このディレクトリの索引

% 以下のサイトは # 出典 :: 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 q1385 言語不問:通分と約分を実装しよう # # 小学生が分数を学ぶときに、最初に躓くのが「通分」です。 # # 分母の異なる分数の足し算や引き算を行うとき、先に通分を行っておく必要があります。 # # また、計算した結果、「約分」できる場合は、可能な限り簡単な分数にしないと正解になりません。 # # 【問題】 # # では、入力される二つの分数について足し算を行った時に、 # # 正しい答えを出力するプログラムを作り、 # # 問1〜問5の標準入力に対して、出力内容を答えてください。 # # ※分母が1の時には整数として出力してください。 # # ■例 # # 例1) # # 【標準入力】 # # 5/6 # # 1/10 # # 【標準出力】 # # 14/15 # # 例2) # # 【標準入力】 # # 1/3 # # 2/3 # # 【標準出力】 # # 1 # # ■問1〜5 # # 問1) # # 1/3 # # 2/7 # # 問2) # # 2/8 # # 3/5 # # 問3) # # 3/10 # # 1/6 # # 問4) # # 3/4 # # 5/8 # # 問5) # # 2/5 # # 2/3 # # 【解答方法】 # # 解答用テキストファイルanswer_q1385.txtをダウンロードし、必要事項をご記入ください。 # # 必須事項がすべて記入されていることをご確認いただいた後、テキストファイルのままアップロードしてください。 # # 【注意】 # # ・ご提出いただいたプログラムは個別に実行テストを行いますので、 # #  解答用テキストファイルに書かれた解答が正解していても最高評価になるとは限りません。 # # ・プログラミング言語は不問ですが、古すぎる実行環境・特殊な設備を要する実行環境では採点できない場合がございます。 # # ・使用する言語は1解答につき必ず1種類でお願いします。 # #  どうしても複数の言語を用いる場合は、解答に「メインの言語名」を明記してください。 # '問1〜問5の標準入力に対して、出力内容を答えてください。 ■問1〜5 問1) 1/3 2/7 問2) 2/8 3/5 問3) 3/10 1/6 問4) 3/4 5/8 問5) 2/5 2/3' :- between(1,5,N), '入力される二つの分数について足し算を行った時に、正しい答えを出力する', N = 5. '入力される二つの分数について足し算を行った時に、正しい答えを出力する' :- 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2), 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _加算された分母), 約分(_加算された分子 / _加算された分母,_約分された分子 / _約分された分母), 答えを出力する(_約分された分子 / _約分された分母). 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _通分された分母) :- 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _通分された分母,_通分された分子_2 / _通分された分母), _加算された分子 is _通分された分子_1 + _通分された分子_2,!. 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2) :- 入力される分数(_分子_1 / _分母_1), 入力される分数(_分子_2 / _分母_2). 入力される分数(_分子_1 / _分母_1) :- 行入力(_行), read_term_from_atom(_行,_分子 / _分母,[]). 行入力(_行) :- get_char(_先読み文字), 行ならびを得る(_先読み文字,_行ならび), atom_chars(_行,_行ならび). 行ならびを得る('\n',[]). 行ならびを得る(_先読み文字,[_先読み文字|R]) :- get_char(_次の文字), 行ならびを得る(_次の文字,R). 答えを出力する(_約分された分子 / _約分された分母) :- writef('%t\n',[_約分された分子 / _約分された分母]). 約分(_分子 / _分母,X) :- 最大公約数で分子分母を割って約分する(_分子,_分母,_分子_1,_分母_1), 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子_2,_分母_2), 分母が1の時は整数に変形(_分子_2,_分母_2,X). 最大公約数で分子分母を割って約分する(_分子_1,_分母_1,_分子,_分母) :- 最大公約数(_分子_1,_分母_1,_最大公約数), _分子 is _分子_1 // _最大公約数, _分母 is _分母_1 // _最大公約数. 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子,_分母) :- 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母),!. 負数の場合のマイナス符号は分子側に付ける(_分子,_分母,_分子,_分母). 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母) :- _分母_1 =< 0, _分子 is _分子_1 * -1, _分母 is _分母_1 * -1. 分母が1の時は整数に変形(_分子,1,_分子) :- !. 分母が1の時は整数に変形(_分子,1.0,_分子) :- !. 分母が1の時は整数に変形(_分子,_分母,_分子 / _分母). 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _最小公倍数,_通分された分子_2 / _最小公倍数) :- 最小公倍数([_分母_1,_分母_2],_最小公倍数), _通分された分子_1 is _分子_1 * (_最小公倍数 // _分母_1), _通分された分子_2 is _分子_2 * (_最小公倍数 // _分母_2). 最大公約数([_整数],_整数). 最大公約数([_整数|R],_最大公約数) :- 最大公約数(R,_最大公約数_2), 二つの整数の最大公約数(_整数,_最大公約数_2,_最大公約数). 二つの整数の最大公約数(M,N,X) :- 二つの整数の絶対値をとる(M,N,M_2,N_2), 最大公約数をユークリッドの互除法で求める(M_2,N_2,Y), 負数解の可能性も探る(M,M_2,N,N_2,Y,X). 負数解の可能性も探る(M,M_2,N,N_2,Y,X) :- setof(X,[M,M_2,N,N_2,Y,X] ^ 負数解の可能性(M,M_2,N,N_2,Y,X),L), member(X,L). 負数解の可能性(M,M_2,_,_,Y,X) :- X is Y * (M // M_2). 負数解の可能性(_,_,N,N_2,Y,X) :- X is Y * (N // N_2). 二つの整数の絶対値をとる(M,N,M_2,N_2) :- M_2 is abs(M), N_2 is abs(N). 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 最小公倍数(_整数ならび,_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(_整数ならび,_最小公倍数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数],_整数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数|R],_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(R,_最小公倍数_1), 二つの整数の最小公倍数(_整数,_最小公倍数_1,_最小公倍数). 二つの整数の最小公倍数(A,B,X) :- 二つの整数の最大公約数(A,B,_最大公約数), setof(X,[X,A,B,_最大公約数] ^ (X is A * B // _最大公約数),L), member(X,L). % 以下のサイトは # 出典 :: 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. % 以下のサイトは % % 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). % % 以下のサイトは 魔方陣(_魔方陣) :- 魔方陣の構成要素を得る(_魔方陣,Ln1,Ln2,_数ならび), 魔方陣を構成してみる(Ln1,Ln2,_数ならび,_行_列_合計,_魔方陣), 魔方陣列検査(_魔方陣,_行_列_合計). 魔方陣の構成要素を得る(_魔方陣,Ln1,Ln2,_数ならび) :- length(_魔方陣,_n), length(Ln1,_n), length(Ln2,_n), _n掛けるn is _n * _n, findall(M,between(1,_n掛けるn,M),_数ならび). 魔方陣を構成してみる([],Ln2,_,_行の合計,[]). 魔方陣を構成してみる([_|Ln1],Ln2,_数ならび_1,_行の合計,[L|R]) :- 魔方陣の一行を得る(Ln2,_数ならび_1,L,_数ならび_2), sum_list(L,_行の合計), 魔方陣を構成してみる(Ln1,Ln2,_数ならび_2,_行の合計,R). 魔方陣の一行を得る([],_残り数ならび,[],_残り数ならび). 魔方陣の一行を得る([_|Ln],_数ならび_1,[_n|R4],_残り数ならび) :- select(_n,_数ならび_1,_数ならび_2), 魔方陣の一行を得る(Ln,_数ならび_2,R4,_残り数ならび). 魔方陣列検査(_行列,_行_列の合計) :- 転置(_行列,_転置行列), 行の合計が全て一致する(_転置行列,_行_列の合計). 行の合計が全て一致する([],_). 行の合計が全て一致する([L|R],S) :- sum_list(L,S), 行の合計が全て一致する(R,S). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 出典 :: 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',[_変換された行]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1392388003/270 # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):入力した1桁の整数を行数と解釈し、その後、その行数分だけキーボードから入力された # 文字をディスプレイに出力する。 # [条件1]整数(行数)入力にはgetchar関数を使用する。 # [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。 # [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。 # [3] 環境 #  [3.1] OS:Windows7 #  [3.2] コンパイラ名とバージョン:gcc 3.4 #  [3.3] 言語: C # [4] 期限:2014/03/30 '入力した1桁の整数を行数と解釈し、その後、その行数分だけキーボードから入力された文字をディスプレイに出力する。 [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。' :- '入力した1桁の整数を行数と解釈し、 [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_行数), 'その後、', 'その行数分だけキーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。'(_行数),!. '入力した1桁の整数を行数と解釈し、 [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_行数) :- '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数), 行数と解釈し(_入力した1桁の整数,_行数). '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数) :- '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。'(_入力した1桁の整数),!. '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数) :- write('Input error 再入力をお願いします\n'), '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数). '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。'(_入力した1桁の整数) :- 行入力(_行文字列), get_term_from_atom(_行文字列,_入力した1桁の整数,[]), integer(_入力した1桁の整数), number_chars(_入力した1桁の整数,[_]),!. 行数と解釈し(_入力した1桁の整数,_行数) :- _入力した1桁の整数 = _行数. 'その後、'. 'その行数分だけキーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。'(_行数) :- reawmode, between(1,_行数,_行目), 'キーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。', _行目 = _行数, norawmode. 'キーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。' :- repeat, get_char(_文字), put_char(_文字), _文字 = '\n',!. 行入力(_行文字列) :- get_char(_文字), 行文字ならび(_文字,_行文字ならび), atom_chars(_行文字列,_行文字ならび). 行文字ならび(end_of_file,[]) :- !. 行文字ならび('\n',[]) :- !. 行文字ならび(_文字,[_文字|R]) :- get_char(_次の文字), 行文字ならび(_次の文字,R). rawmode :- shell('stty raw -echo',_). norawmode :- shell('stty -raw echo',_). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/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,_残り文字列),!. 改行記号を含む行を得る(_文字列,_文字列,''). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/696 # [1] 授業単元: Cプログラミング # [2] 問題文(含コード&amp;リンク): データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が # 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の # 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 # 探索は二分探索法を使いソートにはクイックソートを使うこと。 # # 表示は以下のようにすること。 # Input A Student Number: 14【Enter】 # Ranking : #269 /*最高得点は1位とせよ.*/ # Subject A : 86 # Subject B : 59.1 # Subject C : 220.42 # Total : 365.52 # # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/697 # 【備考】 # 科目 A の得点は int 型,科目 B,C の得点は double 型で扱うこと. # 合計点が同じになる学生はいないということは既知とせよ. # データの人数は 1000 人であることもわかっているとせよ. # 学籍番号には抜けがある.学籍番号が存在しない場合は,”No data”と表示するようにせよ. # 雛型 (121.c) を用いよ.main 関数は完成しているので,main 関数内で呼び出している関数を作成せよ. # 'データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 探索は二分探索法を使いソートにはクイックソートを使うこと。' :- 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび), 合計得点の順位表を作る(_学生成績ならび,_合計得点の順位表), キーボードから入力された学籍番号の(_学籍番号), 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績), '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績). 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび) :- get_lines('rep_data.txt',Lines), findall(L,( member(_行,Lines), split(_行,[','],L)), _学生成績ならび). 合計得点の順位表を作る(_学生成績ならび,_合計得点の重複要素を許す降順ならび) :- findall(_合計,( member([_,A,B,C],_学生成績ならび), _合計 is A + B + C), _合計得点ならび), 重複要素を許す降順整列(_合計得点ならび,_合計得点の重複要素を許す降順ならび). キーボードから入力された学籍番号の(_学籍番号) :- 整数を得る(学籍番号,_学籍番号 >= 0,_学籍番号). キーボードから入力された学籍番号の(_学籍番号) :- キーボードから入力された学籍番号の(_学籍番号). 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績) :- length(Lines,_最大要素位置), 二分探索法を使い学生の成績を得る(1,_最大要素位置,_最大要素位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_要素位置,_要素位置,Lines,_学籍番号,_学生の成績) :- !, nth1(_要素位置,Lines,[_学籍番号|_学生の成績]). 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- succ(_要素位置_1,1,_要素位置_2),!, 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績), 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- _検索位置 is (_要素位置_1 + _要素位置_2) // 2, nth1(_検索位置,Lines,[_学籍番号_1|_学生の成績_1]), 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_学生の成績_1,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績,_学籍番号,_学生の成績) :- !. 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @< _学籍番号, 二分探索法を使い学生の成績を得る(_要素位置_1,_検索位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @> _学籍番号, 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_2,Lines,_学籍番号,_学生の成績). 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_1,Lines,[_学籍番号|_学生の成績]),!. 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_2,Lines,[_学籍番号|_学生の成績]). 重複要素を許す降順整列([],[]). 重複要素を許す降順整列([_軸要素|_残りならび],_合計得点の重複要素を許す降順ならび) :- 重複要素を許す降順分割(_軸要素,_残りならび,_軸要素と等しいか大きいならび,_軸要素より小さいならび), 重複要素を許す降順整列(_軸要素と等しいか大きいならび,_合計得点の重複要素を許す降順ならび_1), 重複要素を許す降順整列(_軸要素より小さいならび,_合計得点の重複要素を許す降順ならび_2), append(_合計得点の重複要素を許す降順ならび_1,[_軸要素|_合計得点の重複要素を許す降順ならび_2],_合計得点の重複要素を許す降順ならび). 重複要素を許す降順分割(_,[],[],[]) :- !. 重複要素を許す降順分割(_軸要素,[A|R],[A|R2],R3) :- A @>= _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). 重複要素を許す降順分割(_軸要素,[A|R],R2,[A|R3]) :- A @< _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績) :- _学生の成績 = [_科目Aの得点,_科目Bの得点,_科目Cの得点], _学生の合計得点 = _科目Aの得点+_科目Bの得点+_科目Cの得点, nth1(_順位,_合計得点の重複を許す降順ならび,_学生の合計得点), writef('学籍番号 :: %t\n順位 :: #%t\n,科目%t :: %t\n科目%t :: %t\n科目%t :: %t\n',[_学籍番号,_順位,'A',_科目Aの得点,'B',_科目Bの得点,'C',_科目Cの得点]). get_lines(Lines) :- get_lines(user_input,Lines). get_lines(Stream,Lines) :- findall(Line,( get_line(Stream,Line), ( Line=end_of_file,!,fail; true)), Lines). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/854 # ●Regular Expressionの使用環境 # Becky! Internet Mail Ver.2 # # ●検索か置換か? # 検索 # # ●説明 # +0900を含まないものを検索したい # # ●対象データ # +0900 # +0500 # +0630 # # ●希望する結果 # +0500 # +0630 # # よろしくお願いします。 # # '+0900を含まないものを検索したい'(_文字列) :- get_lines(Lines), '+0900を含まないものを検索したい'(Lines,_文字列). '+0900を含まないものを検索したい'(Lines,_文字列) :- member(_文字列,Lines), '+0900を含まないものを'(_文字列). '+0900を含まないものを'(_文字列) :- \+(sub_atom(_文字列,_,_,_,'+0900')). % 以下のサイトは # 出典:: 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). % % 以下のサイトは # # お題:テキストファイルを読み込み、その中で最もよく使われている単語ベスト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). % 以下のサイトは # 宿題じゃないんだけど、 # input.txtの中身が # 北アイルランド # あいうえお # aaa # だったとして # → # aaa # あいうえお # 北アイルランド # とエクセルの昇順と同じように並べ替えて # output.txtとして保存するプログラムを作成する # # C言語でお願いします。 'input.txtの中身が 北アイルランド あいうえお aaa だったとして → aaa あいうえお 北アイルランド とエクセルの昇順と同じように並べ替えて output.txtとして保存するプログラム' :- 'input.txtの中身が'(_行ならび), エクセルの昇順と同じように並べ替えて(_行ならび,_整列済み行ならび), 'output.txtとして保存する'(_整列済み行ならび). 'input.txtの中身が'(_行ならび) :- get_lines('input.txt',_行ならび). エクセルの昇順と同じように並べ替えて(_行ならび,_整列済み行ならび) :- 整列(_行ならび,_整列済み行ならび). 'output.txtとして保存する'(_整列済み行ならび) :- open('output.txt',write,Outstream), 'output.txtとして保存する'(Outstream,_整列済み行ならび), close(Outstream). 'output.txtとして保存する'(_,[]). 'output.txtとして保存する'(Outstream,[_行|_残り行ならび]) :- writef(Outstream,'%t\n',[_行]), 'output.txtとして保存する'(Outstream,_残り行ならび). get_lines( 整列([],[]). 整列([_軸要素|_残りならび],_整列したならび) :- 分類(_軸要素,_残りならび,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび), 整列(_軸要素に等しいか小さい要素ならび,_整列した軸要素に等しいか小さい要素ならび), 整列(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), append(_整列した軸要素に等しいか小さい要素ならび,[_軸要素|_整列した軸要素に等しいか小さい要素ならび],_整列したならび). 分類(_,[],[],[]). 分類(_軸要素,[_要素|_残り要素ならび],[_要素|_軸要素に等しいか小さい要素ならび],_軸要素より大きい要素ならび) :- _要素 @=< _軸要素, 分類(_軸要素,_残り要素ならび,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび). 分類(_軸要素,[_要素|_残り要素ならび],_軸要素に等しいか小さい要素ならび,[_要素|_軸要素より大きい要素ならび]) :- _要素 @> _軸要素, 分類(_軸要素,_残り要素ならび,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/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/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/1354070278/859 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/kie.nu/Hag # ファイルの内容を行番号付きで出力するプログラムを作成せよ # ファイルの内容を行番号付きで出力するプログラムを作成せよ(_ファイル名) :- get_lines(_ファイル名,Lines), append(L0,[_行|R],Lines), length([_|L0],_行番号), writef('%t %t\n',[_行番号,_行]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/648 # # [1] 授業単元:Cプログラミング # [2] 問題文(含コード&リンク): # 下記のアップロードされたファイル(数字の羅列)を読み込み、並び替え方法(昇順/降順)で指定されたファイル(out.txt) # へ出力するプログラムを作成せよ # http://ime.nu/www1.axfc.net/uploader/He/so/280605 # 以下実行結果 # # 並び替え方法をしていしてください(1:昇順、2:降順) # 1 # # 並び替えたファイルへ出力しました。 # # cat out.txt ←catコマンドで中身確認 # 1 # 3 # 3 # 3 # 'アップロードされたファイル(数字の羅列)を読み込み、並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_アップロードされたファイル名) :- 'アップロードされたファイル(数字の羅列)を読み込み'(_アップロードされたファイル名,_行ならび), '並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_行ならび). 'アップロードされたファイル(数字の羅列)を読み込み'(_行ならび) :- get_lines('input.txt',_行ならび). '並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_行ならび) :- '並び替え方法を指定してください(1:昇順、2:降順)'(_並び替え方法), 並び替え(_並び替え方法,_行ならび,_並び替えた行ならび), '指定されたファイル(out.txt)へ出力する'(_並び替えた行ならび). '並び替え方法を指定してください(1:昇順、2:降順)'(_並び替え方法) :- write('並び替え方法を指定してください(1:昇順、2:降順)'), 整数を得る('並び替え方法を指定してください(1:昇順、2:降順)',between(1,2,N),N), 並び替え方法(N,_並び替え方法). 並び替え方法(1,昇順). 並び替え方法(2,降順). 並び替え(昇順,_行ならび,_並び替えた行ならび) :- 整列(_行ならび,_並び替えた行ならび). 並び替え(降順,_行ならび,_並び替えた行ならび) :- 整列(_行ならび,_並び替えた昇順行ならび), reverse(_並び替えた昇順行ならび,_並び替えた行ならび). '指定されたファイル(out.txt)へ出力する'(_並び替えた行ならび) :- put_lines('out.txt',_並び替えた行ならび). put_lines(_ファイル名,_行ならび) :- open(_ファイル名,write,Outstream), forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/138 # # [1] 授業単元: ファイル読み取り コサイン類似度 # [2] 問題文(含コード&amp;リンク):http://ime.nu/codepad.org/pX1MdXpC #   問題中のsample.txtの例 http://ime.nu/www1.axfc.net/uploader/so/2707638.txt #   問題中のtest.txtの例 http://ime.nu/www1.axfc.net/uploader/so/2707641.txt # # /* # 二つのtxtファイルがある # sample.txtはファイル名と500個の数値の文字列が一行書かれている。 # txtファイルを例として上げる # 例: # # test.txtはsample.txtと同じようなファイル名と500個の数値の文字列を一行とした文字列が # 不特定多数並んでいる。txtファイルを例として上げる。 # 例: # # この2つのtxtファイルを使って次の動作をするプログラムを作れ # # ?sample.txtに書かれている数値を読み取って、配列a[n]に格納する。 # nは数値の番号で0からはじめる。 # # ?test.txtを読み取って、一行ごとに数値を配列b[i][j]に格納する #  iには行数、jには数値の番号を入れる。番号は0からはじめる。 #  余裕があれば、ファイル名を別の配列に格納する # # ?それぞれ格納された配列の数値をつかって繰り返し文を使い # # c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数*sqrt(b[i][j]*b[i][j])をすべて足した数} # # の計算を行う。 # 考え方は下の用になる # # c[0]=(a[0]*b[0][0]+a[1]*b[0][1]+a[2]*b[0][2]+...+a[n]*b[0][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[0][0]*b[0][0]+b[0][1]*b[0][1]+b[0][2]*b[0][2]+...+b[0][j]*b[1][j])); # # c[1]=(a[0]*b[1][0]+a[1]*b[1][1]+a[2]*b[1][2]+...+a[n]*b[1][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[1][0]*b[1][0]+b[1][1]*b[1][1]+b[1][2]*b[1][2]+...+b[1][j]*b[1][j])); # # c[2]=(a[0]*b[2][0]+a[1]*b[2][1]+a[2]*b[2][2]+...+a[n]*b[2][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[2][0]*b[2][0]+b[2][1]*b[2][1]+b[2][2]*b[2][2]+...+b[2][j]*b[2][j])); # # ・ # ・ # ・ # # c[i]=(a[0]*b[i][0]+a[1]*b[i][1]+a[2]*b[i][2]+...+a[n]*b[i][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[i][0]*b[i][0]+b[i][1]*b[i][1]+b[i][2]*b[i][2]+...+b[i][j]*b[i][j])); # # # ?画面にc[i]をすべて表示させる。余裕があれば同時に?で格納したファイル名も出力する # # # /* # '二つのtxtファイルがある sample.txtはファイル名と500個の数値の文字列が一行書かれている。 txtファイルを例として上げる 例: test.txtはsample.txtと同じようなファイル名と500個の数値の文字列を一行とした文字列が 不特定多数並んでいる。txtファイルを例として上げる。 例: この2つのtxtファイルを使って次の動作をするプログラムを作れ 1)sample.txtに書かれている数値を読み取って、配列a[n]に格納する。 nは数値の番号で0からはじめる。 2)test.txtを読み取って、一行ごとに数値を配列b[i][j]に格納する  iには行数、jには数値の番号を入れる。番号は0からはじめる。  余裕があれば、ファイル名を別の配列に格納する 3)それぞれ格納された配列の数値をつかって繰り返し文を使い c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数*sqrt(b[i][j]*b[i][j])をすべて足した数} の計算を行う。'(_c) :- 'sample.txtに書かれている数値を読み取って、_aに格納する'(_a), 'test.txtを読み取って、配列bに格納する'(_b), 'c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数の計算を行う'(_a,_b,_c). 'sample.txtに書かれている数値を読み取って、_aに格納する。'(_a) :- get_numbers('sample.txt',_a). 'test.txtを読み取って、配列bに格納する'(_b) :- 'test.txtを読み取って'(Lines), 配列bに格納する(Lines,_b). 'test.txtを読み取って'(Lines) :- get_lines('test.txt',Lines). 配列bに格納する(Lines,_b) :- findall(L,( member(A,Lines), atom_codes(A,L)), _b). 'c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数の計算を行う'(_a,_b,_c) :- 'sqrt(a[n]*a[n])をすべて足した数'(_a,V), findsum(X,( 'a[n]*b[i][j]をすべて足した数'(_a,_b,W), X is W / (V * sqrt(S_1))), _c). 'sqrt(a[n]*a[n])をすべて足した数'(_a,X) :- findsum(U,( member(A,_a), U is A * A), S_0), X is sqrt(S_1). 'a[n]*b[i][j]をすべて足した数'(_a,_bW) :- member(L,_b), findsum(Y,( nth0(_nth0_1,L,N), nth0(_nth0_1,_a,M), Y is M * N), W). get_numbers(File,Numbers) :- get_lines(File,Lines), findall(Number,( member(Line,Lines), atom_to_number(Line,Number)), Numbers). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/102 # # [1] 授業単元:言語処理 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/0VyMr7kt # 上記のプログラムを変更して、逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み,計算結果を出力するプログラムを作成せよ. # さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示するプログラムを作成せよ. # '逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み,計算結果を出力する.さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル) :- 逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み(_テキストファイル,_逆ポーランド式ならび), 計算結果を出力する(_逆ポーランド式ならび), 'さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル). 逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み(_テキストファイル,_逆ポーランド式ならび) :- get_Chars(_テキストファイル,_文字ならび), 数字を値に変換する(_文字ならび,_文字ならび_1), 空白を除去する(_文字ならび_1,_逆ポーランド式ならび). 数字を値に変換する([],[]). 数字を値に変換する([A|R1],[B|R1]) :- 数字ならば数に変換(A,B), 数字を値に変換する(R1,R2),!. 数字を値に変換する([A|R1],[A|R2]) :- 数字を値に変換する(R1,R2). 空白改行などを除去する([],[]). 空白改行などを除去する([A|R1],[A|R1]) :- member(A,[+,-,*,/,0,1,2,3,4,5,6,7,8,9]), 空白改行などを除去する(R1,R2),!. 空白改行などを除去する([_|R1],[_|R2]) :- 空白改行などを除去する(R1,R2). 数字ならば数に変換(A,B) :- A @>= '0', A @=< '9', atom_number(A,B). 計算結果を出力する(_逆ポーランド式ならび) :- 計算結果(_逆ポーランド式ならび,[],_値), writef('%t\n',[_値]). 計算結果([],[_値],_値). 計算結果([N|R1],L1,_値) :- number(N), 計算結果(R1,[N|L1],_値),!. 計算結果([_演算子|R1],[N1,N2|R2],_値) :- 演算(_演算子,N1,N2,N3), 計算結果(R1,[N3|R2],_値). 演算(_演算子,N1,N2,N3) :- F =.. [_演算子,N1,N2], N3 is F. 'さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル) :- get_lines(_テキストファイル,Lines), '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(Lines). '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(Lines) :- append(_,[_行|R],Lines), '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を'(_行), 表示する(_頻度ならび), R = []. '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を'(_行,_頻度ならび) :- '各行の内容を字句解析(トークンに分解)し'(_行,_字句ならび), 各要素の個数をカウントした結果を(_字句ならび,_頻度ならび). '各行の内容を字句解析(トークンに分解)し'(_行,_字句ならび) :- sPLIT(_行,[' ','+','-','*','/','1','2','3','4','5','6','7','8','9','0'],L_1), 空白を取り除く(L_1,_字句ならび). 各要素の個数をカウントした結果を(_字句ならび,_頻度ならび) :- findsetof(_要素,( member(_要素,_字句ならび)), L_1), findall([_頻度,_字句],( member(_字句,L_1), count(member(_字句,_字句ならび),_頻度)), _頻度ならび). 表示する(_頻度ならび) :- append(_,[[_頻度,_字句]|R],_頻度ならび), writef('%t,%t回 ',[_字句,_頻度]), R = [], write('\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/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/1342966104/793 # # [1] 授業単元:プログラミング # [2] 問題文: # http://ime.nu/codepad.org/3HrmfsVo # http://ime.nu/codepad.org/InxgbSAZ # http://ime.nu/codepad.org/99RFoVNY # # /* # プログラムの引数に書籍データのファイルと列数(a) を与える。書籍データのファイルは # c2md.csv である。 # # 各行が1つの書籍データを表している。書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち、 # それらをカンマ(,)で区切って表している。ただし書名にカンマ(,)が含まれる場合には、書名は二重引用符 # (”)で囲まれている。発行年、本体価格は正の整数値で記述されており、情報がない不明の場合は記述がない。 # # a で指定された列だけを表示せよ。 # ただし1行を出版社出版社名を表す文字の配列、書名を表す文字の配列、発行年を表す整数、本体価格 # を表す整数に分解する関数bunkatu を実装することで実現せよ。 # # */ # /* # プログラムの引数に書籍データのファイル(c2md.csv) を与える。各出版社が2000 年から2012 年ま # でに出版した本の冊数を求め、その冊数の多い順に表示せよ。 # ただし出版社名(name)とその出版社が2000 年から2012 年までに出版した本の冊数(pub)を表す以 # 下の構造体bkcmpy を用意する。 # struct bkcmpy { # char name[100]; # int pub; # }; # 各出版社に対して、このbkcmpy を作成し、この構造体の情報を出力することでプログラムを作成せよ。 # # プログラムでは、出版社が全部で150 社以下であることは仮定し、bkcmpy のポインターの配列 # bkcmpydb[150] を用意する。関数touroku ではbkcmpydb と読み込んだ出版社名cname を与える。 # cname が既にbkcmpydb に登録されていたら、その構造体のpub を1 増やし、登録されていなかった # ら、bkcmpy を1つ作成してbkcmpydb に登録する。 # /* # プログラムの引数に書籍データのファイル(c2md.csv) を与える。各出版社が2000 年から2012 年ま # でに出版した本の中で最高価格の本の情報を表示せよ。 # ただし出版社名(name)、書名(book)、発行年(year)、最高価格(price)を表す以下の構造体bkcmpy # を用意する。 # # struct bkcmpy { # char name[100]; # char book[420]; # int year; # int price; # }; # # 各出版社に対して、このbkcmpy を作成し、この構造体の情報を出力することでプログラムを作成せよ。 # # */ 'プログラムの引数に書籍データのファイルと列数(a) を与える。書籍データのファイルはc2md.csv である。各行が1つの書籍データを表している。書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち、それらをカンマ(,)で区切って表している。ただし書名にカンマ(,)が含まれる場合には、書名は二重引用符(”)で囲まれている。発行年、本体価格は正の整数値で記述されており、情報がない不明の場合は記述がない。a で指定された列だけを表示せよ。'(_ファイル名,_列数a) :- get_lines(_ファイル名,_行ならび), 書籍データならびに変換する(_行ならび,_書籍データならび), 空文字でないデータの列数が列数aと一致する情報だけ表示する(_列数a,_書籍データならび). 書籍データならびに変換する([],[]). 書籍データならびに変換する([_行|R1],[[_出版社名,_書名,_発行年,_本体価格]|R2]) :- '書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち'(_行,_出版社名,_書名,_発行年,_本体価格), 書籍データならびに変換する(R1,R2). '書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち'(_書籍データ,_出版社名,_書名,_発行年,_本体価格) :- 二重引用符をエスケープに使ったsplit(_書籍データ,[_出版社名,_書名,_発行年,本体価格]). 二重引用符をエスケープに使ったsplit(_書籍データ,L) :- atom_chars(_書籍データ,_書籍データ文字ならび), 二重引用符をエスケープに使った文字ならびを区切る(_書籍データ文字ならび,L). 二重引用符をエスケープに使った文字ならびを区切る([],[]). 二重引用符をエスケープに使った文字ならびを区切る(L1,[A|R2]) :- 二重引用符にぶつかった(L1,A,R1_2), 二重引用符をエスケープに使った文字ならびを区切る(R1_2,R2),!. 二重引用符をエスケープに使った文字ならびを区切る(L1,[A|R2]) :- カンマ区切りを切り取る(L1,A,R1), 二重引用符をエスケープに使った文字ならびを区切る(R1,R2). 二重引用符にぶつかった(L1,A,R1_2) :- append(L0,['"'|R1],L1), \+(member('''',L0)), append(L1_1,['"'|R1_2],R1), atom_chars(A,L1_1),!. カンマ区切りを切り取る(L1,A,R1) :- append(L0,[','|R1],L1), atom_chars(A,L0),!. 空文字でないデータの列数が列数aと一致する情報だけ表示する(_列数a,_書籍データならび) :- member(L,_書籍データならび), count((member(A,L),\+(A='')),_列数a), writef('%t,%t,%t,%t\n',L), fail. 空文字でないデータの列数が列数aと一致する情報だけ表示する(_列数a,_書籍データならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/844 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/DXRUGC3J # http://ime.nu/codepad.org/e9CIf3Iy # # /* # # 2.以下のように各行に整数だけを記したファイルがあるとします.このファイルを開いて,各 # 行の数値の和を求めるプログラムを書きなさい.ファイル名はプログラムの引数にすること. # # ----ファイルdata.txtの中身---- # 12 # 2 # -4 # 6 # 321 # --------------------------- # # 実行例337 # # */ # # /* # 3.2のプログラムを,数値は標準入力から得るようにしなさい.そして,以下の # 命令で2 と同じ結果が出るようにしなさい. # # 実行例 # # */ # # type datatxt | prog # .sum is # prog dat.txt337 # sum is a '数値は標準入力から得る.そして各行の数値の和を求める'(_各行の数値の和) :- get_lines(Lines), findsum(_値,( member(_行,Lines), atom_number(_行,_値)), _各行の数値の和). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/844 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/DXRUGC3J # http://ime.nu/codepad.org/e9CIf3Iy # # /* # # 2.以下のように各行に整数だけを記したファイルがあるとします.このファイルを開いて,各 # 行の数値の和を求めるプログラムを書きなさい.ファイル名はプログラムの引数にすること. # # ----ファイルdata.txtの中身---- # 12 # 2 # -4 # 6 # 321 # --------------------------- # # 実行例337 # # */ # # /* # 3.2のプログラムを,数値は標準入力から得るようにしなさい.そして,以下の # 命令で2 と同じ結果が出るようにしなさい. # # 実行例 # # */ # # type datatxt | prog # .sum is # prog dat.txt337 # sum is a '各行に整数だけを記したファイルがあるとします.このファイルを開いて,各行の数値の和を求める'(_ファイル名,_各行の数値の和) :- get_lines(_ファイル名,Lines), findsum(_値,( member(_行,Lines), atom_number(_行,_値)), _各行の数値の和). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1269704830/946 # # # 質問です。メモ帳のデータをfortranで読み込んだ後、指定したデータを掛け算し、 # その合計値を算出したいいのですが、どのようにプログラミングしたらいいでしょうか? # # depth 0, 5 cm P, S, P+S # 1 .000E+00 .121E+06 .121E+06 .000E+00 .859E+06 .859E+06 # 2 .320E+02 .325E+06 .325E+06 .170E+02 .798E+06 .798E+06 # 3 .300E+01 .671E+06 .671E+06 .100E+01 .116E+07 .116E+07 # 4 .247E+05 .173E+07 .175E+07 .120E+05 .160E+07 .161E+07 # 5 .440E+06 .151E+07 .195E+07 .229E+06 .152E+07 .175E+07 # 6 .146E+07 .474E+06 .194E+07 .793E+06 .899E+06 .169E+07 # 7 .253E+07 .124E+06 .266E+07 .143E+07 .763E+06 .219E+07 # 8 .329E+07 .280E+05 .332E+07 .191E+07 .757E+06 .267E+07 # 9 .373E+07 .526E+04 .373E+07 .222E+07 .753E+06 .297E+07 # 10 .391E+07 .315E+04 .392E+07 .239E+07 .732E+06 .312E+07 # 11 .394E+07 .516E+05 .399E+07 .245E+07 .772E+06 .322E+07 # 12 .387E+07 .910E+02 .387E+07 .245E+07 .636E+06 .309E+07 # 13 .375E+07 .480E+02 .375E+07 .242E+07 .583E+06 .300E+07 # ↓ #  ↓ #  ↓ #  400 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 # # 上記のデータの説明をさせていただきます。深さ0cmと5cmのそれぞれにP,S,P+Sという3種類のデータ # が存在し、まず、5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後、 # 5cmのP+Sの行と対応した「1〜400の変更した値」で順番に掛けてその合計を計算するようにプログラミング # したいのですが、うまくできず、困っています。 # (5cmのP+Sのデータは、左から数えて7番目のデータです。.859E+06から始まる行になります。) # # 具体的には、1〜400までの数字をそれぞれ1の場合、(1×50-25)×.859E+06という計算を縦に行っていき、 # (400×50-25)×.000E+00まで計算し、その合計値を算出できるようにプログラミングしたいと考えています。 # # '5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後、5cmのP+Sの行と対応した「1〜400の変更した値」で順番に掛けてその合計を計算する'(_ファイル名,_合計) :- '5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後'(_ファイル名,L), findsum(Y,( nth1(_nth,L,X), Y is _nth * X), _合計). '5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後'(_ファイル名,L) :- get_lines(_ファイル名,[' '],LL), findall(X,( member(L_1,LL), nth1(7,L_1,X_1), X is X_1 * 50 - 25), L). % 以下のサイトは # 出典:: 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',[_変換された文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/849 # # [1] 授業単元: プログラミング # [2] 問題文: # 1文字を引数として受け取り、AならばZ,BならばY,aならばz,bならばy,0ならば9,1ならば8 # というように入れ替えた文字を戻り値とする関数をsymmetry()という名前で作成する。 # キーボードから80文字以内の英文を1行入力し、1行の全ての文字をsymmetry()で変換した # 文字列を1行に表示する。同じ操作を更にもう一度繰り返し、結果的に入力された英文と # 同じ文字列が表示されるようにする。 # 例:I was born in 1956.と打ち込んだ場合、R dzh ylim rm 8043.と表示されるようにする。 # 'キーボードから80文字以内の英文を1行入力し、1行の全ての文字をsymmetry述語で変換した文字列を1行に表示する。' :- 'キーボードから80文字以内の英文を1行入力し、'(_80文字以内の文字列), '1行の全ての文字をsymmetry述語で変換した文字列を'(_80文字以内の文字列,_変換した文字列), 表示する(_変換した文字列). 'キーボードから80文字以内の英文を1行入力し、'(_80文字以内の文字列) :- get_line(_文字列), '80文字以内の'(_文字列,_80文字以内の文字列). '80文字以内の'(_文字列,_80文字以内の文字列) :- sub_atom(_文字列,0,80,_,_80文字以内の文字列),!. '80文字以内の'(_文字列,_文字列). '1行の全ての文字をsymmetry述語で変換した文字列を'(_80文字以内の文字列,_変換した文字列) :- findall(_暗号文字,( sub_atom(_80文字以内の文字列,_,1,_,_文字), symmetry(_文字,_暗号文字)), _変換した文字ならび), atom_chars(_変換した文字列,_変換した文字ならび). 表示する(_変換した文字列) :- writef('%t\n',[_変換した文字列]). symmetry(_文字,_暗号文字) :- 暗号文字へずらす(_文字,_暗号文字),!. summetry(_文字,_文字). 暗号文字へずらす(_文字,_暗号文字) :- 文字種(_,_文字コード下限,_文字コード上限,L), nth0(_nth0,L,_文字), _シフト数 is _nth0 + (_文字コード上限 - _文字コード下限 + 1) // 2, ならびの回転(左方向,_シフト数,L,[_暗号文字|_]),!. 文字種(英小文字,97,122,[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]). 文字種(英大文字,65,90,['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']). 文字種(数字,48,57,['0','1','2','3','4','5','6','7','8','9']). % 以下のサイトは # 出典:: 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つの数値以降の文字列を表示したい'(_テキストファイル) :- 数値が並んだテキストファイルから(_テキストファイル,Lines), 各行の最初の2つの数値以降の文字列を(Lines,Line), 表示したい(Line,_残り行ならび), _残り行ならび = []. 数値が並んだテキストファイルから(_テキストファイル,Lines) :- get_lines(_テキストファイル,Lines). 各行の最初の2つの数値以降の文字列を取り出して(Lines,Line,_残り行ならび) :- append(_,[Line_1|_残り行ならび],Lines), 最初の2つの数値以降の文字列を取り出して(Line_1,Line). 最初の2つの数値以降の数値を取り出して(_文字列,_残り文字列) :- 最初の数値を除く残り文字列(_文字列,_残り文字列_1), 最初の数値を除く残り文字列(_残り文字列_1,_残り文字列),!. 最初の数値を除く残り文字列(_文字列,_残り文字列) :- sub_atom(_文字列,_,_,_,S1,_残り文字列,S3,L1,L2,L3), すべて数字(L2), \+((sub_atom(S3,0,1,_,A),数字(A))),!. 数字(A) :- A @>= '0', A @=< '9'. すべて数字([]). すべて数字([A|R]) :- 数字(A), すべて数字(R). 表示したい(Line) :- writef('%t\n',[Line]). % 以下のサイトは # 出典:: 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 # # 'のぞみ料金表を"http://nojiriko.asia/prolog/nozomi_ryoukinhyo.txt"から読み取り、述語 料金表/1 を定義する' :- get_lines('http://nojiriko.asia/prolog/nozomi_ryoukinhyo.txt',Lines), カンマを取り除く(Lines,_カンマを取り除いたLines), '述語 料金表/1 を定義する'(_カンマを取り除いたLines,_料金表), assertz(料金表(_料金表)). カンマを取り除く([],[]). カンマを取り除く([_行|R1],[_行_2|R2]) :- findall(_文字,( sub_atom(_行,_,1,_,_文字), \+(_文字=',')), L), atom_chars(_行_2,L), カンマを取り除く(R1,R2). '述語 料金表/1 を定義する'(_カンマを取り除いたLines,_料金表) :- findall(L,( member(Line,Lines), split(Line,[' '],L)), LL), LL = [L1|R], _料金表 = [[''|L1]|R]. % split/3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 料金表([['',新大阪,京都,名古屋,新横浜], [東京,14920,14390,11540,3180], [新横浜,14600,13660,10910], [名古屋,6840,6100], [京都,3240]]). 料金表からのぞみ料金述語を定義する :- 料金表(_料金表), 料金表からのぞみ料金述語を定義する(_料金表). 料金表からのぞみ料金述語を定義する([[_|_行き先ならび]|_出発点付き料金表]) :- 新幹線のぞみ料金述語の定義する(_行き先ならび,_出発点付き料金表). 新幹線のぞみ料金述語を定義する(_,[]). 新幹線のぞみ料金述語を定義する(_行き先ならび,[[_出発点|_料金ならび]|R]) :- 出発点からの料金を定義する(_出発点,_行き先ならび,_料金ならび), 新幹線のぞみ料金述語を定義する(_行き先ならび,R). 出発点からの料金を定義する(_,_,[]). 出発点からの料金を定義する(_出発点,[_行き先|R1],[_料金|R2]) :- assertz(新幹線のぞみ料金(_出発点,_行き先,_料金)), 出発点からの料金を定義する(_出発点,R1,R2). 'なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする' :- split('なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする',[が,と,','],L), append(_,[',',_駅名,'が,N|_],L). assertz(駅番号(_駅名,N)), fail. 'なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/703 # # # レポート課題 # # 標準入力で与えた単語が,指定ファイル中に出現した回数を出力するプログラムを作成せよ. # 単語データは以下の構造体を使用し,ハッシュを使用すること # ハッシュ関数は各自で定義してよい # 単語は,スペースまたは改行で区切られる文字列とする # ハッシュのサイズはコマンド引数から指定し,作成したハッシュテーブルの偏り具合を表示すること # # struct word { # char *str; # int count; # struct word *next; # }; # 実行例 # # $ ./wordcount 13 api.txt # [0]:147 [1]:133 [2]:170 [3]:137[4]:133[5]:132 [6]:160 [7]:167 [8]:136 [9]:154 [10]:142 [11]:149 [12]:125 # Word => API # API: 10 # Word => virtual # virtual: 33 # Word => 0 # $ # # # お願いします。 # # '標準入力で与えた単語が,指定ファイル中に出現した回数を出力する'(_指定ファイル) :- 標準入力で与えた単語が(_標準入力で与えた単語), 指定ファイル中に出現した回数を(_指定ファイル,_標準入力で与えた単語,_出現した回数), 出力する(_指定ファイル,_標準入力で与えた単語,_出現した回数). 標準入力で与えた単語が(_標準入力で与えた単語) :- get_line(_標準入力で与えた単語). 指定ファイル中に出現した回数を(_指定ファイル,_標準入力で与えた単語,_指定ファイル中に出現した回数) :- get_lines(_指定ファイル,Lines), count(( member(_行,Lines), sub_atom(_行,_,_,_,_標準入力で与えた単語)), _指定ファイル中に出現した回数). 出力する(_指定ファイル,_標準入力で与えた単語,_指定ファイル中に出現した回数) :- writef('単語 %t が ファイル "%t" 中に出現した回数は %t です。\n',[_標準入力で与えた単語,_指定ファイル,_指定ファイル中に出現した回数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/663 # # [2]水の量(L)を入力し、その水に含まれる水素および酸素の原子の数を表示するプログラムを作成せよ。 # アボガドロ定数は6.02×10^23、水の分子量は18,水の重さは1ml=1gとしてよく、 # 入力される数値として浮動小数点数値に対応すること表示は指数表現で行う。 # # [3.1]windows # [3.3]c/c++ # [4]今日中 # よろしくお願いします。 # '水の量(L)を入力し、その水に含まれる水素および酸素の原子の数を表示するプログラムを作成せよ。 アボガドロ定数は6.02×10^23、水の分子量は18,水の重さは1ml=1gとしてよく、 入力される数値として浮動小数点数値に対応すること表示は指数表現で行う。' :- '水の量(L)を入力し'(_水の量), 'その水に含まれる水素および酸素の原子の数を表示する'(_水素の原子数,_酸素の原子数). '水の量(L)を入力し'(_水の量) :- write('水の量(L)を入力してください : '), 行入力と終了状態(_行,_), 水の量の入力診断(_行,_水の量),!. '水の量(L)を入力し'(_水の量) :- '水の量(L)を入力し'(_水の量). 水の量の入力診断(_行,_水の量) :- read_term_from_atom(_行,_水の量,[]), number(_水の量), _水の量 > 0.0,!. 水の量の入力診断(_行,_水の量) :- writef('入力された水の量は適切でありません。再入力をお願いします。\n'). 'その水に含まれる水素および酸素の原子の数を表示する'(_水の量,_水素の原子数,_酸素の原子数) :- アボガドロ数(_アボガドロ数), _分子の総数 is _アボガドロ数 * _水の量 * 1000 * (1 / 1), 水の分子量(_分子量,_酸素原子量,_水素原子量), 水素および酸素の原子の数を(_分子の総数,_分子量,_酸素原子量,_水素原子量,_酸素原子の数,_水素原子の数), 表示する(_水の量,_分子の総数,_分子量,_酸素原子量,_水素原子量). アボガドロ数(602000000000000000000000). 水の分子量(_分子量,_酸素原子量,_水素原子量) :- _分子量 = 18, _酸素原子量 = 16, _水素原子量 = 2. 水素および酸素の原子の数を(_分子の総数,_分子量,_酸素原子量,_水素原子量,_酸素原子の数,_水素原子の数) :- _酸素原子の数 is _分子の総数 * _酸素原子量 // _分子量, _水素原子の数 is _分子の総数 * _水素原子量 // _分子量. 表示する(_水の量,_分子の総数,_分子量,_酸素原子量,_水素原子量) :- writef('水の量=%t\n分子の総数=%t\n分子量=%t\n酸素原子量=T\n水素原子量=%t\n',[_水の量,_分子の総数,_分子量,_酸素原子量,_水素原子量]). 行入力と終了状態(_行,_終了状態) :- get_char(_先読み文字), 文字ならび行入力と終了状態(_先読み文字,_文字ならび,_終了状態), atom_chars(_行,_文字ならび). 文字ならび行入力と終了状態('\n',[],正常終了) :- !. 文字ならび行入力と終了状態(end_of_file,[],end_of_file) :- !. 文字ならび行入力と終了状態(_先読み文字,[_先読み文字|R],_状態) :- get_char(_文字), 文字ならび行入力と終了状態(_文字,R,_状態). % 以下のサイトは # 出典:: 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/1325685876/829 # # プログラムに以下の機能を追加したプログラムを作成する. # (1) 各行ごとに1バイト空白 ' ',または,タブ '\t' で区切られた部分文字列が何個あるかカウントする関数を作成し, #   出力の際に,行番号の右側に表示する.(画面表示の例) # (2) 結果を画面表示すると共に,同等の内容をファイルに書き出す. #   ファイル形式は HTML ファイル(.html)とすること. #   ・ただし,HTMLファイルに用いるタグは FireFox や Safari などで,それなりの表示が得られる程度で良い # # #include <stdio.h> # #include <stdlib.h> # int main (void){ char fileName[] = "14-1.c"; # FILE *f; # f=fopen(fileName, "r"); # if(f==NULL){ # printf("ファイルが開けませんでした\n"); # exit(EXIT_FAILURE);} # int lineNum=1; # char str[256]; # while(fgets(str,255,f) !=NULL){ # printf("%03d :%s",lineNum,str); # lineNum++;} # printf("\n"); # char* line = "--------------------------------\n"; # printf("%s",line); # printf("lines: %d\n",lineNum-1); # printf("%s",line); # fclose(f); # return 0;} # [3]c言語 # [4]1/31 よろしくお願いします # # '(1) 各行ごとに1バイト空白または,タブで区切られた部分文字列が何個あるかカウントする関数を作成し,出力の際に,行番号の右側に表示する.'(_ファイル) :- 各行ごとに(_ファイル,Line,_行番号,R), '1バイト空白または,タブで区切られた部分文字列が何個あるかカウントする'(Line,_何個), '出力の際に,行番号の右側に表示する'(_行番号,_何個,Line), R = []. 各行ごとに(_ファイル,Line,_行番号,R) :- get_lines(_ファイル,Lines), append(L0,[Line|R],Lines), length([_|L0],_行番号). '1バイト空白または,タブで区切られた部分文字列が何個あるかカウントする'(Line,_何個) :- split(Line,[' ','\t'],L), length(L,_何個). '出力の際に,行番号の右側に表示する'(_行番号,_何個,Line) :- writef('%t:%t %t\n',[_行番号,_何個,Line]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/668 # # [1] 授業単元:ソート # [2] 問題文(含コード&リンク): # 1. savadata.txt内にあるデータを読み取り、名前順にソートして # 全員分のLEVEL、PLAYER NAME、POINTを表示するプログラムを # 作成せよ. # # 2. savadata.txt内にあるデータを読み取り、レベル別にPOINTが上位3人までのPlayerNameとそのPOINTおよび # レベル別の全体の平均点(Average)を表示させるプログラムを作成せよ. # # 出力例) # ■EASY # Rank1 : Tanaka 1000 POINT # Rank2 : Onishi 875 POINT # Rank3 : KItano 685 POINT # Average : 256 POINT # # ■Normal # Rank1 : Kuriyama 900 POINT # Rank2 : Onishi 775 POINT # Rank3 : KItano 605 POINT # Average : 232 POINT # # savedata.txt # http://ime.nu/www.kent-web.com/pubc/book/test/uploader/uploader.cgi?mode=downld&no=5099 # # HARD Ichihashi 230 # HARD Tanaka 170 # HELL Nakamura 10 # EASY kanzaki 130 # HARD Ichihashi 20 # VERY HARD Tamura 570 # HELL Ishii 1000 # EASY kanagawa 200 # HARD Kuriyama 250 # DETH Takeda 180 # HELL Nakanishi 10 # NORMAL kamida 450 # HARD Iguchi 290 # VERY HARD Tanaka 370 # DETH Murata 800 # VERY HARD THirano 290 # HARD Kanemoto 230 # NORNAL Yano 110 # HELL Kuji 10 # EASY Arai 130 # EASY Hamada 20 # VERY HARD Satoh 120 # NORNAL ishimura 900 # EASY Ushijima 200 # HARD Kumada 230 # NORNAL Nasuno 820 # HELL Hashimoto 0 # EASY Kim 130 # HARD John 20 # VERY HARD Kimura 170 # HARD Nishioka 470 # NORNAL Honda 400 # 'savadata.txt内にあるデータを読み取り、名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する' :- 'savadata.txt内にあるデータを読み取り'(LL), '名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL). 'savadata.txt内にあるデータを読み取り'(LL) :- get_lines('savadata.txt',Lines), Lines = [_見出し|_実データならび], '各行をLEVEL,PLAYER NAME,POINTに分割する'(1,_実データならび,LL). '各行をLEVEL,PLAYER NAME,POINTに分割する'(_,[],[]). '各行をLEVEL,PLAYER NAME,POINTに分割する'(N,[_行|R1],[[N,_LEVEL,_PLAYER_NAME,_POINT]|R2]) :- split(_行,[' ','\t'],L), 'LEVEL,PLAYER NAME,POINTに分割する'(L,_LEVEL,_PLAYER_NAME,_POINT), N2 is N + 1, '各行をLEVEL,PLAYER NAME,POINTに分割する'(N2,R1,R2). 'LEVEL,PLAYER NAME,POINTに分割する'(['VERY','HARD',_PLAYER_NAME,_POINT],'VERY HARD',_PLAYER_NAME,_POINT). 'LEVEL,PLAYER NAME,POINTに分割する'([_LEVEL,_PLAYER_NAME,_POINT],_LEVEL,_PLAYER_NAME,_POINT). '名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL) :- 名前を順に(LL,LL1), ソートして(LL1,LL2), '全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL2,LL). 名前を順に(LL,LL1) :- '鍵(名前)と行番号の対を作る'(LL,LL1). '鍵(名前)と行番号の対を作る'(LL,LL1) :- findall([_NAME,_行位置],( member([_行位置,_LEVEL,_PLAYER_NAME,_POINT],LL)), LL1). ソートして(LL1,LL2) :- 整列(LL1,LL2). '全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL1,LL) :- append(_,[[_,_行番号]|R],LL1), nth1(_行番号_1,LL,[_,_LEVEL,_PLAYER_NAME,_POINT]), writef('%t %t %t\n',[_LEVEL,_PLAYER_NAME,_POINT]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/516 # # [1] 授業単元:キーボード入力 # [2] 問題文(含コード&リンク): # 打ち込む文章を表示して,それをユーザがそっくりに打ち込ませ # その正確さを判定するプログラムを作成せよ. # '打ち込む文章を表示して,それをユーザにそっくりに打ち込ませその正確さを判定する' :- 打ち込む文章を表示して(_打ち込む文章ファイル,_打ち込む文章), それをユーザにそっくりに打ち込ませ(_ユーザの打ち込んだ文章), その正確さを判定する(_打ち込む文章,_ユーザの打ち込んだ文章,_減点数,_正確さの判定), 判定を表示する(_減点数,_正確さの判定). 打ち込む文章を表示して(_打ち込む文章ファイル,_打ち込む文章) :- get_lines(_打ち込む文章ファイル,Lines), append(_,[_打ち込む文章|_],Lines), writef('%t\n',[_打ち込む文章]). それをユーザにそっくりに打ち込ませ(_ユーザの打ち込んだ文章) :- get_line(_ユーザの打ち込んだ文章). その正確さを判定する(_打ち込む文章,_ユーザの打ち込んだ文章,_減点数,_正確さの判定). atom_chars(_打ち込む文章,_打ち込む文章の文字ならび), atom_chars(_ユーザの打ち込んだ文章,_ユーザの打ち込んだ文章の文字ならび), 語彙判定(_打ち込む文章,_ユーザの打ち込んだ文章,_同一語彙数判定), 誤字脱字等判定(_打ち込む文章の文字ならび,_ユーザの打ち込んだ文章の文字ならび,_誤字脱字度数判定), 総合判定(_同一語彙数判定,_誤字脱字度数判定,_減点数,_正確さの判定). 同一語彙数判定(_打ち込む文章,_ユーザの打ち込んだ文章,_同一語彙数判定) :- 形態素解析(_打ち込む文章,_形態素解析_1), 形態素解析(_ユーザの打ち込んだ文章,_形態素解析_2), 語彙の出現数の差異(_形態素解析_1,_形態素解析_2,_語彙の出現数差異度数), _同一語彙数判定 is (-1) * 2 * _語彙の出現数差異度数. 語彙の出現数の差異(_形態素解析_1,_形態素解析_2,_語彙の出現数の差異度数) :- setof(_形態素,member(_形態素,_形態素解析_1),_整列した形態素), findall(_出現数差異,( member(_形態素,_整列した形態素), count(member(_形態素,_形態素解析_1),_度数_1), count(member(_形態素,_形態素解析_2),_度数_2), _出現数差異 is abs(_度数_1 - _度数_2)), _語彙の出現数の差異ならび), sum(_語彙の出現数の差異ならび,_語彙の出現数の差異度数). 誤字脱字等判定(_打ち込む文章の文字ならび,_ユーザの打ち込んだ文章の文字ならび,_誤字脱字度数判定) :- 誤字脱字度数(_打ち込む文章の文字ならび,_ユーザの打ち込んだ文章の文字ならび,_誤字脱字数ならび), findall(_文字数,( member([_,_文字数],_誤字脱字数ならび)), _誤字脱字文字数ならび), sum(_誤字脱字文字数ならび,_誤字脱字度数), _誤字脱字数判定 is (-1) * _誤字脱字度数. 誤字脱字度数([],[],[]). 誤字脱字度数([A,B|R1],[B|R2],[[脱字,1]|R3]) :- \+(A == B), 誤字脱字度数(R1,R2,R3). 誤字脱字度数([B|R1],[A,B|R2],[[誤字挿入,1]|R3]) :- \+(A == B), 誤字脱字度数(R1,R2,R3). 誤字脱字度数([A,B|R1],[C,B|R2],[[誤字,1]|R3]) :- \+(A == C), 誤字脱字度数(R1,R2,R3). 誤字脱字度数([A|R1],[A|R2],R3) :- 誤字脱字度数(R1,R2,R3). 総合判定(_同一語彙数判定,_誤字脱字度数判定,_減点数,_正確さの判定) :- _減点数 is _同一語彙数判定 + _誤字脱字度数判定, 分類判定(_減点数,_正確さの判定). 分類判定(0,'1級'). 分類判定(_減点数,'2級') :- _減点数 < 0, _減点数 >= (-3). 分類判定(_減点数,'3級') :- _減点数 < (-3), _減点数 >= (-7). 分類判定(_減点数,'4級') :- _減点数 < (-7), _減点数 >= (-12). 分類判定(_減点数,'5級') :- _減点数 < (-12). 判定を表示する(_減点数,_正確さの判定) :- writef('入力された文章の正確さ判定は誤り減点数 %t で %t です。\n',[_減点数,_正確さの判定]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/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/159 # # ●正規表現の使用環境 # テキスト # # ●検索か置換か? # 置換 # # ●説明 # 文章内の指定した数の改行毎に、行を一段開けたい。 # 下記例文なら改行三つごとに行を一段開けたい。 # # ●対象データ # (例文) # 人は誰しも初体験にはほろ苦く、甘酸っぱい思い出があるものだが、人生の諸先輩方はどんな童貞喪失体験をしたのか? # 「シリーズ初体験」−−現在70歳の会社役員(兵庫県)が当時の思い出を語った。 # 中学2年の時、国語の女教師に「勉強を教えてあげるから家においで」といわれ、夏休みに入ってすぐに先生の家を訪れました。 # 教師になって3年目、美人ではないけれど、私にとっては優しいお姉さんのような存在でした。 # 何人かいるのかなと思ったんですが、先生の家に行くと私の他は誰もいませんでした。 # 勉強を教わり、夕食をご馳走になり、その日は泊めてもらいました。 # 夜中、下半身がもぞもぞするので目が覚めると、先生が私の浴衣の裾を広げていました。 # # ●希望する結果 # 人は誰しも初体験にはほろ苦く、甘酸っぱい思い出があるものだが、人生の諸先輩方はどんな童貞喪失体験をしたのか? # 「シリーズ初体験」−−現在70歳の会社役員(兵庫県)が当時の思い出を語った。 # 中学2年の時、国語の女教師に「勉強を教えてあげるから家においで」といわれ、夏休みに入ってすぐに先生の家を訪れました。 # # 教師になって3年目、美人ではないけれど、私にとっては優しいお姉さんのような存在でした。 # 何人かいるのかなと思ったんですが、先生の家に行くと私の他は誰もいませんでした。 # 勉強を教わり、夕食をご馳走になり、その日は泊めてもらいました。 # # 夜中、下半身がもぞもぞするので目が覚めると、先生が私の浴衣の裾を広げていました。 # ------------------------- # よろしくお願いします。 # # '文章内の指定した数の改行毎に、行を一段開ける'(_ファイル,_n行毎) :- get_lines(_ファイル,Lines), 'n行毎に改行を挿入する'(Lines,Lines2), 表示する(_ファイル,Lines2). 'n行毎に改行を挿入する'([A,B,C|R1],[A,B,C,'\n'|R2]) :- 'n行毎に改行を挿入する'(R1,R2),!. 'n行毎に改行を挿入する'(L,L). 表示する(_ファイル,Lines) :- put_lines(_ファイル,Lines). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/87 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク): # 次のように1行に氏名、科目ごとの成績が記録されたファイル # (ファイル名:result.dat)があるとする。 # Name English Science Math Sociology # Ichiro 100 30 40 90 # Jiro 100 80 70 100 # Saburo 80 90 100 60 # Shiro 95 90 95 80 # Goro 73 85 90 98 # このファイルを読み込んで各生徒の平均点を求め、平均点の高い順に行を並べ替えて表示するプログラムを作成せよ。 # (表示には平均点を含む) # '1行に氏名、科目ごとの成績が記録されたファイル(ファイル名:result.dat)があるとする。このファイルを読み込んで各生徒の平均点を求め、平均点の高い順に行を並べ替えて表示する' :- get_lines('result.dat',[_第一行|LL]), findall([_平均点,_氏名],( member(Line,LL), split(Line,[' '],[_|_得点ならび]), avg(_得点ならび,_平均点)), _平均点ならび), 平均点の高い順に行をならび替えて表示する(_第一行,LL,_平均点ならび). 平均点の高い順に行をならび替えて表示する(_第一行,LL,_平均点ならび) :- 平均点の高い順に(_平均点ならび,_平均点の高い順の氏名ならび), 行をならび替えて(_第一行,LL,_平均点の高い順の氏名ならび,_表示行ならび), 表示する(_表示行ならび). 平均点の高い順に(_平均点ならび,LL,_行のならび) :- sort(_平均点ならび,_整列した平均点), reverse(_整列した平均点,_平均点の高い順にならび替えた行), findall(_氏名,( member([_,_氏名],_平均点の高い順にならび替えた行)), _平均点の高い順の氏名ならび). 行をならび替えて(_第一行,LL,_平均点の高い順の氏名ならび,[_第一行|_表示行ならび]) :- findall([_氏名,Line],( member(Line,LL), split(Line,[' '],[_氏名|_])), LL1), findall(L,( member(_氏名,_平均点の高い順の氏名ならび), member([_氏名,Line],LL1)), _表示行ならび). 表示する(_表示行ならび) :- append(_,[_表示行|R],_表示行ならび), writef('%t\n',[_表示行]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/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/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/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/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/1322562648/172 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 前日商品別に在庫を登録したファイル "zaiko.txt" と # 当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し、 # 新たな在庫ファイル "zaiko_new.txt" を出力するプログラムを作成せよ。 # ファイルの各レコード(行)は次の形式であり、ひとつの商品に対してひとつのレコードとする。 # # 商品コード 整数 4桁 # 数量 数字 4桁 # # なお、各ファイルは商品コードの昇順にソートされているものとする。 # ※実行例:http://ime.nu/s2.etowns.slyip.net/~c_cpp_homework/cgi-bin/joyful/img/256.txt # '前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し、新たな在庫ファイル "zaiko_new.txt" を出力する' :- '前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し'(LL1,LL2), '新たな在庫ファイル "zaiko_new.txt" を出力する'(LL1,LL2). '前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し'(LL1,LL2) :- get_lines('zaiko.txt',Lines1), get_lines('nyuko.txt',Lines2), 行を商品番号と数量に分解する(Lines1,LL1), 行を商品番号と数量に分解する(Lines2,LL2). 行を商品番号と数量に分解する(Lines,LL) :- findall([_商品番号,_数量],( append(_,[_行|_],Lines), 商品番号と数量に分解(_行,_商品番号,_数量)), LL). 商品番号と数量に分解(_行,_商品番号,_数量) :- sub_atom(_行,0,4,4,S1), sub_atom(_行,4,4,0,S2), atom_to_term(S1,_商品番号,_), atom_to_term(S2,_数量,_). '新たな在庫ファイル "zaiko_new.txt" を出力する'(LL1,LL2) :- '新たな在庫ファイル'(LL1,LL2,LL3), 出力する('zaiko_new.txt',LL3). '新たな在庫ファイル "zaiko_new.txt" を出力する'(LL1,[],LL1) :- !. '新たな在庫ファイル "zaiko_new.txt" を出力する'([],LL2,LL2) :- !. '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号,_数量_1]|R1],[[_商品番号,_数量_2]|R2],[[_商品番号,_数量_3]|R3]) :- _数量_2_1 is _数量_1 + _数量_2, 入庫の集約(_商品番号,R2,_数量_2_1,_数量_3,R2_2), '新たな在庫ファイル "zaiko_new.txt" を出力する'(R1,R2_2,R3). '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号_1,_数量_1]|R1],[[_商品番号_2,_数量_2]|R2],[[_商品番号_1,_数量_1]|R3]) :- _商品番号_1 @< _商品番号_2, '新たな在庫ファイル "zaiko_new.txt" を出力する'(R1,[[_商品番号_2,_数量_2]|R2],R3). '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号_1,_数量_1]|R1],[[_商品番号_2,_数量_2]|R2],[[_商品番号_2,_数量_3]|R3]) :- _商品番号_1 @> _商品番号_2, 入庫の集約(_商品番号_2,R2,_数量_2,_数量_3,R2_2), '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号_1,_数量_1]|R1],R2_2,R3). 入庫の集約(_商品番号,[],_数量_3,_数量_3,[]) :- !. 入庫の集約(_商品番号,[[_商品番号,_数量]|R],_数量_2_1,_数量_3,R2_2) :- _数量_2_2 is _数量_2_1 + _数量, 入庫の集約(_商品番号,R,_数量_2_2,_数量_3,R2_2),!. 入庫の集約(_商品番号,[[_商品番号_2_2,_数量]|R2],_数量_3,_数量_3,[[_商品番号_2,_数量_2]|R2]) :- \+(_商品番号=_商品番号_2). 出力する(File,LL) :- open(File,write,Outstream), append(_,[[_商品番号,_数量]|R],LL), writef(Outstream,'%4r%4r\n',[_商品番号,_数量]), R = [], close(Outstream). % 以下のサイトは # 出典:: 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)改行...といったような表示で書き込む。 'テキストデータ3つ(data.txt data2.txt data3.txt)を(それぞれ内容は違う)読み込む。それぞれに1次元の離散コサイン変換を行う。変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。' :- 'テキストデータ3つ(data.txt data2.txt data3.txt)を(それぞれ内容は違う)読み込む'(Lines1,Lines2,Lines3), テキストデータ3つを3つのならびに変換(Lines1,Lines2,Lines3,L1_1,L2_1,L3_1), それぞれに1次元の離散コサイン変換を行う(L1_1,L2_1,L3_1,L1_2,L2_2,L3_2), '変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。'(L1_2,L2_2,L3_2). テキストデータ3つを3つのならびに変換(L1,L2,L3) :- テキストデータを3つ取得(Lines1,Lines2,Lines3), 要素ならびに変換(Lines1,Lines2,Lines3,L1,L2,L3). テキストデータを3つ取得(Lines1,Lines2,Lines3) :- get_lines('data.txt',Lines1), get_lines('data2.txt',Lines2), get_lines('data3.txt',Lines3). それぞれに1次元の離散コサイン変換を行う(L1_1,L2_1,L3_1,L1_2,L2_2,L3_2) :- '1次元の離散コサイン変換'(L1_1,L1_2), '1次元の離散コサイン変換'(L2_1,L2_2), '1次元の離散コサイン変換'(L3_1,L3_2). '1次元の離散コサイン変換'(L1,L2) :- append([_第一要素],L,[_最終要素],L1), length(L1,N), '1次元の離散コサイン変換'(L,L,N,-1,_第一要素,_最終要素,L2). '1次元の離散コサイン変換'([],_,_,_,_第一要素,_最終要素,[]). '1次元の離散コサイン変換'([N|R1],L,N,-1,_第一要素,_最終要素,[Xk|R2]) :- findsum(U,( append(L0,[B|_],L), length([_|L0],K), U is _最終要素 * cos(pi/(N-1) * N * K)), Sum), Xk is _第一要素/2 + Sum + ((-1) / 2) * (_最終要素-1)), '1次元の離散コサイン変換'(R1,L,N,1,_第一要素,_最終要素,R2). '1次元の離散コサイン変換'([N|R1],L,N,1,_第一要素,_最終要素,[Xk|R2]) :- findsum(U,( append(L0,[B|_],L), length([_|L0],K), U is _最終要素 * cos((pi / (N-1)) * N * K), Sum), Xk is _第一要素/2 + Sum + ((1 / 2) * (_最終要素-1)), '1次元の離散コサイン変換'(R1,L,N,-1,_第一要素,_最終要素,R2). '変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。'(L1,L2,L3) :- open('data4.txt',write,Outstream), '変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。'(Outstream,L1,L2,L3), close(Outstream). '変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。'(_,[],[],[]). '変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。'(Outstream,[A|R1],[B|R2],[C|R3]) :- writef(Outstream,'%t,%t,%t\n',[A,B,C]), '変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。'(Outstream,R1,R2,R3). % 以下のサイトは # 出典:: 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/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/1309076891/523 # # 【 課題 】キーボードで生徒のデータを入力するプログラムを作成せよ # データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。 # 【 形態 】Javaアプリケーション(main()で開始 # 【 GUI  】制限なし # 【 期限 】2011年11月24日(木) # 【 Ver  】java version 1.6.0_22 # 【 補足 】作ってみたものの、上手く行きません。 # http://ime.nu/ideone.com/8gqKi # 何処がどう間違っているか指摘していただければ幸いです。 # # 'キーボードで生徒のデータを入力する。データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。' :- repeat, 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断), 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,_診断),!. 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 指示に従い一行入力する('名前,ID,学年,電話番号 をカンマ区切りで入力して下さい(終了したい時は改行のみ) : ',Line), 入力診断(Line,_名前,_ID,_学年,_電話番号,_診断), \+(_診断 = 再入力),!. 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断). 指示に従い一行入力する(_指示,Line) :- writef('%t',[_指示]), get_line(Line),!. 入力診断('',_名前,_ID,_学年,_電話番号,終了) :- !. 入力診断(Line,_名前,_ID,_学年_1,_電話番号,入力完了) :- split(Line,[','],[_名前,_ID,_学年,_電話番号]), 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年),!. 入力診断(Line,_名前,_ID,_学年,_電話番号,再入力) :- writef('入力された %t からは求める生徒データが得られません。再入力をお願いします。\n',[Line]). 学年の入力が負の場合メッセージを表示して中断する(_学年,_学年) :- _学年 >= 0,!. 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年) :- _学年_1 < 0, writef('学年データ%tが負数です。再入力をしますか? y or n : ',[_学年_1]), get_line(y), 学年の再入力(_学年),!. 学年の再入力(_学年) :- write('学年を入力して下さい : '), get_line(Line), 学年再入力診断(Line,_学年),!. 学年再入力診断(Line,_学年) :- atom_to_term(Line,_学年,_), integer(_学年), _学年 >= 0,!. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,終了) :- !. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,入力完了) :- assertz(生徒のデータ(_名前,_ID,_学年,_電話番号)), fail. % % http://nojiriko.asia/prolog/j71_523.html とは僅かな違い。 % 何処が違うのか、捜すのさえ難しいくらいだが。 % どちらが好ましい表現かという問題。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/523 # # 【 課題 】キーボードで生徒のデータを入力するプログラムを作成せよ # データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。 # 【 形態 】Javaアプリケーション(main()で開始 # 【 GUI  】制限なし # 【 期限 】2011年11月24日(木) # 【 Ver  】java version 1.6.0_22 # 【 補足 】作ってみたものの、上手く行きません。 # http://ime.nu/ideone.com/8gqKi # 何処がどう間違っているか指摘していただければ幸いです。 # # 'キーボードで生徒のデータを入力する。データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。' :- 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断), 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,_診断),!. 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 指示に従い一行入力する('名前,ID,学年,電話番号 をカンマ区切りで入力して下さい(終了したい時は改行のみ) : ',Line), 入力診断(Line,_名前,_ID,_学年,_電話番号,_診断), \+(_診断 = 再入力). 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断). 指示に従い一行入力する(_指示,Line) :- writef('%t',[_指示]), get_line(Line),!. 入力診断('',_,_,_,_,終了) :- !. 入力診断(Line,_名前,_ID,_学年_1,_電話番号,入力完了) :- split(Line,[','],[_名前,_ID,_学年,_電話番号]), 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年),!. 入力診断(Line,_名前,_ID,_学年,_電話番号,再入力) :- writef('入力された %t からは求める生徒データが得られません。再入力をお願いします。\n',[Line]). 学年の入力が負の場合メッセージを表示して中断する(_学年,_学年) :- _学年 >= 0,!. 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年) :- _学年_1 < 0, writef('学年データ%tが負数です。再入力をしますか? y or n : ',[_学年_1]), get_line('学年データ%tが負数です。再入力をしますか? y or n : ',y), 学年の再入力(_学年),!. 学年の再入力(_学年) :- write('学年を入力して下さい : '), get_line(Line), 学年再入力診断(Line,_学年),!. 学年再入力診断(Line,_学年) :- atom_to_term(Line,_学年,_), integer(_学年), _学年 >= 0,!. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,終了) :- !. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,入力完了) :- assertz(生徒のデータ(_名前,_ID,_学年,_電話番号)), fail. % 以下のサイトは # 出典:: 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/383 # # # [1] 授業単元:プログラミング演習 # # [2] 問題文(含コード&リンク): # # # http://ime.nu/codepad.org/bMCs37CD # # # 1): # n個の実数からなるファイルを読み込み、それらの最大値、最小値、および平均値をディスプレイに出力するプログラムを作成し、動作を確認せよ。 # ただし、整数nと入力ファイル名はコマンドライン引数とすること。 # また、プログラム内ではn個の実数は配列x[]に読み込むこと、すなわち、 # double *x; # int n; # n=atoi(argv[1]); # x=(double *)malloc(sizeof(double)*n); # # 2): # #include # int main(){ # int x=100; # int y=500; # int *ptr=&x; # # printf("*ptr=%d\n",*ptr); # *ptr=400; # printf("x=%d\n",x); # printf("y=%d\n",y); # # return 0; # } # を関数化せよ。 # すなわち、実数からなる配列x[]とその要素数nが与えられたとき、それらnこの実数の最大値、採草地、および平均値を求める関数。 # void max_min_mean(double x[],int n,double *a,double *b,,double *c) # を作成し、動作を確認せよ。 # # 3): # 西暦で表された、年、月、日、の3つの値が与えられていたとして、その年内で経過日数を求めるプログラムを作成する。 # ?ヶ月ごとの日数を配列に格納するが、うるう年があるため、?行?列の多次元配列を用いることとする。 # # int mdays[][12]={{日数を入れる},{うるう年の日数を入れる}}; # # 結果は標準入出力とする。 # # # 4): # 身体検査データを構造体配列として格納し、身長の平均値と視力の分布を求めるプログラムを作成する。身長検査データは標準入力からでもプログラムに記述でもどちらでもいい。 # # 結果 平均身長 〇〇cm #    視力の分布 0.0〜:○人 #          0.1〜:○人(以下略 # # struct{ # # } 'n個の実数からなるファイルを読み込み、それらの最大値、最小値、および平均値をディスプレイに出力する'(_n個,_残り実数ならび) :- 'n個の実数からなるファイルを読み込み'(_実数ならび,_残り実数ならび), 'それらの最大値、最小値、および平均値をディスプレイに出力する'(_実数ならび). 'n個の実数からなるファイルを読み込み'(_n個,_ファイル,_実数ならび), get_lines(_ファイル,Lines), 'n個の実数ならびを生成'(_n個,Lines,_実数ならび,_残り実数ならび). 'n個の実数ならびを生成'(_n個,Lines,_実数ならび,_残り実数ならび) :- length(_実数ならび,_n個), findall(_実数,( append(L0,[_実数|_],Lines), float(_実数)), _実数ならびの一), append(_実数ならび,_残り実数ならび,_実数ならびの一),!. 'それらの最大値、最小値、および平均値をディスプレイに出力する'(_実数ならび) :- 最大値(_実数ならび,_最大値), 最小値(_実数ならび,_最小値), 平均値(_実数ならび,_平均値), writef('最大値 = %t,最小値 = %t,平均値 = %t\n',[_最大値,_最小値,_平均値]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最大値([A|L],_最大値) :- !. 最大値(L,A,_最大値), 最大値([],_最大値,_最大値) :- !. 最大値([A|R],_最大値_1,_最大値) :- A @> _最大値_1, 最大値(R,A,_最大値). 最大値([A|R],_最大値_1,_最大値) :- 最大値(R,_最大値_1,_最大値). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最大値([_最大値],_最大値) :- !. 最大値([A1,A2],_最大値) :- 大きい方が最大値(A1,A2,_最大値),!. 最大値(_実数ならび,_最大値) :- append(L1,L2,_実数ならび), length(L1,N), length(L2,N), 最大値(L1,Max1), 最大値(L2,Max2), 大きい方が最大値(Max1,Max2,_最大値),!. 最大値([A|_実数ならび],_最大値) :- 最大値(_実数ならび,Max1), 大きい方が最大値(A,Max1,_最大値). 大きい方が最大値(Max1,Max2,Max1) :- Max1 @>= Max2,!. 大きい方が最大値(Max1,Max2,Max2) :- Max1 @< Max2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最小値([A|L],_最小値) :- !. 最小値(L,A,_最小値), 最小値([],_最小値,_最小値) :- !. 最小値([A|R],_最小値_1,_最小値) :- A @< _最小値_1, 最小値(R,A,_最小値). 最小値([A|R],_最小値_1,_最小値) :- 最小値(R,_最小値_1,_最小値). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最小値([_最小値],_最小値) :- !. 最小値([A1,A2],_最小値) :- 小きい方が最小値(A1,A2,_最小値),!. 最小値(_実数ならび,_最小値) :- append(L1,L2,_実数ならび), length(L1,N), length(L2,N), 最小値(L1,Max1), 最小値(L2,Max2), 小きい方が最小値(Max1,Max2,_最小値),!. 最小値([A|_実数ならび],_最小値) :- 最小値(_実数ならび,Max1), 小きい方が最小値(A,Max1,_最小値). 小きい方が最小値(Max1,Max2,Max1) :- Max1 @< Max2,!. 小きい方が最小値(Max1,Max2,Max2) :- Max1 @> Max2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 平均値(L,_平均値) :- sum(L,_合計), length(L,_要素数), _平均値 is _合計 / _要素数. sum([],0). sum([A|R],S) :- sum(R,S1), S is A + S1. % 以下のサイトは # # 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). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/799 # # テキストファイルの中にある複数の英字の文字列をソートして書きこむプログラム教えてください # # MOJI # EIGO # NIPPON # #  ↓ # # EIGO # MOJI # NIPPON # # 'テキストファイルの中にある複数の英字の文字列をソートして書きこむ'(_テキストファイル) :- get_lines(_テキストファイル,Lines), 整列(Lines,整列したLines), put_lines(_テキストファイル,_整列したLines). 整列([],[]). 整列([_軸要素|_残り要素],整列したLines) :- 軸要素で分割する(_軸要素,_残り要素,_軸要素より小さいか等しい要素ならび,_軸要素より大きい要素ならび), 整列(_軸要素より小さいか等しい要素ならび,_整列した軸要素より小さいか等しい要素ならび), 整列(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), append(_整列した軸要素より小さいか等しい要素ならび,[_軸要素|_整列した軸要素より大きい要素ならび],_整列したLines). 軸要素で分割する([],[],[]). 軸要素で分割する(_軸要素,[A|R],[A|R1],R2) :- A @=< _軸要素, 軸要素で分割する(_軸要素,R,R1,R2). 軸要素で分割する(_軸要素,[A|R],R1,[A|R2]) :- A @> _軸要素, 軸要素で分割する(_軸要素,R,R1,R2). % 以下のサイトは # # 行読み込み述語 get_line/2,get_line/1 です。 # ここでの焦点は改行なしにいきなりEOFが来た時の処理。 # at_end_of_stream で処理をするのですが、最後の文字として、 # 改行があったのかどうかを返すことはできません。 # % % get_chars/2 : get_chars(_ファイル,_文字リスト) % ファイル全体をリストとして取得します % get_chars(File,Chars) :- open(File,read,Instream), get_chars_1(Instream,Chars), close(Instream). get_chars_1(Instream,[]) :- at_end_of_stream(Instream),!. get_chars_1(Instream,[Char|R]) :- get_char(Instream,Char), get_chars_1(Instream,R). % % get_lines/2 : get_lines(_ファイル名,_行リスト) % ファイル全体を行のリストとして取得します % 第一引数はストリームではなくファイルです % get_lines(File,Lines) :- open(File,read,Instream), get_lines_1(Instream,Lines), close(Instream). get_lines_1(Instream,[]) :- at_end_of_stream(Instream),!. get_lines_1(Instream,[Line|R]) :- get_line(Instream,Line), get_lines_1(Instream,R). % % get_line/2 : get_line(_ストリーム,_行) % 改行がくるまで、アトムとして取得します % get_line(Stream,end_of_file) :- at_end_of_stream(Stream),!. get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,C,[C]) :- at_end_of_stream(Stream),!. get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). % % 標準入力の場合。 % get_line(X) :- current_input(Stream), get_line(Stream,X). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305217361/661 # # 001 # 002 # 003 # ・・・ # 012 # 013 # ・・・ # 099 # 100 # 101 # ・・・ # と言うように数字の頭にゼロを付けて # 決まった桁数にするにはどうしたらいいですか? # # ファイル行の数字の頭にゼロを付けて決まった桁数にする(_ファイル,_決まった桁数) :- get_lines(_ファイル,Lines), append(_,[Line|R],Lines), 頭部零文字列(_決まった桁数,Line,_頭部零文字列), writef('%t\n',[_頭部零文字列]), R = []. 頭部零文字列(_決まった桁数,_数値文字列,_頭部零文字列) :- atom(_数値文字列), atom_length(_数値文字列,_文字列長), length(L,_決まった桁数), atom_chars(_数値文字列,Chars), append(L0,Chars,L), all(L0,'0'), concat_atom(L,_頭部零文字列),!. 頭部零文字列(_決まった桁数,_数値,_頭部零文字列) :- number(_数値文字列), number_chars(_数値,Chars), length(L,_決まった桁数), append(L0,Chars,L), all(L0,'0'), concat_atom(L,_頭部零文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/937 # # [1] 授業単元:プログラミング問題 # [2] 問題文(含コード&リンク):ファイルに格納された適当な文字列を代入した # 連結リストからある特定の文字列を削除し,削除後のリストをファイルに出力する関数を作成せよ. # # 'ファイルに格納された適当な文字列を代入した連結リストからある特定の文字列を削除し,削除後のリストをファイルに出力する'(_ファイル,_削除する特定の文字列) :- get_lines(_ファイル,Lines), 特定の文字列を削除し(_削除する特定の文字列,Lines,Lines2), put_lines(_ファイル,Lines2). 特定の文字列を削除し(_,[],[]) :- !. 特定の文字列を削除し(_削除する特定の文字列,[_削除する特定の文字列|R1],R2) :- 特定の文字列を削除し(_削除する特定の文字列,R1,R2),!. 特定の文字列を削除し(_削除する特定の文字列,[A|R1],[A|R2]) :- 特定の文字列を削除し(_削除する特定の文字列,R1,R2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/914 # # [1] 授業単元:プログラム概論 # [2] 問題文(含コード&リンク):ファイルの商品名を順に読み込んで、オーダー #                   の順を出力する関数を作成しなさい. # http://ime.nu/codepad.org/q5G3hxdB ←ここまで作りましたが、"ファイルが見つかりません"と表示されます. # # 'ファイルの商品名を順に読み込んで、オーダーの順を出力する'(_ファイル) :- get_lines(_ファイル,Lines), append(_,[Line|R],Lines), sub_atom(Line,0,20,_,_商品名), writef('%t\n',[_商品名]), R = []. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'ファイルの商品名を順に読み込んで、オーダーの順を出力する'(_ファイル) :- open(_ファイル,read,Instream), '商品名を順に読み込んで、オーダーの順を出力する'(Instream), close(Instream). '商品名を順に読み込んで、オーダーの順を出力する'(Instream) :- at_end_of_stream(Instream),!. '商品名を順に読み込んで、オーダーの順を出力する'(Instream) :- get_line(Instream,Line), sub_atom(Line,0,20,_,_商品名), writef('%t\n',[_商品名]), '商品名を順に読み込んで、オーダーの順を出力する'(Instream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/662 # # [1] 課題 # [2] .tsv形式のファイルをネット上から呼び出して、一番最後の行を引用して表示するプログラムを教えてください # [3] Mac OS X C++ # [4] 7/16 19時まで # [5] 関数呼び出しまで # 宜しくお願いします。 # '.tsv形式のファイルをネット上から呼び出して、一番最後の行を引用して表示する'(_ファイル) :- get_lines(_ファイル,Lines), last(Lines,Line), writef('%t\n',[Line]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '.tsv形式のファイルをネット上から呼び出して、一番最後の行を引用して表示する'(_URL) :- w3c(URL,Chars), 最終行を捜す(Chars,_最終行). 最終行を捜す(Chars,_最終行) :- 一番最初の行(Chars,L,R), 最終行を捜す(R,L,_最終行). 最終行を捜す([],L,_最終行) :- atom_chars(_最終行,L),!. 最終行を捜す(R,_,_最終行) :- 最終行を捜す(R,_最終行). 一番最初の行(['\n'|R],[],R) :- !. 一番最初の行([C|R1],[C|R2],R) :- 一番最初の行(R1,R2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/586 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/3dkRTmjJ # # 生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。 # このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人の # BMI値および肥満か否かを列挙するプログラムkadai13-1.cを書きなさい。 # ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分から # ないものとする。 # # ヒント: # ○何をしなければならないかを大まかに書き下してみよう。 #  1. ファイルのオープン(これに先立ってファイル名を取得する必要がある) #  2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう) #  3.データの読み込み #  4.BMIの算出 #  5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい) #  6. 画面表示 # # ○BMIとは? # BMIは次のようにして計算されるものとする。 # BMI値=体重(キログラム)÷(身長(メートル))^2 # '^2'は二乗を意味する。 # このBMI値が25を越えると、肥満とみなされる。 # # ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。 # rewind(FILE *stream); # # ○wh-list.dat の中身は以下の通りで、氏名 身長(cm) 体重(kg)が列挙されている。 # yamada 157 62.5 # tanaka 180 45.1 # yoneda 190 50.5 # yamashita 210 80.5 # toyama 140 80 # .... # # ○例えば画面表示は # toyama BMI=40.816326 himan # nagashima BMI=29.551020 himan # yamashita BMI=27.777779 himan # takenaka BMI=27.716263 himan # . # 中略 # . # nakano BMI=23.179012 # yamashita BMI=18.253969 # . # . # # 等と表示されるものとする。 # '生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する' :- user_parameters([_ファイル名]), 'ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_ファイル名,Instream), データの読み込み(Instream,Lines), 'BMIの算出と判定'(Lines,_BMIと判定ならび), 'BMIの大きい者順に並べ替える'(_BMIと判定ならび,_降順に整列したBMIと判定ならび), 画面表示(_降順に整列したBMIならび),!. 'ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_ファイル名,Instream) :- open(_ファイル名,read,Instream),!. データの読み込み(Instream,Lines) :- get_lines(Instream,Lines),!. 'BMIの算出と判定'([],[]) :- !. 'BMIの算出と判定'([Line|R1],[[_BMI,_名前,_判定]|R2]) :- split(Line,[' '],[_名前,_身長単位センチメートル,_体重]), _身長単位メートル is _身長単位センチメートル / 100, 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長単位メートル,_BMI値), 'BMI値が25を越えると、肥満とみなされる'(_BMI値,_判定), 'BMIの算出と判定'(R1,R2). 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長,_BMI値) :- _BMI値 is _体重 * _身長 ^ 2. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,肥満) :- _BMI値 > 25,!. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,''). 'BMIの大きい者順に並べ替える'(_BMIならび,_降順に整列したBMIならび) :- バブルソート(_BMIならび,_昇順に整列したBMIならび), reverse(_昇順に整列したBMIならび,_降順に整列したBMIならび). バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一), !, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). 画面表示(_降順に整列したBMIならび) :- append(_,[[_BMI,_名前,_判定]|R],_降順に整列したBMIならび), writef('%t %t %t\n',[_名前,_BMI,_判定]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/256 # # よろしくお願いします。 # ●正規表現の使用環境 # Ruby # ●検索か置換か? # 検索 # ●説明 # 株価のみを抜出し、DBに入れていく予定でいます。 # ●対象データ # http://ime.nu/stocks.finance.yahoo.co.jp/stocks/history/?code=9984.T # のソースから # # ●希望する結果 # 2011年6月30日 # 3,010 # 3,050 # 2,986 # 3,030 # 8,376,600 # 3,030 # . # . # . # 日付、始値、高値、安値、終値、出来高、調整後終値 # です。 # http://ime.nu/stocks.finance.yahoo.co.jp/stocks/history/?code=9984.T # . # . # . # <td>2011年6月30日</td> # <td>3,010</td> # <td>3,050</td> # <td>2,986</td> # <td>3,030</td> # <td>8,376,600</td> # <td>3,030</td> # . # . # このページのソースから正規表現で、下記のように日付と株価の部分だけ抜き出すにはどうしたらよいでしょうか? # 2011年6月30日 # 3,010 # 3,050 # 2,986 # 3,030 # 8,376,600 # 3,030 # . # . # . # . # # 言語はRubyで、([^<>]+)などで色々やってみましたが、どうにもうまく抜き出せません。 # また、webのHTMLから、正規表現である程度特定して文字列を抜き出し、 # その特定して抜き出した文字列に再度正規表現で、文字列を特定していくという # 方法は可能でしょうか? # よろしくお願いします。 # 'ページのソースから正規表現で、下記のように日付と株価の部分だけ抜き出す'(WebURL,_日付か株価) :- get_lines(WebURL,Lines), 日付と株価行を絞り込む(Lines,Lines2), 絞り込んだ日付と株価行からデータ部分を切り取る(Lines2,_日付か株価). 日付と株価行を絞り込む(Lines,Lines2) :- 日付と株価tableタグを捜す(Lines,R1), 日付と株価行のみ選別(R1,Lines2). 日付と株価tableタグを捜す(Lines,R1) :- append(_,[Line1|R1],Lines), sub_atom(Lines,0,7,_,'

