このディレクトリの索引

# 出典 :: C/C++の宿題片付けます 132台目 #365 # 【質問テンプレ】 # [1]授業単元:応用C言語演習 # [2]問題文(含コード&リンク) # 標準入力から1文字以上の英数字と'_'で構成される単語を読み込み、 # それぞれの単語が何回、何行目の何個目の単語に出現したかを単語アルファベット順 # にリストする索引作成プログラム # アルファベット順出力の後出現頻度(出現が多い単語順、同数についてはアルファベ # ット順)順についても同じ書式で出力 # 改行記号とタブ/アルファベット/数字/ '_' /空白しか標準入力されないとして良い。 # 入力行数、単語長、種数、単語辺りの出現回数に制限は無い。 # 単語の前後の区切りは単語を構成しない文字とする。(行末記号を含む) # 書式: 単語 (回数) 位置(行番号が若い順)改行 # 位置: 'L'行番号(1から開始)-行内単語番号(1から開始) # alpha (3回) L32-5 L66-4 L124-1 # beta (2回) L192-1 L276-3 # :- dynamic(単語索引/3). 文から索引の作成(_ファイル,_索引ならび) :- abolish(単語索引/3), ファイルを行ならびに変換する(_ファイル,_行ならび), 単語索引を作成(_行ならび). 単語索引を作成(_行ならび) :- '行ならびの全行に対して項目を区切って単語を取り出し、[単語,行目,行の中での位置]を引数とする節を単語索引に登録する'(_行ならび). '行ならびの全行に対して項目を区切って単語を取り出し、[単語,行目,行の中での位置]を引数とする節を単語索引に登録する'(_行ならび) :- forall( '行ならびの全行に対して'(_行ならび,_行目,_行), '項目を区切って単語を取り出し、[単語,行目,行の中での位置]を引数とする節を単語索引に登録する'(_行目,_行)). '行ならびの全行に対して'(_行ならび,_行目,_行) :- nth1(_行目,_行ならび,_行). '項目を区切って単語を取り出し、[単語,行目,行の中での位置]を引数とする節を単語索引に登録する'(_行目,_行) :- 項目区切り(_行,[' ','\t'],_単語ならび), 単語索引に登録する(_行目,_単語ならび). 単語索引に登録する(_行目,_単語ならび) :- forall( nth1(_位置,_単語ならび,_単語), assertz(単語索引(_単語,_行目,_位置))). 単語索引の全表示 :- forall(単語ごとの(_単語), '単語ごとの[_行,_位置]の明細と出現数を表示する'(_単語)). 単語ごとの(_単語) :- 単語ならびを生成し(_単語ならび), 一つずつ単語を取りだす(_単語). 単語ならびを生成し(_単語ならび) :- setof(_単語,[_単語,_行,_位置] ^ 単語索引(_単語,_行,_位置),_単語ならび). 一つずつ単語を取りだす(_単語) :- member(_単語,_単語ならび). '単語ごとの[_行,_位置]の明細と出現数を表示する'(_単語) :- '単語ごとの[_行,_位置]の明細'(_単語,_行_位置ならび), '[_行,_位置]の明細と出現数を表示する'(_単語,_行_位置_ならび). '単語ごとの[_行,_位置]の明細'(_単語,_行_位置ならび) :- findall([_行,_位置],( 単語索引(_単語,_行,_位置)),_行_位置ならび). '[_行,_位置]の明細と出現数を表示する'(_単語,_行_位置_ならび) :- length(_行_位置ならび,_度数), writef('%w\t%w\t%w\n',[_単語,_行_位置ならび,_度数]). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列).