'),!,fail;true)), Lines2),!. 絞り込んだ日付と株価行からデータ部分を切り取る(Lines2,_日付か株価) :- append(_,[Line2|_],Lines2), sub_atom(Line2,0,4,_,'
'), sub_atom(Line2,4,_,5,_日付か株価). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/108 # # 以下のCのプログラム "test.c" から # 電話番号情報を抜き取り述語 電話帳/2 を定義しなさい。 # 電話番号はperson型の構造体 telbook として定義されている。 # # #include <stdio.h> # #include <string.h> # #define MAX 100 # struct person { # char name[MAX]; # char telno[MAX]; # }; # int search(struct person telbook[], int n, char *name) # { # /* ... */ # } # int main(void) # { # char name[MAX]; # struct person telbook[] = # { {"Taro", "090-111-1111"}, # {"Hanako", "090-222-2222"}, # {"Ichiro", "090-333-3333"}, # {"Jiro", "090-444-4444"}, # {"Hanayo", "090-555-5555"} }; # int n = 5; /* 電話帳に登録された人数 */ # int idx; # # printf("名前 > "); scanf("%s", name); # idx = search(telbook, n, name); # if (idx < 0) { # printf("該当者なし\n"); # } else { # printf("%s\n", telbook[idx].telno); # } # return 0; # } # # 'Cのプログラム "test.c" から電話番号情報を抜き取り述語 電話帳/2 を定義する' :- get_lines('test.c',Lines), telbookを捜す(Lines,R), 電話帳を定義する(R). telbookを捜す(Lines,R) :- append(L0,[_行|R],Lines), sub_atom(_行,_,_,_,'struct person telbook[];'),!. 電話帳を定義する(Lines) :- append(_,[_行|R],Lines), split(_行,[' ','{','"','}'],[_名前,_電話番号]), assertz(電話帳(_名前,_電話番号)), '}が2回出現'(R),!. '}が2回出現'([_行|_]) :- count(sub_atom(_行,_,1,_,'}'),2),!. '}が2回出現'([]). % 以下のサイトは # [1] 授業単元: 情報処理 # [2] 問題文(含コード&リンク): # テキストファイルの入力に対して行の文字数の短い順に並べて出力しなさい。 # 空行は出力しないこと。 # # 例) # abcd # abcdef # ab # abc # # 出力結果: # ab # abc # abcd # abcdef 'テキストファイルの入力に対して行の文字数の短い順に並べて出力しなさい。空行は出力しないこと'(_ファイル) :- テキストファイルの入力(_ファイル,_テキストならび), 行の文字数と行位置のならびを生成する(_テキストならび,_行の文字数と行位置のならび), 短い順に並べて(_行の文字数と行位置のならび,_整列した行の文字数と行位置のならび), 出力する(_テキストならび,_整列した行の文字数と行位置のならび),!. テキストファイルの入力(_ファイル,_テキストならび) :- get_lines(_ファイル,_テキストならび). 行の文字数と行位置のならびを生成する(_テキストならび,_行の文字数と行位置のならび) :- findall([_文字数,_行位置],( テキスト行を取り出し文字数と行位置を得る(_テキストならび,_文字数,_行位置)), _行の文字数と行位置のならび). テキスト行を取り出し文字数と行位置を得る(_テキストならび,_文字数,_行位置) :- append(L0,[_テキスト行|_],_テキストならび), subatom(_テキスト行,0,_文字数,0,_テキスト行), 行位置はL0の要素数よりひとつ大きな数(L0,_行位置). 行位置はL0の要素数よりひとつ大きな数(L0,_行位置) :- length([_|L0],_行位置). 短い順に並べて(_行の文字数と行位置のならび,_整列した行の文字数と行位置のならび) :- sort(_行の文字数と行位置のならび,_整列した行の文字数と行位置のならび). 出力する(_テキストならび,_整列した行の文字数と行位置のならび) :- 整列した行から順に行位置を取り出し(_整列した行の文字数と行位置のならび,_行位置,_残り行ならび), 行位置からテキスト行を取り出す(_行位置,_テキストならび,_テキスト行), writef('%t\n',[_テキスト行]), _残り行ならび = []. 整列した行から順に行位置を取り出し(_整列した行の文字数と行位置のならび,_行位置,_残り行ならび) :- append(_,[[_,_行位置]|_残り行ならび],_整列した行の文字数と行位置のならび). 行位置からテキスト行を取り出す(_行位置,_テキストならび,_テキスト行) :- nth1(_行位置,_テキストならび,_テキスト行). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/962 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 読み込むファイルはinput.txtに固定されていたが、それを拡張する。 # プログラム実行時に、ファイル名を入力させ、ファイルが読み込み出来ない場合には、ファイル名を繰り返し再入力させるように改良しなさい。 # 'プログラム実行時に、ファイル名を入力させ、ファイルが読み込み出来ない場合には、ファイル名を繰り返し再入力させる'(Lines) :- ファイル名を入力させ(File), 全行を読み込む(File,Lines),!. 'プログラム実行時に、ファイル名を入力させ、ファイルが読み込み出来ない場合には、ファイル名を繰り返し再入力させる'(Lines) :- 'プログラム実行時に、ファイル名を入力させ、ファイルが読み込み出来ない場合には、ファイル名を繰り返し再入力させる'(Lines). 全行を読み込む(File,Lines) :- get_lines(File,Lines),!. 全行を読み込む(File,Lines) :- writef('%tの入力に失敗しました\nファイル名の入力に戻ってください\n',[File]), fail. ファイル名を入力させ(File) :- write('ファイル名を入力してください : '), get_line(Line), ファイル名を入力診断(Line,File),!. ファイル名を入力させ(File) :- ファイル名を入力させ(File). ファイル名を入力診断(Line,File) :- Line = File, exists(File,read),!. ファイル名を入力診断(Line,File) :- write('入力された%tというファイルはありません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/953 # # ../test/read.cgi/tech/1307166756/928です # 小出しになってしまって申し訳ないのですがもう1つお願いします # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 長いのでろだにうpしました # http://ime.nu/www.dotup.org/uploda/www.dotup.org1726929.txt # # file03.txt # http://ime.nu/www.dotup.org/uploda/www.dotup.org1726932.txt # 'file1を読み込み、n1行目からn2(n2>=n1)行目までをコピーして、m行目とm+1行目の間に入れfile2に書き込む'(_n1,_n2,_m) :- 'file1を読み込み'(LL1), 'n1行目からn2(n2>=n1)行目までをコピーして'(LL1,_n1,_n2,LL2), 'm行目とm+1行目の間に入れ'(LL1,_m,_LL2,LL3), 'file2に書き込む'(LL3). 'file1を読み込み'(LL1) :- get_lines(file1,LL1),!. 'n1行目からn2(n2>=n1)行目までをコピーして'(LL,_n1,_n2,_コピー) :- length([_|LL0],_n1), append(LL0,_,LL), length(LL02,_n2), append(LL02,_,LL), append(LL0,_コピー,LL02),!. 'm行目とm+1行目の間に入れ'(LL,_m,_コピー,LL3) :- length(LL0,_m), append(LL0,LL1,LL), append(LL0,_コピー,LL2), append(LL2,LL1,LL3),!. 'file2に書き込む'(LL) :- open(file2,write,Outstream), append(_,[Line|R],LL), writef(Outstream,'%t\n',[Line]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/717 # # <html>......<div class="list">画像リスト<br>1枚目<br><img src="http://ime.nu/example.com/aaa.jpg"><br> # 2枚目<br><img src="http://ime.nu/example.com/bbb.jpg"><br> # 3枚目<br><img src="http://ime.nu/example.com/ccc.jpg"><br>もっと見る<br></div>........</html> # # これで<div class="list">と</div>の間のアドレスだけ抜き出すのってどうやりますか? # ........の中にも画像アドレスがあります。そっちはマッチさせないようにしたい。 # # preg_match_all("/list\".+?src=\"(.+)\".+</div>/", $html, $m); # # 'これで div class="list" と /div の間のアドレスだけ抜き出す'(File,URL) :- get_lines(File,Lines), append(_,[Line|_],Lines), 'div class="list" と /divの間'(Line,URL). 'div class="list" と /divの間'(Line,URL) :- sub_atom(Line,_,_,_,S1,S2,S3,L1,L2,[<,/,d,i,v,>|R3]), sub_atom(S2,0,18,N,'
'), sub_atom(S2,18,N,0,URL), \+(sub_atom(URL,_,_,_,'')). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/928 # # ../test/read.cgi/tech/1307166756/885に追加で # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # file1を読み込み、特定の文字列string1 を全てstring2 に置き換え、file2に書き込むファイル、ensyu07.cを作成せよ # replase_strings( ”file1”, ”file2”, ”string1”, ”string2” ) ; # # file1を読み込み、行の文字数の大きい順番に並び換え、file2に書き込むファイル、ensyu08.cを作成せよ # text_sort( ”file1”, ”file2” ) ; # # 出来れば../test/read.cgi/tech/1307166756/900や../test/read.cgi/tech/1307166756/907のような形式で書いてもらえると助かります # 'file1を読み込み、特定の文字列string1 を全てstring2 に置き換え、file2に書き込む' :- 'file1を読み込み'(_行ならび), '特定の文字列string1 を全てstring2 に置き換え'(_行ならび,_string1,_string2,_置き換えられた行ならび), file2に書きこむ(_置き換えられた行ならび). file1を読み込み(_行ならび) :- get_lines(file1,_行ならび). '特定の文字列string1 を全てstring2 に置き換え'(_行ならび,_string1,_string2,_置き換えられた行ならび) :- findall(_行1,( append(_,[_行|_],_行ならび), 置換対象文字列は置換する(_行,_string1,_string2,_行1)), _置換された行ならび). 置換対象文字列は置換する(_行,_string1,_string2,_置換された行) :- sub_atom(_行,_,_,_,S1,_string1,S3,_,_,_), 置換対象文字列は置換する(S3,_string1,_string2,_行2), concat_atom([S1,_string2,_行2],_置換された行),!. 置換対象文字列は置換する(_行,_,_,_行). file2に書き込む(_行ならび) :- open(file2,write,Outstream), append(_,[_行|R],_行ならび), writef('%t\n',[_行]), R = [], close(Outstream),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/885 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # # file1を読み込み、特定の文字c を削除し、file2に書き込むファイル、ensyu06.cを作成せよ # erase_char( ”file1”, ”file2”, ’c’ ) ; # 'file1を読み込み、特定の文字c を削除し、file2に書き込む' :- file1を読み込み(Chars), '特定の文字c を削除し'(Chars,Chars2), 'file2に書き込む'(Chars). file1を読み込み(Lines) :- get_lines(file1,Lines). '特定の文字c を削除し'([],[]) :- !. '特定の文字c を削除し'([c|R1],R2) :- !. '特定の文字c を削除し'(R1,R2),!. '特定の文字c を削除し'([A|R1],[A|R2]) :- '特定の文字c を削除し'(R1,R2). file2に書き込む(Chars) :- open(file2,write,Outstream), concat_atom(Chars,S), writef('%t',[S]), close(Outstream),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/885 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # file1を読み込み、特定の文字列string を含む行を削除し、file2に書き込むファイル、ensyu05.cを作成せよ # erase_string( ”file1”, ”file2”, ”string” ) ; # 'file1を読み込み、特定の文字列string を含む行を削除し、file2に書き込む'(_特定の文字列) :- file1を読み込み(Lines), open(file2,write,Outstream), '特定の文字列string を含む行を削除し、file2に書き込む'(Outstream,_特定の文字列,Lines), close(Outstream). '特定の文字列string を含む行を削除し、file2に書き込む'(Outstream,_特定の文字列,[]) :- !. '特定の文字列string を含む行を削除し、file2に書き込む'(Outstream,_特定の文字列,[Line|R]) :- sub_atom(Line,_,_,_,_特定の文字列), '特定の文字列string を含む行を削除し、file2に書き込む'(Outstream,_特定の文字列,R),!. '特定の文字列string を含む行を削除し、file2に書き込む'(Outstream,_特定の文字列,[Line|R]) :- \+(sub_atom(Line,_,_,_,_特定の文字列)), writef(Outstream,'%t\n',[Line]), '特定の文字列string を含む行を削除し、file2に書き込む'(Outstream,_特定の文字列,R),!. file1を読み込み(Lines) :- get_lines(file1,Lines). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/885 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # file1を読み込み、n1行目からn2 (n2>=n1)行目までを削除し、file2に書き込むファイル、ensyu03.cを作成せよ # 注意:切り取った際、文章は上に詰めること # erase_multiline( ”file1”, ”file2”, n1, n2 ) ; # # file1を読み込み、n行目とm行目を入れ替え、file2に書き込むファイル、ensyu04.cを作成せよ # replace_lines( ”file1”, ”file2”, n, m ) ; # # file1を読み込み、特定の文字列string を含む行を削除し、file2に書き込むファイル、ensyu05.cを作成せよ # erase_string( ”file1”, ”file2”, ”string” ) ; # # file1を読み込み、特定の文字c を削除し、file2に書き込むファイル、ensyu06.cを作成せよ # erase_char( ”file1”, ”file2”, ’c’ ) ; # 'file1を読み込み、n1行目からn2 (n2>=n1)行目までを削除し、file2に書き込む'(_n1行目,_n2行目) :- file1を読み込み(Lines), 'n1行目からn2 (n2>=n1)行目までを削除し'(Lines,_n1行目からn2行目までを削除されたならび), file2に書き込む(_n1行目からn2行目までを削除されたならび),!. file1を読み込み(Lines) :- get_lines(file1,Lines). 'n1行目からn2 (n2>=n1)行目までを削除し'(Lines,_n1行目からn2行目までを削除されたならび) :- length([_|L0],_n1行目), length(L2,_n2行目), append(L0,L1,L2), append(L2,L3,Lines), append(L0,L3,_n1行目からn2行目までを削除されたならび),!. file2に書き込む(_n1行目からn2行目までを削除されたならび) :- open(file2,write,Outstream), append(_,[Line|R],_n1行目からn2行目までを削除されたならび), writef('%t\n',[Line]), R = [], close(Outstream),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/470 # # [1] 授業単元:ファイルから読み込んだ数値の集計 # [2] 問題文(含コード&リンク): # ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする。 # そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を画面に表示するプログラムを作成しなさい。 # 'ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする。そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を画面に表示する' :- 'ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする'(_20個の数値ならび), 'そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を'(_20個の数値ならび,_最大値,_最小値,_平均値), 画面に表示する(_最大値,_最小値,_平均値). 'ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする'(_20個の数値ならび) :- get_lines('num1.txt',LL), findall(V,( append(_,[Line|_],LL), atom_to_term(Line,V,_)), _20個の数値ならび). 'そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を画面に表示する'(_20個の数値ならび,_最大値,_最小値,_平均値) :- 最大値(_20個の数値ならび,_最大値), 最小値(_20個の数値ならび,_最小値), 平均値(_20個の数値ならび,_平均値). 画面に表示する(_最大値,_最小値,_平均値) :- writef('最大値 = %t, 最小値 = %t, 平均値 = %t\n',[_最大値,_最小値,_平均値]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最大値([A|R],X) :- 最大値_1(R,A,X) . 最大値_1([],X,X) :- !. 最大値_1([A|R],B,X) :- A @> B,!, 最大値_1(R,A,X). 最大値_1([_|R],A,X) :- 最大値_1(R,A,X). 最小値([A|R],X) :- 最小値_1(R,A,X). 最小値_1([A|R],B,X) :- A @> B,!, 最小値_1(R,B,X). 最小値_1([A|R],_,X) :- !,最小値_1(R,A,X). 最小値_1([],X,X). 平均値(L,M) :- length(L,N), 平均値(L,N,0.0e+00,M). 平均値([],N,S,M) :- M is S / N,!. 平均値([A|R],N,S,M) :- S1 is S + A, 平均値(R,N,S1,M). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/470 # # [1] 授業単元:ファイルから読み込んだ数値の集計 # [2] 問題文(含コード&リンク): # ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする。 # そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を画面に表示するプログラムを作成しなさい。 # 'ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする。そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を画面に表示する' :- 'ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする'(_20個の数値ならび), 'そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を'(_20個の数値ならび,_最大値,_最小値,_平均値), 画面に表示する(_最大値,_最小値,_平均値). 'ファイルnum1.txtには、実数での20個の数値が改行を挟んで入力されているものとする'(_20個の数値ならび) :- get_lines('num1.txt',LL), findall(V,( append(_,[Line|_],LL), atom_to_term(Line,V,_)), _20個の数値ならび). 'そのとき、num1.txtの数値を全て読み込み、最大値、最小値、平均値を画面に表示する'(_20個の数値ならび,_最大値,_最小値,_平均値) :- 最大値(_20個の数値ならび,_最大値), 最小値(_20個の数値ならび,_最小値), 平均値(_20個の数値ならび,_平均値). 画面に表示する(_最大値,_最小値,_平均値) :- writef('最大値 = %t, 最小値 = %t, 平均値 = %t\n',[_最大値,_最小値,_平均値]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最大値([A|R],X) :- 最大値_1(R,A,X) . 最大値_1([],X,X) :- !. 最大値_1([A|R],B,X) :- A @> B,!, 最大値_1(R,A,X). 最大値_1([_|R],A,X) :- 最大値_1(R,A,X). 最小値([A|R],X) :- 最小値_1(R,A,X). 最小値_1([A|R],B,X) :- A @> B,!, 最小値_1(R,B,X). 最小値_1([A|R],_,X) :- !,最小値_1(R,A,X). 最小値_1([],X,X). 平均値(L,M) :- length(L,N), 平均値(L,N,0.0e+00,M). 平均値([],N,S,M) :- M is S / N,!. 平均値([A|R],N,S,M) :- S1 is S + A, 平均値(R,N,S1,M). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/342 # # ごめんなさい。よろしくお願いします。 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という # 名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理と、 # 続いてそのファイルを開いてデータを読み込み、指定した番号の人のデータを # 以下のように表示する処理をするプログラムを作りなさい。 # (実行後meibo.txt の中身は # # 1 # 168.000000 # 55.000000 # 2 # 170.000000 # 66.000000 # 3 # 158.000000 # 45.000000 # # と書かれている) # # 実行例です # http://ime.nu/uproda.2ch-library.com/387866eaw/lib387866.jpg # # '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理と、続いてそのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する' :- '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理', 続いて, 'そのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する'. '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理' :- '学籍番号(整数)、身長(実数)、体重(実数)を入力すると'(_学籍番号・身長・体重ならび), 'meibo.txt という名前のファイルを作り'(Outstream), 'その中に学籍番号、身長、体重を記録する'(Outstream,_学籍番号・身長・体重ならび),!. そのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する :- そのファイルを開いてデータを読み込み(_データ), 指定した番号の人のデータを以下のように表示する(_データ). '学籍番号(整数)、身長(実数)、体重(実数)を入力すると'(_学籍番号・身長・体重ならび) :- 登録人数を得る(_登録人数), 学籍番号・身長・体重ならびを形作る(_学籍番号・身長・体重ならび,_登録人数), 学籍番号・身長・体重ならびを得る(_学籍番号・身長・体重ならび). 学籍番号・身長・体重ならびを形作る(_学籍番号・身長・体重ならび,_登録人数) :- length(_学籍番号・身長・体重ならび,_登録人数). 学籍番号・身長・体重ならびを得る([]). 学籍番号・身長・体重ならびを得る([[_学籍番号・身長・体重ならび]|R]) :- 学籍番号を得る(_学籍番号), 身長を得る(_身長), 体重を得る(_体重), 学籍番号・身長・体重ならびを得る(R). 'meibo.txt という名前のファイルを作り'(Outstream) :- open('meibo.txt',write,Outstream),!. 'その中に学籍番号、身長、体重を記録する'(Outstream,_学籍番号・身長・体重ならび) :- append(_,[[_学籍番号,_身長,_体重]|R],_学籍番号・身長・体重ならび), writef(Outstream,'%t\n%t\n%t\n',[_学籍番号,_身長,_体重]), R = [], close(Outstream),!. そのファイルを開いてデータを読み込み(_データ) :- get_lines('meibo.txt',_データ). 指定した番号の人のデータを以下のように表示する(_データ) :- 指定した番号の人(_学籍番号), 指定した番号の人のデータを以下のように表示する(_学籍番号,_データ),!. 指定した番号の人のデータを以下のように表示する('',_) :- !. 指定した番号の人のデータを以下のように表示する(end_of_file,_) :- !. 指定した番号の人のデータを以下のように表示する(_学籍番号,_データ) :- append(_,[[_学籍番号,_身長,_体重]|_],_データ), writef('%t %t %t\n',[_学籍番号,_身長,_体重]), 指定した番号の人(_学籍番号2), 指定した番号の人のデータを以下のように表示する(_学籍番号2,_データ),!. 指定した番号の人(_学籍番号) :- write('検索する学籍番号を入れてください : '), get_integer(_学籍番号),!. 登録人数を得る(_登録人数) :- write('最初に登録人数を決めてください : '), get_line(Line), 登録人数入力診断(Line,_登録人数),!. 登録人数入力診断(Line,_登録人数) :- atom_to_term(Line,_登録人数,_), integer(_登録人数), _登録人数 >= 1, _登録人数 =< 10,!. 登録人数入力診断(Line,_登録人数) :- 再入力指示(Line,[登録人数]). 学籍番号を得る(_学籍番号) :- repeat, write('学籍番号(整数) : '), get_line(Line), 学籍番号入力検査(Line,_学籍番号),!. 学籍番号入力検査(Line,_学籍番号) :- 再入力指示(Line,学籍番号), fail. 身長を得る(_身長) :- repeat, write('身長(実数) : '), get_line(Line), 学籍番号入力検査(Line,_身長),!. 体重を得る(_体重) :- repeat, write('体重(実数) : '), get_line(Line), 学籍番号入力検査(Line,_体重),!. 学籍番号入力検査(Line,_学籍番号) :- atom_to_term(Line,_学籍番号,_), integer(_学籍番号),!. 学籍番号入力検査(Line,_学籍番号) :- 再入力指示(Line,学籍番号), fail. 身長入力検査(Line,_身長) :- atom_to_term(Line,_身長,_), float(_身長),!. 身長入力検査(Line,_身長) :- 再入力指示(Line,身長), fail. 体重入力検査(Line,_体重) :- atom_to_term(Line,_体重,_), float(_体重),!. 体重入力検査(Line,_体重) :- 再入力指示(Line,体重), fail. 再入力指示(Line,_項目名) :- writef('入力された %t からは%tが得られません。再入力をお願いします。\n',[Line,_項目名]). 続いて :- true. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/341 # # [よろしくお願いします・・(´・ω・`) # # 1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 整数aとbを入力すると、mylife.txt という名前のファイルを作り、その中にa+bの計算結果を記録する処理と、 # 続いてそのファイルを開いてデータを読み込み、ディスプレイ上に表示する処理をするプログラムを作りなさい。 # (実行後mylife.txt の中身は # # 126 # # とだけ書かれている) # # http://ime.nu/uproda.2ch-library.com/387865yc9/lib387865.jpg # 実行例です。 # # http://ime.nu/uproda.2ch-library.com/387863Wqm/lib387863.jpg # ここまで出来て居ます # '整数aとbを入力すると、mylife.txt という名前のファイルを作り、その中にa+bの計算結果を記録する処理と、続いてそのファイルを開いてデータを読み込み、ディスプレイ上に表示する処理をする' :- '整数aとbを入力すると、mylife.txt という名前のファイルを作り、その中にa+bの計算結果を記録する', 続いて, _そのファイル = 'mylife.txt', そのファイルを開いてデータを読み込み、ディスプレイ上に表示する(_そのファイル). '整数aとbを入力すると、mylife.txt という名前のファイルを作り、その中にa+bの計算結果を記録する' :- 整数aとbを入力すると(_a,_b), 'mylife.txt という名前のファイルを作り'(Outstream), 'a+bの計算結果を'(_a,_b,_計算結果), 記録する(Outstream). 整数aとbを入力すると(_a,_b) :- 整数aを入力する(_a), 整数bを入力する(_b). 整数aを入力する(_a) :- write('整数を入力してください : '), get_integer(_a). 整数bを入力する(_b) :- write('整数を入力してください : '), get_integer(_b). 'mylife.txt という名前のファイルを作り'(Outstream) :- open('mylife.txt',write,Outstream),!. 'a+bの計算結果を'(_a,_b,_計算結果) :- _計算結果 is _a + _b. 記録する(Outstream,_計算結果) :- writef(Outstream,'%t\n',[_計算結果]), close(Outstream). 続いて :- true. そのファイルを開いてデータを読み込み、ディスプレイ上に表示する(_そのファイル) :- そのファイルを開いて(_そのファイル,Instream), データを読み込み(Instream,_データ), ディスプレイ上に表示する(Instream,_データ). そのファイルを開いて(_そのファイル,Instream) :- open(_そのファイル,read,Instream). データを読み込み(Instream,_データ) :- get_lines(Instream,_データ), close(Instream). ディスプレイ上に表示する(_データ) :- put_lines(_データ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_lines(Stream,Lines) :- is_stream(Stream), get_chars(Stream,Chars), chars_lines(Chars,Lines),!. get_lines(File,Lines) :- atom(File), exitst(File,read), get_chars(File,L), chars_lines(L,Lines),!. get_chars(Input,end_of_file,[]) :- !. get_chars(Input,X,[X|R]) :- get_char(Input,Y), get_chars(Input,Y,R). get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists(File_1,read), open(File_1,read,Input), get_char(Input,X), get_chars(Input,X,L), close(Input),!. get_chars(Input,L) :- is_stream(_,Input,_), get_char(Input,X), get_chars(Input,X,L),!. % *** user: chars_lines / 3 *** 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). % *** user: chars_lines / 2 *** chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), concat_atom(U,A), chars_lines(R,R2). % *** user: put_lines / 2 *** put_lines(_,[]) :- !. put_lines(Output,[Line|R]) :- is_stream(Output), write(Output,Line), write(Output,'\n'), put_lines(Output,R),!. put_lines(File,L) :- \+(is_stream(File)), open(File,write,Output), put_lines(Output,L), close(Output),!. % *** user: put_lines / 1 *** put_lines(Lines) :- append(_,[Line|R],Lines), write_formatted('%t\n',[Line]), R = [],!. % *** user: get_integer / 2 *** get_integer(Input,N) :- get_line(Input,Line), get_integer_1(Input,Line,N),!. % *** user: get_integer / 1 *** get_integer(N) :- get_line(Line), get_integer_1(Line,N),!. % *** user: get_integer_1 / 3 *** get_integer_1(_,end_of_file,_) :- !, fail. get_integer_1(Input,Line,N) :- atom_to_term(Line,N,_), integer(N),!. get_integer_1(Input,_,N) :- get_line(Input,Line), get_integer_1(Input,Line,N) . % *** user: get_integer_1 / 2 *** get_integer_1(end_of_file,_) :- !,fail. get_integer_1(Line,N) :- atom_to_term(Line,N,_), integer(N),!. get_integer_1(_,N) :- get_line(Line), get_integer_1(Line,N). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/124 # # [1] 授業単元:プログラミング # [2] 問題文: # ファイルから指定した文字列を検索し、行番号と検索文字列該当部分に***の1行 # 検索文字列を含んだ行すべてを表記した1行を画面に出力する # ただし、ファイルについてはタブを半角スペースに変換させ、エラー文についても適宜出力させる # 表記例(検索文字:aaa) # 行番号 ***     *** #     aaa bbb ccc aaa 111 # 'ファイルから指定した文字列を検索し、行番号と検索文字列該当部分に***の1行検索文字列を含んだ行すべてを表記した1行を画面に出力するただし、ファイルについてはタブを半角スペースに変換させ、エラー文についても適宜出力させる'(_ファイル,_検索文字列) :- 'ファイルから指定した文字列を検索し、行番号と検索文字列該当部分に***の1行検索文字列を含んだ行すべて'(_ファイル,_適合行情報), 表示(_検索文字列,_適合行情報). 'ファイルから指定した文字列を検索し、行番号と検索文字列該当部分に***の1行検索文字列を含んだ行すべて'(_ファイル,L2) :- 'ファイルから'(_ファイル,Lines), findall([_行番号,_変換された行,L],( append(L0,[_行|_],Lines), タブを半角スペースに変換する(_行,_変換された行), _行番号 is L0 + 1, findall(S2,( sub_atom(Line,S,_,_,_検索文字列), S2 is S + 1)), L), \+(L = [])), _適合行情報ならび). ファイルから(_ファイル,Lines) :- get_lines(_ファイル,Lines). タブを半角スペースに変換する(_行,_変換された行) :- findall(_変換された文字,( sub_atom(_行,_,1,_,_文字), タブならば半角スペースに変換する(_文字,_変換された文字)), L), concat_atom(L,_変換された行). タブならば半角スペースに変換する('\t',' '). タブならば半角スペースに変換する(_文字,_文字) :- \+(_文字 = '\t'). 表示(_検索文字列,_行ならび) :- 星文字列(_検索文字列,_星の長さ,_星文字列), append(_,[[_行番号,_行,_位置ならび]|R],_行ならび), 行表示(_行番号,_行,_星の長さ,_星表示,_位置ならび). 星文字列(_検索文字列,_星の長さ,_星文字列) :- sub_atom(_検索文字列,_,_星の長さ,_,_検索文字列), length(_星ならび,_星の長さ), all(_星ならび,'*'), concat_atom(_星ならび,_星表示),!. 行表示(_行番号,_行,_星の長さ,_星表示,_位置ならび) :- write('行番号 '), 星表示(1,_星の長さ,_星表示,_位置ならび), writef(' %t\n',[_行]). 星表示(_,_,_,[]) :- nl,!. 星表示(N,_星の長さ,_星文字列,[N|R]) :- write(_星文字列), N2 is N + _星の長さ, 星表示(N2,_星の長さ,_星文字列,R). 星表示(N,_星の長さ,_星文字列,[M|R]) :- \+(M = N), write(' '), N2 is N + 1, 星表示(N2,_星の長さ,_星文字列,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/745 # # [1] 授業単元:プログラム実習 # [2] 問題文(含コード&リンク): # 名前・身長・体重・血液型が記録されたメモ帳(ファイル)がある。 # これを身長順にソートして並べ替えてコマンドプロンプト上に # 表示させるプログラムを作成せよ。 # なお、今回メモ帳はstudentsdata.txtという名前で保存されていることとする。 # # program :- get_lines('studentsdata.txt',Lines), 身長を取り出して鍵とする(Lines,LL1), sort(LL1,LL2), append(_,[[_,Line]|R],LL2), writef('%t\n',[Line]), R = [],!. 身長を取り出して鍵とする([],[]) :- !. 身長を取り出して鍵とする([Line|R1],[[_身長,Line]|R2]) :- split(Line,[' ',','],[_,_身長,_,_]), 身長を取り出して鍵とする(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/470 # # # 入力ファイル(成績ファイル)の仕様 # # ファイル名は、ASCII文字で構成されるものとする。 # ファイル名の最大長は FILENAME_MAX である(第2回の課題0を参照)。 # 1行は、「学生番号」、「氏名」、「成績」の順に記述したもので、 # 各項目の区切り文字は、「タブ('\t')」1個である。 # 学生番号は、英数字からなる6桁の文字列である。 # 氏名の文字列長の最大は20バイトとする。 # 成績は、0〜100までの整数である。 # 入力は、最大500行と仮定してよい。 # # 出力形式 # 入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する。 # 次に、成績の降順にソートして出力する。各項 目間は、「タブ('\t')」1個で区切る。 # 平均点は、小数点以下1桁まで出力する。 # 出力形式は、実行例を参照せよ。 # エラー処理 # 呼出しでファイル名が指定されない場合はエラーとし、「ファイル名を指定してください」と表示し、プログラムを終了する。 # 指定されたファイルのオープンに失敗した場合に、「ファイルを開けませんでした」と表示し、プログラムを終了する。 # 今回のプログラムでは、a. b. 以外のエラー処理はしなくてよい。 # # % cat sample.txt # 03888 八 90 # 03111 一 100 # 03222 二 30 # 03666 六 70 # 03555 五 60 # 03333 三 80 # 03777 七 40 # 03999 九 20 # 03444 四 50 # % ./work31.exe sample.txt # 最高点:100 # 最低点: 20 # 平均点: 60.0 # 100 03111 一 # 90 03888 八 # 80 03333 三 # 70 03666 六 # 60 03555 五 # 50 03444 四 # 40 03777 七 # 30 03222 二 # 20 03999 九 # % # # 言語はCです # よろしくおねがいします # program :- user_parameters([_ファイル名]), '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t''[B')」1個で区切る。' (_ファイル名). '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(_ファイル名) :- 入力ファイルを読み込み(_ファイル名,LL), '最初に、成績の最高点と最低点と平均点を出力する'(LL), '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL). 入力ファイルを読み込み(_ファイル名,LL) :- get_lines(_ファイル名,Lines), 三項ならびに変換(Lines,LL). 三項ならびに変換([],[]) :- !. 三項ならびに変換([Line|R1],[[_成績,_学生番号,_氏名]|R2]) :- atom_chars(Line,Chars), append(L0,['\t'|L1],['\t'|L2],Chars), atom_chars(_学生番号,L0), atom_chars(_氏名,L1), atom_chars(_成績文字列,L2), atom_to_term(_成績文字列,_成績,_), 三項ならびに変換(R1,R2). 最初に、成績の最高点と最低点と平均点を出力する(LL) :- findmax(_成績, append(_,[[_成績,_,_]|_],LL), _最高点成績), findmin(_成績, append(_,[[_成績,_,_]|_],LL), _最低点成績), findavg(_成績, append(_,[[_成績,_,_]|_],LL), _平均点), writef('最高点: %t\n',[_最高点成績]), writef('最低点: %t\n',[_最低点成績]), writef('平均点: %t\n',[_平均点]),!. '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL) :- sort(LL,LL1), reverse(LL1,LL2), append(_,[L|R],LL2), writef('%t\t%t\t%t\t\n',L), R = [],!. % *** user: append / 4 *** append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % *** user: findmax / 3 *** findmax(V,P,Max) :- findall(V,P,L), max(L,Max). % *** user: findmin / 3 *** findmin(V,P,Max) :- findall(V,P,L), min(L,Max). % *** user: findavg / 3 *** findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. % *** user: sum / 2 *** sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/7 # # [1] 授業単元:暇つぶし # [2] 問題文(含コード&リンク): # 下記のような2chへの書き込み時刻のログを標準入力より受け取り、 # EOF がきたら現在の !ninja レベルがいくつであるか出力せよ # # !ninja レベルについて # 最初の書き込み時にはレベル1である # 最後にレベルアップした書き込み時刻から24時間以上経過して書き込むと1レベルアップする # # 条件1 一番最初の書き込み時刻以前にはクッキーは存在しないものとする # 条件2 ●無しとする # 条件3 書き込み時刻のログは古いものから順に並んでいるものとする # # 2011/02/11 22:33:44 # 2011/02/12 01:23:45 # 2011/02/14 18:19:20 # '下記のような2chへの書き込み時刻のログを標準入力より受け取り、 EOF がきたら現在の !ninja レベルがいくつであるか出力せよ' :- 一番最初の書き込み時刻以前にはクッキーは存在しないものとする(_ninja_1), get_lines(Lines), ninjaレベルの計測(Lines,_ninja_1,_ninja), writef('現在の !ninja レベルは %t です\n',[_ninja]),!. ninjaレベルの計測([],_ninja,_ninja) :- !. ninjaレベルの計測([_],_ninja,_ninja) :- !. ninjaレベルの計測([_時刻_1,_時刻_2|R],_ninja_1,_ninja) :- '24時間以上経過'(_時刻_1,_時刻_2), _ninji_2 is _ninja_1 + 1, ninjaレベルの計測([_時刻_2|R],_ninja_2,_ninja),!. ninjaレベルの計測([_時刻_1,_時刻_2|R],_ninja_1,_ninja) :- \+('24時間以上経過'(_時刻_1,_時刻_2)), ninjaレベルの計測([_時刻_2|R],_ninja_1,_ninja),!. 一番最初の書き込み時刻以前にはクッキーは存在しないものとする(1). '24時間以上経過'(_時刻_1,_時刻_2) :- sub_atom(_時刻_1,0,10,_,_年月日_1), sub_atom(_時刻_2,0,10,_,_年月日_2), sub_atom(_時刻_1,11,8,_,_時分秒_1), sub_atom(_時刻_1,11,8,_,_時分秒_2), '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2), '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2) :- _年月日_1 @< _年月日_2, _時分秒_1 @=< _時分秒_2,!. '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2) :- \+(_月末日(_年月日_1)), _時分秒_1 @> _時分秒_2, 翌日(_年月日_1,_翌日_1), _翌日_1 @< _年月日_2,!. 翌日(_年月日,_翌日の表示表現) :- sub_atom(_年月日,0,4,_年), sub_atom(_年月日,5,2,_月), sub_atom(_年月日,8,2,_日), 翌日(_年,_月,_日,_翌日の表示表現). 翌日(_年,'12','31',_翌日の表示表現) :- atom_to_term(_年,_年整数,_), _年整数_2 is _年整数 + 1, concat_atom([_年整数_2,/,'01',/,'01'],_翌日の表示表現),!. 翌日(_年,_月,_日,_翌日の表示表現) :- 月末日(_月,_日), 次の数字に対応する二文字の頭部零文字列(_月,_翌月), concat_atom([_年,/,_翌月,/,'01'],_翌日の表示表現),!. 翌日(_年,_月,_日,_翌日の表示表現) :- \+(月末日(_月,_日)), 次の数字に対応する二文字の頭部零文字列(_日,_翌日), concat_atom([_年,/,_翌月,/,_翌日],_翌日の表示表現),!. 次の数字に対応する二文字の頭部零文字列(_数値文字列,_次の数値文字列) :- length(L,2), atom_to_term(_数値文字列,_整数,_), _整数_2 is _整数 + 1, number_chars(_整数_2,Chars), append(L0,Chars,L), all(L0,'0'). 月末日(_年,'02','29') :- atom_to_term(_年,_年整数,_), うるう年(_年整数),!. 月末日(_年,'02','28') :- atom_to_term(_年,_年整数,_), \+(うるう年(_年整数)),!. 月末日(_年,_月,30) :- append(_,[_月|_],['04','06','09','11']),!. 月末日(_年,_月,31) :- append(_,[_月|_],['01','03','05','07','08','10','12']),!. うるう年(_年) :- 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/1296387672/610 # # [1] 授業単元: プログラミング # [2] 問題文 サッカーの試合結果の記録されたデータファイルを読み取り、 # 優勝したチーム名を出力するプログラムを作成せよ。 # データファイルには、先頭の行にチーム数が出力されており、 # 2行目からチーム名(チーム数分)、 # それ以降の行に試合結果が出力されている。 # 試合結果の行は以下のフォーマットとなっている。 # <ホーム側のチーム名> <ホーム側チームの得点> # <アウェイ側チームの得点> <アウェイ側チーム名> # チーム名は30文字以内とする。 # 試合に勝ったチームには勝ち点3が与えられ、引き分けたチームには # 勝ち点1が与えられる。勝ち点の合計が最も多いチームが優勝となるが、 # 勝ち点の合計が同じチームが複数ある場合には、それらのうち、 # 得失点差(得点と失点の差)の合計が大きいチームが優勝となる。 # 得失点差の合計が同じ場合にはどちらを優勝としてもよい。 # 4 # MANCHESTER_UNITED # ARSENAL # CHELSEA # LIVERPOOL # MANCHESTER_UNITED 3 1 ARSENAL # CHELSEA 3 0 LIVERPOOL # ARSENAL 2 2 CHELSEA # LIVERPOOL 3 0 MANCHESTER_UNITED # ------------------------------------ # 優勝したチーム名を出力するプログラムを作成する(_データファイル) :- get_lines(_データファイル,Lines), データファイルには先頭の行にチーム数が出力されており、(Lines,_チーム数,_2行目以降ならび), '2行目からチーム名(チーム数分)'(_2行目以降ならび,_チーム数,_チーム名ならび,_試合結果ならび), 優勝したチーム名を(_チーム名ならび,_試合結果ならび,_優勝したチーム), 出力する(_優勝したチーム名). データファイルには先頭の行にチーム数が出力されており、(Lines,_チーム数,_2行目以降ならび) :- Lines = [_チーム数文字列|_2行目以降ならび], atom_to_term(_チーム数文字列,_チーム数,_),!. '2行目からチーム名(チーム数分)'(_2行目以降ならび,_チーム数,_チーム名ならび,_試合結果ならび) :- length(_チーム名ならび,_チーム数), append(_チーム名ならび,_試合結果ならび,_2行目以降ならび),!. 優勝したチーム名を(_チーム名ならび,_試合結果ならび,_優勝したチーム名) :- findall([_チーム名,_勝,_敗,_分,_勝ち点,_得点,_失点,_得失点差],( append(_,[_チーム名|_],_チーム名ならび), all([_勝,_敗,_分,_勝ち点,_得点,_失点,_得失点差],0)), _チーム成績ならび), 試合結果をチーム成績ならびに反映させる(_試合結果ならび,_チーム成績ならび,_最終チーム成績ならび), 優勝したチームを判定する(_最終チーム成績ならび,_優勝したチーム名). 試合結果をチーム成績ならびに反映させる([],_最終チーム成績ならび,_最終チーム成績ならび) :- !. 試合結果をチーム成績ならびに反映させる([_試合結果行|R],_チーム成績ならび1,_最終チーム成績ならび) :- split(_試合結果行,[' '],[_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名]), 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,_ホーム側の勝数の加算値,_アウェイ側の勝数の加算値,_ホーム側の敗数の加算値,_アウェイ側の敗数の加算値,_ホーム側の引き分け数の加算値,_アウェイ側の引き分け数の加算値,_ホーム側の勝ち点の加算値,_アウェイ側の勝ち数の加算値), チーム成績の更新(_ホーム側のチーム名,_ホーム側の得点,_ホーム側の勝数の加算値,_ホーム側の敗数の加算値,_ホーム側の引き分け数の加算値,_ホーム側の勝ち点の加算値,_チーム成績ならび1,_チーム成績ならび2), チーム成績の更新(_アウェイ側のチーム名,_アウェイ側の得点,_アウェイ側の勝数の加算値,_アウェイ側の敗数の加算値,_アウェイ側の引き分け数の加算値,_アウェイ側の勝ち点の加算値,_チーム成績ならび2,_チーム成績ならび3), 試合結果をチーム成績ならびに反映させる(R,_チーム成績ならび3,_最終チーム成績ならび). 優勝したチームを判定する(_最終チーム成績ならび,_優勝したチーム名) :- findmax([_勝ち点,_得失点差],( append(_,[[_チーム名,_勝,_敗,_分,_勝ち点,_得点,_失点,_得失点差]|_],_最終チーム成績ならび)), [_勝ち点,_得失点差]), append(_,[[_優勝したチーム名,_,_,_,_勝ち点,_,_,_得失点差]|_],_最終チーム成績ならび). 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,1,0,0,1,0,0,3,0) :- _ホーム側の得点 > _アウェイ側の得点,!. 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,0,1,1,0,0,0,0,3) :- _ホーム側の得点 < _アウェイ側の得点,!. 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,0,0,0,0,1,1,1,1) :- _ホーム側の得点 = _アウェイ側の得点,!. 出力する(_優勝したチーム名) :- write_formatted('優勝したチームは %t です\n',[_優勝したチーム名]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/274 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1324335.txt.html # # 商品(data1.txt)と在庫(data2.txt)からデータを読み込み # 商品名を入力すると、ID、単価、在庫総数、総在庫額を出力するプログラムの作成 # それぞれを構造体に読み込んでから探索、計算をお願いします # # ファイル様式 # data1.txtは上からID、商品名、単価の順番で並んでいます # data2.txtは上からID、在庫数の順番で並んでいます # # data1.txt # 1 # マウス # 780 # 2 # キーボード # 980 # 3 # ボールペン # 120 # 4 # えんぴつ # 80 # 5 # イヤホン # 790 # # data2.txt # 1 # 15 # 2 # 10 # 3 # 23 # 4 # 40 # 5 # 5 '商品(data1.txt)と在庫(data2.txt)からデータを読み込み商品名を入力すると、ID、単価、在庫総数、総在庫額を出力する' :- '商品(data1.txt)と在庫(data2.txt)からデータを読み込み'(_商品データならび,_在庫データならび), 商品名を入力すると、ID、単価、在庫総数、総在庫額を出力する(_商品データならび,_在庫データならび). '商品(data1.txt)と在庫(data2.txt)からデータを読み込み'(_商品データならび,_在庫データならび) :- '商品(data1.txt)を読み込む'(_商品データならび), '在庫(data2.txt)を読み込む'(_在庫データならび). '商品(data1.txt)を読み込む'(_商品データならび) :- get_lines('data1.txt',_商品データならび). '在庫(data2.txt)を読み込む'(_在庫データならび) :- get_lines('data1.txt',_在庫データならび). 商品名を入力すると、ID、単価、在庫総数、総在庫額を出力する(_商品データならび,_在庫データならび) :- 商品名を入力すると(_商品名), 'ID、単価、在庫総数、総在庫額を出力する'(_商品名,_商品データならび,_在庫データならび),!. 商品名を入力すると、ID、単価、在庫総数、総在庫額を出力する(_商品データならび,_在庫データならび) :- 商品名を入力すると、ID、単価、在庫総数、総在庫額を出力する(_商品データならび,_在庫データならび). 商品名を入力すると(_商品名) :- write('商品名を入力してください : '), get_line(_商品名). 'ID、単価、在庫総数、総在庫額を出力する'('',_,_) :- !. 'ID、単価、在庫総数、総在庫額を出力する'(end_of_file,_,_) :- !. 'ID、単価、在庫総数、総在庫額を出力する'(_商品名,_商品データならび,_在庫データならび) :- append(_,[[_ID,_商品名,_単価]|_],_商品データならび), findsum(_在庫数,append(_,[[_ID,_在庫数]|_],_在庫データならび),_在庫総数), _総在庫額 is truncate(_在庫総数 * _単価), write_formatted('%t,%t,%t,%t\n',[_ID,_単価,_在庫総数,_総在庫額]), fail. 'ID、単価、在庫総数、総在庫額を出力する'(_商品名,_商品データならび,_在庫データならび) :- \+(append(_,[[_ID,_商品名,_単価]|_],_商品データならび)), write_formatted('入力された商品名%tは商品データの中に存在しません。再入力をお願いします。\n',[_商品名]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/778 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # n本の棒がある。棒i(3<n<100)の長さはa_i(1<a_i<10^4)である。 # あなたは、それらの棒から3本を選び、「できるだけ周長の長い三角形」と「できるだけ周長の短い三角形」 # を作ろうと考えている。それぞれ最大・最短の周長と選択した棒の組を求めるプログラムを作成せよ。 # ただし、どのような棒の組を選んでも三角形が作れない場合、0を答えとして返せ。 # プログラムの要件として、以下の事項を定める。 # ・引数として棒の長さデータが収められたファイル名のみが与えられるものとする。 # ・結果として、標準出力に、最大周長と棒の組み合わせ、最短周長と棒の組み合わせが出力されること。 # # % cat length.dat # 2 3 4 5 10 # % ./a.out length.dat # 最大周長=12 (3 4 5) # 最短周長=9 (2 3 4) # # %cat length.dat # 4 5 10 20 # % ./a.out length.dat # 0 # program :- user_parameters([_ファイル名]), get_lines(_ファイル名,Lines), findall(N,( append(_,[Line|_],Lines), sqlit(Line,[' '],L2), append(_,[N|_],L2)), _棒の長さならび), 周囲が最大の三角形(_棒の長さならび,[A1,B1,C1]), 周囲が最短の三角形(_棒の長さならび,[A2,B2,C2]), write_formatted('最大周長=%t (%t %t %t)\n',[_最大周長,A1,B1,C1]), write_formatted('最短周長=%t (%t %t %t)\n',[_最短周長,A2,B2,C2]). fail. program. 周囲が最大の三角形(_棒の長さならび,[A,B,C],_最大周長) :- 最大周長を得る(_棒の長さならび,_最大周長), 周長から三辺を得る(_棒の長さならび,_最大周長,A,B,C). 最大周長を得る(_棒の長さならび,_最大周長) :- findmax(_周囲,( 組み合わせ(_棒の長さならび,3,[A,B,C]), C > A + B, B > A + C, A > B + C, _周囲 is A + B + C), _最大周長),!. 周囲が最短の三角形(_棒の長さならび,[A,B,C]) :- 最短周長を得る(_棒の長さならび,_最短周長), 周長から三辺を得る(_棒の長さならび,_最大周長,A,B,C). 最短周長を得る(_棒の長さならび,_最短周長) :- findmin(_周囲,( 組み合わせ(_棒の長さならび,3,[A,B,C]), C > A + B, B > A + C, A > B + C, _周囲 is A + B + C), _最短周囲). 周長から三辺を得る(_棒の長さならび,_周長,A,B,C) :- 組み合わせ(組み合わせ(_棒の長さならび,3,[A,B,C]), 組み合わせ(_棒の長さならび,3,[A,B,C]), _周長 is A + B + C, C > A + B, B > A + C, A > B + C. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/703 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # # 1..キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む関数を作れ。ただし、nの値とファイル名は引数として取得するものとする。 # 2..引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する関数を作れ。 # 3..以上で作成した関数を使用し、プログラムを完成せよ。ただし、nの値と使用するファイルの名前はプログラムの引数として与えられるものとする。 キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む。その後そのファイルから情報を読み込み学生番号順に表示する(_n,_ファイル名) :- キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む(_n,_ファイル名), 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_n,_ファイル名). 'キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む'(_n,_ファイル名) :- write('学生番号と氏名の組みをカンマ区切りで%t行入力してください : '), length(L,_n), findall(_行,( append(_,[_行|_],L)), L), put_lines(_ファイル名,L). 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_n,_ファイル名) :- length(LL1,_n), see(_ファイル名), findall([_学生番号,_氏名],( append(_,[_|_],L1L), get_split_line(Instream,[','],[_学生番号,_氏名])), LL1), close(Instream), sort(LL1,LL2), append(_,[L|R],LL2), write_formatted('%t%t\n',L), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/755 # # すいません。行頭のスペースが消えておかしくなりましたので書き込み直します。 # # ●正規表現の使用環境 # Java1.6 # # ●検索か置換か? # 検索(Stringクラス String[] split(String regex)メソッドによる文字列分割) # # ●説明 # CSVファイル中の一行を対象文字列とし、 # その文字列中初出の\s*,\s*をデータ区切り子として見なしマッチさせる。 # (その前後で文字列を2つに分割) # # ●対象データ # aaa,bbb,ccc # aaa, bbb, ccc # aaa , bbb , ccc # # ●希望する結果 # "aaa"と"bbb,ccc"に分割 # "aaa"と"bbb, ccc"に分割 # "aaa"と"bbb , ccc"に分割 # # ●希望しない結果 # "aaa"と"bbb"と"ccc"に分割 # etc... # # 自分で考えた(?<^[^,]*)\s*,\s*では # java.util.regex.PatternSyntaxException: Unknown look-behind group near index 8 # というような例外が出てしまいました。 # # よろしくお願いします。 # # 'CSVファイル中の一行を対象文字列とし、その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(_csvファイル,_行,_前文字列,_後文字列) :- get_lines(_ファイル,Lines), append(L0,[Line|R],Lines), _行 is L0 + 1, 'その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(Line,_前文字列,_後文字列), fail. 'その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(Line,_前文字列,_後文字列) :- sub_atom(Line,_,_,_,_前文字列,_区切り文字列,_後文字列,L1,L2,L3), append(L0,[','|R],L2), all(L0,' '), \+((append(L01,[A|_],R),\+(A=' '))),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/31 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/www.dotup.org/uploda/www.dotup.org1341084.txt # # ファイルls-Rを読み込んでメモリ上にディレクトリツリーを構築し、全ファイルをホームディレクトリからの相対パスで出力せよ。 # ※ファイルls-Rはunixコマンドでls-rをしたものです 'ファイルls-Rを読み込んでメモリ上にディレクトリツリーを構築し、全ファイルをホームディレクトリからの相対パスで出力せよ。'(_ホームディレクトリ) :- get_lines('ls-R',Lines), 'メモリ上にディレクトリツリーを構築し、'(Lines,_ディレクトリツリー), '全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ). 'メモリ上にディレクトリツリーを構築し、'([]) :- !. 'メモリ上にディレクトリツリーを構築し、'([''|R]) :- 'メモリ上にディレクトリツリーを構築し、'(R),!. 'メモリ上にディレクトリツリーを構築し、'([_ディレクトリ|R]) :- sub_atom(_ディレクトリ,_,1,0,':'), sub_atom(_ディレクトリ,0,_,1,_ディレクトリパス), 'メモリ上にディレクトリツリーを構築し、'(_ディレクトリパス,R). 'メモリ上にディレクトリツリーを構築し、'(_,[]) :- !. 'メモリ上にディレクトリツリーを構築し、'(_ディレクトリパス,[''|R]) :- 'メモリ上にディレクトリツリーを構築し、'(R),!. 'メモリ上にディレクトリツリーを構築し、'(_ディレクトリパス,[_ファイルまたはディレクトリ|R]) :- assertz(dir(_ディレクトリパス,_ファイルまたはディレクトリ)), 'メモリ上にディレクトリツリーを構築し、'(_ディレクトリパス,R). '全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ) :- dir(_ディレクトリ,_パス), '全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ,_パス),fail. '全ファイルをホームディレクトリからの相対パスで出力する'(_). '全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ,_パス) :- dir(_パス,_パス2), ホームディレクトリからの相対パス(_ホームディレクトリ,_パス,_相対パス), write_formatted('%t/\n',[_相対パス]), dir(_パス,_パス2), '全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ,_パス2). '全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ,_パス) :- ホームディレクトリからの相対パス(_ホームディレクトリ,_パス,_相対パス), write_formatted('%t\n',[_相対パス]). ホームディレクトリからの相対パス(_ホームディレクトリ,_パス,_相対パス) :- atom_chars(_ホームディレクトリ,Chars1), atom_chars(_ホームディレクトリ,Chars2), append(Chars2,R,Chars1), 相対パスの微調整(R,_相対パス). ホームディレクトリからの相対パス(_ホームディレクトリ,_パス,_相対パス) :- split(_ホームディレクトリ,[/],L1), split(_パス,[/],L2), append(L0,[A|R1],L1), append(L0,[B|R2],L2), 遡り相対パス(A,R1,B,R2,_相対パス). 相対パスの微調整([/|R],_相対パス) :- concat_atom(R,_相対パス),!. 相対パスの微調整(L,_相対パス) :- concat_atom(L,_相対パス),!. 遡り相対パス(A,R1,B,R2,_相対パス) :- \+(A=B), findall('..',( append(_,[_|_],[B|R2])), LP), append(LP,[B|R2],L3), concat_atom(L3,'/',_相対パス),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289816228/245 # # 外部で定期的に更新されるA-Eの値があってコレらを取り込みたいとき # # 全ての値を取得したいときは # GetAllValue()みたいな命名するじゃないですか # # このとき # 通常処理に必要な値のみ(例えばA-Cのみ)を取得したい場合と # 引数に識別子をとって個別の値を取得したい場合の関数名ってどうするのが良いと思いますか? # # Prologの例で関数定義ではないが、基本的に仕様の通り、 '通常処理に必要な値のみ(例えばA-Cのみ)を取得'(A,B,C) :- get_lines('A',A), get_lines('B',B), get_lines('C',C). '個別の値を取得'(_識別子,_値) :- get_lines(_識別子,_値). だと思うが、 '通常処理に必要な値のみ(例えばA-Cのみ)を取得'(A,B,C) :- '個別の値を取得'('A',A), '個別の値を取得'('B',B), '個別の値を取得'('C',C). '個別の値を取得'(_識別子,_値) :- get_lines(_識別子,_値). はどうかという問題がある。これは仕様にある「個別の」の意味から 外れて使われているから肯定できない。 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/721 # # firefox3.6のbockmark形式の a.html、b.htmlを # マージして c.html として出力するプログラムを誰か書いてください。 # # 例; # <a.html> # <link>ホームページA # <link>ホームページB # <link>ホームページC # # <b.html> # <link>ホームページA # <link>ホームページY # <link>ホームページZ # # <diff.html> # <link>ホームページY # <link>ホームページZ # # <c.html> # <link>ホームページA # <link>ホームページB # <link>ホームページC # <link>ホームページY # <link>ホームページZ # # a.html と b.html の差分 diff.html # a.html に diff.html を追加し c.html # 'a.html と b.html の差分 diff.html'(_a_html,_b_html,_差分html) :- 'bookmarks.htmlの解析'('a.html',_頭部ならび_a,_リンク部ならび_a,_末尾部ならび_a), 'bookmarks.htmlの解析'('b.html',_頭部ならび_b,_リンク部ならび_b,_末尾部ならび_b), 差分の生成(_リンク部ならび_b,_リンク部ならび_a,_差分リンク部), append(_頭部ならび_a,_差分リンク部,_末尾ならび_a,_差分html行ならび), put_lines('diff.html',_差分hmtl行ならび). 'a.html に diff.html を追加し c.html'(_a_html,_差分html,c_html) :- 'bookmarks.htmlの解析'('a.html',_頭部ならび_a,_リンク部ならび_a,_末尾部ならび_a), 'bookmarks.htmlの解析'('diff.html',_頭部ならび_d,_リンク部ならび_d,_末尾部ならび_d), append(_リンク部_a,_リンク部_d,_新しいリンク部), append(_頭部ならび_a,_新しいリンク部,_末尾ならび_a,_c_html行ならび), put_lines('c.html',_c_html行ならび),!. 'bookmarks.htmlの解析'(HTMLファイル,_頭部ならび,_リンク部ならび,_末尾部ならび) :- get_lines(HTMLファイル,Lines), 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(Lines,_頭部ならび,_リンク部ならび,_末尾部ならび). 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(Lines,_頭部ならび,_リンク部ならび,_末尾部ならび) :- 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。'(Lines,_頭部ならび,_残りならび), 'その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(_残りならび,_リンク部ならび,_末尾部ならび),!. 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。'(Lines,_頭部ならび,_残りならび) :- append(_頭部ならびの一,[_行|_残りならび],Lines), atom_chars(_行,['<','D','L','>'|_]), append(_頭部ならびの一,[_行],_頭部ならび),!. 'その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(_残りならび,_リンク部ならび,_末尾部ならび) :- append(_リンク部,[_行2|_末尾部ならびの一],_残りならび), atom_chars(_行2,['<','/','D','L','>'|_]), _末尾ならび = [_行2|_末尾部ならび],!. 差分の生成(_リンク部ならび_1,_リンク部ならび_2,_差分リンク部) :- 'URL部分だけ抜き取る'(_リンク部_1,_リンク部_2,_参照URLならび_1,_参照URLならび_2), findall(_URL,( append(_,[_URL|_],_参照URLならび_2), \+(append(_,[_URL|_],_参照URLならび_1))), _差分参照URLならび), 行とURLを対応させる(_リンク部ならび_2,_差分参照URLならび,_差分リンク部). 'URL部分だけ抜き取る'(_リンク部_1,_リンク部_2,_参照URL_1,_参照URL_2) :- 参照URLならび(_リンク部ならび_1,_参照URL_1), 参照URLならび(_リンク部ならび_2,_参照URL_2),!. 参照URLならび(_リンク部ならび,_参照URLならび) :- findall(_参照URL,( append(_,[_行|_],_リンク部ならび), 参照URL(_行,_参照URL)), _参照URLならび). 参照URL(_行,_参照URL) :- split(_行,['"'],[_,_参照URL|_]),!. 行とURLを対応させる(_リンク部ならび_2,_差分参照URLならび,_差分リンク部) :- findall(_行,( append(_,[_行|_],_リンク部ならび_2), 参照URL(_行,_参照URL), append(_,[_参照URL|_],_差分参照URLならび)), _差分リンク部). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/721 # # firefox3.6のbockmark形式の a.html、b.htmlを # マージして c.html として出力するプログラムを誰か書いてください。 # # 例; # <a.html> # <link>ホームページA # <link>ホームページB # <link>ホームページC # # <b.html> # <link>ホームページA # <link>ホームページY # <link>ホームページZ # # <diff.html> # <link>ホームページY # <link>ホームページZ # # <c.html> # <link>ホームページA # <link>ホームページB # <link>ホームページC # <link>ホームページY # <link>ホームページZ # # a.html と b.html の差分 diff.html # a.html に diff.html を追加し c.html # 'a.html と b.html の差分 diff.html'(_a_html,_b_html,_差分html) :- 'bookmarks.htmlの解析'('a.html',_頭部ならび_a,_リンク部ならび_a,_末尾部ならび_a), 'bookmarks.htmlの解析'('b.html',_頭部ならび_b,_リンク部ならび_b,_末尾部ならび_b), 差分の生成(_リンク部ならび_b,_リンク部ならび_a,_差分リンク部), append(_頭部ならび_a,_差分リンク部,_末尾ならび_a,_差分html行ならび), put_lines('diff.html',_差分hmtl行ならび). 'a.html に diff.html を追加し c.html'(_a_html,_差分html,c_html) :- 'bookmarks.htmlの解析'('a.html',_頭部ならび_a,_リンク部ならび_a,_末尾部ならび_a), 'bookmarks.htmlの解析'('diff.html',_頭部ならび_d,_リンク部ならび_d,_末尾部ならび_d), append(_リンク部_a,_リンク部_d,_新しいリンク部), append(_頭部ならび_a,_新しいリンク部,_末尾ならび_a,_c_html行ならび), put_lines('c.html',_c_html行ならび),!. 'bookmarks.htmlの解析'(HTMLファイル,_頭部ならび,_リンク部ならび,_末尾部ならび) :- get_lines(HTMLファイル,Lines), 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(Lines,_頭部ならび,_リンク部ならび,_末尾部ならび). 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(Lines,_頭部ならび,_リンク部ならび,_末尾部ならび) :- 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。'(Lines,_頭部ならび,_残りならび), 'その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(_残りならび,_リンク部ならび,_末尾部ならび),!. 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。'(Lines,_頭部ならび,_残りならび) :- append(_頭部ならびの一,[_行|_残りならび],Lines), atom_chars(_行,['<','D','L','>'|_]), append(_頭部ならびの一,[_行],_頭部ならび),!. 'その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(_残りならび,_リンク部ならび,_末尾部ならび) :- append(_リンク部,[_行2|_末尾部ならびの一],_残りならび), atom_chars(_行2,['<','/','D','L','>'|_]), _末尾ならび = [_行2|_末尾部ならび],!. 差分の生成(_リンク部ならび_1,_リンク部ならび_2,_差分リンク部) :- 'URL部分だけ抜き取る'(_リンク部_1,_リンク部_2,_参照URLならび_1,_参照URLならび_2), findall(_URL,( append(_,[_URL|_],_参照URLならび_2), \+(append(_,[_URL|_],_参照URLならび_1))), _差分参照URLならび), 行とURLを対応させる(_リンク部ならび_2,_差分参照URLならび,_差分リンク部). 'URL部分だけ抜き取る'(_リンク部_1,_リンク部_2,_参照URL_1,_参照URL_2) :- 参照URLならび(_リンク部ならび_1,_参照URL_1), 参照URLならび(_リンク部ならび_2,_参照URL_2),!. 参照URLならび(_リンク部ならび,_参照URLならび) :- findall(_参照URL,( append(_,[_行|_],_リンク部ならび), 参照URL(_行,_参照URL)), _参照URLならび). 参照URL(_行,_参照URL) :- split(_行,['"'],[_,_参照URL|_]),!. 行とURLを対応させる(_リンク部ならび_2,_差分参照URLならび,_差分リンク部) :- findall(_行,( append(_,[_行|_],_リンク部ならび_2), 参照URL(_行,_参照URL), append(_,[_参照URL|_],_差分参照URLならび)), _差分リンク部). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/700 # # サクラエディタで、改行部分を連番+改行に置き換えたいのですけど、連番に変換するにはどうしたらよろしいでしょうか? # # 文字列1 # 文字列2 # # を # 1 # 文字列1 # 2 # 文字列2 # # といったかんじです。 # '改行部分を連番+改行に置き換える'(_ファイル) :- get_lines(_ファイル,Lines), open(_ファイル,write,Outstream), append(L0,[Line|R],Lines), length([_|L0],N), write_formatted(Outstream,'%t\n%t\n',[N,Line]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/439 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 次のCプログラムとアセンブラコードを作成しなさい。 # 問題1「Hello World!」を作成するCプログラム # 問題2九九の計算結果を一の段から九の段まで表示するプログラム #  例  123456789 # 2 4 6 8 10 12 14 16 18  #    % stdio.h の位置を移動してあります。.htmlファイルで > < に囲まれるとブラウザの表示時に化けるので。 'Hello World!のCプログラムとアセンブラコードを作成しなさい。'(_Cプログラム,_アセンブラコード) :- 'Hello World!ソースプログラムを書く', '-Sオプションでコンパイル', get_lines('hello.c',_Cプログラム), get_lines('hello.s',_アセンブラコード). 'Hello World!ソースプログラムを書く' :- open('hello.c',write,Outstream), write_formatted(Outstream,'%t',['#include "stdio.h"\nmain() {\n printf("Hello World\\n");\n}\n']), close(Outstream). '-Sオプションでコンパイル' :- system('cc -S hello.c'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/348 # # [1] 授業単元: プログラミング # [2] 問題文:たとえば、100個の数字が用意されたファイルを用意します。 # そのファイルを使って平均値を求めるプログラムを作りたいのですが教えてください。 # ファイル名は適当で良いです。 # # 平均値を求める計算は関数部分でお願いします。 # ファイルから読み出した数字の平均を求める(_ファイル) :- 100個の数字が用意されたファイルを用意します。(_ファイル), get_lines(_ファイル,Lines), findall(V,( append(_,[Line|_],Lines), atom_to_term(Line,V,_)), _標本ならび), 重み付け可能な汎用平均器(_標本ならび,[],[],0,0,0,_相加平均,_調和平均,_相乗平均), write_formatted('相加平均は %t, 調和平均は %t, 相乗平均は %t です。\n',[_相加平均,_調和平均,_相乗平均]). 100個の数字が用意されたファイルを用意します。(_ファイル) :- length(L,100), 100個の数字を用意する(L), tell(_ファイル), put_lines(L), told,!. 100個の数字を用意する([]). 100個の数字を用意する([V|R]) :- V is random mod 1000, 100個の数字を用意する(R). 重み付け可能な汎用平均器([],_,Ln,_相加和,_調和和,_相乗和,_相加平均,_調和平均,_相乗平均) :- length(Ln,N), _相加平均 is _相加和 / N, _調和平均 is N / _調和和, _相乗平均 is exp(_相乗和 / N), !. 重み付け可能な汎用平均器([A|R],[],Ln,_相加和,_調和和,_相乗和,_相加平均,_調和平均,_相乗平均) :- _相加和2 is _相加和 + A, _調和和2 is _調和和 + (1.0 / A), S0 is ln(A), _相乗和2 is _相乗和 + S0, 重み付け可能な汎用平均器(R,[],[_|Ln],_相加和2,_調和和2,_相乗和2,_相加平均,_調和平均,_相乗平均). 重み付け可能な汎用平均器([A|R],[_重み|R2],Ln,_相加和,_調和和,_相乗和,_相加平均,_調和平均,_相乗平均) :- _相加和2 is _相加和 + A * _重み, _調和和2 is _調和和 + (1.0 / (A * _重み)), S0 is ln(A * _重み), _相乗和2 is _相乗和 + S0, 重み付け可能な汎用平均器(R,R2,[_|Ln],_相加和2,_調和和2,_相乗和2,_相加平均,_調和平均,_相乗平均). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/317 # # 配列とファイルの読み込みです。 # # たとえば、100個の数字が用意されたファイルを用意します。 # そのファイルを使って平均値を求めるプログラムを作りたいのですが教えてください。 # ファイル名は適当で良いです。 # # 平均値を求める計算は関数部分でお願いします。 # たとえば、100個の数字が用意されたファイルを用意します。そのファイルを使って平均値を求める(_ファイル,_平均値) :- get_lines(_ファイル,Lines), findavg(N,( append(_[Line|_],Lines), atom_to_term(Line,N,_)), _平均値). 100個の数字が用意されたファイルを用意します(_ファイル) :- length(L,100), 100個の数字が用意されたファイルを用意します(L), open(_ファイル,write,Outstream), append(_,[N|R],L), write_formatted(Outstream,'%t\n',[N]), R = [], close(Outstream). 100個の数字が用意されたファイルを用意します([]) :- !. 100個の数字が用意されたファイルを用意します([V|R]) :- V is random mod 10000, 100個の数字が用意されたファイルを用意します(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/32 # # 失礼しました。 # # [1] 授業単元:応用プログラミング # [2] 問題文(含コード&リンク): # n人の成績データを一次元配列に格納し、平均点を求めるプログラムを作成せよ。 # ただし、データ入力部、計算部、出力部は関数化せよ。 # # 'n人の成績データを成績データならびに格納し、平均点を求める'(File) :- 'n人の成績データを成績データならびに格納し、'(_Lines,_成績データならび), 平均点を求める(_n人,_成績データならび,_平均点), 平均点を出力する(_成績データならび,_平均点). 'n人の成績データを成績データならびに格納し、'(File,_n人,_成績データならび) :- get_lines(File,Lines), 'n人の'(Lines,_n人,R), '成績データを成績データならびに格納し、'(R,_成績データならび). 'n人の'(Lines,_n人,R) :- append([Line],R,Lines), read_term_from_atom(Line,_n人,[]). '成績データを成績データならびに格納し、'(R,_成績データならび) :- findall(_成績,(member(A,R),read_term_from_atom(A,_成績,[])),_成績データならび). 平均点を求める(_n人,_成績データならび,_平均点) :- sum_list(_成績データならび,_n人の合計点), _平均点 is _n人の合計点 / _n人. 平均点を出力する(_成績データならび,_平均点) :- writef('成績ならびは %t. 平均点は %t です。\n',[_成績データならび,_平均点]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/32 # # 失礼しました。 # # [1] 授業単元:応用プログラミング # [2] 問題文(含コード&リンク): # n人の成績データを一次元配列に格納し、平均点を求めるプログラムを作成せよ。 # ただし、データ入力部、計算部、出力部は関数化せよ。 # # 'n人の成績データを一次元配列に格納し、平均点を求める'(_成績ならび,_平均点) :- get_lines('data.txt',Lines), append([Line],R,Lines), atom_to_term(Line,_n人,_), length(_成績ならび,_n人), append(_成績ならび,_,R), findavg(N,( append(_,[A|_],L), atom_to_term(A,N,_)), _平均点), write_formatted('成績ならびは %t. 平均点は %t です。\n',[_成績ならび,_平均点]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1287755129/11 # # 3003,aaa # 3004,bbb # 3005,ccc # ・ # ・ # こんなレコードが何百万行っていうCSVがあって、 # 1カラム目の値をキーとして、2カラム目の値を取得したいんです。 # このリクエストは1分当たりに何度も発生します。 # 当然、1カラム目の値はユニークです。 # # で、リクエストが発生するたびに、 # 単純に先頭から検索していったんじゃ、時間がかかるんで、 # このCSVをハッシュに持っておいて、 # レスポンスを返すようなデーモンを作れば、速くなるかな〜 # と考えてるんですが、方向性は合ってますかね? # #DBは使えない環境です。。。 # # ここで聞くことか迷ったんですが、 # 組むならperlで組むんで、こちらで聞いてみました。 # # よろしくお願いします。 # # 要約関数(_述語幹部,_鍵整数値,_述語名) :- _法 = 1000, _剰余 is _鍵整数値 mod _法, concat_atom([_述語名幹部,'_',_剰余],_述語名),!. '第一項をユニークな整数鍵とするCSVファイルを要約関数述語として登録'(CSVファイル,_述語名幹部) :- get_lines(CSVファイル,Lines), append(_,[Line|R],Lines), split(Line,[','],[_鍵整数値|_値ならび]), 要約関数述語の節として追加(_述語名幹部,_鍵整数値,_値ならび), R = [],!. 要約関数述語の節として追加(_述語名幹部,_鍵整数値,_値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), P =.. [_述語名幹部,_鍵値|_値ならび], asserta(P). 要約関数述語の節を削除(_述語名幹部,_鍵整数値,_値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), P =.. [_述語名,_鍵値|_値ならび], retract(P). 要約関数述語の検索(_述語名幹部,_鍵整数値,_値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), P =.. [_述語名,_鍵値|_値ならび], call(P). 要約関数述語の節置換(_述語名幹部,_鍵整数値,_更新する値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), length(_更新する値ならび,Len), length(L,Len), P1 =.. [_述語名,_鍵値|L], retract(P1), P2 =.. [_述語名,_鍵値|_更新する値ならび], asserta(P2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1274998754/670 # # C++で躓いてしまいました。。 # 10行程度の文字が書かれてあるテキストファイルを開き、各行の1文字 "+" だけをを消去していく # ようなプログラミングは可能でしょうか? # 今は、foutで使用してファイルに書き込みをしているのですが、どうしても各行1文字だけを消去するというアルゴリズムのアイディアが浮かばず # 質問させて頂きました。 # よろしくお願いします。 # '10行程度の文字が書かれてあるテキストファイルを開き、各行の1文字 "+" だけをを消去していく'(_テキストファイル) :- get_lines(_テキストファイル,Lines), findall(Line2,( append(_,[Line|R],Lines), 文字列置換(Line,'+','',Line2)), Lines2), put_lines(_テキストファイル,Lines2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/503 # # 秀丸ですが、指定の文字列が無い行全てを削除したいです。 # # 以下の様な複数行のターゲットがあって、zyzの文字列が有る行のみ # 残したいのです。 # # .+[^(zyz)].+\n じゃダメだったし、力不足でニッチもサッチもいきませんorz # どなたかHELP ME・・・・・ # # AAABBBzzyCCDDDEEEAAA # AAABBBDDzyzEEEAAA # AAABBBCCzyzEEEAAA # AAABBBCCDDDAAA # AAACCDDDEEEAA # AzyzAABBBCCDDDEEEAAA # 指定の文字列が無い行全てを削除したい(_ファイル名,_削除指定文字列) :- get_lines(_ファイル名,Lines), findall(_行,( append(_,[_行|_],Lines), 指定文字列がある(_行,_削除指定文字列)), Lines2), put_lines(_ファイル名,Lines2). 指定文字列がある(_行,_指定文字列) :- sub_atom(_行,_,_,_,_指定文字列),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/568 # # 質問です。 # テキストの中の<location></location>で囲まれた行のみ処理対象にして、 # 1.<location></location>を残す。 # 2../(ピリオドとスラッシュ)を追加。 # 3.前から8個目(後ろから1個目)の/(スラッシュ)以降のファイル名を残す。 # という正規表現を教えてください。 # # 例 # <location>file:///(ドライブ名):/(フォルダ名)/(フォルダ名)/(フォルダ名)/(フォルダ名)/(ファイル名)</location> # という行がテキストファイル内に存在したら # <location>./(ファイル名)</location> # という内容に変更したい。フォルダ名とファイル名に規則性無し。 # 特に、8個目の/(スラッシュ)以降の文字列を残す方法が全くワカリマヘン。 # # 現状レベル # 昨日から丸1日正規表現に取り組んで、近づいてる様な近づいてない様な抽出実験してるレベルです。 # # 因みに今回のテキストファイルは、VLCのプレイリストのxspfファイルです。 # ファイルを移動した時、プレイリストが絶対アドレスで定義されてるので、リンクが切れてしまいます。 # 今回の変更で、相対アドレスになりある程度のファイル移動が可能になる。まあ仕事じゃない趣味のレベルです。 # # 宜しくお願いします。 # 'テキトの中ので囲まれた行のみ処理対象にして、1.を残す。2../(ピリオドとスラッシュ)を追加。3.前から8個目(後ろから1個目)の/(スラッシュ)以降のファイル名を残す。' :- get_lines(_テキストファイル,Lines), append(_,[_行|R],Lines), 'で囲まれた行のみ処理対象'(_行), R = []. 'で囲まれた行のみ処理対象'(_行) :- 'SPLIT'(_行,['','/',''],L), append([''],L1,[''],L), last(L1,_ファイル名), concat_atom(['./',_ファイル名,''],S), write_formatted('%t\n',[S]),!. 'で囲まれた行のみ処理対象'(_行) :- write_formatted('%t\n',[_行]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/557 # # JMeterで何とか以下のHTMLの『二番目の』optionを拾いたいんだけど、どーも上手くいきません。 # <select name="select$item1" onchange="javascript:dummry();" id="select_item1"> # <option selected="selected" value="0">(none)</option> # <option value="1">item1</option> # <option value="2">item2</option> # <option value="3">item2</option> # </select> # ※optionの行にはいくつかタブが入っています。 # # 「id="select_item1">([.\r\n\t\f]*)option value="([1-9]*)"」と書けば拾ってくれると思ったんだけどダメでした。 # 何か忘れている箇所がありましたら、是非アドバイスをお願いします。 # # ちなみに(おそらくnameに$が入っているせいだと思いますが)HTMLリンクパーサは動きません(涙 # # '『二番目の』optionを拾いたい'(_htmlファイル,_二番目のoption) :- get_lines(Lines), '『二番目の』option'([],Lines,_二番目のoption). '『二番目の』option'([_],[_行|R],_二番目のoption) :- 'SPLIT'(_行,['>',''|_],L), last(L0,_二番目のoption),!. '『二番目の』option'(L,[_行|R],_二番目のoption) :- 'SPLIT'(_行,['>','',L), '『二番目の』option'([_|L],R,_二番目のoption). '『二番目の』option'(L,[_行|R],_二番目のoption) :- '『二番目の』option'(L,R,_二番目のoption). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/374 # # 【 課題 】 コマンドラインからファイル名を受け取り、拡張子が txt の場合は内容を表示し、 # txt でない場合はファイル情報を表示しなさい。また、コマンドラインからファイル名が与えられなかった場合には # FileChooser を使ってファイル名を自由に取得できるようにしなさい。 # 【 補足 】.txtという拡張子の時でもFileChooserが動いてしまうので、 # それをどうにか直したいのですが、うまくいきません。 # 以下がソースです。 # http://ime.nu/www.geocities.jp/lang_lang_true/ss.txt # prolog :- 'コマンドラインからファイル名を受け取り、拡張子が txt の場合は内容を表示し、txt でない場合はファイル情報を表示しなさい。また、コマンドラインからファイル名が与えられなかった場合にはFileChooser を使ってファイル名を自由に取得できるようにしなさい。'. 'コマンドラインからファイル名を受け取り、拡張子が txt の場合は内容を表示し、txt でない場合はファイル情報を表示しなさい。また、コマンドラインからファイル名が与えられなかった場合にはFileChooser を使ってファイル名を自由に取得できるようにしなさい。' :- user_parameters([_ファイル名]), '拡張子が txt の場合は内容を表示し、txt でない場合はファイル情報を表示しなさい'(_ファイル名),!. 'コマンドラインからファイル名を受け取り、拡張子が txt の場合は内容を表示し、txt でない場合はファイル情報を表示しなさい。また、コマンドラインからファイル名が与えられなかった場合にはFileChooser を使ってファイル名を自由に取得できるようにしなさい。' :- \+(user_parameters([_])), ファイル名指定(_ファイル名), '拡張子が txt の場合は内容を表示し、txt でない場合はファイル情報を表示しなさい'(_ファイル名),!. '拡張子が txt の場合は内容を表示し、txt でない場合はファイル情報を表示しなさい'(_ファイル名) :- atom_suffix(_ファイル名,4,'.txt'), get_lines(_ファイル名,Lines), put_lines(Lines). '拡張子が txt の場合は内容を表示し、txt でない場合はファイル情報を表示しなさい'(_ファイル名) :- \+(atom_suffix(_ファイル名,4,'.txt')), get_file_info(_ファイル名,_ファイル情報ならび), write_formatted('%t\n',[_ファイル情報ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1280653311/566 # # [1] 授業単元:応用C言語 # [2] 問題文(含コード&リンク): # テキストファイルを読み込み、指定された文字列を検索し、指定文字列が含まれている行を抽出して出力するプログラムを作成せよ。 # プログラムの実行および引数は以下の通りである。 # 実行ファイル名 入力ファイル名 検索文字列 出力ファイル名 # # *1行50文字×1000行以上扱えること # program :- user_parameters([_入力ファイル名,_検索文字列,_出力ファイル名]), テキスト検索(_入力ファイル名,_検索文字列,_出力ファイル名). テキスト検索(_入力ファイル名,_検索文字列,_出力ファイル名) :- get_lines(_入力ファイル名,L), findall(_行,( append(_,[_行|R],L), 行検索(_行,_検索文字列)), _検索した行ならび), put_lines(_出力ファイル名,_検索した行ならび). 行検索(_行,_検索文字列) :- sub_atom(_行,_,_,_,_検索文字列),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1197620454/581 # # 問題3:ファイルのデータ(英文)を読み込み、一行毎の文字数(スペースも含む)とワード数を数えるプログラム。 # (実行結果例) # (例として次のような C:\test3.txtを入力する) # And friends just can't be found # Like a bridge over troubled water # I will lay me down ←の文章を以下のようなプログラムにする。 # # ファイル名を入力してください:C:\test3.txt # 1:And friends just can't be found # ⇒31文字、6ワード # 2:Like a bridge over troubled water # ⇒33文字、6ワード # 3:I will lay me down # ⇒18文字、5ワード # 'ファイルのデータ(英文)を読み込み、一行毎の文字数(スペースも含む)とワード数を数える'(_ファイル) :- get_lines(_ファイル,Lines), append(_,[S|R],Lines), sub_atom(S,0,_文字数,0,S), split(S,[' ',',',':'],L1), length(L1,_ワード数), write_formatted('%t\n=%t文字、%tワード\n',[S,_文字数,_ワード数]), R = [],!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/91 # # [1] 授業単元:情報処理 # [2] 問題文: # # 問1 キーボードから3個の実数(整数でない)値を1行に1組として計5組入力し、 # ファイル(ファイル名data1.txt)に保存する。 # # 問2 #  問1で作ったファイルから実数値を読み込み、総合計と各組の実数の平均を求める。 # ただし、ファイルに書かれている組の数は不明とする。 # 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力し、ファイル(ファイル名data1.txt)に保存する。 ' :- 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(1,L), open('data1.txt',write,Output), append(_,[[V1,V2,V3]|R],L), write_formatted(Output,'%t,%t,%t\n',[V1,V2,V3]), R = [], close(Output),!. 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(3,[]) :- !. 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(N,[L|R]) :- write_formatted('%t組目の入力 _実数1 _実数2 _実数3 : ',[N]), get_line(Line), 入力の診断(Line,L), N2 is N + 1, 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(N2,R),!. 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(N,X) :- 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(N,X). 入力の診断(Line,[V1,V2,V3]) :- split(Line,[' ',','],[V1,V2,V3]), real(V1), real(V2), real(V3),!. 入力の診断(Line,[V1,V2,V3]) :- write_formatted('%tは実数を3個(間をスペースであける)になっていません',[Line]), fail. '問1で作ったファイルから実数値を読み込み、総合計と各組の実数の平均を求める。'(_総合計,_各組の実数の平均) :- get_lines('data1.txt',Lines), 総合計の取得(Line,_総合計), 各組の平均の取得(Lines,_各組の実数の平均). 総合計の取得(Lines,_総合計) :- findsum(_各行の合計,( member(Line,Lines), split(Line,[','],[V1,V2,V3]), _各行の合計 is V1+V2+V3), _総合計). 各組の平均の取得(Lines,_各組の実数の平均ならび) :- findall(_各組の実数の平均,( member(Line,Lines), split(Line,[','],[V1,V2,V3]), _各組の実数の平均 is (V1+V2+V3) / 3), _各組の実数の平均ならび). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1262163854/238 # # Repl-Aceというテキスト置換ツールを使っているんですが、 # # 1月 # ・1日 # ・2日 # ・3日 # 2月 # ・1日 # ・2日 # ・3日 # # といったテキストを、 # # 1月1日 # 1月2日 # 1月3日 # 2月1日 # 2月2日 # 2月3日 # # といったように置換することができず困っています。 # 単純な文字の置換や簡単な正規表現は理解できるのですが、 # 1月から2月までの「・」を「1月」に置換、2月から3月までの「・」を「2月」に置換、3月から(ry # を一気に行えるような正規表現ってありますか? # Repl-Aceで試すのは自力でやるので、一般的な記述方法があれば教えてください。 # おながいします。 # 月日の構造表現を平坦な月日に置換(InputTextFile,OutputTextFile) :- get_lines(InputTextFile,Lines), 平坦な月日に置換(Lines,L), put_lines(OutputTextFile,L). 平坦な月日に置換([],[]) :- !. 平坦な月日に置換([_月|R1],L) :- \+(sub_atom(_月,0,1,_,'.')), 平坦な月日に置換(_月,R1,R2,L1), 平坦な月日に置換(R2,L2), append(L1,L2,L). 平坦な月日に置換(_,[],[],[]) :- !. 平坦な月日に置換(_,[_月|R1],[_月|R1],[]) :- \+(sub_atom(_月,0,1,_,'.')),!. 平坦な月日に置換(_月,[A|R1],R,[C|R2]) :- sub_atom(A,1,_,0,B), concat_atom([_月,B],C), 平坦な月日に置換(_月,R1,R,R2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1136788500/499 # # Visual Basicでの質問なんですが、 # # 今給料明細のプログラミングをしてまして、 # 1日目の就業時間 8時間30分 # 2日目の就業時間 8時間30分 # 3日目〜〜 # 4日目〜〜 # # 総労働時間123時間30分 # などという用に作りたいのですが、 # timeserial関数を使って計算したところ24時間以降はまた1になってしまいます。 # 何かいい方法はないでしょうか? # # :- op(450,xfx,時間). :- op(440,xf,分). :- op(500,xfx,日目の就業時間). 就業時間合計(_時間,_分) :- findsum([_N2,_N3],(N 日目の就業時間 N2 時間 N3 分),[_時間_1,_分_1]), _分 is truncate(_分_1) mod 60, _時間プラス is _分_1 // 60, _時間 is truncate(_時間_1) + _時間プラス. /* 就業時間合計(_就業時間テキスト,_時間,_分) :- get_lines(_就業時間テキスト,Lines), member(Line,Lines),, replace(Line,日目の就業時間,' 日目の就業時間',Line1), replace(Line1,時間,' 時間',Line2), replace(Line2,分,' 分',Line3), atom_to_term(Line3,Term,_), assertz(Term), fail. 就業時間合計(_就業時間テキスト,_時間,_分) :- 就業時間(_時間,_分). */ % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/414 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):switch 文を使用して # 1. データファイルの新規作成 # 2. データファイルの追加作成 # 3. データファイルの読み込みと表示 # 4. 終了 # をメニュー形式で処理するプログラムを作成せよ。 # ・ ファイル名はキーボードから入力する。 # ・ 1〜4の処理はユーザ関数として定義すること。 # void data_write(void) # void data_append(void) # void data_read(void) # void the_end(void) # ・1〜4以外の数値が入力されたら再入力させること。 # # switch(N,{N:P}) :- !,call(P). switch(N,{N:P;_}) :- !,call(P). switch(N,{P1;P2}) :- switch(N,{P1});switch(N,{P2}). switch述語を使ってメニューを処理する(N,File) :-     switch(N,{1:データファイルの新規作成(File);2:データファイルの追加作成(File);3:データファイルの読み込みと表示(File);4:終了}). データファイルの新規作成(File) :- open(File,write,Output),close(Output). データファイルの追加作成(File) :-     write('追加要素を入力しなさい : '),     get_line(Line),     open(File,append,Output),     write_formatted(Output,'%t\n',[Line]),     close(Output). データファイルの読み込みと表示(File) :-     get_lines(File,Lines),     put_lines(Lines). 終了 :- halt. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274121477/320 # # 日本語文章中の複数の単語を置換したいです。 # ファイルは一つのディレクトリに複数あります。 # >http://ime.nu/www.machu.jp/diary/20070224.html#p01 # ファイル検索はcygwin かlinux上なので上記を参考にしています。 # trではうまくいきませんでした。 # # お題 # # 拡張子が .rb の全てのファイルに対して、 # # #!/usr/bin/env ruby # # を # # #!/usr/local/bin/ruby # # に置換する。ついでに、「ruby」という文字を「perl」に置き換える '拡張子が .rb の全てのファイルに対して、#!/usr/bin/env ruby を #!/usr/local/bin/ruby に置換する。ついでに、「ruby」という文字を「perl」に置き換える' :- shs('ls -N *.cs',Files), append(_,[File|R],Files), get_lines(File,Lines), 指定された内容に文字列を置換する(Lines,Lines2), put_lines(File,Lines2), R = []. 指定された内容に文字列を置換する([],[]) :- !. 指定された内容に文字列を置換する([Line|R1],[Line2|R2]) :- sub_atom(Line,_,_,_,A1,'#!/usr/bin/env ruby',A3,L1,L2,L3), concat_atom([A1,'#!/usr/local/bin/ruby',A3],Line1), rubyをperlに置換する(Line1,Line2), 指定された内容に文字列を置換する(R1,R2),!. 指定された内容に文字列を置換する([Line|R1],[Line2|R2]) :- rubyをperlに置換する(Line,Line2), 指定された内容に文字列を置換する(R1,R2). rubyをperlに置換する(Line,Line2) :- replace_all(Line,ruby,perl,Line2). % replace_all/3は http://nojiriko.asia/prolog/replace_atom.html 参照 % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1266565626/627 # # ずぶの素人なのですのでお手柔らかにお願いします # # 今2つのテキストファイルがあって、内容はおおよそ下のようです # # --------------テキストA------------------- # fcart1 -0.0000000000E+00 -0.0000000000E+00 1.0770536961E-04 # -0.0000000000E+00 -0.0000000000E+00 6.6543134784E-04 # -0.0000000000E+00 -0.0000000000E+00 -7.7313671745E-04 # getden1 0 # ------------------------------------------ # # --------------テキストB-------------------- # xred 0.0 0.0 0.047843858990 # 0.0 0.0 0.000434433306 # 1/3 2/3 -0.011730466739 # #Definition of the planewave basis set # ------------------------------------------ # テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足したいのですが # どのようにしたらいいでしょうか # ご教授お願いします # テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(_テキストA,_テキストB) :-     get_lines(_テキストA,LinesA),     get_lines(_テキストB,LinesB),     テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(LinesA,LinesB,LinesC),     put_lines(_テキストB,LineC). テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(LinesA,LinesB,LinesC) :-     テキストの一番右の列の数値を切り取る(LinesA,LA),     テキストの一番右の列の数値を切り取る(LinesB,LB),     加算([LA,LB],LC),         テキストBの最終数値要素を置換(LB,LC,LineC). テキスト一番右の列の数値を切り取る([],[]) :- !. テキスト一番右の列の数値を切り取る([Line|R1],[V|R2]) :-     split(Line,[ ],L),     数値要素が3個以上(L),     last(L,V),     テキストAの一番右の列の数値を切り取る(R1,R2). テキストBの最終数値要素を置換([],_,[]) :- !. テキストBの最終数値要素を置換([Line|R1],[V|R2],[LineC|R3]) :-     sPLIT(Line,[ ],L1),     数値要素が3個以上(L1),         length(L1,Len),     findmax(Nth,(            for(1,Nth,Len),            list_nth(Nth,L1,V1),number(V1)),         LastNth),     要素番号によるならびの置換(LastNth,V,L1,L3),     concat_atom(L3,LineC),     テキストBの最終数値要素を置換(R1,R2,R3),!. テキストBの最終数値要素を置換([Line|R1],L2,[Line|R3]) :-     テキストBの最終数値要素を置換(R1,L2,R3),!. 数値要素が3個以上(L1) :-     count((member(A,L1),number(A)),Count),     Count >= 3,!. % *** user: sPLIT / 3 *** sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not U = ''),L), L = X,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % *** user: 'SPLIT' / 3 *** 'SPLIT'(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Z), Z = X,!. % *** user: split_00 / 3 *** split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび),atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). % *** user: split_0 / 3 *** split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X) . % *** user: split_1 / 3 *** split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. % *** user: split_2 / 5 *** split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. % *** user: split / 3 *** split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not U = ''),L), L = X,!. % *** user: sPlit / 3 *** sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(member(U,_区切り符号ならび))), Z), Z = X,!. % *** user: put_lines / 2 *** put_lines(_,[]) :- !. put_lines(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), open(File_1,write,Output), put_lines(Output,L), close(Output),!. put_lines(Output,[Line|R]) :- is_stream(_,Output,_), write(Output,Line), write(Output,'\n'), put_lines(Output,R),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/198 # # ファイルkadai.txt に記述された数行の数値を表す文字列を読み込み、 # 整数に変更して数値として表示するプログラムを作成せよ。 # 関数としてstrtol()を使用すれば問題ないが、同じ機能の関数を作成すること。 # 基数の設定に関する引数は必要なくデフォルト(先頭が0 なら8 進、それ以外は10 進、16 進は使用しない)とする # 'ファイルkadai.txt に記述された数行の数値を表す文字列を読み込み、整数に変更して数値として表示する' :- get_lines('kadai.txt',_行ならび), append(_,[_行文字列|R],_行ならび), 整数に変更して(_行文字列,_整数), write_formatted('%t\n',[_整数]), R = []. 整数に変更して(_行文字列,_整数) :- sub_atom(_行文字列,0,1,_,'0'), atom_codes(_行文字列,Codes), reverse(Codes,Codes2), 反転した基数コードならびから10進数を得る(8,Codes2,_整数),!. 整数に変更して(_行文字列,_整数) :- atom_codes(_行文字列,Codes), reverse(Codes,Codes2), 反転した基数コードならびから10進数を得る(10,Codes2,_整数),!. 反転した基数コードならびから10進数を得る(_,[],0) :- !. 反転した基数コードならびから10進数を得る(_基数,[C|R],M) :- \+((C >=48,C =< 57)), 反転した基数コードならびから10進数を得る(_基数,R,M),!. 反転した基数コードならびから10進数を得る(_基数,[C|R],M) :- M0 is C - 48, 反転した基数コードならびから10進数を得る(_基数,R,M2), M is M2 * _基数 + M0. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/87 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # txtファイルからデータを読み込み、人口順に並べ替えて、都道府県名、人口、面積を1行に表示せよ。 # 表示は全部で5行になる。 # # txtファイルの内容 # Gunma # 2016027 # 6363.16 # Saitama # 7104222 # 3797.25 # Chiba # 6108809 # 5156.60 # Tokyo # 12790202 # 2187.58 # Kanagawa # 8899545 # 2415.84 # # txtファイルからデータを読み込み、人口順に並べ替えて、都道府県名、人口、面積を1行に表示せよ(_textファイル) :- '3行で一組の情報を読み取る'(_textファイル,L), append(_,[[_都道府県名,_人口,_面積]|R],L), write_formatted('%t,%t,%t\n',[_都道府県名,_人口,_面積]), R = []. '3行で一組の情報を読み取る'(_textファイル,L) :- get_lines(_textファイル,Lines), 'N個組'(3,Lines,L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/918 # # [1] 授業単元:Cプログラミング演習 # [2] 問題文(含コード&リンク): # 問題1:文字列"Computer1Programing2Communication3Electro4"を、"test.txt"に書き込むプログラムを作成せよ。 # 問題2:ファイル"test.txt"から文字列も読み込み、並びを逆にしてファイル"sample.txt"に出力するプログラムを作成せよ。("test.txt"は問題1で作成したものを使用すること。) # 問題3:ファイル"sample.txt"から大文字だけを画面に表示させるプログラムを作成せよ。("sample.txt"は問題2で作成したものを使用すること。) # '文字列"Computer1Programing2Communication3Electro4"を、"test.txt"に書き込む' :- open('test.txt',write,Output), write(Output,'Computer1Programing2Communication3Electro4'), close(Output). 'ファイル"test.txt"から文字列も読み込み、並びを逆にしてファイル"sample.txt"に出力する' :- get_lines('test.txt',Lines), open('sample.txt',write,Output), append(_,[Line|R],Lines), 並びを逆に(Line,_並びを逆にしたLine), write_formatted(Output,_並びを逆にしたLine), R = [], close(Output). 並びを逆に(Line,_並びを逆にしたLine) :- atom_chars(Line,Chars), reverse(Chars,Rchars), atom_chars(_並びを逆にしたLine,Rchars). 'ファイル"sample.txt"から大文字だけを画面に表示させる' :- get_chars('sample.txt',Chars), append(_,[Char|R],Chars), 大文字だけを画面に表示させる(Char), R = [],!. 大文字だけを画面に表示させる(Char) :- Char @>= 'A',Char @=< 'Z', write(Char). 大文字だけを画面に表示させる(Char) :- \+((Char @>= 'A',Char @=< 'Z')). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1266565626/538 # # test.txt文書内にある # abc001.jpg # abc002.jpg # という2行の文字列を # <Vol.001>abc001.jpg # <Vol.002>abc002.jpg # と書き換えてoutput.txtに書き出すPerlスクリプトを書きたいと思っています。 # しかし、test.txt内の文字列が1行の場合には上手くいきますが、 # 例のような複数行では # <Vol.001>abc001.jpg # abc002.jpg # となってしまいます。 # どこが間違っているのでしょうか? # # #!/usr/bin/perl # use strict; # use warnings; # $a="test.txt"; # $b="output.txt"; # open my $in , '<', $a or die "Cannot open '$a': $!"; # open my $out, '>', $b or die "Cannot open '$b': $!"; # while(<$in>){ # s/abc(.+?)\.jpg/<Vol\.$1>abc$1\.jpg/; # print $out $_; # }; # close($in); # close($out); # # 'test.txt文書内にあるabc001.jpg\nabc002.jpg\nという2行の文字列をabc001.jpg\nabc002.jpgと書き換えてoutput.txtに書き出すPerlスクリプトを書きたいと思っています。' :- get_lines('test.txt',Lines), tell('output.txt'), append(L1,[Line|R],Lines), length([_|L1],N), write_formatted_atom(';%t\n',[N,Line],S), write(S), R=[], told. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/453 # # # [1] 授業単元: 上級プログラミング # [2] 問題文(含コード&リンク): # # 1、VisualC++2008のWindowsフォームアプリケーションのプロジェクトを作成し、DataGridViewを作成なさい。列は # A,B,C の3列とする。 # 2、列Aに入力された4桁の数値を日付形式に変換し表示する様にしなさい(○月○日)。 # 3、sample.txtの内容を読み取り、その内容を使って列Bにオートコンプリートを実装しなさい。 # # sample.txtの内容は # あいうえお # abcde # 12345 # と言う様に、1行に1単語とする。 # # 列Bの入力(_行,2,X,LL1,LL2) :- rawmode, get_char(Char), 検査(Char,[],L), atom_chars(X,L) 要素位置による行列の置換(_行,2,X,LL1,LL2), 検査('\n',L,L) :- assertz(入力補助情報('B',L)),!. 検査(Char,L1,L) :- append(L1,[Char],L2), findall(L,(append(L1,[Char|R],LX),入力補助情報('B',LX)),_入力補助), 入力補助選択(L,_入力補助),!. 検査(Char,L1,L) :- append(L1,[Char],L2), get_char(Char2), 検査(Char2,L2,L). 列Bに入力補助初期情報を与える :- get_lines('sample.txt',Lines), member(Line,Lines), atom_chars(Line,Chars), assertz(入力補助情報('B',Chars)), fail. 列Bに入力補助初期情報を与える. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/217 # # [1] 授業単元:Cプログラミング # [2] 問題文(含コード&リンク): # 下記のアップロードされたファイル(数字の羅列)を読み込み、並び替え方法(昇順/降順)で指定されたファイル(out.txt) # へ出力するプログラムを作成せよ # http://ime.nu/www1.axfc.net/uploader/He/so/280605 # 以下実行結果 # # 並び替え方法をしていしてください(1:昇順、2:降順) # 1 # # 並び替えたファイルへ出力しました。 # # cat out.txt ←catコマンドで中身確認 # 1 # 3 # 3 # 3 # '下記のアップロードされたファイル(数字の羅列)を読み込み、並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_並べ替え方法) :- get_lines('input.txt',Lines), 整列(_並べ替え方法,Lines,Lines2), put_lines('out.txt',Lines2). 整列(_並べ替え方法,_対象ならび,_整列されたならび) :- 分割閾値の選択(_対象ならび,_分割閾値,_それ以外のならび), 分割(_並べ替え方法,_それ以外のならび,_分割閾値,_左側ならび,_右側ならび), 整列(_並べ替え方法,_左側ならび,_整列された左側ならび), 整列(_並べ替え方法,_右側ならび,_整列された右側ならび), append(_整列された左側ならび,[_分割閾値|_整列された右側ならび],_整列されたならび). 整列(_,[],[]). 分割閾値の選択([_分割閾値|_残りならび],_分割閾値,_残りならび) :- ここでは先頭要素を分割閾値とする. ここでは先頭要素を分割閾値とする. 分割(昇順,[_要素|_残りならび],_分割閾値,[_要素|_左側ならび],_右側ならび) :- _要素 @=< _分割閾値, 分割(昇順,_残りならび,_分割閾値,_左側ならび,_右側ならび). 分割(降順,[_要素|_残りならび],_分割閾値,[_要素|_左側ならび],_右側ならび) :- _要素 @>= _分割閾値, 分割(降順,_残りならび,_分割閾値,_左側ならび,_右側ならび). 分割(昇順,[_要素|_残りならび],_分割閾値,_左側ならび,[_要素|_右側ならび]) :- _要素 @> _分割閾値, 分割(昇順,_残りならび,_分割閾値,_左側ならび,_右側ならび). 分割(降順,[_要素|_残りならび],_分割閾値,_左側ならび,[_要素|_右側ならび]) :- _要素 @< _分割閾値, 分割(降順,_残りならび,_分割閾値,_左側ならび,_右側ならび). 分割(_,[],_,[],[]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/204 # # 「4行3列の配列をキーボードから読み込み、 # 各行、各列の和、及び配列全体の総和を求め、表示する # プログラムを作成しなさい。」という問題です。 '4行3列の配列をキーボードから読み込み、各行、各列の和、及び配列全体の総和を求め、表示する' :- '4行3列の配列をキーボードから読み込み、'(_4行3列の配列), 各行、各列の和、及び配列全体の総和を求め、(_4行3列の配列,_各行の和,_各列の和,_配列全体の総和), '_4行3列の配列,_各行の和,_各列の和,_配列全体の総和を表示する'(_4行3列の配列,_各行の和,_各列の和,_配列全体の総和). '4行3列の配列をキーボードから読み込み、'(_4行3列の配列) :- write('列を3要素の整数リストとして4行入力しなさい(ただしread/1で読み込めるよう入力は.で終わること) : '), findall(_3要素の整数ならび,(for(1,N,3),read(_3要素の整数ならび)),_4行3列の配列). 各行、各列の和、及び配列全体の総和を求め、(_4行3列の配列,_各行の和,_各列の和,_配列全体の総和) :- 各行の和(_4行3列の配列,_各行の和), 各列の和(_4行3列の配列,_各列の和), 配列全体の総和(_各行の和,_配列全体の総和). 各行の和(_4行3列の配列,_各行の和) :- findall(_行の和,(append(_,[_行|_],_4行3列の配列), sum(_行,_行の和)),_各行の和). 各列の和(_4行3列の配列,_各列の和) :- 転置(_4行3列の配列,_転置された配列), 各行の和(_転置された配列,_各列の和). 配列全体の総和(_各行の和,_配列全体の総和) :- sum(_各行の和,_配列全体の総和). '_4行3列の配列,_各行の和,_各列の和,_配列全体の総和を表示する'(_4行3列の配列,_各行の和,_各列の和,_配列全体の総和) :- 行の表示(_4行3列の配列,_各行の和), 各列の和の表示(_各列の和), 配列全体の総和の表示(_配列全体の総和). 行の表示([],[]) :- !. 行の表示([_行|R1],[_和|R2]) :- append(_行,[_和],L), write_formatted('%d,%d,%d,%d\n',L), 行の表示(R1,R2). 各列の和の表示(_各列の和) :- write_formatted('%d,%d,%d,',_各列の和). 配列全体の総和の表示(_配列全体の総和) :- write_formatted('%d\n',[_配列全体の総和]). sum([],0) :- !. sum([N|R],S) :- sum(R,S1),S is N + S1. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/php/1147830986/9 # # 1.1行ずつURLが記述されたテキストファイルを読み込み、 # 2.そのURLのコンテンツを取得して # 3.タイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) # するプログラムを作ってください。 # # 尚テキストファイルに記述されているURLは妥当なものと見なして構わないものとする。 # (リンク先が存在し、そこには必ず<title></title>で囲まれた箇所があるhtml) # また正常系のみで、エラー(テキストファイルが読み込めない、ネットワークが # 繋がらなくてコンテンツが取得できない)の場合の処理は無くて構わない。 # # 1〜3まで順を追ってやっていくと良いよ。 # 1がファイルの扱い、ループ処理や配列の扱い(逐次処理でやれば配列使わないけど)、 # 2がネット(HTTP)関連、3が文字列処理や正規表現あたり。 # '1行ずつURLが記述されたテキストファイルを読み込み、そのURLのコンテンツを取得してタイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) する'(_テキストファイル) :- get_lines(_テキストファイル,Lines), member(URL,Lines), 'URLをHost,Port,Fileに分解する'(URL,Host,Port,File), www_lines(Host,Port,File,_行ならび), 文字コードを得る(_行ならび,_文字コード), タイトルを得る(_行ならび,_文字コード,_タイトル), write_formatted('URL=%t タイトル=%t\n',[URL,_タイトル]), fail. '1行ずつURLが記述されたテキストファイルを読み込み、そのURLのコンテンツを取得してタイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) する'(_). 'URLをHost,Port,Fileに分解する'(URL,Host,Port,File) :- 'sPLIT'(URL,['/',':'],[http,':','/','/',Host,':',Port,'/'|File]),!. 'URLをHost,Port,Fileに分解する'(URL,Host,80,File) :- 'sPLIT'(URL,['/',':'],[http,':','/','/',Host,'/'|File]),!. 文字コードを得る(_行ならび,_文字コード) :- append(_,[''|R],_行ならび), append(_,[_行|R1],R), sub_atom(_行,_,8,_,P,'char_set',_残り文字列,_,_,_), split(_残り文字列,['=',' ',',','>'],[A|_]), to_upper(A,B), 文字コード(A,_文字コード). タイトルを得る(_行ならび,euc,_タイトル) :- append(_,[''|R],_行ならび), append(_,[_行|R1],R), sub_atom(_行,_,7,_,_,'',_残り文字列,_,_,_), sub_atom(_残り文字列,_,8,_,_エンコードされたタイトル,'',_,_,_,_), URLの文字列をデコードする(_エンコードされたタイトル,_タイトル),!. 文字コード('EUC_JP',euc) :- !. 文字コード('EUC-JP',euc) :- !. 文字コード('SJIS_JP',sjis) :- !. 文字コード('SJIS-JP',sjis) :- !. www_lines(Host, Port, File, DataList) :- hp_open_client(Host, Port, Socket), make_request_header(Host,Header), hp_work_client(Socket,Header,DataList). hp_open_client(Host, Service, Socket) :- atom(Service), !, net_service(Service, tcp, Port), socket(internet, stream, Socket), host_addr(Host, Addr), socket_connect(Socket, Addr : Port). hp_open_client(Host, Port, Socket) :- integer(Port), !, socket(internet, stream, Socket), socket_connect(Socket, Host : Port). make_request_header(_ファイル,Header) :- myhostname(Myhostname), request_header_file(_ファイル,_整形されたファイル), concat_atom(['GET ',_ファイル,' HTTP/1.1\nHost: ',Myhostname, '\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.7.8) Gecko/20050511\n', 'Accept: text/xml,application/xml,application/xhtml+xml,', 'text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\nAccept-Language: ja,', 'en-us;q=0.7,en;q=0.3\nAccept-Encoding: gzip,deflate\n', 'Accept-Charset: EUC-JP,utf-8;q=0.7,*;q=0.7\nKeep-Alive: 300\n', 'Connection: keep-alive\n\n'],Header). request_header_file(_ファイル,_ファイル) :- sub_atom(_ファイル,0,1,_,'/'),!. request_header_file(_ファイル,_整形されたファイル) :- \+(sub_atom(_ファイル,0,1,_,'/')), concat_atom(['/',_ファイル],_整形されたファイル),!. hp_work_client(Socket,Header,DataList) :- open(Socket, read, Input), open(Socket, write, Output), write_formatted(Output,'%t',[Header]), flush_output, findall(X,(repeat,get_line(Input,_診断,Data),(_診断=終了,!,fail;true)),DataList), close(Input), close(Output), socket_shutdown(Socket). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/989 # # [1] 授業単元:プログラミング演習 # [2] 問題文 : # 1.テキストファイル(file,txt)を読み込み、 goodという単語すべてをbadに置換し、filea.txtに出力せよ # 2.テキストファイル(file,txt)を読み込み、文字数の多い行から順に並べかえてfileb.txtに出力せよ # 'テキストファイル(file,txt)を読み込み、 goodという単語すべてをbadに置換し、filea.txtに出力せよ' :- get_lines('file.txt',Lines), findall(Line2,(member(Line,Lines),replace_all(Line,good,bad,Line2)),Lines2), put_lines('filea.txt',Lines2). 'テキストファイル(file,txt)を読み込み、文字数の多い行から順に並べかえてfileb.txtに出力せよ' :- get_lines('file.txt',Lines), findall([_文字数,_行],(member(_行,Lines),sub_atom(_行,_,_文字数,_,_行)),L1), sort(L1,L2), 第二要素だけ選択してならびを反転する(L2,[],L3), put_lines('fileb.txt',L3). 第二要素だけ選択してならびを反転する([],L,L) :- !. 第二要素だけ選択してならびを反転する([[_,A|_]|R1],L1,L) :- 第二要素だけ選択してならびを反転する(R1,[A|L1],L). replace_all('',_,_,[]) :- !. replace_all(Atom,Subatom,R_atom,[R_atom|R]) :- sub_atom(Atom,0,Len,Len3,Subatom), sub_atom(Atom(Len,Len3,_,Atom2), replace_all(Atom2,Subatom,R_atom,R),!. replace_all(Atom,Subatom,R_atom,[Atom1,R_atom|R]) :- sub_atom(Atom,_,_,_,Atom1,Subatom,Atom2,_,_,_), replace_all(Atom2,Subatom,R_atom,R),!. replace_all(Atom,_,_,[Atom]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1268979408/209 # # さくらエディタを使っていて # # CHAPTER01=00:00:00.000 # CHAPTER01NAME=第一部 オープニング # CHAPTER02=00:09:13.400 # CHAPTER02NAME=オラはにんきもの # # こういうのを # # TRACK 01 AUDIO # TITLE "第一部 オープニング" # INDEX 01 00:00:00 # TRACK 02 AUDIO # TITLE "オラはにんきもの" # INDEX 01 09:13:40 # # こうしたいんですが、正規表現でできるもんなんでしょうか # できるとしたら答えを貰えるのが一番ですが、どこら辺を調べればいいのかヒントをもらえないでしょうか # # 変換(_ファイル名) :- get_lines(_ファイル名,Lines), 変換規則('TRACK',Lines,TRACK,S1), 変換規則('TITLE',Lines,TRACK,S2), 変換規則('TIME',Lines,TRACK,S3), write_formatted('%t\n%t\n%t\n',[S1,S2,S3]), fail. 変換(_). 変換規則('TRACK',Lines,TRACK,S) :- member(_文,Lines), sub_atom(_文,0,7,_,H,'CHAPTER',T,HL,XL,TL), append(L0,['='|R2],TL), \+(append(_,['N','A','M','E'],L0)), concat_atom(L0,TRACK), concat_atom(['TRACK',' ',TRACK,' ','AUDIO'],S). 変換規則('TITLE',_Lines,TRACK,S) :- member(_文,Lines), sub_atom(_文,0,7,_,H,'CHAPTER',T,HL,XL,TL), append(L1,['='|R],TL), append(L0,['N','A','M','E'|R2],L1), concat_atom(L0,TRACK), concat_atom(R,TITLE), concat_atom([' ','TITLE',' "',TITLE,'"'],S). 変換規則('TIME',Lines,TRACK,S) :- member(_文,Lines), sub_atom(_文,0,7,_,H,'CHAPTER',T,HL,XL,TL), append(L0,['='|R2],TL), \+(append(_,['N','A','M','E'],L0)), concat_atom(L0,TRACK), concat_atom(R2,TIME), concat_atom([' ','INDEX',' 01 ',TIME],S). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/415 # # [1] 授業単元:プログラム # [2] 問題文(含コード&リンク):プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラムをC言語により作成する. # プログラム開始行はprogramからはじまることとする. 'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'(_プログラム) :- get_lines(_プログラム,Lines), 'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'(Lines,[],Lines2), put_lines(_プログラム,Lines2),!. 'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'([A|R1],[],['%',A|R1]) :- プログラム開始行はprogramからはじまることとする, sub_atom(A,0,7,_,program),!. 'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'([A|R1],[_|_],[A|R1]) :- プログラム開始行はprogramからはじまることとする, sub_atom(A,0,7,_,program),!. 'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'(['%'|R1],[],['%'|R2]) :- 'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'(R1,[_],R2). 'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'(['%'|R1],[_],R2) :- 'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'(R1,[_],R2). 'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'([A|R1],U,[A|R2]) :- \+(A='%'), 'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'(R1,U,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/83 # # [1] 授業単元: Cプログラム応用A # [2] 問題文(含コード&リンク): # 文字列操作の標準ライブラリ関数を使用し、指定したファイルの中で、辞書列で最初に出てくる単語と最後に出てくる単語、さらに最も長い単語をを見つけ表示せよ。 # ただし、同じ長さの単語がある場合最初に見つけた一つでいい。 # # ここでの単語とは、スペースや改行、タブで区切られた文字列のことである。 # ただし、単語の長さは100文字以内と考えていい。 # 指定したファイルの中で、辞書列で最初に出てくる単語と最後に出てくる単語、さらに最も長い単語をを見つけ表示する(_ファイル,_最初の単語,_最後の単語,_最もながい単語) :-   get_lines(_ファイル,Lines),   concat_atom(Lines,S),   split(S,[' ','\t','\n'],_単語ならび),   sort(_単語ならび,_整列された単語ならび),   append([_最初に出てくる単語|_],[_最後に出てくる単語],_整列された単語ならび),   findmax(_長さ,(member(_単語,_単語ならび),sub_atom(_単語,_,_長さ,_,_単語)),_最もながい長さ). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/752 # # 1] 授業単元: プログラミング # [2]問題文:http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyfmg/10358.txt # # ★演習問題2 # fgetc関数とfputc関数を使って,テキストファイルの内容を,別のテキ # ストファイルにコピーするプログラムを作成しなさい.確認のため,元の # ファイルとコピーされたテキストファイルの中身の内容を画面にそれぞれ # 出力せよ 'テキストファイルの内容を,別のテキストファイルにコピーする'(_コピー元ファイル,_コピー先ファイル) :- open(_コピー元ファイル,read,Input,[type(binary)]), open(_コピー先ファイル,write,Output,[type(binary)]), repeat, 一文字読む(Input,C), 一文字書き出す(Output,C), close(Input), close(Output),!. 一文字読む(Input,C) :- get_byte(C). 一文字書き出す(Output,-1) :- !. 一文字書き出す(Output,C) :- put_byte(Output,C),fail.!. テキストファイルの中身の内容を画面に出力(_コピー元ファイル,_コピー先ファイル) :- get_lines(_コピー元ファイル,Lines1), get_lines(_コピー先ファイル,Lines2), '2テキストを並べて行表示'(Lines1,Lines2),!. '2テキストを並べて行表示'([],[]) :- !. '2テキストを並べて行表示'([A|R1],[B|R2]) :- write_formatted('%t %t\n',[A,B]), '2テキストを並べて行表示'(R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/752 # # 1] 授業単元: プログラミング # [2]問題文:http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyfmg/10358.txt # ★演習問題3 # 氏名,年齢,性別が5人分書かれた次のようなテキストファイルを読み # 込んで、両面に表示するプログラムを作成せよ.このとき,構造体を利用 # せよ. #  (入力ファイル:test.txtの中身) # # Tanaka 31 Man # Kawai 24 Man # Suzuki 22 Woman # ltoh 40 Woman # Sugita 37 Man 'テキストファイルの内容を,別のテキストファイルにコピーする'(_コピー元ファイル,_コピー先ファイル) :- open(_コピー元ファイル,read,Input,[type(binary)]), open(_コピー先ファイル,write,Output,[type(binary)]), repeat, 一文字読む(Input,C), 一文字書き出す(Output,C), close(Input), close(Output),!. 一文字読む(Input,C) :- get_byte(C). 一文字書き出す(Output,-1) :- !. 一文字書き出す(Output,C) :- put_byte(Output,C),fail.!. テキストファイルの中身の内容を画面に出力(_コピー元ファイル,_コピー先ファイル) :- get_lines(_コピー元ファイル,Lines1), get_lines(_コピー先ファイル,Lines2), '2テキストを並べて行表示'(Lines1,Lines2),!. '2テキストを並べて行表示'([],[]) :- !. '2テキストを並べて行表示'([A|R1],[B|R2]) :- write_formatted('%t %t\n',[A,B]), '2テキストを並べて行表示'(R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/678 # # [1] 授業単元: 基礎プログラミングおよび演習 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10352.txt # # あるWebページに対する24時間分の閲覧者の名前、閲覧開始時刻および閲覧継続時間を表す「閲覧データ」があるとしよう。 # 1名以上の閲覧データから、閲覧している人数がもっとも多い30分刻みでの時間帯を求め、そのときの閲覧者名を印字する # プログラムを作成せよ。状況によっては日をまたぐこともあるが、ここではどの時間帯に閲覧が多いのかを知りたいので # 日の違いは考えなくてよい。各閲覧データは標準入力から、 # # 閲覧者名 # 閲覧開始時刻 閲覧継続時間 # # の2行で与えられる。ここで閲覧者名は英小文字2文字の後に4桁の数字が続く。閲覧開始時刻は24時間制での時を100倍し、 # 分を加えた数を表す4桁の数字、閲覧継続時間は分を表す高々3桁の数字である。時刻および時間は30分刻み(つまり0分か30分) # である。たとえば、 # # ku7535 # 0130 60 # # は、名前がku7535、開始時刻が1時30分、継続時間が60分、つまり1時30分から2時30分直前まで閲覧していたことを表す。 # まず閲覧データに対する構造体 user を定義し、それを要素とする大きさNの大域的な配列 users を用意せよ(Nはマクロ # である)。次に、N人分のデータを読み込むか、閲覧者名としてアスタリスク(*)が与えられるまで、標準入力から閲覧データを # 読み込み、配列 users にセットするとともに閲覧データを返す関数 int read_users(void) を作成せよ。最後に配列 users の # 先頭からn個の閲覧データを対象に、24時間中で最大人数が閲覧している30分刻みでの時間帯と、そのときの閲覧者名を印字 # する関数 void print_prime_time(int n) を定義せよ。ただし最大閲覧者数となる時間帯は一般に複数あることに注意すること。 # さらに以下のmain関数と組み合わせてプログラムを作成せよ。 標準入力から閲覧履歴読み込む(_閲覧履歴ならび) :- get_lines(Lines), 閲覧者情報の取得(Lines,_閲覧履歴ならび), 閲覧者履歴の登録(_閲覧者履歴ならび),!. 閲覧履歴の取得と登録([],[]) :- !. 閲覧履歴の取得と登録([_閲覧者名,B|R1],[[_閲覧者名,_閲覧開始時刻,_閲覧継続時間]|R2]) :- split(B,[' '],[_閲覧開始時刻,_閲覧継続時間]), assertz(閲覧履歴(_閲覧者名,_閲覧開始時刻,_閲覧継続時間)), 閲覧履歴の取得と登録(R1,R2),!. 先頭からn個の閲覧データを対象に、24時間中で最多人数が閲覧している30分刻みでの時刻と、そのときの閲覧者名を印字(N,_時,_分,_閲覧者ならび) :- 先頭からn個の閲覧データを対象に、24時間中で最多人数が閲覧している30分刻みでの時刻と、そのときの閲覧者名(N,_閲覧履歴ならび,_時刻,_閲覧者ならび), _時 is _時刻 // 100, _分 is _時刻 mod 100, concat_atom(_閲覧者ならび,' ',_閲覧者ならび表示), write_formatted('最多閲覧時間 %t時%t分から %t\n',[_時,_分,_閲覧者ならび表示]). 先頭からn個の閲覧データを対象に、24時間中で最多人数が閲覧している30分刻みでの時刻と、そのときの閲覧者名(N,_閲覧履歴ならび,_時刻,_閲覧者ならび) :- 先頭からn個の閲覧データを対象に(N,_閲覧履歴ならび,_先頭からn個のデータ), 閲覧分布ならびを作る(_先頭からn個のデータ,_履歴分布ならび), 最多閲覧者時刻(_履歴分布ならび,_最多閲覧者時刻ならび), member(_時刻,_最多閲覧者時刻), setof(_閲覧者名,member([_閲覧者名,_時刻,_],_履歴分布ならび),_閲覧者ならびの一). 先頭からn個の閲覧データを対象に(N,_閲覧履歴ならび,_先頭からn個のデータ) :- length(_先頭からn個のデータ,N), append(_先頭からn個のデータ,_,_閲覧履歴ならび),!. 閲覧分布ならびを作る([],[]) :- !. 閲覧分布ならびを作る([[_閲覧者名,_閲覧開始時刻,_閲覧継続時間]|R1],X) :- 閲覧継続時間を30分ごとに刻む(_閲覧者名,_閲覧開始時刻,_閲覧継続時間,L), 閲覧分布ならびを作る(R1,Y), append(L,Y,X). 閲覧継続時間を30分ごとに刻む(_,_,0,[]) :- !. 閲覧継続時間を30分ごとに刻む(_閲覧者名,_閲覧開始時刻,_閲覧継続時間,[[_閲覧者名,_閲覧開始時刻,30]|R]) :- 次の30分を閲覧開始時刻とする(_閲覧開始時刻,_次の閲覧開始時刻), _閲覧継続時間2 is _閲覧継続時間 - 30, 閲覧継続時間を30分ごとに刻む(_閲覧者名,_次の閲覧開始時刻,_閲覧継続時間2,R),!. 次の30分を閲覧開始時刻とする(2330,0) :- !. 次の30分を閲覧開始時刻とする(_閲覧開始時刻,_次の閲覧開始時刻) :- 30 is _閲覧開始時刻 mod 100, _次の閲覧開始時刻 is _閲覧開始時刻 - 30 + 100,!. 次の30分を閲覧開始時刻とする(_閲覧開始時刻,_次の閲覧開始時刻) :- 0 is _閲覧開始時刻 mod 100, _次の閲覧開始時刻 is _閲覧開始時刻 + 30,!. 最多閲覧者時刻(_履歴分布ならび,_最多閲覧者時刻ならび) :- findall(L1,setof(_閲覧開始時刻,member([_,_閲覧開始時刻,_],_履歴分布ならび),L1),L2), 最多閲覧者時刻の二(L2,_履歴分布ならび,L3), findmax(Count,member([Count,_,_],L3),Max), findall([_閲覧開始時刻,_閲覧者ならび],member([Max,_閲覧開始時刻,_閲覧者ならび],L3),_最多閲覧者時刻ならび). 最多閲覧者閲覧開始時刻の二([],_,[]) :- !. 最多閲覧者閲覧開始時刻の二([[_閲覧開始時刻]|R1],_履歴分布ならび,[[Count,_閲覧開始時刻,L1]|R2]) :- findall([_閲覧者名,_閲覧開始時刻],member([_閲覧者,_閲覧開始時刻,_],_履歴分布ならび),L1), length(L1,Count), 最多閲覧者閲覧開始時刻の二(R1,_履歴分布ならび,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/365 # # 【質問テンプレ】 # [1]授業単元:応用C言語演習 # [2]問題文(含コード&リンク) # 標準入力から1文字以上の英数字と'_'で構成される単語を読み込み、 # それぞれの単語が何回、何行目の何個目の単語に出現したかを単語アルファベット順 # にリストする索引作成プログラム # アルファベット順出力の後出現頻度(出現が多い単語順、同数についてはアルファベ # ット順)順についても同じ書式で出力 # 改行記号とタブ/アルファベット/数字/ '_' /空白しか標準入力されないとして良い。 # 入力行数、単語長、種数、単語辺りの出現回数に制限は無い。 # 単語の前後の区切りは単語を構成しない文字とする。(行末記号を含む) # 書式: 単語 (回数) 位置(行番号が若い順)改行 # 位置: 'L'行番号(1から開始)-行内単語番号(1から開始) # alpha (3回) L32-5 L66-4 L124-1 # beta (2回) L192-1 L276-3 # 文から索引の作成(_ファイル,_索引ならび) :- get_lines(_ファイル,Lines), 行単位に索引を作成(1,Lines,[],_索引ならび). 行単位に索引を作成(_行番号,[],X,X). 行単位に索引を作成(_行番号,[Line|R1],Y,X) :- split(Line,[' ',',','\r','t'],_単語ならび), 行単位に索引に追加(1,_行番号,_単語ならび,Y,Y2), _行番号2 is _行番号 + 1, 行単位に索引を作成(_行番号2,R1,Y2,X). 行単位に索引に追加(_行での相対位置,_行番号,[],X,X). 行単位に索引に追加(_行での相対位置,_行番号,[_単語|R1],Y,X) :- 索引に追加(_単語,_行番号,_行での相対位置,Y,Y2), _行での相対位置2 is _行での相対位置 + 1, 行単位に索引に追加(_行での相対位置2,_行番号,R1,Y2,X). 索引に追加(_単語,_行番号,_行での相対位置,[[_単語,_位置情報ならび,_頻度]|R1],[[_単語,_更新された位置情報,_頻度2]|R1]) :- append([_位置情報ならび,[_行番号,_行での相対位置],_更新された位置情報ならび), _頻度2 is _頻度 + 1,!. 索引に追加(_単語,_行番号,_行での相対位置,[[_単語1,_位置情報ならび1,_頻度1]|R1],[[_単語,[_行番号,_行での相対位置],1],[単語1,_位置情報ならび1,_頻度1]|R1]) :- _単語 @< _単語2,!. 索引に追加(_単語,_行番号,_行での相対位置,[[_単語1,_位置情報ならび1,_頻度1]|R1],[[単語1,_位置情報ならび1,_頻度1]|R2]) :- _単語 @> _単語2, 索引に追加(_単語,_行番号,_行での相対位置,R1,R2) :- 索引の全表示([]). 索引の全表示([[_単語,_位置情報ならび,頻度]|R]) :- findall(S,(member([A,B],_位置情報ならび),concat_atom(['L',A,'-',B],S)),L), concat_atom(L,' ',S2), write_formatted('%t (%t回) %t\n',[_単語,頻度,S2]), 索引の全表示(R). 出現頻度順索引全表示(_索引ならび) :- findall([_頻度|L],(member(L,_索引ならび),last(L,_頻度)),L1), sort(L1,L2), findall(L,member([_|L],L2),L3), reverse(L3,L4), 索引の全表示(L3). 索引の保護(_文名,_保護ファイル,_索引ならび) :- 現在定義されている索引は消去(_文名), assertz(索引(_文名,_索引ならび)), tell(_保護ファイル), listing(索引), told. 索引の定義(_文名,_保護ファイル,_索引ならび) :- reconsult(_保護ファイル), 索引(_文名,_索引ならび). 現在定義されている索引は削除(_文名) :- retract(索引(_文名,_)),!. 現在定義されている索引は削除(_). % 以下のサイトは # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # タイピングプログラムを作る。 # プログラムの流れは、英単語1行1個ずつ10個入ったファイルを作り、 # 1.テキストファイル名を入れる # 2.テキストファイルの1行目が表示される # 3.タイピングをする(ミスをするともう1回タイピングさせる) # 4.1行目が終わると、2行目が表示され、またタイピングをする # 5.10問おわったら、かかった時間とミスした回数が出力される テキストファイルを読み込み1行づつタイピングする :-   テキストファイル名を入れる(_テキストファイル名),   get_lines(_テキストファイル名,Lines),   TimeA is time,   タイピングをする(1,10,Lines,TimeB,0,_ミスした回数),   _かかった時間 is time - TimeA,   write_formatted('かかった時間 %t秒, ミスした回数 %t回\n',[_かかった時間,_ミスした回数]),!. テキストファイル名を入れる(_テキストファイル名) :-   write('テキストファイル名を入れてください : '),   get_line(_テキストファイル名). タイピングをする(M,N,Lines,X,X) :- !. タイピングをする(M,N,[Line|R],Y,X) :-   write_formatted('%t: %t : ',[M,Line]),   get_line(Line),   M2 is M + 1,   タイピングをする(M2,N,R,Y,X),!. タイピングをする(M,N,[Line|R],X) :-   Y2 is Y + 1,   タイピングをする(M,N,[Line|R],Y2,X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/50 # # [1] 授業単元:C言語基礎 # 2.テキストファイルを引数から読み込み、中のデータの順を入れ替えて出力。 # 〜入力例〜 # あいう # # えお # 〜出力例〜 # おえ # # ういあ # コマンドプロンプト上に出力し、さらに「入力ファイル名-out.txt」の形でファイル出力も行え # テキストファイルを引数から読み込み、中のデータの順を入れ替えて出力。(_ファイル) :- get_lines(_ファイル,Lines), 行を反転し同時に行文字列も反転する(L,[],L2), 行表示(L2), '-out.txtを付加したファイル名で出力'(_ファイル,L2). 行を反転し同時に行文字列も反転する([],L,L) :- !. 行を反転し同時に行文字列も反転する([A|R1],Y,L) :- atom_chars(A,Chars), reverse(Chars,RChars), atom_chars(B,RChars), 行を反転し同時に行文字列も反転する(R1,[B|Y],L). 行表示(L) :- put_lines(L). '-out.txtを付加したファイル名で出力'(_ファイル,Lines) :- concat_atom([_ファイル,'-out.txt'],_出力ファイル), put_lines(_出力ファイル,Lines). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/949 # # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10114.txt # 以下のプログラムを作成せよ # # 9個のマスがあり、1〜9の数字が一個だけ入るとする。 # このとき、符号なし整数1つでマスにまだ入れられていない数字を記録したい。 # そこで、下位ビットから9ビット目までで1〜9がマスに入っているかどうかを表すこととする。 # 空白のマスは0で表示する。 # # 例:132584090→下位9ビット:001100000 # この場合、6もしくは7がマスに入っていないため、6ビット目と7ビット目に1が立っていることとなる。 # # 課題プログラムを実行すると、in.txtから9個の文字データを読み込み、上記のような変換をして9ビットのデータのビット列を表示する。 # 例えば132584090とin.txtに記録されていた場合、下位9ビットは # 001100000と表示される # # 手順 # 1..ビット列を記録する変数を宣言し、0で初期化する。 # 2..9個の数字を9個の変数に ファイルから読み込む # 3..各変数には0〜9の数字が入っているが、0以外の場合に対応する桁に1を立てる # 4..ビット列の 0と1を反転させる # 5..下位9ビットをprintf関数で表示する # # 6..in.txtの値をいろいろ変化させて、プログラムが正しいことを確認せよ # # 発展課題: # in.txtに9x9の以下のような数字列を入れておく. # 縦と横に必ず1から9までの数字が並ぶとする。ここで各行、各列の空白(空白は0で表す)に入りうる数字をビット列で表せ。 # # 9行、9列なので、18個の整数データとなる。 # # 次に、空白があれば、どのように処理すれば、空白に入る数字を決めることができるか、考えよ。 # # 1 2 3 4 0 6 0 8 9 # 2 3 4 5 6 7 8 9 1 # 3 4 5 0 7 0 9 1 2 # 0 5 6 7 8 9 1 2 3 # 5 6 7 8 9 1 2 3 4 # 6 7 0 9 0 2 3 4 5 # 7 8 9 1 2 3 4 5 6 # 8 0 1 2 3 4 5 0 7 # 9 1 2 3 4 5 6 7 8 # # 1行目-> 001010000 # 5列目-> 000010001 c2_949 :- get_lines('in.txt',L), findall(L2,(member(A,L),split(A,[' '],L2)),L3), findall([N,L5],(member(L4,L3),欠落した番号ビット(L4,L5)),L6), c2_949_表示(L6). 欠落した番号ビット(L1,L2) :- length(L2,9), findall(N,(for(1,N,9),\+(member(N,L1)),L3), 欠落した番号ビット(9,L3,L2). 欠落した番号ビット(N,_,[]) :- N < 1. 欠落した番号ビット(N,L,[0|R]) :-. \+(member(N,L)), N1 is N - 1, 欠落した番号ビット(N1,L,R). 欠落した番号ビット(N,L,[1|R]) :-. member(N,L), N1 is N - 1, 欠落した番号ビット(N1,L,R). c2_949_表示([]) :- !. c2_949_表示([[N,L]|R]) :- concat_atom(L,' ',S), write_formatted('%t 行目: %t\n',[S]), c2_949_表示(R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/561 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10060.txt t2_14(File) :- get_lines(File,Lines),member(_行,Lines),split(_行,[','],L),構造追加(L),fail. t2_14(_). 索引番号起点(-1). 索引番号終点(-1). 構造追加(L) :- 索引番号終点(_索引番号終点),構造追加(L,_索引番号終点). 構造追加([A|R]) :- Random is random mod 9999,\+(index(Random,A,-1)), assertz(index(Random,A,-1)), length(R,Len), assertz(num(Random,Len)), attr定義(1,Len,Random,R),!. retract(索引番号終点(_索引終点番号)), 構造追加_2(_索引終点番号,Random). 構造追加([A|R]) :- 構造追加([A|R]). 構造追加_2(-1,Random) :- retract(索引番号起点(_索引起点番号)),assertz(索引番号起点(Random)),assertz(索引番号終点(Random)),!. 構造追加_2(N,Random) :- assertz(索引番号終点(Random)),retract(index(N,W2,_)),assertz(index(N,W2,Random)),!. attr定義(M,N,A,[]) :- M > N,!. attr定義(M,N,A,[B|R]) :- assertz(attr(A,M,B)),M2 is M+1,attr定義(M2,N,A,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/442 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10025.txt # 「スコアー,ステージナンバー,名前」が入っているファイルがあるとする。 # # 降順にソート済みのスコアーデータのファイルから、上位10件を配列に読み込み、 # 新たに11件目のスコアーデータを入力後、スコアーの大きい順に並び替えを行い、 # 上位10件のデータを再度書き込むプログラムを作成せよ # # 999999,6,faegalr # 999976,123,aaaaaa # 999923,23,Steel # 999765,43,tyudayo # 786754,34,tyui # 713146,10,gawehgpoin # 654789,12,abaeuogn # 479136,65,gwerhja # 456789,43,tyu # 454545,45,454545 # 123456,34,ert t908(File) :- get_lines(File,Lines), findall(U,(member(A,Lines),split(A,[','],U)),L1), get_line(Line), split(Line,[','],W), 降順整列状態を保って挿入する(W,L1,L2), append(L3,[_],L2), findall(S,(member(L4,L3),concat_atom(L4,',',S)),L5), put_lines(File,L5). 降順整列状態を保って挿入する(_挿入要素,L1,L2) :- append(L3,L4,L1), append(L3,[_挿入要素|L4],L2), すべての要素が大きい(L3,_挿入要素), すべての要素が小さいか等しい(L4,_挿入要素). すべての要素が大きい([],_). すべての要素が大きい([A|R],B) :- A @> B,すべての要素が大きい(R,B). すべての要素が小さいか等しい([],_). すべての要素が小さいか等しい([A|R],B) :- A @=< B,すべての要素が小さいか等しい(R,B). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1135125328_02.html (レス番号139) # # [1] 授業単元:プログラミング # [2] HEADコマンドを実装せよ #   構文head[-Ln][filename] # 実現する機能:ファイルの先頭の複数行を画面に出力する。 #   引数:Ln:出力する行数nを指定する(デフォルトは10行) program :- head. head :- user_parameters(_パラメータリスト), ファイル名と表示行数の取得(_パラメータリスト,_ファイル名,N), get_lines(_ファイル,Lines), length(L,N), append(L,L2,Lines), member(_行,L), write_formatted('%t\n',[_行]), fail. head. ファイル名と表示行数の取得(['-L',A,_ファイル名],_ファイル名,N) :- atom_to_term(A,N,_),!. ファイル名と表示行数の取得(['-l',A,_ファイル名],_ファイル名,N) :- atom_to_term(A,N,_),!. ファイル名と表示行数の取得([A,_ファイル名],_ファイル名,N) :- sub_atom(A,0,2,J,_), sub_atom(A,2,J,_,B), atom_to_term(B,N,_). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/376 # # ・課題 # 与えられたベクトルファイル(c.txt)を読み込み # 1-normの結果を表示させるプログラムを作成せよ # # 途中までのソースとベクトルファイルです # http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/809.java # http://ime.nu/kissho.xii.jp/1/src/1jyou94333.txt.html # ( c.txt = ) # 0.9999999973 # 0.0000000023 # -0.0000000016 # t798 :- t798(1). t798(P) :- float_format(_,f(22,21)), get_lines('c.txt',Lines), findall(V,(member(Line,Lines),atom_to_term(Line,V,_)),L), ベクトルのnorm(L,1,X), write_formatted('|C|=%t の時 |C|%t = %t\n',[L,P,X]). ベクトルのnorm(L,P,X) :- findsum(B,(member(A,L),B is abs(A) ^ P),S), X is S ^ (1 / P). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1235561034/532 # # 問題. # 久方のなかなる川のうかひ舟いかにちぎりてやみを待つらむ 藤原定家 # # この短歌に現れる枕詞「久方の」は # 「なかなる川」= 京の中なる川 = 桂川 の # 桂から月が連想されて、その月の光に対して、 # 添えられていると考えられる。 # # この関係を示す述語「久方のについて思い巡らし」を定義せよ。 歌('久方のなかなる川のうかひ舟いかにちぎりてやみを待つらむ'). 作者('久方のなかなる川のうかひ舟いかにちぎりてやみを待つらむ',藤原定家). 枕詞(久方の). 同義(なかなる川,京の中なる川). 同義(京の中なる川,桂川). 音通(_語,_部分的な語) :- sub_atom(_語,_,_,_,_部分的な語), \+(_部分的な語==[]). 連想(桂,月). 連想(月,光). 連想(A,B) :- 連想(A,C),連想(C,B). 連想(A,B) :- 音通(A,D),連想(A,D). 連想(A,B) :- 連想(B,A). 枕詞の係り(久方の,光). 久方のについて思い巡らし(_定義アトム,_思い巡らし) :- 歌(_歌), 形態素解析(_歌,_語彙ならび), 久方のについて思い巡らし(_歌,_語彙ならび,_定義アトム,_思い巡らし). 久方のについて思い巡らし(_歌,_語彙ならび,_定義アトム,_思い巡らし) :- 枕詞(_語彙ならび,_枕詞,_枕詞の係る言葉,_係る言葉,_語彙2,R,R3), 定義節([作者/1,枕詞/1,同義/2,音通/2,連想/2,枕詞の係り/2],_定義アトム), _思い巡らし=[形態素解析(_歌,_語彙ならび),append(_,[_枕詞|R],_語彙ならび),append(_,[_枕詞の係る言葉|R2],R),枕詞の係り(_枕詞,_係る言葉),連想(_係る言葉,_語彙2),append(_,[_語彙2|R3],R)]. 枕詞(_語彙ならび,_枕詞,_枕詞の係る言葉,_係る言葉,_語彙2,R,R3) :- append(_,[_枕詞|R],_語彙ならび), append(_,[_枕詞の係る言葉|R2],R), 枕詞の係り(_枕詞,_係る言葉), 連想(_係る言葉,_語彙2), append(_,[_語彙2|R3],R). 定義節(_述語定義ならび,_定義アトム) :- tmpnam(F), tell(F), listing(_述語定義ならび), told, get_lines(F,Lines), atom_chars(_定義アトム,Lines). % 以下のサイトは # 出典::C/C++の宿題片付けます 第130代目 #676 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9965.txt # 以下のプログラムを作成せよ。 # 三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 # 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした # 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される # このような点数の変換プログラムを考える # 達成条件は # ・ファイルin.txtを開き、変換された点数データをファイルoutput.txtに書き込んでいる。 # ・ファイルからデータを読み込んだ時に、構造体にデータを入力している # ・ファイルout.txt内では、正しく点数が変換されている。 # ・名前は最大でも半角で20文字として。配列nameの外をアクセスしていない。 '以下のプログラムを作成せよ。 三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される このような点数の変換プログラムを考える 達成条件は ・ファイルin.txtを開き、変換された点数データをファイルoutput.txtに書き込んでいる。 ・ファイルからデータを読み込んだ時に、構造体にデータを入力している ・ファイルout.txt内では、正しく点数が変換されている。' :- get_lines('in.txt',Lines), 点数を嵩上げ計算する(Lines,L2), '変換された点数データをファイルoutput.txtに書き込んでいる。'('out.txt',L2). 点数を嵩上げ計算する(Lines,L2) :- 'Linesから名前・三科目点数ならびのならびに分解'(Lines,LL), 三科目の最高点を得る(LL,MaxA,MaxB,MaxC), 嵩上げ率の計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C), 嵩上げ計算した表示行ならびの生成(LL,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,L2). 'Linesから名前・三科目点数ならびのならびに分解'(Lines,LL) :- findall([Name2,A1,B1,C1],( member(Line,Lines), split(Line,[' ',','],[Name1,A1,B1,C1]), 名前の長さ制限(Name1,Name2)), LL). 三科目の最高点を得る(L,MaxA,MaxB,MaxC) :- findmax(A,(member([_,A,_,_],L)),MaxA), findmax(B,(member([_,_,B,_],L)),MaMaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C) :- _嵩上げ率A is 100 / MaxA, _嵩上げ率B is 100 / MaxB, _嵩上げ率C is 100 / MaxC. 嵩上げ計算(A,B,C,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX) :- AX is A * _嵩上げ率A, BX is B * _嵩上げ率B, CX is C * _嵩上げ率C. 嵩上げ計算した表示行ならびの生成(LL,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,L2) :- findall(表示行,( member([Name,A2,B2,C2],LL), 嵩上げ計算(A2,B2,C2,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX), atomic_list_concat([Name,AX,BX,CX],',',表示行)), L2). 名前の長さ制限(Name,NameX) :- atom_code(Name,L), 名前の長さ制限(0,L,LX), atom_codes(NameX,LX). 名前の長さ制限(_バイト累計_1,[A|R1],[A|R2]) :- char_code(A,Code), 文字のバイト累計(Code,_バイト累計_1,_バイト累計_2), 名前の長さ制限(_バイト累計_2,R1,R2). 名前の長さ制限(_,_,[]). 文字のバイト累計(Code,_バイト累計_1,_バイト累計_2) :- 全角文字の場合2バイト加算(Code,_バイト累計_1,_バイト累計_2). 文字のバイト累計(Code,_バイト累計_1,_バイト累計_2) :- 半角文字の場合1バイト加算(Code,_バイト累計_1,_バイト累計_2). 全角文字の場合2バイト加算(Code,_バイト累計_1,_バイト累計_2) :- Code > 255, _バイト累計_1 < 19, _バイト累計_2 is _バイト累計_1 + 2. 半角文字の場合1バイト加算(Code,_バイト累計_1,_バイト累計_2) :- Code < 256, _バイト累計_1 < 20, _バイト累計_2 is _バイト累計_1 + 2. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/676 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9965.txt # 以下のプログラムを作成せよ。 # 三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 # 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした # 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される # このような点数の変換プログラムを考える # 達成条件は # ・ファイルin.txtを開き、変換された点数データをファイルoutput.txtに書き込んでいる。 # ・ファイルからデータを読み込んだ時に、構造体にデータを入力している # ・ファイルout.txt内では、正しく点数が変換されている。 # ・名前は最大でも半角で20文字として。配列nameの外をアクセスしていない。 t741 :- get_lines('in.txt',Lines), findall([Name2,A1,B1,C1],(member(Lines),split(Lines,[' ',','],[Name1,A1,B1,C1]),名前の長さ制限(Name1,Name2)),L), findmax(A,(member([_,A,_,_],L),MaxA), findmax(B,(member([_,_,B,_],L),MaxB), findmax(A,(member([_,_,_,C],L),MaxC), 嵩上げ率の計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C), findall(S,( member([Name,A2,B2,C2],L),嵩上げ計算(A2,B2,C2,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX),concat_atom([Name,AX,BX,CX],',',S)),L2), put_lines('out.txt',L2). 嵩上げ率計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C) :- _嵩上げ率A is 100 / MaxA, _嵩上げ率B is 100 / MaxB, _嵩上げ率C is 100 / MaxC. 嵩上げ計算(A,B,C,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX) :- AX is A * _嵩上げ率A, BX is B * _嵩上げ率B, CX is C * _嵩上げ率C. 名前の長さ制限(Name,NameX) :- atom_code(Name,L), 名前の長さ制限(0,L,LX), atom_codes(NameX,LX). 名前の長さ制限(M,_,[]) :- M > 20,!. 名前の長さ制限(M,[A|R1],[]) :- char_code(A,Code), Code > 255, M > 18,!. 名前の長さ制限(M,[A|R1],[A|R2]) :- char_code(A,Code), Code > 255, M < 19, M2 is M + 2, 名前の長さ制限(M2,R1,R2),!. 名前の長さ制限(M,[A|R1],[A|R2]) :- char_code(A,Code), Code < 256, M2 is M + 1, 名前の長さ制限(M2,R1,R2),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/660 # # [1] C言語 # [2] 2つのファイルを比較し,内容が異なっている最初の行の行番号と内容を #   標準出力に表示するプログラムを作成せよ。 #   ファイル名はコマンドライン入力により受け取ることとする。 # [3] 環境 #  [3.1] OS:Windows #  [3.2] コンパイラ:gcc 3.4 #  [3.3] 言語:C # [4] 期限:2009年7月31(金) # [5] その他の制限:ポインタ履修済みです t584 :- user_parameters([File1,File2]), '二つのファイルの内容が異なっている最初の行'(_行番号,File1,A,File2,B), write_formatted('行番号=%t %t=%t %t=%t\n',[_行番号,File1,A,File2,B]). '二つのファイルの内容が異なっている最初の行'(_行番号,File1,A,File2,B) :- get_lines(File1,L1), get_lines(File2,L2), append(L,[A|_],L1), append(L,[B|_],L2), \+(A=B), length(L,Len), _行番号 is Len + 1,!. % 以下のサイトは # [1] 授業単元: プログラミング # [2]問題文:以下の2つの構造体を用い,sample_data2.txt を単方向連結リストに # 保存するプログラム extra8 を作成せよ.item_list 中の item は各行中の数値を # 保持し,t_list 中の itemset は1行分のデータを保持するものとする. # struct item_list { # int item; # struct item_list *next; # }; # struct t_list { # struct item_list itemset; # struct t_list *next # }; # ソースファイルの名前は extra8.c とする.また,extra8.c には, # 生成した単方向連結リストの内容を標準出力に出力する関数 print_tlist を # 含むものとし,以下の実行例のように print_tlist により各行の内容を出力 # するものとする. # なお,入力ファイル名はコマンドライン引数で指定するものとし,入力ファイルが # オープンできなかった場合の処理も含めること.また,プログラム自身を除く # 引数の数が0個,もしくは2個以上の場合は,何もせず適切なメッセージを出力して # 終了するものとする. # (実行例1) # > .\extra8 sample_data2.txt # Itemset: 1,3,9,13,23,25,34,36 # Itemset: 2,3,9,14,23,26,34,36,39,40,52,55,59 extra8 :- ユーザパラメータの取得(_ファイル名), get_lines(_ファイル名,Lines), findall(Item_list,(member(Line,Lines),split(Line,[','],Item_list)),T_list), assertz(t_list(T_list)). print_tlist :- t_list(T_list), member(Item_list,T_list), print_tlist_format(Item_list,Format), write_formatted(Format,Item_list), fail. print_tlist. print_tlist_format(Item_list,Format) :- length(Item_list,Len), length(L,Len), all(L,'%t'), concat_atom(L,',',S), concat_atom(['Items : ,S,'\n'],Format),!. ユーザパラメータの取得(_ファイル名) :- user_parameters([_ファイル名]),!. ユーザパラメータの取得(_) :- error_tell(Output), write(Output,'パラメータで適切なファイル名が与えられませんでした\n'), errot_told(Output). % 以下のサイトは % database_domain(postgresql,mydomain,mydatabase). % database_domain(mysql,mydomain,mydatabase). 'Postgresqlコマンド読み出し'(SQL,X) :- database_domain(postgresql,Domain,Database), psql_macro(SQL,SQL_2), concat(['psql -h ',Domain,' ',Database,' -q -t -c ','"',SQL_2,'"'],S) shs(S,Y), findall(U,(member(V,Y) , not V = '' , psql_get_field(V,U)),X), ! . 'mysqlコマンド呼び出し'(SQL,X) :- database_domain(mysql,Domain,Database), psql_macro(SQL,SQL_2), replace_all(SQL_2,'"','',SQL_3), concat_atom(['mysql -h ',Domain,' ',Database,' -s -e ','"',SQL_3,'"'],S) shs(S,Y), findall(U,(member(V,Y) , not V = '' , mysql_get_field(V,U)),X),!. psql_macro(SQL,SQL2) :- subatomic(SQL,1,12,'create table'), replace_all(SQL,number,numeric,SQL2), ! . psql_macro(SQL,SQL). mysql_get_field(S,X) :- atomic_length(S,Len), findall(N,(for(1,N,Len) , subatomic(S,N,1,'\t')),_区切り位置ならび), psql_get_field_2(S,Len,[0|_区切り位置ならび],X) . psql_get_field(S,X) :- atomic_length(S,Len), findall(N,(for(1,N,Len) , subatomic(S,N,1,'|')),_区切り位置ならび), psql_get_field_2(S,Len,[0|_区切り位置ならび],X). psql_get_field_2(S,_,[],[]) :-!. psql_get_field_2(S,Len,[St],[A]) :- N2 is St + 1, Len2 is Len - St, subatomic(S,N2,Len2,A_1), erase_space(A_1,A_2), atomic_length(A_2,Len3), postgresql_parse_1(A_2,Len3,A),!. psql_get_field_2(S,Len,[N1,N2|R],[A|R2]) :- Ns is N1 + 1, Len2 is N2 - N1 - 1, subatomic(S,Ns,Len2,A_1), erase_space(A_1,A_2), atomic_length(A_2,Len3), postgresql_parse_1(A_2,Len3,A), psql_get_field_2(S,Len,[N2|R],R2) . postgresql_parse_1(A,Len,V) :- atom_number(A,V), '実数'(V),!. postgresql_parse_1(A,Len,X) :- atom_number(A,N), integer(N), '整数から文字列'(Len,N,X),!. postgresql_parse_1(A,Len,A). erase_space(S,X) :- atomic_length(S,Len), erase_space_s(1,Len,S,X1), atomic_length(X1,Len2), erase_space_e(Len2,X1,X),!. erase_space_s(St,Len,_,'') :- St > Len,!. erase_space_s(St,Len,S,X) :- subatomic(S,St,1,' '), St2 is St + 1, erase_space_s(St2,Len,S,X),!. erase_space_s(St,Len,S,X) :- subatomic(S,St,Len,X),!. erase_space_e(0,_,'') :-!. erase_space_e(St,S,X) :- subatomic(S,St,1,' '), St2 is St - 1, erase_space_e(St2,S,X),!. erase_space_e(St,S,X) :- subatomic(S,1,St,X),!. '整数から文字列'(_文字列桁,_文字列,_副文字列) :- atom(_文字列), subatomic(_文字列,1,_文字列桁,_副文字列),!. '整数から文字列'(_文字列桁,_実数,_副文字列) :- '実数'(_実数), write_formatted_atom(_文字列形式,'%%%d.0f',[_文字列桁]), write_formatted_atom(_副文字列,_文字列形式,[_実数]),!. '整数から文字列'(_文字列桁,_整数,_定数) :- '整数・文字番号変換'(_整数,_文字番号ならび), 'ならびの長さ'(_文字番号ならび,_ならびの長さ), _不足桁 is _文字列桁 - _ならびの長さ, '頭部に零を詰める'(_不足桁,_文字番号ならび,_整形された文字番号ならび), '定数・文字番号変換'(_定数,_整形された文字番号ならび),!. 'ならびの長さ'(_ならび,_ならびの長さ) :- length(_ならび,_ならびの長さ). '実数'(_項) :- real(_項). '整数・文字番号変換'(_整数,_文字番号ならび) :- number(_整数,_文字番号ならび). '頭部に零を詰める'(0,_文字ならび,_文字ならび) :- !. '頭部に零を詰める'(_桁,[_|_未決定ならび],_文字ならび) :- _桁 < 0, !, _残り桁 is _桁 + 1, '頭部に零を詰める'(_残り桁,_未決定ならび,_文字ならび). '頭部に零を詰める'(_桁,_文字ならび,[48|_未決定ならび]) :- _残り桁 is _桁 - 1, '頭部に零を詰める'(_残り桁,_文字ならび,_未決定ならび). replace_all('',A,B,'') :- !. replace_all(String,S1,'',X) :- decompcons(String,StringL), decompcons(S1,S1L), replace_31(StringL,S1L,Y), concat_atom(Y,X),!. replace_all(String,S1,S2,X) :- decompcons(String,StringL), decompcons(S1,S1L), decompcons(S2,S2L), replace_41(StringL,S1L,S2L,Y), concat_atom(Y,X),!. replace_31([],_,[]) :- !. replace_31(L,L1,Y) :- append(L1,R,L), replace_31(R,L1,Y),!. replace_31([A|R],L1,[A|R2]) :- replace_31(R,L1,R2). replace_41([],_,_,[]) :- !. replace_41(L,L1,L2,R2) :- append(L1,R,L), replace_41(R,L1,L2,R3), append(L2,R3,R2),!. replace_41([A|R],L1,L2,[A|R2]) :- replace_41(R,L1,L2,R2). shs(Command,[],X) :- shs(Command,X), ! . shs(Command,List,X) :- tmpnam(TMPNAM), open(TMPNAM,write,Output1), wrln(Output1,List), close(Output1), concat_atom(['cat ',TMPNAM],Cat), system(Cat,user_input,Pipe), system(Command,Pipe,Output), findall(Y,(repeat , get_line(Output,Y) , (Y = end_of_file , (!) , fail ; true)),X), close(Pipe), close(Output), unlink(TMPNAM), ! . shs(Command,user_input,X) :- ( var(X) ; \+(var(X)), \+(X = pipe(_)) ), system(Command,user_input,Pipe), findall(S,(repeat , get_line(Pipe,S) , (S = end_of_file , (!) , fail ; true)),X), close(Pipe), ! . shs(Command,user_input,X) :- \+(var(X)), X = pipe(Pipe), system(Command,user_input,Pipe), ! . shs(Command,Input,Output) :- \+(var(Input)), Input = pipe(Pipe1), \+(var(Output)), Output = pipe(Pipe2), system(Command,Pipe1,Pipe2), close(Pipe1), ! . shs(Command,Input,X) :- \+(var(Input)), Input = pipe(Pipe1), ( var(X) ; \+(var(X)), \+(X = pipe(_)) ), system(Command,Pipe1,Pipe2), close(Pipe1), findall(S,(repeat , get_line(Pipe2,S) , (S = end_of_file , (!) , fail ; true)),X), close(Pipe2), ! . shs(Command,Input,X) :- \+(var(X)), X = pipe(Pipe), \+(var(Input)), \+(Input = pipe(_)), open(Input,read,InputStream), system(Command,InputStream,Pipe), close(InputStream),!. shs(Command,Input,X) :- ( var(X) ; \+(var(X)), \+(X = pipe(_)) ), \+(var(Input)), \+(Input = pipe(_)), open(Input,read,InputStream), system(Command,InputStream,Pipe), close(InputStream), findall(S,(repeat , get_line(Pipe,S) , (S = end_of_file , (!) , fail ; true)),X), close(Pipe),!. shs(Command,X) :- tmpnam(TMPNAM), open(TMPNAM,write,Output), system(Command,user_input,Output), close(Output), get_lines(TMPNAM,L), concat_atom(['rm -f ',TMPNAM],S), system(S), X = L,!. shs(Command_list,X) :- list(Command_list), concat_atom(Command_list,' ',Command), shs(Command,X),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. 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), concat_atom(U,A), chars_lines(R,R2). tmpnam(TMPNAM) :- tmpnam_c(A), tmpnam_c(B), tmpnam_c(C), tmpnam_c(D), tmpnam_c(E), tmpnam_c(F), concat_atom(['/tmp/file',A,B,C,D,E,F],TMPNAM),!. tmpnam_c(X) :- Y is (random mod 122) + 1, tmpnam_c_2(Y,X),!. tmpnam_c(X) :- tmpnam_c(X). tmpnam_c_2(X,X) :- X >= 97,X =< 121,!. tmpnam_c_2(X,X) :- X >= 65,X =< 90,!. tmpnam_c_2(X,X) :- X >= 48,X =< 57,!. tmpnam_c_2(Y,X) :- Y >= 0,Y =< 47, X is Y + 65, \+((X >= 92,X =< 96)). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/107 # # [1] 授業単元: デジタル信号処理 # [2] 問題文(含コード&リンク): 2つのテキストファイル(double型)を読み込み、 # 畳み込み和を計算し、別のファイルに出力せよ。 t478(N,Infile1,Infile2,Outfile) :- get_lines(Infile1,L1), get_lines(Infile2,L2), findall(F1,(member(A1,L1),atom_to_term(A2,F1,_)),_フィルタならび), findall(F2,(member(A2,L2),atom_to_term(A2,F2,_)),_サンプルならび), 畳み込み和(N,_フィルタならび,_サンプルならび,_畳み込み和), 畳み込み和出力(Outfile,_畳み込み和). 畳み込み和(N,_フィルタならび,_サンプルならび,_畳み込み和) :- length(L,N), append(L,_,_サンプルならび), reverse(_サンプルならび,_逆順サンプルならび), 畳み込み和の二(_フィルタならび,_逆順サンプルならび,_畳み込み和). 畳み込み和の二([],_,0.0) :- !. 畳み込み和の二([A|R1],[B|R2],X) :- 畳み込み和の二(R,R2,Y), X is A * B + Y. 畳み込み和出力(Outfile,_畳み込み和) :- open(Outfile,write,Output), write_formatted(Output,'%t\n',[_畳み込み和]), close(Output). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/929 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 主語、目的語、述部が入ったデータファイルを読み込み、それらをランダムに # 組み合わせて生成した短文を20個ファイルに出力するプログラムの作成。 # 短文の構文は必ず、「(主語)は、(目的語)(述部)。」となるようにする。 # # 出力例:俺は、カレーが大好きだ。 # # データファイルは以下を使用すること。 # 主語: 俺 私 あなた 彼 彼女 先生 犬のポチ 猫のタマ ライオン # その人 政治家 ネズミ  の12個 # 目的語: カレー ご飯 肉 授業 男 女 すごいもの アレ アンパン # お金  の10個 # 述部: が大好きだ が大嫌いだ を作った をなくした が欲しい # に全力を尽くす を新しいものに交換した ?なにそれ美味いの? # について深く考えた を捨てた に塩をふりかけた の11個 % 入力データファイル: http://nojiriko.asia/prolog/t440_1.txt % 出力データファイル: http://nojiriko.asia/prolog/t440_2.txt t440 :- get_lines('t440_1.txt',Lines), 構造定義(Lines), findall(_語ならび,表示文(_語ならび,[]),_語ならび集), '20文をランダムに選択して表示'(_語ならび集). 表示文(_語ならび,R) :- 主部(_語ならび,R1),読点(R1,R2),目的語(R2,R3),述部(R3,R4),句点(R4,R). 主部(L,R) :- 主語(L,R1),後置詞(R1,R). 後置詞(['は'|R],R). 読点(['、'|R],R). 句点(['。'|R],R). 構造定義(Lines) :- member(_行,Lines), split(_行,[':',':',' ',' '],[F|L2]), append(L3,[_],L2), 要素定義(F,L3), fail; true. 要素定義(F,L) :- member(A,L), P =.. [F,[A|R],R], assertz(P), fail; true. '20文をランダムに選択して表示'(_語ならび集) :- length(_語ならび集,Len), tell('t440_2.txt'), 重複しない20文をランダムに選択表示(20,_語ならび集,Len,[]). told. 重複しない20文をランダムに選択表示(0,_,_,_) :- !. 重複しない20文をランダムに選択表示(N,_語ならび集,Len,_選択したnthならび) :- Nth is random mod Len + 1, not(member(Nth,_選択したnthならび)), list_nth(Nth,_語ならび集,_選択した語ならび), concat_atom(_選択した語ならび,_選択文), write_formatted('%t\n',[_選択文]), M is N - 1, 重複しない20文をランダムに選択表示(M,_語ならび集,Len,[Nth|_選択したnthならび]),!. 重複しない20文をランダムに選択表示(N,_語ならび集,Len,_選択したnthならび) :- 重複しない20文をランダムに選択表示(N,_語ならび集,Len,_選択したnthならび). % 以下のサイトは ホスト名のIPアドレスを取得する(_ホスト名,IPアドレス) :- get_lines('/etc/hosts',Lines), member(Line,Lines), split(Line,[' '],[IPアドレス,_ホスト名|_]),!. 'IPアドレスからホスト名を取得する'(IPアドレス,_ホスト名) :- get_lines('/etc/hosts',Lines), member(Line,Lines), split(Line,[' '],[IPアドレス,_ホスト名|_]),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1232627790/904 # # ・課題の内容 # TCP/IPプロトコルを用い、通信するプログラムを作成せよ。 # ・条件 # キーボードから文字列を1行入力し、それを送信するプログラム(tcp_snd1)と、 # それを受信するプログラム(tpc_rec1)の2つを作成せよ。 # tcp_snd1では、送信先の計算機の名前をプログラムの引数で指定できるようにせよ。 # tcp_rec1では、コネクションの要求あったら、コネクションを張り、 # 要求した計算機のIPアドレスを表示せよ。 # メッセージを受信するたびに、通信回数を[]で括って表示し、 # その後にメッセージを表示せよ。 # 空行が入力されたら、tcp_snd1もtcp_rec1の双方が終了するようにせよ。 # ポートとして、9000を利用せよ。 tcp_snd1(Host) :- socket(internet, stream, Socket), host_addr(Host,9000), socket_connect(Socket, Addr : Port), open(Socket,read,Input), open(Socket,write,Output), get_line(Line), send_message(Line,Host,Socket,Input,Output), write(Output,'\n'), close(Input), close(Output), socket_shutdown(Socket). send_message(end_of_file,Host,Input,Output) :- !. send_message(Line,Host,Input,Output) :- write_formatted(Output,'%t\n',[Host,Line]), flush_output(Output), get_line(Line2), send_message(Line,Host,Input,Output), get_line(Input,_). tcp_rcv1 :- socket(internet, stream, Socket), socket_bind(Socket, 9000), socket_listen(Socket), socket_accept(Socket,Host:Port,NewSocket), write_formatted('Accept Host:%t\n',[Host]), open(NewSocket,read,Input), open(NewSocket,write,Output), for(1,N,2000000000), get_line(Input,Line), return_message(N,Line,Status), Status == end_of_file, close(Input), close(Output), socket_shutdown(Socket), socket_shutdown(NewSocket). return_message(N,'',end_of_file) :- !. return_message(N,Line,ok) :- write_formatted('[%t]%t\n',[N,Line]), write(Output,'ok\n'). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/ # # [1] 授業単元:C言語実習 # [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin /joyful/img/9658.txt # {5,21,4,14,12}, # {25,20,15,3,7}, # {24,11,6,1,13}, # {16,2,17,19,8}, # {23,18,22,9,10} # # の横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替え(上が小さくな るように) # 結果を出力 # # 結果は # # 5 21 4 14 12 # 25 20 15 3 7 # 24 11 6 1 13 # 16 2 17 19 8 # 23 18 22 9 10 # # のような形で出力 '横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替えて出力する'(_ファイル) :- 行列に入力する(_ファイル,_行列1), '横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替えてW得点データをバブルソートを用いて国語の得点の大きい順に並び替えよ出力する'(_行列1,_行列2), 出力する(_行列2),!. '横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替えて出力する'(_行列1,_行列2) :- 各行を整列する(_行列1,_行列3), 縦の各列を整列する(_行列3,_行列2). 行列に入力する(_ファイル,_行列) :- get_split_lines(_ファイル,['{',',','}'],_行列). 各行を整列する([],[]) :- !. 各行を整列する([_行|R1],[_整列された行|R2]) :- quicksort(_行,_整列された行), 各行を整列する(R1,R2). 縦の各列を整列する(_行列1,_行列2) :- 転置(_行列2,_行列3), 各行を整列する(_行列3,_行列4), 転置(_行列4,_行列2). 出力する(_行列2) :- append(L0,[L|R],_行列2), concat_atom(L,' ',S), writef('%t\n',[S]), R = []. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines) . get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat , get_line(Line) , (Line = end_of_file , (!) , fail ; true)), Lines). get_chars(File,L) :- \+(is_stream(_,File,_)), exists(File,read), open(File,read,Input), get_char(Input,X), get_chars(Input,X,L), close(Input),!. get_chars(Input,L) :- is_stream(_,Input,_), get_char(Input,X), get_chars(Input,X,L),!. get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). get_line_3(_,'連続','\n',[]) :- !. get_line_3(Instream,_診断,'\r',X) :- get_char(Instream,C2), get_line_3_2(Instream,_診断,C2,X),!. get_line_3(Instream,'終了',end_of_file,[]) :- !. get_line_3(Instream,_診断,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,_診断,C2,R). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). get_chars(L) :- findall(U,( repeat , get_char(U) , (U = end_of_file , (!) , fail ; true)), L). get_line(Instream,_診断,X) :- get_char(Instream,C), get_line_3(Instream,_診断,C,Chars), atom_chars(X,Chars),!. get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). get_line_3(_,'連続','\n',[]) :- !. get_line_3(Instream,_診断,'\r',X) :- get_char(Instream,C2), get_line_3_2(Instream,_診断,C2,X),!. get_line_3(Instream,'終了',end_of_file,[]) :- !. get_line_3(Instream,_診断,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,_診断,C2,R). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). get_line_3_2(Instream,'連続','\n',[]) :- !. get_line_3_2(Instream,'連続',C,['\r'|R]) :- \+(C == '\n'), get_line_3(Instream,_診断,C,R),!. split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not U = ''),L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,(member(U,Y) , \+(member(U,_区切り符号ならび))),Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :-!. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), number(C,Nl),!. split_5(B,C) :- concat_atom(B,C),!. split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42([],[],'',_,[]) :- !. split_42([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. number(A,B) :- number_codes(A,B). numeric_list([],[]) :-!. numeric_list([A|R],[B|R1]) :- digit(A), char_code(A,B), numeric_list(R,R1),!. numeric_list(['.'|R],[46|R1]) :- numeric_list(R,R1),!. numeric_list([-|R],[45|R1]) :- numeric_list(R,R1),!. 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % *** user: quicksort / 2 *** quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Bigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). quicksort([],[]). partition([X|Xs],Y,[X|Ls],Bs) :- X @=< Y, partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X @> Y, partition(Xs,Y,Ls,Bs). partition([],Y,[],[]). % 以下のサイトは # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9554.txt # ◎フォネティックコード # # 無線などで会話する際、A,B,Cなどのアルファベットをそのまま発音しても相手方に聞き取りにくい事がある.アルファベットを明瞭 # に伝達するために,各アルファベットに対して1つの単語が割り当てられており,これを使用することが国際的に定められている. # この単語をフォネティックコードと呼ぶ. フォネティックコードファイルを読み込み,1つの文章を全てフォネティックコード化でき # るようなプログラムを作成せよ. # 課題実行においては以下の点に注意すること. # ・プログラム名は「phon」とすること. # ・フォネティックコードはスペースで区切って表示すること. # ・コードファイル名を指定して読み込めるようにすること. # ・コードファイルのフォーマットは、a,Alphaのように、文字,コードの形式である # # # # 実行結果 # cat ./nato.cod # a,Alfa # b,Bravo # c,Charlie #  ・ #  ・ #  ・ # z,Zulu # ./phon # nato.cod # OPA627 # Oscar Papa Alfa 627 # ./phon # ./nato.cod # IEICE # India Echo India Charlie Alfa Echo # # # # # フォネティックコード # a,Alfa # b,Bravo # c,Charlie # d,Delta # e,Echo # f,Foxtrot # g,Golf # h,Hotel # i,India # j,Juliett # k,Kilo # l,Lima # m,Mike # n,November # o,Oscar # p,Papa # q,Quebec # r,Romeo # s,Sierra # t,Tango # u,Uniform # v,Victor # w,Whiskey # x,X-ray # y,Yankee # z,Zulu phon(_フォネティックコードファイル,_文字列) :- assertz_フォネティックコード(_フォネティックコードファイル), atom_chars(_文字列,Chars), phon_1(Chars,XL), phon_2(XL). phon_1([],[]) :- !. phon_1([A],[C]) :- フォネティックコード(A,C),!. phon_1([A],[A]) :- not(フォネティックコード(A,_)),!. phon_1([A,B|R1],[C,' '|R2]) :- フォネティックコード(A,C), フォネティックコード(B,_), phon_1([B|R1],R2). phon_1([A,B|R1],[C,' '|R2]) :- フォネティックコード(A,C), not(フォネティックコード(B,_)), phon_1([B|R1],R2). phon_1([A,B|R1],[A,' '|R2]) :- not(フォネティックコード(A,_)), フォネティックコード(B,_), phon_1([B|R1],R2). phon_1([A,B|R1],[A|R2]) :- not(フォネティックコード(A,_)), not(フォネティックコード(B,_)), phon_1([B|R1],R2). phon_2([]). phon_2([A|R]) :- write(A), phon_2(R). assertz_フォネティックコード(_フォネティックコードファイル) :- フォネティックコードファイルの読み込み(_フォネティックコードファイル,Lines), abolish(フォネティックコード/2), フォネティックコードベースの登録(Lines). フォネティックコードファイルの読み込み(_フォネティックコードファイル,Lines) :- get_lines(_フォネティックコードファイル,Lines). フォネティックコードベースの登録(Lines) :- member(Line,Lines), split(Line,[','],[A,B]), forall(フォネティックコードベースの登録(A,B),true). フォネティックコードベースの登録(A,B) :- assertz(フォネティックコード(A,B). フォネティックコードベースの登録(A,B) :- to_upper(A,C), assertz(フォネティックコード(C,B). % 以下のサイトは # [1]授業単元:プログラミング演習課題3 # [2]問題文:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9516.txt # ファイルに登録された成績コードを読み、構造体列にデータを編集し指定された項目で # ソート処理を行って、画面に一覧(見出しと明細データ)を出力する。 # ソートの順序は降順とし、10行毎に見出しを入れる。 # # 成績ファイル: # コード(6桁),氏名(20桁),国語(3桁),算数(3桁),理科(3桁),社会(3桁) # # 構造体の定義: # struct seito { # char cd[7]; # char simei[21]; # int kokugo; # int sansu; # int rika; # int syakai; # }; # # ソート項目は、コード、氏名、国語、算数、理科、社会が選択できるようにする。 項目長(コード,7,6). 項目長(氏名,21,20). 項目長(国語,3,3). 項目長(算数,3,3). 項目長(理科,3,3). 項目長(社会,3,3). 項目位置(コード,A,[A,_,_,_,_,_]). 項目位置(氏名,A,[_,A,_,_,_,_]). 項目位置(国語,A,[_,_,A,_,_,_]). 項目位置(算数,A,[_,_,_,A,_,_]). 項目位置(理科,A,[_,_,_,_,A,_]). 項目位置(社会,A,[_,_,_,_,_,A]). 'ファイルに登録された成績コードを読み、構造体列にデータを編集し指定された項目で ソート処理を行って、画面に一覧(見出しと明細データ)を出力する。 ソートの順序は降順とし、10行毎に見出しを入れる。'(_ファイル,_キーならび) :- 'ファイルに登録された成績コードを読み、'(_ファイル,_行ならび), '構造体列にデータを編集し指定された項目でソート処理(ソートの順序は降順とし)を行って、'(_行ならび,_先頭にキーが付加された降順整列した値ならび), length(_キーならび,_キーの長さ), '画面に一覧(見出しと明細データ)を出力する。10行毎に見出しを入れる。'(_先頭にキーが付加された降順整列した値ならび,1,_キーの長さ). 'ファイルに登録された成績コードを読み、'(_ファイル,_行ならび) :- get_lines(_ファイル,_行ならび). '構造体列にデータを編集し指定された項目でソート処理(ソートの順序は降順とし)を行って、'(_行ならび,_キーならび,L2) :- 構造体列にデータを編集し指定された項目で(_行ならび,_キーならび,L1), 'ソート処理(ソートの順序は降順とし)を行って、'(L1,L2). 構造体列にデータを編集し指定された項目で(_行ならび,_キーならび,L1) :- キーを付加しながら項目の切り出し(_行ならび,_キーならび,L1). キーの付加([],L,L) :- !. キーの付加([_項目名|R1],L,[_値|R2]) :- 項目位置(_項目名,_値,L), キーの付加(R1,L,R2). キーを付加しながら項目の切り出し([],_,[]) :- !. キーを付加しながら項目の切り出し([_行|R1],_キーならび,[L2|R2]) :- 項目の切り出し(_行,0,[コード,氏名,国語,算数,理科,社会],L), キーの付加(_キーならび,L,L2), キーを付加しながら項目の切り出し(R1,_キーならび,R2),!. 項目の切り出し(_行,_開始点,[A|R1],[B|R2]) :- 項目長(A,Len,_), sub_atom(_行,_開始点,Len,_,B), _次の開始点 is _開始点 + Len, 項目の切り出し(_行,_次の開始点,R1,R2). 'ソート処理(ソートの順序は降順とし)を行って、'(L1,L2) :- sort(L1,L3), reverse(L3,L2). '画面に一覧(見出しと明細データ)を出力する。10行毎に見出しを入れる。'([],_,_) :- !. '画面に一覧(見出しと明細データ)を出力する。10行毎に見出しを入れる。'([_キーの付いた値ならび|R],_行目,_キーの長さ) :- '10行毎に見出しを入れる。'(_行目), 明細データを出力する(_キーの長さ,_キーの付いた値ならび), _次の行目 is _行目 + 1, '画面に一覧(見出しと明細データ)を出力する。'(R,_次の行目,_キーの長さ). '10行毎に見出しを入れる。'(_行目) :- 1 is _行目 mod 10, writef('成績ファイル:\nコード(6桁),氏名(20桁),国語(3桁),算数(3桁),理科(3桁),社会(3桁)\n'),!. '10行毎に見出しを入れる。'(_). 明細データを出力する(_キーの長さ,_キーの付いた値ならび) :- キーを取り除く(_キーの長さ,_キーの付いた値ならび,_値ならび), 表示項目の調整([コード,氏名,国語,算数,理科,社会],_値ならび,_表示値ならび), writef('%t,%t,%t,%t,%t,%t\n',_表示値ならび). キーを取り除く(_キーの長さ,_キーの付いた値ならび,_値ならび) :- length(VL,_キーの長さ), append(VL,_値ならび,_キーの付いた値ならび),!. 表示項目長の調整([],[],[]) :- !. 表示項目長の調整([_項目名|R1],[_値|R2],[_表示値|R3]) :- 項目長(_項目名,_,Len), sub_atom(_値,0,Len,_,_表示値), 表示項目長の調整(R1,R2,R3). % 以下のサイトは # 入力ファイルを読み込み、顧客別売上明細書を出力する # # ・支店が変われば、支店合計を印字し改ページをする # ・顧客が変われば、顧客合計を印字し、1行空白を印字する # ・入力ファイルはソートされているものとする # ・入力ファイル、出力ファイルはコマンドライン引数で受け取る # ・20行を超える場合は、改ページする #  ただし、合計出力途中の場合は20行を超えていても出力する # ・金額出力時のカンマ編集をする # # ・例外処理は、コマンドライン引数が正しくない場合、入力・出力ファイルがオープンできない場合、入力ファイルにデータがない場合の4種類 # # ・突合せ処理(コントロールブレイク>)を使用する # # ・入力ファイルの支店コードから売上金額までクラス分けをする # (クラス分けがよく解りませんが、Cの構造体のようなものを使用せよと言われました) # # ・例外処理を書いたメインメソッド、突合せ処理メソッド、ヘッダメソッドの3つに分ける # # 下記の処理をヘッダメソッドとする # ここから # 帳票明細 # 001 東京 支店 出力日6月21日(出力した日)  P.1 # (空白行 1行) # 販売先 販売日 販売金額 # --------------------------------------------------------------- # ここまで # # # # ☆入力ファイル例 # ?支店コード ?支店名 ?販売日 ?販売先コード ?販売先名 ?売上金額 # # # 001 東京 20090601 0001 田中商店  1000 # 001 東京 20090602 0001 田中商店  5000 # 001 東京 20090603 0001 田中商店  10000 # 001 東京 20090601 0002 山田スーパー  3000 # 002 沖縄 20090604 0001 沖縄商店  7000 # ☆出力ファイル例 # # 帳票明細 # # 001 東京 支店 出力日6月21日(出力した日)  P.1 # (空白行 1行) # 販売先 販売日 販売金額 # --------------------------------------------------------------- # 0001 田中商店 6月1日 1,000 # 0001 田中商店 6月2日 5,000 # 0001 田中商店 6月3日 10,000 # ---------------------------------------------------------------- # 販売合計 件数 3 16,000 # (空白行 1行) # 0002 山田スーパー 6月1日 3,000 # ---------------------------------------------------------------- # 販売合計 件数 1 3,000 # (空白行 1行) #    **支店合計 件数 4 19,000 # # # # # 帳票明細 # 002 沖縄 支店 出力日6月21日(出力した日)  P.2 # (空白行 1行) # 販売先 販売日 販売金額 # ---------------------------------------------------------------- # 0001 沖縄商店 6月4日 7,000 # ---------------------------------------------------------------- # 販売合計 件数 1 7,000 # (空白行 1行) #    **支店合計 件数 1 7,000 #    ***総合計 件数 5 26,000 # # # # 入力ファイルを以下のように変更しましょう。 顧客別売上明細書を出力する :- 入力ファイルを読み込む(F1,F2,F3,L1,L2,L3), コントロールブレイク(L1,L2,L3,0,0,0,0,0,0,0). 入力ファイルを読み込む(F1,F2,F3,L1,L2,L3) :- get_lines(F1,L1), get_lines(F2,L2), get_lines(F3,L3). コントロールブレイク([L1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(6,L1,[],L2,L3), 合計加算(L1,SX,SX2,SX3,SX4,SX5,SX6), 明細行表示(_頁,_頁1,_行,_行1,L1,L2,L3), write('---------------------------------------------------------------\n'), 改頁制御(_頁1,_頁2,_行1,_行2,L2,L3), 販売先合計表示(_行2,_行3,CX5,SX5), 改頁制御(_頁2,_頁3,_行3,_行4), 支店合計表示(_行4,_行5,CX4,SX4), 改頁制御(_頁3,_頁4,_行5,_行6), 総合計表示(_行3,_,CX3,SX3),!. コントロールブレイク([L1,L12|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(1,L1,L12,L2,L3), 合計加算(L1,SX1,SX2,SX3,SX4,SX5,SX6), 明細行表示(_頁,_頁1,_行,_行1,[K|R11],L2,L3), コントロールブレイク([L12|R1],[L2|R2],[L3|R3],_頁1,_行1,CX4,CX5,CX6,SX4,SX5,SX6). コントロールブレイク([L1,L12|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(2,L1,L12,L2,L3), 合計加算(L1,SX,SX2,SX3,SX4,SX5,SX6), 明細行表示(_頁,_頁1,_行,_行1,L1,L2,L3), 販売先合計表示(_頁1,_頁2,_行1,_行2,CX5,SX5), コントロールブレイク([L12|R1],[L2|R2],[L3|R3],_頁2,_行2,CX,0,CX6,SX4,0,SX6). コントロールブレイク([L1,L12|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(3,L1,L12,L2,L3), 合計加算(L1,SX,SX2,SX3,SX4,SX5,SX6), 明細印刷(_頁,_頁1,_行,_行1,L1,L2,L3), 販売先合計表示(_頁1,_頁2,_行2,_行3,CX5,SX5), 支店合計表示(_頁2,_頁3,_行4,_行5,CX4,SX4), コントロールブレイク([L12|R1],[L2|R2],[L3|R3],_頁3,0,0,0,CX3,0,0,SX3),!. コントロールブレイク([L1|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(4,L1,_,L2,L3), コントロールブレイク([L1|R1],R2,[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3),!. コントロールブレイク([L1|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(5,L1,_,L2,L3), コントロールブレイク([L1|R1],[L2|R2],R3,_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3). コントロールブレイクパターン(1,L1,L12,L2,L3) :- 鍵項目(売上明細,L1,[KL1,KL11|_]), 鍵項目(売上明細,L12,[KL1,KL11|_]), 鍵項目(支店名,L2,[KL1|_]), 鍵項目(販売先名,L3,[KL11|_]),!. コントロールブレイクパターン(2,L1,L12,L2,L3) :- 鍵項目(売上明細,L1,[KL1,KL11|_]), 鍵項目(売上明細,L12,[KL1,KL12|_]), not(KL11=KL12), 鍵項目(支店名L2,[KL1|_]), 鍵項目(販売先名,L3,[KL11|_]),!. コントロールブレイクパターン(3,L1,L12,_,_) :- 鍵項目(売上明細,L1,[KL1,_|_]), 鍵項目(売上明細,L12,[KL12,_|_]), not(KL1=KL12),!. コントロールブレイクパターン(4,L1,_,L2,_) :- 鍵項目(売上明細,L1,[KL1|_]), 鍵項目(支店名,L2,[KL2|_]), KL1 @> KL2,!. コントロールブレイクパターン(5,L1,_,_,L3) :- 鍵項目(売上明細,L1,[_,KL11|_]), 鍵項目(販売先名,L3,[KL3|_]), KL11 @> KL3,!. コントロールブレイクパターン(6,L1,[],L2,L3) :- 鍵項目(売上明細,L1,[KL1,KL11|_]), 鍵項目(支店名,L2,[KL1|_]), 鍵項目(販売先名,L3,[KL11|_]),!. 鍵項目(売上明細,[_支店コード,_,_販売先コード|_],[_支店コード,_販売先コード]). 鍵項目(支店名,[_支店コード|_],[_支店コード]). 鍵項目(販売先名,[_販売先コード|_],[_販売先コード]). 明細行表示(_頁,_次の頁,0,_次の行,L1,L2,L3) :- 鍵項目(支店名,L2,[_支店コード,_支店名|_]), 今日(_今日), sub_atom(_今日,4,2,_,_月), sub_atom(_今日,6,2,_,_日), 支店名見出し(_支店コード,_支店名,_月,_日,_頁), 明細行表示(_頁,_頁,0,6,L1,L2,L3),!. 明細行表示(_頁,_次の頁,_行,_次の行, [_支店コード,_支店名,_販売日,_販売先コード,_販売先名,_売上金額], L2,L3) :- _行 > 20, _頁1 is _頁 + 1, 明細行表示(_頁1,_次の頁,1,_次の行, [_支店コード,_支店名,_販売日,_販売先コード,_販売先名,_売上金額], L2,L3),!. 明細行表示(_頁,_頁,_行,_次の行, [_支店コード,_支店名,_販売日,_販売先コード,_販売先名,_売上金額], L2,L3) :- _行 < 20, sub_atom(_販売日,4,2,_,_月), sub_atom(_販売日,6,2,_,_日), カンマの挿入(10,_売上金額,_カンマ付き売上金額), write_formatted('%4d %-30s%2d月%2d日 %t\n',[_販売先コード,_販売先名,_月,_日,_カンマ付き販売金額]), _次の行 is _行 + 1,!. 支店合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 > 20, 改頁, _頁1 is _頁 + 1, 支店合計表示(_頁1,_次の頁,1,_次の行,_件数,_合計),!. 支店合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 =< 20, _次の行 is _行 + 1, カンマの挿入(10,_合計金額,_カンマ付き合計金額), write(' **支店合計 件数 %2d %t\n',[_件数,_カンマ付き合計金額]),!. 販売先合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 > 20, 改頁, _頁1 is _頁 + 1, 販売先合計表示(_頁1,_次の頁,1,_次の行,_件数,_合計),!. 販売先合計表示(_頁,_頁,_行,_次の行,_件数,_合計) :- _行 =< 20, _次の行 is _行 + 1, カンマの挿入(10,_合計金額,_カンマ付き合計金額), write(' 販売合計 件数 %2d %t\n',[_件数,_カンマ付き合計金額]),!. 総合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 > 20, 改頁, _次の頁 is _頁 + 1, 総合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計),!. 総合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 =< 20, _次の行 is _行 + 1, カンマの挿入(10,_合計,_カンマ付き合計), write_formatted(' 総合計 %t\n',[_カンマ付き合計]). 帳票明細見出し :- write('\n 帳票明細\n'). 支店名見出し(_支店コード,_支店名,_月,_日,_頁) :- write_formatted('\n%t %t 出力日%2d月%2d日 P.2d\n\n',[_支店コード,_支店名_月,_日,_頁]), write(' 販売先 販売日 販売金額\n'). write('---------------------------------------------------------------\n'). 明細行項目(L1,_支店コード,_販売日,_販売先コード,_売上金額) :- sub_atom(L1,0,3,A1),atom_to_term(A1,_支店コード), sub_atom(L1,3,8,A2),A2 = _販売日, sub_atom(L1,11,6,A3),atom_to_term(A3,_販売先コード), sub_atom(L1,19,8,A4),atom_to_term(A4,_売上金額). 支店名項目(L2,_支店コード,_支店名) :- sub_atom(L2,0,3,A1),atom_to_term(A1,_支店コード), sub_atom(L2,3,10,_支店名). 販売先名項目(L3,_販売先コード,_販売先名) :- sub_atom(L3,0,6,A),atom_to_term(A3,_販売先コード), sub_atom(L3,6,30,_販売先名). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% カンマの挿入(_表示桁数,_数値,_表示文字列) :- number(_数値), number_codes(_数値,Codes), atom_codes(_数値文字列,Codes), カンマの挿入(_表示桁数,_数値文字列,_表示文字列),!. カンマの挿入(_表示桁数,_数値文字列,_表示文字列) :- atom_chars(_数値文字列,_数値文字ならび), 正数部の長さ(_数値文字ならび,_数値桁数), カンマの挿入の二(_数値桁数,_数値文字ならび,_空白のない数値ならび), length(_空白のない数値ならび,_空白のない数値ならびの桁数), _空白数 is _表示桁数 - _空白のない数値ならびの桁数, 空白文字を連結する(_空白数,_空白のない数値ならび,_表示文字列),!. カンマの挿入の二(0,X,X) :- ! . カンマの挿入の二(1,X,X) :- ! . カンマの挿入の二(N,[-|R],[-|R1]) :- M is N - 1, カンマの挿入の二(M,R,R1),! . カンマの挿入の二(N,[ |R],[ |R1]) :- M is N - 1, カンマの挿入の二(M,R,R1),! . カンマの挿入の二(N,[A|R],[A,,|R1]) :- M is N - 1, 0 is M mod 3, カンマの挿入の二(M,R,R1),! . カンマの挿入の二(N,[A|R],[A|R1]) :- M is N - 1, カンマの挿入の二(M,R,R1),! . 正数部の長さ([],0) :- !. 正数部の長さ([.|_],0) :- !. 正数部の長さ([_|R],N) :- 正数部の長さ(R,M), N is M + 1,!. 空白文字を連結する(N,[_|R],_表示文字列) :- N < 0, M is N + 1, 空白文字を連結する(M,R,_表示文字列),!. 空白文字を連結する(0,_表示文字ならび,_表示文字列) :- 文字列の結合(_表示文字ならび,_表示文字列),!. 空白文字を連結する(N,_表示文字ならび,_表示文字列) :- M is N - 1, 空白文字を連結する(M,[' '|_表示文字ならび],_表示文字列),!. 改頁 :- char_code(C,12), write_formatted('%c',[C]),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/615 # # [1] 授業単元: C初心者コース # [2] 問題文(含コード&リンク):試験の点数(100点満点)を入力すると、評価値(A+,A,B,C,F)を表示する # プログラムを作れ90〜100A+80〜89A70〜79B60〜69C0〜59Fそれ以外error # [3] 環境 # [3.1]linux # [3.2] gcc # [3.3]C # [4]6月19日 # [5]if文(gotoは論外)while do while for等 ループ文を使ってはいけないそうです 評価値(_点数,'A+') :- _点数>=90,_点数=<100. 評価値(_点数,'A') :- _点数>=80,_点数=<89. 評価値(_点数,'B') :- _点数>=70,_点数=<79. 評価値(_点数,'C') :- _点数>=60,_点数=<69. 評価値(_点数,'F') :- _点数>=0,_点数=<59. 評価値(_,error). '試験の点数(100点満点)を入力すると、評価値(A+,A,B,C,F)を表示する' :- '試験の点数(100点満点)を入力すると'(_試験の点数), 評価値を表示する(_試験の点数). '試験の点数(100点満点)を入力すると'(_試験の点数) :- write('試験の点数を入力してください : '), 行入力(_行), '試験の点数(100点満点)を入力診断'(_行,_試験の点数),!. '試験の点数(100点満点)を入力すると'(_試験の点数) :- '試験の点数(100点満点)を入力すると'(_試験の点数). '試験の点数(100点満点)を入力診断'(_行,_試験の点数) :- atom_to_term(_行,_試験の点数,_), 試験の点数は整数で0点以上100点以下(_試験の点数),!. '試験の点数(100点満点)を入力診断'(_行,_試験の点数) :- writef('入力された %t からは適切な試験の点数が得られません。再入力をお願いします。\n',[_行]), fail. 試験の点数は整数で0点以上100点以下(_試験の点数) :- integer(_試験の点数), _試験の点数>=0, _試験の点数=<100,!. 評価値を表示する(_試験の点数) :- 評価値(_試験の点数,_評価値), writef('入力した試験の点数は %t,その評価値は %t です\n',[_試験の点数,_評価値]). % 鍵値が範囲指定のときは、鍵の引数は変数にして置く。同時に二つ以上の具体的な値は表現できない。 % 評価値は英大文字から始まっているので変数と区別するためシングルクォーツで囲う。 % 一般に入力は不適切な文字列が入力されることも考慮する。ここでは、適切な入力が得られるまで、 % 繰り返し入力を促す例を示した。これが一般的な対応。 % read/1を使わないのは、入力の最後にピリオドが必要になるから。実務では受け入れられない。 % 文字列から整数を得るのにはatom_to_term/3を使う。第三引数は使わないためアンダースコアになっている。 行入力(_行) :- get_char(_文字), 行末まで読み込む(_文字,_行末までの文字ならび), atom_chars(_行,_行末までの文字ならび). 行末まで読み込む(end_of_file,[]) :- !. 行末まで読み込む('\n',[]) :- !. 行末まで読み込む(_文字,[_文字|R]) :- get_char(_次の文字), 行末まで読み込む(_次の文字,R). % 以下のサイトは % http://pc12.2ch.net/test/read.cgi/tech/1200175247/529 % [1] 授業単元:Ruby % [2] 問題文 ファイル分割 % % 下記は、hoge.csvを均等に4分割して tmp/ 以下に書き込むプログラムである。 % % ruby split.rb hoge.csv tmp/ 4 % % 出力例 % tmp/1out.csv % tmp/2out.csv % tmp/3out.csv % tmp/4out.csv t131(_分割されるファイル,_分割数) :- get_lines(_分割されるファイル,[_先頭行|L]), length(L,Len), Div is Len // _分割数, Mod is Len mod _分割数, t131(L,Div,Mod,1,X), t131(_分割数,_先頭行,X), fail; true. t131(_分割数,_先頭行,L) :- for(1,N,_分割数), list_nth(N,L,X), concat_atom(['tmp/',N,'out.csv'],F), put_lines(F,[_先頭行|X]), N=_分割数. t131([],_,_,_,_). t131(L,Div,Mod,Gth,[X|R]) 切り取り行数(Div,Mod,Gth,M), member_n(M,X,L,RL), Gth2 is Gth+1, t131(RL,Div,Mod,Gth2,R). 切り取り行数(Div,Mod,Nth,X) :- Nth > Mod,X is Div. 切り取り行数(Div,Mod,Nth,X) :- Nth =< Mod,X is Div + 1. member_n(N,X,L,R) :- length(X,N), append(X,R,L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1153585095/640 # # 【 課題 】 # 指定したフォルダの中身をフォルダの構成などを含めて完全にバックアップする # ソフトを作成すること。 # 尚、バックアップファイルには以下の機能を持つようにすること。 # ・ 対象ファイルや除外ファイルを指定できるような # 仕組みを持つこと。 # ・ バックアップ経過のログを作成すること。 # ログにはバックアップ処理の実行時間を出力すること。 # また、既にあるフォルダが指定された場合の対処についてもそれぞれ考慮して # 機能の実装を行うこと。 # 作業に余裕のある人は以下の機能を追加すること。 # ・バックアップしたファイルを圧縮する仕組みの追加。 # ・プログラムが常駐する仕組みの追加。 t111(Dir,SaveDir) :- concat_atom(['cp -R ',Dir,' ',SaveDir],S), shs(S,_). /* concat_atom(['ls -l ',Dir],S), shs(S,L), member(A,L), not(sub_atom(A,1,1,_,d)), concat_atom([Dir,/,A],FI), concat_atom([SaveDir,/,A],FO), copy(FI,FO), fail; true. */ shs(S,L) :- system(S,user_input,Input),get_lines(Input,L),close(Input). get_lines(File,Lines) :- get_chars(File,L),chars_lines(L,Lines),!. get_chars(Input,end_of_file,[]) :- !. get_chars(Input,X,[X|R]) :- get_char(Input,Y),get_chars(Input,Y,R) . get_chars(Input,L) :- get_char(Input,X),get_chars(Input,X,L),!. 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),concat_atom(U,A),chars_lines(R,R2). concat_atom([],'') :- !. concat_atom([A|R],S) :- concat_atom(R,S2),atom_concat(A,S2,S). % 以下のサイトは # [1] 授業単元: # [2] 問題文 # 今テキストファイルAが1つとBが10個あるとする。 # Aには # haru # natsu # aki # fuyu # とかかれ # Bにはそれぞれのテキストに以下のような文字列がかかれている # wheiowfjhoiejwio2121oij3io12ji2oj3io2j3oijo # iouaiojoiajwioejio121j3oi1j2iojlajia # これらをまとめ # テキストCに # aki[tab]wheiowfjhoiejwio2121oij3io12ji2oj3io2j3oijo[改行] # natsu[tab]iouaiojoiajwioejio121j3oi1j2iojlajia[改行] # になるようなプログラムをかけ # ただし。Bのそれぞれのテキストは非常に長くても大丈夫にせよ。 # [3] 環境 [3.1] OS:linux #  [3.2] gcc #  [3.3 C # [4] 期限: 5/23 '今テキストファイルAが1つとBが10個あるとする。 Aには haru natsu aki fuyu とかかれ Bにはそれぞれのテキストに以下のような文字列がかかれている wheiowfjhoiejwio2121oij3io12ji2oj3io2j3oijo iouaiojoiajwioejio121j3oi1j2iojlajia これらをまとめ テキストCに aki[tab]wheiowfjhoiejwio2121oij3io12ji2oj3io2j3oijo[改行] natsu[tab]iouaiojoiajwioejio121j3oi1j2iojlajia[改行] になるようなプログラムをかけ ただし。Bのそれぞれのテキストは非常に長くても大丈夫にせよ。' :- テキストファイルAとならびBに現れるファイルを結合する(_A,_ならびB). テキストファイルAとならびBに現れるファイルを結合する(_A,_ならびB) :- get_lines(_A,Lines), forall(( nth1(_nth1,Lines,Line), atom_chars(Line,Chars1), テキストファイルAとならびBに現れるファイルを結合する(Chars1,_nth1,_ならびB)), true). テキストファイルAとならびBに現れるファイルを結合する(Chars1,_nth1,_ならびB) :- nth1(_nth1,_ならびB,File), get_chars(File,Chars2), append(Chars1,['\t'|Chars2],Chars3), atom_chars(_表示文字列,Chars3), writef('%t\n',[_表示文字列]).