このディレクトリの索引

% 以下のサイトは ヘッドゼロサプレス数値文字列(_桁数,_数,_ヘッドゼロサプレス数値文字列) :- length(_ヘッドゼロサプレス文字ならび,_桁数), ヘッドゼロサプレス文字ならび(_数,_ヘッドゼロサプレス文字ならび), atom_chars(_ヘッドゼロサプレス数値文字列,_ヘッドゼロサプレス文字ならび). ヘッドゼロサプレス文字ならび(_数,_ヘッドゼロサプレス文字ならび) :- number_chars(_数,_数字ならび), append(L1,_数字ならび,_ヘッドゼロサプレス文字ならび), すべて同一文字(L1,' '). すべて同一文字([],_). すべて同一文字([_同一文字|R],_同一文字) :- すべて同一文字(R,_同一文字). ?- ヘッドゼロサプレス数値文字列(8,-25.42,_ヘッドゼロサプレス数値文字列). _ヘッドゼロサプレス数値文字列 = ' -25.42' % 以下のサイトは # p=1231, q=4567を選びます。 # eに65537 # e^-1=d mod φ(n) のdを計算して求めます。 #     d=3988493 # となります。 # # 暗号化と複合化の手順 # 公開鍵:N = 1231 * 4567 # E = 65537 # d = 3988493 # 文字コード:「a〜z」=01〜26、「A〜Z」=27〜52、空白=53 # 文書:This Anser p(1231). % 素数1 q(4567). % 素数2 法とする数(5621977). % 法とする数 公開鍵(65537). % 公開鍵 秘密鍵(3988493). % 秘密鍵 'RSA暗号化'(_文書,_暗号文字コードならび) :- 文書を文字コードで数値化します(_文書,_文字コードならび), 'RSA方式によるコード暗号化'(_文字コードならび,_暗号文字コードならび). 'RSA復号化'(_暗号文字コードならび,_文書) :- 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび), 文字コードならびから文書を復元します(_文字コードならび,_文書). 'RSA方式によるコード暗号化'(_文字コードならび,_暗号コードならび) :- 公開鍵(_公開鍵), 法とする数(_法とする数), findall(_暗号コード,( '_文字コードを_暗号コードに変換'(_文字コードならび,_公開鍵,_法とする数,_暗号コード)),_暗号コードならび). '_文字コードを_暗号コードに変換'(_文字コードならび,_公開鍵,_法とする数,_暗号コード) :- member(_文字コード,_文字コードならび), _暗号コード is _文字コード ^ _公開鍵 mod _法とする数. 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび) :- 秘密鍵(_秘密鍵), 法とする数(_法とする数), findall(_文字コード,( '_暗号文字コードを_文字コードに復号する'(_暗号文字コードならび,_秘密鍵,_法とする数,_文字コード)),_文字コードならび). '_暗号文字コードを_文字コードに復号する'(_暗号文字コードならび,_秘密鍵,_法とする数,_文字コード) :- member(_暗号文字コード,_暗号文字コードならび), _文字コード is _暗号文字コード ^ _秘密鍵 mod _法とする数. 文書を文字コードで数値化します(_文書,_文字コードならび) :- findall(_文字コード,( sub_atom(_文書,_,1,_,_文字), 文字コード(_文字,_文字コード)), _文字コードならび). 暗号コードを暗号文に変換(_暗号コードならび,_暗号文) :- findall(_暗号文字,( member(_暗号コード,_暗号コードならび), 文字コード(_暗号文字,_暗号コード)),_暗号文字ならび), atom_chars(_暗号文,_暗号文字ならび). 文字コードならびから文書を復元します(_文字コードならび,_文書) :- findall(_文字,( member(_文字コード,_文字コードならび), 文字コード(_文字,_文字コード)),_文字ならび), atom_chars(_文書,_文字ならび). 文字コード(_文字,_コード) :- char_code(_文字,_コード). '秘密鍵の候補'(_素数p,_素数q,_公開鍵,_秘密鍵) :- '_素数p_1と_素数q_1の最小公倍数'(_素数p,_素数q,_素数p_1と_素数q_1の最小公倍数), '((_素数p_1と_素数q_1の最小公倍数 * N + 1) / _公開鍵) が整数となる秘密鍵候補を得る'(_素数p_1と_素数q_1の最小公倍数,_公開鍵,_秘密鍵). '((_素数p_1と_素数q_1の最小公倍数 * N + 1) / _公開鍵) が整数となる秘密鍵候補を得る'(_素数p_1と_素数q_1の最小公倍数,_公開鍵,_秘密鍵) :- between(1,9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999,N), 0 is (_素数p_1と_素数q_1の最小公倍数 * N + 1) mod _公開鍵, _秘密鍵 is (_素数p_1と_素数q_1の最小公倍数 * N + 1) // _公開鍵. '_素数p_1と_素数q_1の最小公倍数'(_素数p,_素数q,_素数p_1と_素数q_1の最小公倍数) :- succ(_素数p_1,_素数p), succ(_素数q_1,_素数q), 最小公倍数(_素数p_1,_素数q_1,_素数p_1と_素数q_1の最小公倍数). 最小公倍数(_m,_n,_最小公倍数) :- Y is _m * _n, ユークリッドの互除法により最大公約数を得る(_m,_n,_最大公約数), _最小公倍数 is ( _m * _n ) // _最大公約数. 'ユークリッドの互除法により最大公約数を得る'(_m,_m,_m). 'ユークリッドの互除法により最大公約数を得る'(_m,_n,_最大公約数) :- _m > _n, _剰余 is _m mod _n, ユークリッドの互除法により最大公約数を得る(_m,_n,_剰余,_最大公約数). 'ユークリッドの互除法により最大公約数を得る'(_m,_n,_最大公約数) :- _m < _n, ユークリッドの互除法により最大公約数を得る(_n,_m,_最大公約数). ユークリッドの互除法により最大公約数を得る(_,_最大公約数,0,_最大公約数) :- !. ユークリッドの互除法により最大公約数を得る(_m,_n,_剰余,_最大公約数) :- 'ユークリッドの互除法により最大公約数を得る'(_n,_剰余,_最大公約数). % 以下のサイトは # 出典 :: CodeIQ q1365 # # 成績の分布などを表すのに使われる度数分布表。 # ひと目で全体の散らばり具合がわかって便利です。 # # 【問題】 # 今回は素数の度数分布表を作ってみます。 # 入力として2つの正の整数が与えられます。 # 一つ目は分布させる素数の最大値、二つ目は区切りの大きさです。 # 例えば、30と5が与えられたとき、30までの素数を5で区切って出力します。 # 30までの素数は2, 3, 5, 7, 11, 13, 17, 19, 23, 29ですので、 # 出力内容は以下のようになります。 # 01-05:*** # 06-10:* # 11-15:** # 16-20:** # 21-25:* # 26-30:* # 同様に、40と7が与えられると、以下のように出力されます。 # 01-07:**** # 08-14:** # 15-21:** # 22-28:* # 29-35:** # 36-42:* # 上記のように出力するプログラムを作成してください。 # なお、最低限、以下の入力に対して正常に動作することを確認してください。 # 入力1:100 15 # 入力2:1200 25 # 入力3:12345 789 # '今回は素数の度数分布表を作ってみます。'(_最大値,_区切り) :- 素数の度数分布表(_最大値,_区切り,_度数分布表), 度数分布図として表示する(_度数分布表). 素数の度数分布表(_最大値,_区切り,_度数分布表) :- 素数を生成する(_最大値,_素数ならび), 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表). 素数を生成する(_最大値,_素数ならび) :- findall(_自然数,between(2,_最大値,_自然数),L), エラトステネスの篩(L,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- エラトステネスの篩(M,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(M,R1,L) :- findall(N,( member(N,R1), \+(0 is N mod M)),L). 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表) :- findall([_範囲下限,_範囲上限,_度数],( 素数の度数分布(_素数ならび,_最大値,_区切り,1,_区切り,_範囲下限,_範囲上限,_度数)),_度数分布表). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限,_範囲上限,_範囲下限,_範囲上限,_度数) :- 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数). 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数) :- _範囲下限 =< _最大値, 度数((between(_範囲下限,_範囲上限,_素数),member(_素数,_素数ならび)),_度数). '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- _範囲下限_1 =< _最大値, 次の範囲を確定する(_最大値,_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限), 素数の度数分布(_素数ならび,_最大値,_区切り,_次の範囲下限,_次の範囲上限,_範囲下限,_範囲上限,_度数). 次の範囲を確定する(_最大値,_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限) :- 次の範囲下限(_区切り,_範囲下限_1,_次の範囲下限), 次の範囲上限(_最大値,_区切り,_範囲上限_1,_次の範囲上限). 次の範囲下限(_区切り,_範囲下限_1,_次の範囲下限) :- _次の範囲下限 is _範囲下限_1 + _区切り. 次の範囲上限(_最大値,_区切り,_範囲上限_1,_最大値) :- _最大値 < _範囲上限_1 + _区切り,!. 次の範囲上限(_最大値,_区切り,_範囲上限_1,_次の範囲上限) :- _次の範囲上限 is _範囲上限_1 + _区切り. 度数(_目標,_度数) :- findall(_,_目標,L), length(L,_度数). 度数分布図として表示する(_度数分布表) :- 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数), 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数). 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数), 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲上限の表示桁数). 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数) :- findall(_桁数,範囲下限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲下限の表示桁数). 範囲下限値の桁数(_度数分布表,_下限桁数) :- member([_範囲下限,_,_],_度数分布表), number_chars(_範囲下限,Chars), length(Chars,_下限桁数). 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲の表示桁数) :- findall(_桁数,範囲上限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲の表示桁数). 範囲上限値の桁数(_度数分布表,_上限桁数) :- member([_,_範囲上限,_],_度数分布表), number_chars(_範囲上限,Chars), length(Chars,_上限桁数). 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- forall( member([_範囲下限,_範囲上限,_度数],_度数分布表), 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数)). 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数) :- ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列), 星文字列(_度数,_星文字列), writef('%w:%w\n',[_範囲表現文字列,_星文字列]). ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列) :- ヘッドゼロサプライ(_範囲下限の表示桁数,_範囲下限,_表示範囲下限), ヘッドゼロサプライ(_範囲上限の表示桁数,_範囲上限,_表示範囲上限), atomic_list_concat([_表示範囲下限,'-',_表示範囲上限],_範囲表現文字列). ヘッドゼロサプライ(_桁数,_数値,_ヘッドゼロサプライ数値表現) :- ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト), 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト), 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現). ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト) :- length(_ヘッドゼロサプライされたリスト,_桁数). 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト) :- number_chars(_数値,_数字のリスト), append(_頭部の枠リスト,_数字のリスト,_ヘッドゼロサプライされたリスト), 全ての要素が同じ(_頭部の枠リスト,'0'). 全ての要素が同じ([],_). 全ての要素が同じ([V|R],V) :- 全ての要素が同じ(R,V). 星文字列(_度数,_星文字列) :- findall(*,between(1,_度数,_),L), atomic_list_concat(L,_星文字列). 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現) :- atom_chars(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒の成績を管理するプログラムを作成する。 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 内容は 数学:70 英語:80 国語:75 理科:80 社会:60 となっている このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(_テキストファイル名ならび), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(_テキストファイル名ならび,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(_テキストファイル名ならび) :- shs('ls -N *.txt',_テキストファイル名ならび). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する([],_,_) :- !. 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(_テキストファイル名,_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の場合は出席番号を表示して行く(_テキストファイル名,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の場合は出席番号を表示して行く([_テキストファイル名|R],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の場合は出席番号を表示する([_テキストファイル名|R],_指定した科目,_指定した点数), 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(R,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の場合は出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数) :- forall(指定した科目で指定した点数の(_テキストファイル名,_指定した科目,_指定した点数), 生徒の出席番号を表示する(_テキストファイル名)). 指定した科目で指定した点数の(_テキストファイル名,_指定した科目,_指定した点数) :- get_split_lines(_テキストファイル名,[' ',':'],_行ならび), member([_指定した科目,_指定した点数],_行ならび). 生徒の出席番号を表示する(_テキストファイル名) :- 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(L1,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1) :- shs('ls -N *.txt',L1). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([],_,_). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_テキストファイル名|R1],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_|R1],_指定した科目,_指定した点数) :- 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(R1,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号) :- get_split_lines(_テキストファイル名,[' ',':'],L), member([_指定した科目,_指定した点数],L), 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは 'a-zを50回繰り返し、その文字列のn番目のnが素数かつその数値文字列の中に3を含まないものは、大文字に変換する'(_目標文字列) :- '小文字のa-zを50回繰り返したならびと大文字のA-Zを50回繰り返したならび'(_小文字ならび,_大文字ならび), 'エラトステネスの篩の変形'(_大文字ならび,Lx), 第二引数のならびの変数を第一引数の同一位置要素で埋めて文字列に変換する(_小文字ならび,Lx,_目標文字列). 第二引数のならびの変数を第一引数の同一位置要素で埋めて文字列に変換する(_小文字ならび,Lx,_目標文字列) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(_小文字ならび,Lx), atom_chars(_目標文字列,Lx). 第二引数のならびの変数を第一引数の同一位置要素で埋める([],[]). 第二引数のならびの変数を第一引数の同一位置要素で埋める(L1,L2) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(L1,L2). 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く([A|R1],[B|R2]) :- 第二引数が変数の時は第一引数と単一化(A,B), 第二引数のならびの変数を第一引数の同一位置要素で埋める(R1,R2). 第二引数が変数の時は第一引数と単一化(A,A) :- !. 第二引数が変数の時は第一引数と単一化(A,B). '小文字のa-zを50回繰り返したならびと大文字のA-Zを50回繰り返したならび'(L1,L2) :- '小文字のa-zを50回繰り返したならびと'(L1), '大文字のA-Zを50回繰り返したならび'(L2). '小文字のa-zを50回繰り返したならびと'(L1) :- findall(A,( between(1,50,_), sub_atom(abcdefghijklmnopqrstuvwxyz,_,1,_,A)),L1). '大文字のA-Zを50回繰り返したならび'(L2) :- findall(A,( between(1,50,_), sub_atom('ABCDEFGHIJKLMNOPQRSTRVWXYZ',_,1,_,A)),L2). 素数でその数値文字列に3を含まない時大文字で挿入する(_大文字ならび,L) :- findall(N,between(2,1300,N),_篩候補), length(L,1300), '素数でその数値文字列に3を含まない時大文字で挿入する'(_篩候補,_大文字ならび,L). '素数でその数値文字列に3を含まない時大文字で挿入する'([],_大文字ならび,L) :- !. '素数でその数値文字列に3を含まない時大文字で挿入する'([A|R1],_大文字ならび,L) :- '数字列に3を含まない時は大文字を素数の位置に挿入'(A,_大文字ならび,L), '素数でその数値文字列に3を含まない時大文字で挿入する'(A,R1,R2,_大文字ならび,L), '素数でその数値文字列に3を含まない時大文字で挿入する'(R2,_大文字ならび,L). '素数でその数値文字列に3を含まない時大文字で挿入する'(_,[],[],_大文字ならび,L) :- !. '素数でその数値文字列に3を含まない時大文字で挿入する'(N,[A|R1],R,_大文字ならび,L) :- 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L). 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L) :- 'AがNで割り切れたらそのまま篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L). 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L) :- 'AがNで割り切れなかったら篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L). 'AがNで割り切れたらそのまま篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L) :- 0 is A mod N, '素数でその数値文字列に3を含まない時大文字で挿入する'(N,R1,R,_大文字ならび,L),!. 'AがNで割り切れなかったら篩を掛け続ける'(N,[A|R1],[A|R2],_大文字ならび,L) :- '素数でその数値文字列に3を含まない時大文字で挿入する'(N,R1,R2,_大文字ならび,L). '数字列に3を含まない時は大文字を素数の位置に挿入'(N,_大文字ならび,L) :- 数字列に3を含まない時は(N,_大文字ならび), 大文字を素数の位置に挿入(N,_大文字ならび,L),!. '数字列に3を含まない時は大文字を素数の位置に挿入'(_,_,L). 数字列に3を含まない時は(N,_大文字ならび) :- number_chars(N,Chars), \+(member('3',Chars)). 大文字を素数の位置に挿入(N,_大文字ならび,L) :- nth1(N,_大文字ならび,A), nth1(N,L,A). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 157代目 #602 # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し、'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力せよ。'(_文字列). '文字列を入力し、'(_文字列) :- read_line_to_codes(user_input,Codes), atom_chars(_文字列,Codes). 'その文字列に含まれる英字、数字、その他の文字の数を出力せよ。'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力せよ(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- 文字ごとの種別判定行列を作る(_文字列,_文字ごとの種別判定行列), 列を合計したならび(_文字ごとの種別判定行列,[_英字の数,_数字の数,_その他の文字の数]). 文字ごとの種別判定行列を作る(_文字列,_文字ごとの種別判定行列) :- findall([A,B,C],( sub_atom(_文字列,_,1,_,_文字), 文字種判定(_文字,A,B,C)),_文字ごとの種別判定行列). 列を合計したならび(_行列,[_英字の数,_数字の数,_その他の文字の数]) :- 転置(_行列,_転置された行列), 転置された行の合計をならびに取る(_転置された行列,[_英字の数,_数字の数,_その他の文字の数]). 転置された行の合計をならびに取る(_転置された行列,_行の合計ならび) :- findall(S,( member(L,_転置された行列), sum_list(L,S)),_行の合計ならび). 出力せよ(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数は %w,数字の数は %w,その他の文字の数は %w\n',[_英字の数,_数字の数,_その他の文字の数]). 文字種判定(_文字,1,0,0) :- 英字(_文字),!. 文字種判定(_文字,0,1,0) :- 数字(_文字),!. 文字種判定(_文字,0,0,1). 英字(A) :- A @>='A',A @=< 'Z'; A @>='a',A @=< 'z'. 数字(A) :- A @>= '0', A @=< '9'. 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 161代目 #983 # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ.' :- '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントする'. '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントする' :- 入力したDNA塩基配列中にある(_DNA塩基ならび), '塩基 t, c, a, gそれぞれの個数をカウントする'(_DNA塩基ならび,0,0,0,0,_t,_c,_a,_g), writef('Thymine (t) : %w\nCytoshine (c) : %w\nAdenine (a) : %w\nGuanime (g) : %w\n',[_t,_c,_a,_g]). 入力したDNA塩基配列中にある(_DNA塩基ならび) :- 行入力(_行), atom_chars(_行,_DNA塩基ならび). '塩基 t, c, a, gそれぞれの個数をカウントする'([],_t,_c,_a,_g,_t,_c,_a,_g). '塩基 t, c, a, gそれぞれの個数をカウントする'([_塩基|R],_t_1,_c_1,_a_1,_g_1,_t,_c,_a,_g) :- 塩基の集計欄に加算(_塩基,_t_1,_c_1,_a_1,_g_1,_t_2,_c_2,_a_2,_g_2), '塩基 t, c, a, gそれぞれの個数をカウントする'(R,_t_2,_c_2,_a_2,_g_2,_t,_c,_a,_g). 塩基の集計欄に加算(t,_t_1,_c,_a,_g,_t,_c,_a,_g) :- succ(_t_1,_t). 塩基の集計欄に加算(c,_t,_c_1,_a,_g,_t,_c,_a,_g) :- succ(_c_1,_c). 塩基の集計欄に加算(a,_t,_c,_a_1,_g,_t,_c,_a,_g) :- succ(_a_1,_a). 塩基の集計欄に加算(g,_t,_c,_a,_g_1,_t,_c,_a,_g) :- succ(_g_1,_g). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #880 # [1]授業単元:C言語 # [2]問題文 # マインスイーパのような爆弾ゲームプログラムを作成する。 # 1. マス目を8× 8に設定する。 # 2. 爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)。 # 3.まだ指定していないマス目には数字の0の代わりに記号'-'を表示する。 # 4.爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を # 表示する(最小で0、最大で8)。 # 5. 爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字 # の'x'を表示し、"Bomb!"と表示して終了する。 # # [3]環境 # [3.1]windows7 # [3.2]gcc # [3.3]C/C++ # [4]7月20日 # よろしくお願いします。 # マインスイーパ :- 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面). 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面) :- 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面), '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(_平坦なならびで表現された盤面). マインスイーパ(_平坦なならびで表現された盤面) :- 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面),!. マインスイーパ(_平坦なならびで表現された盤面) :- マインスイーパを継続する(_平坦なならびで表現された盤面). 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面) :- 度数((member(A,_平坦なならびで表現された盤面),atom(A)),64), write('あなたの勝ちです。\n'). マインスイーパを継続する(_平坦なならびで表現された盤面) :- '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置), マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置) :- 爆弾を隠して盤面を表示する(_平坦なならびで表現された盤面), マス目を選択させる(_行位置,_列位置). マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面),!. マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面), 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面) :- 平坦化した位置に変換(_行位置,_列位置,_nth1), nth1(_nth1,_平坦なならびで表現された盤面,0). 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面) :- 爆弾は周囲にいくつあるか(_nth1,_平坦なならびで表現された盤面,_個数), writef('周囲に爆弾は %w 個あります\n',[_個数]),!. '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面) :- 得点は(_平坦なならびで表現された盤面,_得点), 爆弾が置かれたすべてのマス目に小文字のxを表示し(_平坦なならびで表現された盤面), writef('\n Bomb! \n\n\n あなたの得点は %t です\n',[_得点]). 得点は(_平坦なならびで表現された盤面,_得点) :- 度数((member(A,_平坦なならびで表現された盤面),\+(var(A)),A==0),_得点). 爆弾が置かれたすべてのマス目に小文字のxを表示し([]) :- !. 爆弾が置かれたすべてのマス目に小文字のxを表示し(L) :- 爆弾が置かれたすべてのマス目に小文字のxを表示して行く(L). 爆弾が置かれたすべてのマス目に小文字のxを表示して行く([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾が置かれたすべてのマス目に小文字のxを表示し(R). 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 行末まで表示する(A,R). 行末まで表示する(A,R) :- 爆弾を含むマス目表示文字(A,_表示文字), 爆弾を含むマス目表示(R,_表示文字). 爆弾を含むマス目表示(R,_表示文字) :- writef('%w',[_表示文字]), R = [], write('\n'). マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R) :- append(_,[A|R],[_1,_2,_3,_4,_5,_6,_7,_8]). 爆弾を含むマス目表示文字(V,'-') :- var(V),!. 爆弾を含むマス目表示文字('x','x') :- !. 爆弾を含むマス目表示文字(_,0). 爆弾を隠して盤面を表示する([]). 爆弾を隠して盤面を表示する([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を隠して盤面を表示する(R). 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 爆弾を隠して行末まで表示する(A,R). 爆弾を隠して行末まで表示する(A,R) :- 爆弾を隠すマス目表示文字(A,_表示文字), 爆弾を隠すマス目表示(_表示文字,R). 爆弾を隠すマス目表示(_表示文字,R) :- writef('%w',[_表示文字]), R = [], write('\n'). 爆弾を隠すマス目表示文字(V,'-') :- var(V),!. 爆弾を隠すマス目表示文字('x','-') :- !. 爆弾を隠すマス目表示文字(_,0). 平坦化した位置に変換(_行位置,_列位置,_nth1) :- _nth1 is (_行位置-1) * 8 + _列位置. 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面) :- length(_平坦なならびで表現された盤面,64). '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(L) :- 爆弾は10個にし(Lp), 同じマス目に重ならないようにランだけに配置する(Lp,L). 爆弾は10個にし(Lp) :- length(Lp,10). 同じマス目に重ならないようにランだけに配置する([],L) :- !. 同じマス目に重ならないようにランだけに配置する([_|R1],L) :- 同じマス目に重ならないようにランダムに一個爆弾を設置する(L), 同じマス目に重ならないようにランだけに配置する(R1,L). 同じマス目に重ならないようにランダムに一個爆弾を設置する(L) :- ランダムに(L,_nth0), 同じマス目に重ならないように一個爆弾を設置する(_nth0,L),!. ランダムに(L,_nth0) :- repeat, _nth0 is random(64). 同じマス目に重ならないように一個爆弾を設置する(_nth0,L) :- 同じマス目に重ならないように(_nth0,L,V), 一個爆弾を設置する(V). 同じマス目に重ならないように(_nth0,L,V) :- nth0(_nth0,L,V), var(V). 一個爆弾を設置する(x). 爆弾は周囲にいくつあるか(N,L,_個数) :- 度数(周囲の八箇所の中で爆弾があるのは(N,L),_個数). 周囲の八箇所の中で爆弾があるのは(N,L) :- 周辺の八箇所の中で(N,_nth1), '_nth1には爆弾がある'(_nth1,L). 周辺の八箇所の中で(N,_nth1) :- member(_式,[N-9,N-8,N-7,N-1,N,N+1,N+7,N+8,N+9]), _nth1 is _式. '_nth1には爆弾がある'(_nth1,L) :- nth1(_nth1,L,V), 変数ではなく爆弾がある(V). 変数ではなく爆弾がある(V) :- 変数ではなく(V), V = x. 変数ではなく(V) :- \+(var(V)). マス目を選択させる(_行位置,_桁位置) :- 整数を得る('マス目の行位置(1-8) ',between(1,8,_行位置),_行位置), 整数を得る('マス目の桁位置(1-8) ',between(1,8,_桁位置),_桁位置),!. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数),!. 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- catch(_条件,E,fail),!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは # 出題 :: プログラミングのお題スレ Part3 #482 # # お題:二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。 # 例 # aabaabbab -> a '二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_多数派の文字) :- 文字ならびに変換して二種の文字を得る(_二種類の文字からなる長さが奇数の文字列,_文字ならび,_甲,_乙), 多数派の文字を求める(_文字ならび,_甲,_乙,_多数派の文字). 文字ならびに変換して二種の文字を得る(_二種類の文字からなる長さが奇数の文字列,_文字ならび,_甲,_乙) :- atom_chars(_二種類の文字からなる長さが奇数の文字列,_文字ならび), ふたつの文字は異なる(_文字ならび,_甲,_乙),!. ふたつの文字は異なる(_文字ならび,_甲,_乙) :- append([_甲|_],[_乙|_],_文字ならび), _甲 \== _乙. 多数派の文字を求める(_文字ならび,_甲,_乙,_多数派の文字) :- 度数を得る(_文字ならび,_甲,_甲の度数,_乙の度数), 多数派の文字を得る(_甲,_乙,_甲の度数,_乙の度数,_多数派の文字). 度数を得る(_文字ならび,_甲,_甲の度数,_乙の度数) :- length(_文字ならび,_文字数), 度数(member(_甲,_文字ならび),_甲の度数), _乙の度数 is _文字数 - _甲の度数. 多数派の文字を得る(_甲,_,_甲の度数,_乙の度数,_甲) :- _甲の度数 > _乙の度数. 多数派(_,_乙,_,_,_乙). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数). 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- _条件,!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 134代目 #554 # [1] 授業単元:プログラミング 1 # [2] 問題文(含コード&リンク): # /************************* # ある二つの文字列str1,str2 の編集距離はつぎの3つの操作を行うことによりstr1 をstr2 に変換するのに要する操作の最低回数である # ・ 1文字挿入する # ・ 1文字削除する # ・ 1文字を他の1文字に置き換える # たとえば str1="sport" はstr2="sort" に, 文字 'p' を削除することによりstr2 に変換できるため編集距離は 1 である # # str_n を文字列str の頭からn 番目までの部分列としm(i,j)をstr i とstr j の編集距離を表すものとする.m(i,j)とm(i+1,j),m(i,j+1),m(i+1,j+1)の間に成り立つ再帰式を記述しなさい # # この再帰式に基づき効率良く編集距離を計算するプログラムを2次元配列を利用して作成しなさい.ただし,関数m(i,j)はint型の編集距離を返り値とする. # ******************************/ # 編集距離(_str1,_str2,_編集距離) :- 文字列をならびに変換して編集距離を計算する(_str1,_str2,_編集距離),!. 文字列をならびに変換して編集距離を計算する(_str1,_str2,_編集距離) :- 文字列をならびに変換して(_str1,_str2,L1,L2), 編集距離を計算する(L1,L2,0,_編集距離). 文字列をならびに変換して(_str1,_str2,L1,L2) :- atom_chars(_str1,L1), atom_chars(_str2,L2). 編集距離を計算する(L1,L2,M1,_編集距離) :- 一致する部分がない時はその部分の距離計算を加算して停止する(L1,L2,M1,_編集距離). 編集距離を計算する(L1,L2,M1,_編集距離) :- 一致する部分までの距離を加算して行く(L1,L2,M1,_編集距離). 一致する部分がない時はその部分の距離計算を加算して停止する(L1,L2,M1,_編集距離) :- 一致する部分がない時は(L1,L2), その部分の距離計算を加算して(L1,L2,M1,_編集距離). その部分の距離計算を加算して(L1,L2,M1,_編集距離) :- 距離計算(L1,L2,M1,_編集距離). 一致する部分がない時は(L1,L2) :- \+(一致する部分(L1,L2)). 一致する部分(L1,L2) :- append(_,[X|_],L1), append(_,[X|_],L2). 一致する部分までの距離を加算して行く(L1,L2,M1,_編集距離) :- 一致部分までの編集距離(L1,L2,M1,R1,R2,_一致部分までの編集距離), 編集距離を計算する(R1,R2,_一致部分までの編集距離,_編集距離). 一致部分までの編集距離(L1,L2,M1,R1,R2,_一致部分までの編集距離) :- 一致部分までの(L1,L2,L0_1,L0_2,R1,R2), 距離計算(L0_1,L0_2,M1,_一致部分までの編集距離). 一致部分までの(L1,L2,L0_1,L0_2,R1,R2) :- append(L0_1,[X|R1],L1), append(L0_2,[X|R2],L2). 距離計算(L1,L2,M1,M2) :- 'L1,L2の長さを取り'(L1,L2,Len1,Len2), 距離に加算する(Len1,Len2,M1,M2). 'L1,L2の長さを取り'(L1,L2,Len1,Len2) :- length(L1,Len1), length(L2,Len2). 距離に加算する(Len1,Len2,M1,M2) :- 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離より短い時は、Len2を加算する'(Len1,Len2,M1,M2). 距離に加算する(Len1,Len2,M1,M2) :- 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離と等しいか長い時は、Len1を加算する'(Len1,Len2,M1,M2). 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離より短い時は、Len2を加算する'(Len1,Len2,M1,M2) :- Len1 =< Len2, M2 is M1 + Len2. 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離と等しいか長い時は、Len1を加算する'(Len1,Len2,M1,M2) :- Len1 > Len2, M2 is M1 + Len1. % 以下のサイトは # 出題 :: プログラミングのお題スレ Part3 #482 # # お題:二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。 # 例 # aabaabbab -> a '二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_多数派の文字) :- 二種類の文字からなる長さが奇数の文字列があるとき(_二種類の文字からなる長さが奇数の文字列,_文字種_1,_文字種_2,Ln1,Ln2), 多数派の文字を求める(_文字種_1,_文字種_2,Ln1,Ln2,_多数派の文字). 二種類の文字からなる長さが奇数の文字列があるとき(_二種類の文字からなる長さが奇数の文字列,_文字種_1,_文字種_2,Ln1,Ln2) :- atom_chars(_二種類の文字からなる長さが奇数の文字列,Chars), 二種類の文字に分類して度数を示すならびを得る(Chars,_文字種_1,_文字種_2,Ln1,Ln2). 二種類の文字に分類して度数を示すならびを得る([],_,_,[],[]) :- !. 二種類の文字に分類して度数を示すならびを得る(L,A,B,Ln1,Ln2) :- 二種類の文字に分類して度数を示すならびを作って行く(L,A,B,Ln1,Ln2). 二種類の文字に分類して度数を示すならびを作って行く(L,A,B,Ln1,Ln2) :- 文字の度数を進める(L,A,B,Ln1_2,Ln2_2,R,Ln1,Ln2), 二種類の文字に分類して度数を示すならびを得る(R,A,B,Ln1_2,Ln2_2). 文字の度数を進める([A|R],A,_,Ln1,Ln2,R,[_|Ln1],Ln2) :- !. 文字の度数を進める([B|R],_,B,Ln1,Ln2,R,Ln1,[_|Ln2]). 多数派の文字を求める(_,B,Ln1,Ln2,B) :- append(Ln1,[_|_],Ln2),!. 多数派の文字を求める(A,_,_,_,A). % 以下のサイトは # 出典::スレ立てるまでもない質問はここで 105匹目 #516 # 文字列をひっくり返す関数下さい # # in→あいうえお # out→おえうあい # # こんな感じのです # # # 文字列をひっくり返す関数下さい(_in,_out) :- 仕様に勘違いがある(_in,_out). 文字列をひっくり返す関数下さい(_in,_out) :- 仕様には深淵なるルールがある(_in,_out). 仕様に勘違いがある(_in,_out) :- 勘違い(おえうあい,おえういあ), '勘違いだと分かったら最も常識的な解決、乃ち文字列を単に反転する'(_in,_out). 勘違い(おえうあい,おえういあ). '勘違いだと分かったら最も常識的な解決、乃ち文字列を単に反転する'(_in,_out) :- atom_chars(_in,_文字ならび), reverse(_文字ならび,_反転した文字ならび), atom_chars(_out,_反転した文字ならび). 仕様には深淵なるルールがある(_in,_out) :- 仕様には深遠なるルールがある(_in,_out). 仕様には深遠なるルールがある(_in,_out) :- atom_chars(_in,Chars), 深遠なるルールを文字のならびで(Chars,Chars2), atom_chars(_out,Chars2). 深遠なるルールを文字のならびで(Chars,Chars2) :- 第三要素から残り最後までを反転し最初の二要素を付加する(Chars,Chars2). 深遠なるルールを文字のならびで(Chars,Chars2) :- 一旦反転して最終二要素を置換する(Chars,Chars2). 深遠なるルールを文字のならびで(Chars,Chars2) :- 文字置換ルールに従って文字を置換する(Chars,Chars2). 第三要素から残り最後までを反転し最初の二要素を付加する(Chars,Chars2) :- 最初の二要素(Chars,_最初のに要素,_第三要素から残り最後まで), 第三要素から残り最後までを反転し(_第三要素から残りの最後まで,_反転した第三要素から残りの最後まで), 最初の二要素を付加する(_反転した第三要素から残りの最後まで,_最初の二要素,Chars2). 最初の二要素(Chars,_最初の二要素,_第三要素から残り最後まで) :- length(_最初の二要素,2), append(_最初の二要素,_第三要素から残り最後まで,Chars). 第三要素から残り最後までを反転し(_第三要素から最後まで,_反転した第三要素から最後まで) :- reverse(_第三要素から最後まで,_反転した第三要素から最後まで). 最初の二要素を付加する(_反転した第三要素から最後まで,_最初の二要素,Chars2) :- append(_反転した第三要素から最後まで,_最初の二要素,Chars2). 一旦反転して最終二要素を置換する(_文字ならび,_一旦反転して最終二要素を置換した文字ならび) :- 一旦反転して(_文字ならび,_反転した文字ならび), 最終二要素を置換する(_反転した文字ならび,_一旦反転して最終二要素を置換した文字ならび). 一旦反転して(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 最終二要素を置換する(_反転した文字ならび,_一旦反転して最終二要素を置換した文字ならび) :- append(L,[A,B],_反転した文字ならび), append(L,[B,A],_一旦反転して最終二要素を置換した文字ならび). 文字置換ルールに従って文字を置換する(_文字ならび,_置換された文字ならび) :- findall(_置換文字, 置換文字を取り出す(_文字ならび,_置換文字),_置換された文字ならび). 置換文字を取り出す(_文字ならび,_置換文字) :- member(_文字,_文字ならび), 文字置換ルール(_文字,_置換文字). 文字置換ルール(あ,お). 文字置換ルール(い,え). 文字置換ルール(う,う). 文字置換ルール(え,あ). 文字置換ルール(お,い). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #111 # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '"CGUU"をギャップ("-")を含んでいても検出'(_文字列,_前文字列,_CGUU,_後文字列) :- atom_chars(_文字列,_文字ならび), 'CGUUを確定する'(_文字ならび,L1,R1,R2,R3,R4), '_前文字列・_後文字列を取りだす'(L1,R4,_前文字列,_後文字列). 'CGUUを確定する'(_文字ならび,L1,R1,R2,R3,R4) :- append([L1,['C'|R1],['G'|R2],['U'|R3],['U'|R4]],_文字ならび), 'R1,R2,R3は全てギャップで満されているか[]である'(R1,R2,R3), 'CGUU'(R1,R2,R3,_CGUU). 'R1,R2,R3は全てギャップで満されているか[]である'(R1,R2,R3) :- forall(member(_ギャップならび,[R1,R2,R3]),'全てギャップで満たされているか[]である'(_ギャップならび)). '全てギャップで満たされているか[]である'([]), '全てギャップで満たされているか[]である'(['-'|R]) :- '全てギャップで満たされているか[]である'(R). 'CGUU'(R1,R2,R3,_CGUU) :- append([['C'|R1],['G'|R2],['U|R3],['U']],L2), atom_chars(_CGUU,L2). '_前文字列・_後文字列を取りだす'(L1,R4,_前文字列,_後文字列) :- atom_chars(_前文字列,L1), atom_chars(_後文字列,R4). % 以下のサイトは # 出典 :: Qiita_47443e0fb2988c1332b2 表(1,×,×,×,×,×). 表(2,×,×,×,○,×). 表(3,×,×,○,×,×). 表(4,×,○,×,×,×). 表(5,×,×,○,○,○). 表(6,×,○,○,×,×). 表(7,×,○,×,○,○). 表(8,×,○,○,○,○). 表(9,○,×,×,×,×). 表(10,○,×,×,○,×). 表(11,○,×,○,×,○). 表(12,○,○,×,×,○). 表(13,○,×,○,○,○). 表(14,○,○,○,×,○). 表(15,○,○,×,○,○). 表(16,○,○,○,○,○). 結婚できるか(_結婚できるか) :- findall(_項目の判定,聞き取り(_項目の判定),[_年収,_身長,_学歴,_親が資産家]), 結婚できるか(_年収,_身長,_学歴,_親が資産家,_結婚できるか). 聞き取り項目(年収,年収). 聞き取り項目(身長,身長). 聞き取り項目(学歴,学歴). 聞き取り項目(親の資産額,親が資産家). 聞き取り(_項目の判定) :- 聞き取り項目の値を得る(_項目,_値), 項目の判定(_項目,_値,_項目の判定). 聞き取り項目の値を得る(_項目,_値) :- 聞き取り項目(_質問,_項目), writef('%t : ',[_質問]), 行入力(_値). 項目の判定(_項目,_値,_項目の判定) :- P =.. [_項目,_値,_項目の判定], call(P). 年収(_年収文字列,○) :- 年収が10000000円以上(_年収文字列),!. 年収(_,×). 年収が10000000円以上(_年収文字列) :- atom_number(_年収文字列,_年収), _年収 >= 10000000. 親が資産家(_資産額文字列,○) :- 親の資産が10000000円以上(_資産額文字列),!. 親が資産家(_,×). 親の資産が10000000円以上(_資産額文字列) :- atom_number(_資産額文字列,_資産額), _資産額 >= 100000000. 身長(_身長文字列,○) :- 身長が180cm以上(_身長文字列),!. 身長(_,×). 身長が180cm以上(_身長文字列) :- atom_number(_身長文字列,_身長), _身長 >= 180. 学歴(_学歴,○) :- 最終学歴の偏差値が65以上(_学歴),!. 学歴(_学歴,×). 最終学歴の偏差値が65以上(_大学卒) :- 入試時点の偏差値(_大学卒,_偏差値), _偏差値 >= 65. 入試時点の偏差値(南河内大学,71). 入試時点の偏差値(私立東京未来大学,62). 結婚できるか(_年収,_身長,_学歴,_親が資産家,結婚できる) :- 表(_,_年収,_身長,_学歴,_親が資産家,○). 結婚できるか(_年収,_身長,_学歴,_親が資産家,結婚できない) :- 表(_,_年収,_身長,_学歴,_親が資産家,×). 行入力(_行文字列) :- 行入力文字ならびを得る(_行入力文字ならび), atom_chars(_行文字列,_行入力文字ならび). 行入力文字ならびを得る(_行入力文字ならび) :- findall(_文字,(文字入力(_文字),(行入力終了(_文字),!,fail;true)),_行入力文字ならび). 文字入力(end_of_file) :- at_end_of_stream(user_input). 文字入力(_文字) :- get_char(_文字). 文字入力(_文字) :- 文字入力(_文字). 行入力終了(end_of_file). 行入力終了('\n'). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #812 # [1] 授業単元:c 反復処理 # [2] 問題文(含コード&リンク): # 整数 a をキーボードから入力し,a が素数かどうか判断するプログラムを作成しなさい.(2〜a/2で整数aを割ったときに全ての値で割り切れなければ,aは素数である.) # サイズm(m<=10)の整数型配列変数aをキーボードから受け取り,a[0],a[1],...,a[n-1]のうちの最大値をディスプレイに表示するプログラムを完成しなさい. # '整数 a をキーボードから入力し,a が素数かどうか判断する' :- '整数 a をキーボードから入力し'(_a), 'a が素数かどうか判断する'(_a,_素数かどうかの判断), writef('%t は %t\n',[_a,_素数かどうかの判断]). '整数 a をキーボードから入力し'(_a) :- 整数を得る('整数 a',_a). 'a が素数かどうか判断する'(_a,素数である) :- _除数になりうる最大値 is _a // 2, 'a が素数かどうか判断する'(2,_除数になりうる最大値,_a),!. 'a が素数かどうか判断する'(_,素数ではない). 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_) :- _除数 > _除数になりうる最大値. 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_a) :- 'a が除数で割り切れない限り除数を1ずつ加算して行って判断する'(_除数,_除数になりうる最大値,_a). 'a が除数で割り切れない限り除数を1ずつ加算して行って判断する'(_除数,_除数になりうる最大値,_a) :- 'a が除数で割り切れない限り'(_a,_除数), 除数を1ずつ加算して(_除数,_次の除数), 'a が素数かどうか判断する'(_次の除数,_除数になりうる最大値,_a). 'a が除数で割り切れない限り'(_a,_除数) :- \+(0 is _a mod _除数). 除数を1ずつ加算して(_除数,_次の除数) :- succ(_除数,_次の除数). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 164代目 #833 # お願いします。 # [1] 情報処理演習 # [2] 自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力するプログラムを作 # 成せよ. #  [3.1] Linux #  [3.2] コンパイラ名とバージョン:visual studio 2010 #  [3.3] C言語 # [4] 指定なし # [5] 特になし # # '自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力する' :- '自然数n > 0 を入力として,'(_n), 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数),!. '自然数n > 0 を入力として,'(_n) :- 整数を得る('0より大きい自然数',_n > 0,_n). 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数), 出力する(_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を'(_n,L), 一つ(L,_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を'(_n,L) :- findall(_その自明でない約数,'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数),L). 'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数) :- _n_1 is _n - 1, between(2,_n_1,_その自明でない約数), 0 is _n mod _その自明でない約数. 一つ([H|T],_その自明でない約数) :- length([H|T],Len), _乱数 is random(Len), nth0(_乱数,[H|T],_その自明でない約数). 出力する(_その自明でない約数) :- writef('%t\n',[_その自明でない約数]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 164代目 #833 # お願いします。 # [1] 情報処理演習 # [2] 自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力するプログラムを作 # 成せよ. #  [3.1] Linux #  [3.2] コンパイラ名とバージョン:visual studio 2010 #  [3.3] C言語 # [4] 指定なし # [5] 特になし # # '自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力する' :- '自然数n > 0 を入力として,'(_n), 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数),!. '自然数n > 0 を入力として,'(_n) :- 整数を得る('0より大きい自然数',_n > 0,_n). 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数), 出力する(_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を'(_n,L), 一つ(L,_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を'(_n,L) :- findall(_その自明でない約数,'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数),L). 'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数) :- _n_1 is _n - 1, between(2,_n_1,_その自明でない約数), 0 is _n mod _その自明でない約数. 一つ([H|T],_その自明でない約数) :- length([H|T],Len), _乱数 is random(Len), nth0(_乱数,[H|T],_その自明でない約数). 出力する(_その自明でない約数) :- writef('%t\n',[_その自明でない約数]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/726 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力した10文字以内の任意の文字列の中で、 # ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す関数 # char *cut_str(char *address1, char target_char)を定義し、 # その動作を確認するkadai7-2.cを作りなさい。 # ただし、文字列と、ある特定の文字の入力は、 # char str[10], target_char; # scanf("%s %c", str, &target_char); # で入力されるものとして、 # 答えは以下で出力されるものとする。 # printf("answer = %s\n", cut_str(str, target_char)); # # 'キーボードから入力した10文字以内の任意の文字列の中で、ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す'(_ある特定の文字が最初に現れる位置からそれ以降の部分文字列) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字), 'ある特定の文字が最初に現れる位置からそれ以降の部分文字列を返す'(_文字列,_ある特定の文字,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列). キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- 催促の後一行入力して文字列とある特定の文字を得る(_文字列,_ある特定の文字),!. キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字). 催促の後一行入力して文字列とある特定の文字を得る(_文字列,_ある特定の文字) :- 催促の後一行入力する(_入力文字列), 文字列入力診断(_入力文字列,_文字列,_ある特定の文字). 催促の後一行入力する(_入力文字列) :- write('10文字以内の任意の文字列とある特定の文字を空白区切りで入力してください : '), 一行読み込む(_入力文字列,_). 文字列入力診断(_入力文字列,_文字列,_ある特定の文字) :- 文字列とある特定の文字を切り出す(_入力文字列,_文字列,_ある特定の文字), 文字列の長さ診断(_文字列,_ある特定の文字),!. 文字列入力診断(_入力文字列,_,_) :- writef('入力された %t から適切な情報が得られません。再入力をお願いします。\n',[_入力文字列]), fail. 文字列とある特定の文字を切り出す(_入力文字列,_文字列,_ある特定の文字) :- sub_atom(_入力文字列,_文字列,_空白文字列,_ある特定の文字), 空白文字列(_空白文字列), ある特定の文字は先頭文字は空白になり得ない(_ある特定の文字). 空白文字列(_空白文字列) :- sub_atom(_空白文字列,_,1,_,' '), forall(sub_atom(_空白文字列,_,1,_,_文字),_文字 = ' '). ある特定の文字は先頭文字は空白になり得ない(_ある特定の文字) :- \+(sub_atom(_ある特定の文字,0,1,_,' ')). 文字列の長さ診断(_文字列,_ある特定の文字) :- '10文字以内の文字列と1文字のある特定の文字'(_文字列,_ある特定の文字),!. 文字列の長さ診断(_文字列,_ある特定の文字) :- atom_length(_文字列,_文字列の長さ), writef('入力された文字列 %t は%t文字あります。10文字以下の長さで再入力をお願いします\n',[_文字列,_文字列の長さ]), fail. '10文字以内の文字列と1文字のある特定の文字'(_文字列,_ある特定の文字) :- '10文字以内の文字列'(_文字列), '1文字のある特定の文字'(_ある特定の文字). '10文字以内の文字列'(_文字列) :- atom_length(_文字列,_文字列の長さ), _文字列の長さ =< 10. '1文字のある特定の文字'(_ある特定の文字) :- atom_length(_ある特定の文字,1). 'ある特定の文字が最初に現れる位置からそれ以降の部分文字列を返す'(_文字列,_ある特定の文字,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列) :- sub_atom(_文字列,S,_,_,_ある特定の文字), sub_atom(_文字列,S,_,0,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列),!. 一行読み込む(_行,_終了状態) :- 行入力(_行,_終了状態). 行入力(X,_終了状態) :- get_char(C), '行入力/3'(C,Chars,_終了状態), atom_chars(X,Chars). '行入力/3'('\n',[],改行) :- !. '行入力/3'([A],[A],end_of_file) :- at_end_of_stream(user_input),!. '行入力/3'(C,[C|R],_終了状態) :- get_char(C2), '行入力/3'(C2,R,_終了状態). % 以下のサイトは しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびになければしりとりを終了する(_前の語彙,_語彙ならび,_しりとりならび). しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,_しりとりならび). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびになければしりとりを終了する(_前の語彙,_語彙ならび,[]) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙が語彙ならびになければ(_語彙の先頭文字,_語彙ならび). 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字) :- atom_chars(_前の語彙,Chars), last(Chars,_語彙の先頭文字). 語彙が語彙ならびになければ(_語彙の先頭文字,_語彙ならび) :- forall(select(_語彙,_語彙ならび,_),\+(atom_chars(_語彙,[_語彙の先頭文字|_]))). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,[_語彙|R]) :- 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび), しりとり(_語彙,_残り語彙ならび,R). 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび). 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび) :- select(_語彙,_語彙ならび,_残り語彙ならび), atom_chars(_語彙,[_語彙の先頭文字|_]). % 以下のサイトは しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,_しりとりならび). しりとり(_,_,[]). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,[_語彙|R]) :- 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび), しりとり(_語彙,_残り語彙ならび,R). 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび). 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字) :- atom_chars(_前の語彙,Chars), last(Chars,_語彙の先頭文字). 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび) :- select(_語彙,_語彙ならび,_残り語彙ならび), atom_chars(_語彙,[_語彙の先頭文字|_]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/111 # # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '"CGUU"をギャップ("-")を含んでいても検出'(_文字列,_前文字列,_CGUU,_後文字列) :- '"CGUU"が検出された場合のギャップ("-")と前後の文字ならび'(R1,R2,R3,L1,L2), 'R1,R2,R3は全て[]であるか全ての要素がギャップ("-")のリストである'(R1,R2,R3), '前文字列・ギャップ("-")を含んだ"CGUU"・後文字列を得る'(L1,R1,R2,R3,L2,_前文字列,_ギャップを含んだCGUU,_後文字列). '"CGUU"が検出された場合のギャップ("-")と前後の文字ならび'(R1,R2,R3,L1,L2) :- 文字列を文字ならびに変換し(_文字列,_文字ならび), 'ギャップ("-")と前後の文字ならびを得る'(_文字ならび,R1,R2,R3,L1,L2). 文字列を文字ならびに変換し(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 'ギャップ("-")と前後の文字ならびを得る'(_文字ならび,R1,R2,R3,L1,L2) :- append([L1,['C'|R1],['G'|R2],['U'|R3],['U'|L2]],_文字ならび). 'R1,R2,R3は全て[]であるか全ての要素がギャップ("-")のリストである'(R1,R2,R3) :- 'R1は[]であるか全ての要素がギャップ("-")のリストである'(R1), 'R2は[]であるか全ての要素がギャップ("-")のリストである'(R2), 'R3は[]であるか全ての要素がギャップ("-")のリストである'(R3). 'R1は[]であるか全ての要素がギャップ("-")のリストである'(R1) :- forall(member(_要素,R1),_要素='-'). 'R2は[]であるか全ての要素がギャップ("-")のリストである'(R2) :- forall(member(_要素,R2),_要素='-'). 'R3は[]であるか全ての要素がギャップ("-")のリストである'(R3) :- forall(member(_要素,R3),_要素='-'). '前文字列・ギャップ("-")を含んだ"CGUU"・後文字列を得る'(L1,R1,R2,R3,L2,_前文字列,_ギャップを含んだCGUU,_後文字列) :- 'L1から前文字列を得る'(L1,_前文字列), 'ギャップ("-")を含んだ"CGUU"'(R1,R2,R3,_ギャップを含んだCGUU), 'L2から後文字列を得る'(L2,_後文字列). 'L1から前文字列を得る'(L1,_前文字列) :- atom_chars(_前文字列,L1). 'ギャップ("-")を含んだ"CGUU"'(R1,R2,R3,_ギャップを含んだCGUU) :- 'ギャップ("-")を含んだ"CGUU"文字ならびを作り'(R1,R2,R3,_ギャップを含んだCGUU文字ならび), 'ギャップ("-")を含んだ"CGUU"に変換する'(_ギャップを含んだCGUU文字ならび,_ギャップを含んだCGUU). 'ギャップ("-")を含んだ"CGUU"文字ならびを作り'(R1,R2,R3,_ギャップを含んだCGUU文字ならび) :- append([['C'|R1],['G'|R2],['U'|R3],['U']],_ギャップを含んだCGUU文字ならび), 'ギャップ("-")を含んだ"CGUU"に変換する'(_ギャップを含んだCGUU文字ならび,_ギャップを含んだCGUU) :- atom_chars(_ギャップを含んだCGUU,_ギャップを含んだCGUU文字ならび). 'L2から後文字列を得る'(L2,_後文字列) :- atom_chars(_後文字列,L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/111 # # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '"CGUU"をギャップ("-")を含んでいても検出'(_文字列,_前文字列,_CGUU,_後文字列) :- '"CGUU"が検出された場合のギャップと前後の文字ならび'(R1,R2,R3,L1,L2), 'R1,R2,R3は全て[]であるか全ての要素がギャップ("-")のリストである'(R1,R2,R3), '前文字列・ギャップ("-")を含んだ"CGUU"・後文字列を得る'(L1,R1,R2,R3,L2,_前文字列,_ギャップを含んだCGUU,_後文字列). '"CGUU"が検出された場合のギャップと前後の文字ならび'(R1,R2,R3,L1,L2) :- atom_chars(_文字列,_文字ならび), append([L1,['C'|R1],['G'|R2],['U'|R3],['U'|L2]],_文字ならび). 'R1,R2,R3は全て[]であるか全ての要素がギャップ("-")のリストである'(R1,R2,R3) :- forall(member(_1,R1),_1='-'), forall(member(_2,R2),_2='-'), forall(member(_3,R3),_3='-'). '前文字列・ギャップ("-")を含んだ"CGUU"・後文字列を得る'(L1,R1,R2,R3,L2,_前文字列,_ギャップを含んだCGUU,_後文字列) :- atom_chars(_前文字列,L1), 'ギャップ("-")を含んだ"CGUU"'(R1,R2,R3,_ギャップを含んだCGUU), atom_chars(_後文字列,L2). 'ギャップ("-")を含んだ"CGUU"'(R1,R2,R3,_ギャップを含んだCGUU) :- append([['C'|R1],['G'|R2],['U'|R3],['U']],_ギャップを含んだCGUU文字ならび), atom_chars(_ギャップを含んだCGUU,_ギャップを含んだCGUU文字ならび). % 以下のサイトは 行文字列入力(_行文字列,_終了状態) :- 一文字を得る(_文字), 文字ならび入力(_文字,_文字ならび,_終了状態), 文字ならびを行文字列に変換する(_行文字列,_文字ならび). 文字ならび入力(_文字,_文字ならび,_終了状態) :- 入力文字が改行またはend_of_fileで終了する(_文字,_文字ならび,_終了状態),!. 文字ならび入力(_文字,_文字ならび,_終了状態) :- 文字を読み込みながら文字ならび入力を続ける(_文字,_文字ならび,_終了状態). 入力文字が改行またはend_of_fileで終了する(end_of_file,[],end_of_file) :- !. 入力文字が改行またはend_of_fileで終了する('\n',[],改行). 文字を読み込みながら文字ならび入力を続ける(_文字,[_文字|R],_終了状態) :- 一文字を得る(_次の文字), 文字ならび入力(_次の文字,R,_終了状態). 一文字を得る(_文字) :- get_char(_文字). 文字ならびを行文字列に変換する(_行文字列,_文字ならび) :- atom_chars(_行文字列,_文字ならび). % 以下のサイトは 行入力(_行,_終了状態) :- 一文字を得る(_文字), 文字ならび入力(_文字,_文字ならび,_終了状態), atom_chars(_行,_文字ならび). 文字ならび入力(_文字,_文字ならび,_終了状態) :- 入力文字が改行またはend_of_fileで終了する(_文字,_文字ならび,_終了状態),!. 文字ならび入力(_文字,_文字ならび,_終了状態) :- 文字を読み込みながら文字ならび入力を続ける(_文字,_文字ならび,_終了状態). 入力文字が改行またはend_of_fileで終了する(end_of_file,[],end_of_file) :- !. 入力文字が改行またはend_of_fileで終了する('\n',[],改行). 文字を読み込みながら文字ならび入力を続ける(_文字,[_文字|R],_終了状態) :- 一文字を得る(_次の文字), 文字ならび入力(_次の文字,R,_終了状態). 一文字を得る(_文字) :- get_char(_文字). % 以下のサイトは 整数から頭部零文字列(_桁,_整数,_数値を表す文字列) :- 整数を数字ならびに変換してその桁数を得る(_整数,_数字ならび,_数字部分の桁), 頭部の零ならびを作り数字ならびを追加した頭部零数字ならびを作る(_桁,_数字ならび,_数字部分の桁,_頭部零数字ならび), 頭部零数字ならびを数値を表す文字列に変換する(_頭部零数字ならび,_数値を表す文字列). 整数を数字ならびに変換してその桁数を得る(_整数,_数字ならび,_数字部分の桁) :- number_chars(_整数,_数字ならび), length(_数字ならび,_数字部分の桁). 頭部の零ならびを作り数字ならびを追加した頭部零数字ならびを作る(_桁,_数字ならび,_数字部分の桁,_頭部零数字ならび) :- _頭部零の桁 is _桁 - _数字部分の桁, findall('0',between(1,_頭部零の桁,_),_頭部零数字ならび,_数字ならび). 頭部零数字ならびを数値を表す文字列に変換する(_頭部零数字ならび,_数値を表す文字列) :- atom_chars(_数値を表す文字列,_頭部零数字ならび). % 以下のサイトは 整数から頭部零文字列(_桁,_整数,_数値を表す文字列) :- 整数を数字ならびに変換して桁数要素の変数ならびの後半に埋め込む(_桁,_整数,_頭部零文字ならび,_文字ならび), 頭部の零ならびは後から変数に零を埋める(_頭部零文字ならび,_文字ならび), 文字ならびを数値を表す文字列に変換する(_文字ならび,_数値を表す文字列). 整数を数字ならびに変換して桁数要素の変数ならびの後半に埋め込む(_桁,_整数,_頭部零文字ならび,_文字ならび) :- length(_文字ならび,_桁), number_chars(_整数,_数字ならび), append(_頭部零文字ならび,_数字ならび,_文字ならび). 頭部の零ならびは後から変数に零を埋める(_頭部零文字ならび) :- findall('0',( member(_要素,_頭部零文字ならび),var(_要素)),_頭部零文字ならび). 文字ならびを数値を表す文字列に変換する(_文字ならび,_数値を表す文字列) :- atom_chars(_数値を表す文字列,_文字ならび). % 以下のサイトは # 出典 :: CodeIQ q1365 # # 成績の分布などを表すのに使われる度数分布表。 # ひと目で全体の散らばり具合がわかって便利です。 # # 【問題】 # 今回は素数の度数分布表を作ってみます。 # 入力として2つの正の整数が与えられます。 # 一つ目は分布させる素数の最大値、二つ目は区切りの大きさです。 # 例えば、30と5が与えられたとき、30までの素数を5で区切って出力します。 # 30までの素数は2, 3, 5, 7, 11, 13, 17, 19, 23, 29ですので、 # 出力内容は以下のようになります。 # 01-05:*** # 06-10:* # 11-15:** # 16-20:** # 21-25:* # 26-30:* # 同様に、40と7が与えられると、以下のように出力されます。 # 01-07:**** # 08-14:** # 15-21:** # 22-28:* # 29-35:** # 36-42:* # 上記のように出力するプログラムを作成してください。 # なお、最低限、以下の入力に対して正常に動作することを確認してください。 # 入力1:100 15 # 入力2:1200 25 # 入力3:12345 789 # '今回は素数の度数分布表を作ってみます。'(_最大値,_区切り) :- 素数の度数分布表(_最大値,_区切り,_度数分布表), 度数分布図として表示する(_度数分布表). 素数の度数分布表(_最大値,_区切り,_度数分布表) :- 素数を生成する(_最大値,_素数ならび), 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表). 素数を生成する(_最大値,_素数ならび) :- findall(_自然数,between(2,_最大値,_自然数),L), エラトステネスの篩(L,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- エラトステネスの篩(M,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(M,R1,L) :- findall(N,( member(N,R1), \+(0 is N mod M)),L). 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表) :- findall([_範囲下限,_範囲上限,_度数],( 素数の度数分布(_素数ならび,_最大値,_区切り,1,_区切り,_範囲下限,_範囲上限,_度数)),_度数分布表). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限,_範囲上限,_範囲下限,_範囲上限,_度数) :- 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数). 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数) :- _範囲下限 =< _最大値, 度数((between(_範囲下限,_範囲上限,_素数),member(_素数,_素数ならび)),_度数). '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- _範囲下限_1 =< _最大値, 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限), 素数の度数分布(_素数ならび,_最大値,_区切り,_次の範囲下限,_次の範囲上限,_範囲下限,_範囲上限,_度数). 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限) :- _次の範囲下限 is _範囲下限_1 + _区切り, _次の範囲上限 is _範囲上限_1 + _区切り. 度数(_目標,_度数) :- findall(_,_目標,L), length(L,_度数). 度数分布図として表示する(_度数分布表) :- 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数), 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数). 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数), 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲上限の表示桁数). 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数) :- findall(_桁数,範囲下限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲下限の表示桁数). 範囲下限値の桁数(_度数分布表,_下限桁数) :- member([_範囲下限,_,_],_度数分布表), number_chars(_範囲下限,Chars), length(Chars,_下限桁数). 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲の表示桁数) :- findall(_桁数,範囲上限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲の表示桁数). 範囲上限値の桁数(_度数分布表,_上限桁数) :- member([_,_範囲上限,_],_度数分布表), number_chars(_範囲上限,Chars), length(Chars,_上限桁数). 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- forall( member([_範囲下限,_範囲上限,_度数],_度数分布表), 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数)). 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数) :- ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列), 星文字列(_度数,_星文字列), writef('%w:%w\n',[_範囲表現文字列,_星文字列]). ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列) :- ヘッドゼロサプライ(_範囲下限の表示桁数,_範囲下限,_表示範囲下限), ヘッドゼロサプライ(_範囲上限の表示桁数,_範囲上限,_表示範囲上限), atomic_list_concat([_表示範囲下限,'-',_表示範囲上限],_範囲表現文字列). ヘッドゼロサプライ(_桁数,_数値,_ヘッドゼロサプライ数値表現) :- ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト), 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト), 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現). ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト) :- length(_ヘッドゼロサプライされたリスト,_桁数). 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト) :- number_chars(_数値,_数字のリスト), append(_頭部の枠リスト,_数字のリスト,_ヘッドゼロサプライされたリスト), 全ての要素が同じ(_頭部の枠リスト,'0'). 全ての要素が同じ([],_). 全ての要素が同じ([V|R],V) :- 全ての要素が同じ(R,V). 星文字列(_度数,_星文字列) :- findall(*,between(1,_度数,_),L), atomic_list_concat(L,_星文字列). 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現) :- atom_chars(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは # 出典 :: CodeIQ q1385 言語不問:通分と約分を実装しよう # # 小学生が分数を学ぶときに、最初に躓くのが「通分」です。 # # 分母の異なる分数の足し算や引き算を行うとき、先に通分を行っておく必要があります。 # # また、計算した結果、「約分」できる場合は、可能な限り簡単な分数にしないと正解になりません。 # # 【問題】 # # では、入力される二つの分数について足し算を行った時に、 # # 正しい答えを出力するプログラムを作り、 # # 問1〜問5の標準入力に対して、出力内容を答えてください。 # # ※分母が1の時には整数として出力してください。 # # ■例 # # 例1) # # 【標準入力】 # # 5/6 # # 1/10 # # 【標準出力】 # # 14/15 # # 例2) # # 【標準入力】 # # 1/3 # # 2/3 # # 【標準出力】 # # 1 # # ■問1〜5 # # 問1) # # 1/3 # # 2/7 # # 問2) # # 2/8 # # 3/5 # # 問3) # # 3/10 # # 1/6 # # 問4) # # 3/4 # # 5/8 # # 問5) # # 2/5 # # 2/3 # # 【解答方法】 # # 解答用テキストファイルanswer_q1385.txtをダウンロードし、必要事項をご記入ください。 # # 必須事項がすべて記入されていることをご確認いただいた後、テキストファイルのままアップロードしてください。 # # 【注意】 # # ・ご提出いただいたプログラムは個別に実行テストを行いますので、 # #  解答用テキストファイルに書かれた解答が正解していても最高評価になるとは限りません。 # # ・プログラミング言語は不問ですが、古すぎる実行環境・特殊な設備を要する実行環境では採点できない場合がございます。 # # ・使用する言語は1解答につき必ず1種類でお願いします。 # #  どうしても複数の言語を用いる場合は、解答に「メインの言語名」を明記してください。 # '問1〜問5の標準入力に対して、出力内容を答えてください。 ■問1〜5 問1) 1/3 2/7 問2) 2/8 3/5 問3) 3/10 1/6 問4) 3/4 5/8 問5) 2/5 2/3' :- between(1,5,N), '入力される二つの分数について足し算を行った時に、正しい答えを出力する', N = 5. '入力される二つの分数について足し算を行った時に、正しい答えを出力する' :- 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2), 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _加算された分母), 約分(_加算された分子 / _加算された分母,_約分された分子 / _約分された分母), 答えを出力する(_約分された分子 / _約分された分母). 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _通分された分母) :- 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _通分された分母,_通分された分子_2 / _通分された分母), _加算された分子 is _通分された分子_1 + _通分された分子_2,!. 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2) :- 入力される分数(_分子_1 / _分母_1), 入力される分数(_分子_2 / _分母_2). 入力される分数(_分子 / _分母) :- 行入力(_行), read_term_from_atom(_行,_分子 / _分母,[]). 行入力(_行) :- get_char(_先読み文字), 行ならびを得る(_先読み文字,_行ならび), atom_chars(_行,_行ならび). 行ならびを得る('\n',[]) :- !. 行ならびを得る(_先読み文字,[_先読み文字|R]) :- get_char(_次の文字), 行ならびを得る(_次の文字,R). 答えを出力する(_約分された分子 / _約分された分母) :- writef('%t\n',[_約分された分子 / _約分された分母]). 約分(_分子 / _分母,X) :- 最大公約数で分子分母を割って約分する(_分子,_分母,_分子_1,_分母_1), 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子_2,_分母_2), 分母が1の時は整数に変形(_分子_2,_分母_2,X). 最大公約数で分子分母を割って約分する(_分子_1,_分母_1,_分子,_分母) :- 最大公約数(_分子_1,_分母_1,_最大公約数), _分子 is _分子_1 // _最大公約数, _分母 is _分母_1 // _最大公約数. 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子,_分母) :- 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母),!. 負数の場合のマイナス符号は分子側に付ける(_分子,_分母,_分子,_分母). 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母) :- _分母_1 =< 0, _分子 is _分子_1 * -1, _分母 is _分母_1 * -1. 分母が1の時は整数に変形(_分子,1,_分子) :- !. 分母が1の時は整数に変形(_分子,1.0,_分子) :- !. 分母が1の時は整数に変形(_分子,_分母,_分子 / _分母). 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _最小公倍数,_通分された分子_2 / _最小公倍数) :- 最小公倍数([_分母_1,_分母_2],_最小公倍数), _通分された分子_1 is _分子_1 * (_最小公倍数 // _分母_1), _通分された分子_2 is _分子_2 * (_最小公倍数 // _分母_2). 最大公約数([_整数],_整数). 最大公約数([_整数|R],_最大公約数) :- 最大公約数(R,_最大公約数_2), 二つの整数の最大公約数(_整数,_最大公約数_2,_最大公約数). 二つの整数の最大公約数(M,N,X) :- 二つの整数の絶対値をとる(M,N,M_2,N_2), 最大公約数をユークリッドの互除法で求める(M_2,N_2,Y), 負数解の可能性も探る(M,M_2,N,N_2,Y,X). 負数解の可能性も探る(M,M_2,N,N_2,Y,X) :- setof(X,[M,M_2,N,N_2,Y,X] ^ 負数解の可能性(M,M_2,N,N_2,Y,X),L), member(X,L). 負数解の可能性(M,M_2,_,_,Y,X) :- X is Y * (M // M_2). 負数解の可能性(_,_,N,N_2,Y,X) :- X is Y * (N // N_2). 二つの整数の絶対値をとる(M,N,M_2,N_2) :- M_2 is abs(M), N_2 is abs(N). 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 最小公倍数(_整数_1,_整数_2,_最小公倍数) :- 二つの整数の最小公倍数(_整数_1,_整数_2,_最小公倍数). 最小公倍数(_整数ならび,_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(_整数ならび,_最小公倍数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数],_整数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数|R],_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(R,_最小公倍数_1), 二つの整数の最小公倍数(_整数,_最小公倍数_1,_最小公倍数). 二つの整数の最小公倍数(A,B,X) :- 二つの整数の最大公約数(A,B,_最大公約数), X is A * B // _最大公約数. % 以下のサイトは 縦書文書を横書文書に変形する(_縦書文書,_横書文書) :- 縦書文書を横書行ならびに変形する(_縦書文書,_横書き行ならび), atomic_list_concat(_横書行ならび,'\n',_縦書文書). 縦書文書を横書行ならびに変形する(_縦書文書,_横書き行ならび) :- 改行を区切りに行ならびに変形する(_縦書文書,_縦書行ならび), 縦書行ならびを横書行ならびに変形する(_縦書行ならび,_横書き行ならび). 縦書行ならびを横書行ならびに変形する(_縦書行ならび,_横書き行ならび) :- 縦書行ならびを反転した行文字ならびに変換(_縦書行ならび,_反転した行文字ならび), 転置(_反転した行文字ならび,_転置した行文字ならび), 転置した行文字ならびを横書き行ならびに変換(_転置した行文字ならび,_横書き行ならび). 縦書行ならびを反転した行文字ならびに変換(_縦書行ならび,_反転した行文字ならび) :- findall(_反転した文字ならび,( member(_行文字列,_縦書行ならび), 文字列を反転した文字ならびに変換(_行文字列,_反転した文字ならび)),_反転した行文字ならび). 文字列を反転した文字ならびに変換(_文字列,_反転した文字ならび) :- 文字列を反転した文字ならびに変換(_文字列,[],_反転した文字ならび). 文字列を反転した文字ならびに変換('',_反転した文字ならび,_反転した文字ならび) :- !. 文字列を反転した文字ならびに変換(_文字列,L1,_反転した文字ならび) :- 先頭文字と残り文字列(_文字列,_先頭文字,_残り文字列), 文字列を反転した文字ならびに変換(_残り文字列,[_先頭文字|L1],_反転した文字ならび). 先頭文字と残り文字列(_文字列,_先頭文字,_残り文字列) :- sub_atom(_文字列,0,1,_末尾からの変位,_先頭文字), sub_atom(_文字列,_,_末尾からの変位,0,_残り文字列). 改行を区切りに行ならびに変形する(_縦書文書,[_前文字列|R]) :- 改行を区切りに(_縦書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_縦書文書,_前文字列,_後文字列) :- sub_atom(_縦書文書,_先頭からの変位,1,_末尾からの変位,'\n'), sub_atom(_縦書文書,0,_先頭からの変位,_,_前文字列), sub_atom(_縦書文書,_,_末尾からの変位,0,_後文字列),!. 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置した行文字ならびを横書き行ならびに変換(_転置した行文字ならび,_横書き行ならび) :- findall(_行文字列,( 空白行を取り除きながら行文字ならびを行文字列に変換する(_転置した行文字ならび,_行文字列)),_横書き行ならび). 空白行を取り除きながら行文字ならびを行文字列に変換する(_転置した行文字ならび,_行文字列) :- member(_行文字ならび,_転置した行文字ならび), 空白行ではない(_行文字ならび), atom_chars(_行文字列,_行文字ならび). 空白行ではない(_行文字ならび) :- \+(空白行(_行文字ならび)). 空白行(_行文字ならび) :- forall(member(_文字,_行文字ならび),_文字 = ' '). % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,0,_縦書文書). 横書文書を縦書文書に変形する(_横書文書,_列間隔文字数,_縦書文書) :- 改行を区切りに行ならびに変形する(_横書文書,_行ならび), 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書). 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書) :- 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび), 行ならびを転置する(_矩形ならび,_転置した矩形ならび), 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書). 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書) :- 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび), 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 改行を区切りに行ならびに変形する(_横書文書,[_前文字列|R]) :- 改行を区切りに(_横書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_横書文書,_前文字列,_後文字列) :- sub_atom(_横書文書,S,1,R,'\n'), sub_atom(_横書文書,0,S,_,_前文字列), sub_atom(_横書文書,_,R,0,_後文字列),!. 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび) :- 最大文字列長を調べ(_行ならび,_最大文字列長), その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび). 最大文字列長を調べ(_行ならび,_最大文字列長) :- findmax(_文字数,( member(_行,_行ならび), atom_length(_行,_文字数)),_最大文字列長). その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび) :- findall(_空白を付加した文字列,( member(_行,_行ならび), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列)),_矩形ならび). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列) :- atom_length(_行,_文字列長), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列) :- 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列), atom_concat(_行,_空白文字列,_空白を付加した文字列). 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列) :- _nth1 is _最大文字列長 - _文字列長, findall(' ',( between(1,_nth1,_)),_空白文字ならび), 文字ならびを文字列に変換する(_空白文字列,_空白文字ならび). 行ならびを転置する(_矩形ならび,_転置された矩形ならび) :- 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび), 転置(_矩形文字ならび,_転置された矩形文字ならび), 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび). 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび) :- findall(_文字ならび,( member(_行,_矩形ならび), 文字列を文字ならびに変換する(_行,_文字ならび)),_矩形文字ならび). 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび) :- findall(_文字列,( member(_文字ならび,_転置された矩形文字ならび), 文字ならびを文字列に変換する(_文字列,_文字ならび)),_転置された矩形ならび). 転置した矩形ならびの各行文字列を反転する(_転置した矩形ならび,_反転した行文字列) :- member(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列). 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび) :- findall(_反転した行文字列,( member(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列)),_要素が反転した転置した矩形ならび). 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 列間隔文字を挟んで縦書文書に変形する(_矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで(_矩形ならび,_列間隔文字数,_矩形ならび_1), 縦書文書に変形する(_矩形ならび_1,_縦書文書). 列間隔文字を挟んで(_矩形ならび_1,_列間隔文字数,_矩形ならび_2) :- 列間隔文字(_列間隔文字数,_列間隔文字), findall(_行,( 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行)),_矩形ならび_2). 列間隔文字(_列間隔文字数,_列間隔文字) :- findall(' ',( between(1,_列間隔文字数,_)),_列間隔文字ならび), atomic_list_concat(_列間隔文字ならび,_列間隔文字). 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行) :- member(_行_1,_矩形ならび_1), 文字列を文字ならびに変換する(_行_1,_文字ならび), atomic_list_concat(_文字ならび,_列間隔文字,_行). 縦書文書に変形する(_矩形ならび_1,_縦書文書) :- atomic_list_concat(_矩形ならび_1,'\n',_縦書文書). 文字列の反転(_文字列,_反転した文字列) :- 文字列を文字ならびに変換する(_文字列,_文字ならび), 文字ならびを反転する(_文字ならび,_反転した文字ならび), 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 文字ならびを反転する(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび) :- atom_chars(_反転した文字列,_反転した文字ならび). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). findmax(A,P,_最大値) :- findall(A,P,L), max_list(L,_最大値). % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # :- op(700,xfx,は). 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,0,_縦書文書). 横書文書を縦書文書に変形する(_横書文書,_列間隔文字数,_縦書文書) :- 改行を区切りに行ならびに変形する(_横書文書,_行ならび), 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書). 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書) :- 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび), 行ならびを転置する(_矩形ならび,_転置した矩形ならび), 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書). 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書) :- 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび), 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 改行を区切りに行ならびに変形する(_横書文書,[_前文字列|R]) :- 改行を区切りに(_横書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_横書文書,_前文字列,_後文字列) :- 副文字列(_横書文書,_先頭からの変位,1,_末尾からの変位,'\n'), 副文字列(_横書文書,0,_先頭からの変位,_,_前文字列), 副文字列(_横書文書,_,_末尾からの変位,0,_後文字列),!. 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび) :- 最大文字列長を調べ(_行ならび,_最大文字列長), その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび). 最大文字列長を調べ(_行ならび,_最大文字列長) :- 解の最大値(_文字数,( 行ならびから行を取り出す(_行,_行ならび), 文字列長(_行,_文字数)),_最大文字列長). その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび) :- 解を集める(_空白を付加した文字列,( 行ならびから行を取り出す(_行,_行ならび), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列)),_矩形ならび). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列) :- 文字列長(_行,_文字列長), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列) :- 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列), 二つの文字列を結合する(_行,_空白文字列,_空白を付加した文字列). 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列) :- _最大文字列長と文字列長の差 は _最大文字列長 - _文字列長, 解を集める(' ',( 整数を順に生成する(1,_最大文字列長と文字列長の差,_)),_空白文字ならび), 文字ならびを文字列に変換する(_空白文字列,_空白文字ならび). 行ならびを転置する(_矩形ならび,_転置された矩形ならび) :- 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび), 転置(_矩形文字ならび,_転置された矩形文字ならび), 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび). 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび) :- 解を集める(_文字ならび,( 矩形ならびから行を取り出す(_行,_矩形ならび), 文字列を文字ならびに変換する(_行,_文字ならび)),_矩形文字ならび). 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび) :- 解を集める(_文字列,( 矩形文字ならびから文字ならびを取り出す(_文字ならび,_転置された矩形文字ならび), 文字ならびを文字列に変換する(_文字列,_文字ならび)),_転置された矩形ならび). 転置した矩形ならびの各行文字列を反転する(_転置した矩形ならび,_反転した行文字列) :- 要素の取り出し(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列). 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび) :- 解を集める(_反転した行文字列,( 矩形ならびから行を取り出す(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列)),_要素が反転した転置した矩形ならび). 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 列間隔文字を挟んで縦書文書に変形する(_矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで(_矩形ならび,_列間隔文字数,_矩形ならび_1), 縦書文書に変形する(_矩形ならび_1,_縦書文書). 列間隔文字を挟んで(_矩形ならび_1,_列間隔文字数,_矩形ならび_2) :- 列間隔文字(_列間隔文字数,_列間隔文字), 解を集める(_行,( 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行)),_矩形ならび_2). 列間隔文字(_列間隔文字数,_列間隔文字) :- 解を集める(' ',( 整数を順に生成する(1,_列間隔文字数,_)),_列間隔文字ならび), 文字列を結合する(_列間隔文字ならび,_列間隔文字). 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行) :- 矩形ならびから行を取り出す(_行_1,_矩形ならび_1), 文字列を文字ならびに変換する(_行_1,_文字ならび), 文字列を結合する(_文字ならび,_列間隔文字,_行). 縦書文書に変形する(_矩形ならび_1,_縦書文書) :- 文字列を結合する(_矩形ならび_1,'\n',_縦書文書). 文字列の反転(_文字列,_反転した文字列) :- 文字列を文字ならびに変換する(_文字列,_文字ならび), 文字ならびを反転する(_文字ならび,_反転した文字ならび), 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 副文字列(_文字列,_開始位置,_長さ,_残り文字数,_副文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り文字数,_副文字列). 矩形ならびから行を取り出す(_行,_矩形ならび) :- member(_行,_矩形ならび). 矩形文字ならびから文字ならびを取り出す(_文字ならび,_転置された矩形文字ならび) :- member(_文字ならび,_転置された矩形文字ならび). 行ならびから行を取り出す(_行,_行ならび) :- member(_行,_行ならび). 二つの文字列を結合する(_文字列_1,_文字列_2,_結合した文字列) :- atom_concat(_文字列_1,_文字列_2,_結合した文字列). 文字列を結合する(_文字列ならび,_挿入文字,_結合した文字列) :- atomic_list_concat(_文字列ならび,_挿入文字,_結合した文字列). 文字列を結合する(_文字列ならび,_結合した文字列) :- atomic_list_concat(_文字列ならび,_結合した文字列). 文字列を文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 文字ならびを反転する(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび) :- atom_chars(_反転した文字列,_反転した文字ならび). 文字列長(_文字列,_文字列長) :- atom_length(_文字列,_文字列長). 整数を順に生成する(1,_列間隔文字数,_) :- between(1,_列間隔文字数,_). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 解を集める(_候補項,_目標,_解ならび) :- findall(_候補項,_目標,_解ならび). 解の最大値(_候補項,_目標,_解の最大値) :- findall(_候補項,_目標,_解ならび), 最大値(_解ならび,_解の最大値). 最大値(_ならび,_最大値) :- select(_最大値,_ならび,_残りならび), forall(member(_値,_残りならび),_最大値 @>= _値). 解の最小値(_候補項,_目標,_解の最小値) :- findall(_候補項,_目標,_解ならび), 最小値(_解ならび,_解の最小値). 最小値(_ならび,_最小値) :- select(_最小値,_ならび,_残りならび), forall(member(_値,_残りならび),_最小値 @=< _値). _値 は _式 :- _値 is _式. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1197620454/699 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク): # 1.acをabbに置き換える最小のレーヴェンシュタイン距離を求めよ # 2.1をもとにdiffツールを作成せよ。なお、出力時の形式は以下のとおりとする # ac # ^ # # abb # || # レーベンシュタイン距離(_文字列1,_文字列2,_レーベンシュタイン距離) :- 編集距離(_文字列1,_文字列2,_レーベンシュタイン距離). 編集距離(S1,S2,_編集距離) :- atom_chars(S1,LX), atom_chars(S2,LY), ならびの編集距離(LX,LY,LZ), length(LZ,_編集距離),!. ならびの編集距離(LX,LY,LZ) :- 'ならびの編集距離の停止条件はLXかLYが[]'(LX,LY,LZ). ならびの編集距離(LX,LY,LZ) :- ならびの編集距離の共通部分を取り除いていく(LX,LY,LZ). ならびの編集距離(LX,LY,LZ) :- append(LX,LY,LZ). 'ならびの編集距離の停止条件はLXかLYが[]'([],LY,LY). 'ならびの編集距離の停止条件はLXかLYが[]'(LX,[],LX). ならびの編集距離の共通部分を取り除いていく(LX,LY,LZ) :- ならびの編集距離の共通部分と残りの部分に分離する(LX,LY,L0,L1,L2,L01,L21), append(L01,L21,LYR), append(L0,LZ_1,LZ), ならびの編集距離(L2,LYR,LZ_1). ならびの編集距離の共通部分と残りの部分に分離する(LX,LY,L0,L1,L2,L01,L21) :- append(L0,L1,L2,LX), \+(L1 = []), append(L01,L1,L21,LY). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは 'PGMファイルの読み取り'(_入力ファイル) :- abolish(画像構造/2), raw_read_pgm(_入力ファイル). raw_read_pgm(_入力ファイル,_画像構造ならび) :- headerを読み取る(_入力ファイル,_headerの文字数), 画像データの読み込み(_入力ファイル,_headerの文字数,_画像データ), assertz(画像構造(画像データ,_画像データ)). headerを読み取る(_入力ファイル,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- open(_入力ファイル,read,Input), '型・矩形サイズ・色の深さを得る'(Input,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数), close(Input). '型・矩形サイズ・色の深さを得る'(Input,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- get_line(Input,Line), '型・矩形サイズ・色の深さを得る'(Input,Line,[],0,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数), '型・矩形サイズ・色の深さを定義する'(_型,_矩形サイズ,_色の深さ). '型・矩形サイズ・色の深さを得る'(Input,Line,[_色の深さ,_矩形サイズ,_型],_ヘッダの文字数,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- !. '型・矩形サイズ・色の深さを得る'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- 'コメント行は無視して、_ヘッダの文字数だけ更新'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数),!. '型・矩形サイズ・色の深さを得る'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- '型・矩形サイズ・色の深さを埋めていく'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). 'コメント行は無視して、_ヘッダの文字数だけ更新'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- sub_atom(Line,0,1,_,'#'), '改行を含むコメント行の文字数を求めて_ヘッダ文字数を更新する'(Line,_ヘッダ文字数_1,_ヘッダ文字数_2), get_line(Input,Line2), '型・矩形サイズ・色の深さを得る'(Input,Line2,L1,_ヘッダの文字数_2,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). '改行を含むコメント行の文字数を求めて_ヘッダ文字数を更新する'(Line,_ヘッダ文字数_1,_ヘッダ文字数_2) :- atom_length(Line,Length), _ヘッダの文字数_2 is _ヘッダの文字数 + Length + 1. '型・矩形サイズ・色の深さを埋めていく'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- get_line(Input,Line2), atom_length(Line,Length), _ヘッダの文字数_2 is _ヘッダの文字数_1 + Length + 1, '型・矩形サイズ・色の深さを得る'(Input,Line2,_ヘッダの文字数_2,[Line|L1],_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). '型・矩形サイズ・色の深さを定義する'(_型,_矩形サイズ,_色の深さ) :- assertz(画像構造(型,_型)), assertz(画像構造(矩形サイズ,_矩形サイズ)), assertz(画像構造(色の深さ,_色の深さ)). 画像データの読み込み(_入力ファイル,_ヘッダの文字数,_画像データ) :- open(_入力ファイル,read,Input,[type(binary)]), ヘッダ部分を空読み(Input,_ヘッダの文字数), 画像データ部分の読み取り(Input,_画像データ), close(input). ヘッダ部分を空読み(Input,_ヘッダの文字数) :- between(1,_ヘッダの文字数,N), get_byte(Input,_), N = _ヘッダの文字数,!. 画像データ部分の読み取り(Input,_画像データ) :- findall(C,(repeat,get_byte(Input,C),(C = -1,!,fail;true)),_画像データ). get_line(Input,Line) :- get_char(Input,A), get_line(Input,A,L), atom_chars(Line,L). get_line(Input,'\n',[]) :- !. get_line(Input,A,[A|R]) :- get_char(Input,B), get_line(Input,B,R). % 以下のサイトは # 出典 :: CodeIQ q1347 # # 3人の几帳面な男たちがいました。 # ジェシー「みかんをたくさん頂いたんだ。みんなで分けようYO!」 # ダニエル「イイネ!…ええと、みかんは全部で30個あるみたいだから、ひとり10個ずつならきちんと分けられるNE!」 # ジョゼフ「それだけじゃダメだYO!みかんは一つひとつ大きさが違うんだから、その辺も考えてきっちり分けNIGHT!」 # # # 【問題】 # # 30個のみかんがあります。3人で10個ずつ分けようと思いますが、不公平にならないよう、みかんの重さの合計が均一になるように分けてください。たとえば、次のような重さのみかん6個 # 101g # 103g # 110g # 105g # 114g # 112g # # を、3人で2つずつ分ける場合、重さの合計が等しくなるように分けると # (101g, 114g) # (103g, 112g) # (105g, 110g) # # のように、合計が215グラムになるように分けることができます。 # # みかんの重さのデータを標準入力から読み込み、それを重さの合計・個数ともに3等分するプログラムを書いてください。 # # # 【入力】 # # 入力はテキストファイルで用意されています。これを標準入力から読み込んでください。 # 入力ファイルの1行目には、みかんの個数Nが与えられます。 # 2行目以降のN行分が、みかんの重さ(正の整数)です。 # # # 【出力】 # # 標準出力に、3等分したみかんのグループを出力してください。 # 1行につき1グループ、計3行を出力します。それ以外は出力しないでください。 # 分け方が複数ある場合、その中の1種類だけを出力してください。 # # # 【入出力例】 # # - sample1.in.txt # 6 # 101 # 103 # 110 # 105 # 114 # 112 # # - sample1.out.txt # (101, 114) # (103, 112) # (105, 110) # # # # - sample2.in.txt # 12 # 147 # 105 # 99 # 116 # 105 # 119 # 93 # 132 # 123 # 95 # 101 # 82 # # - sample2.out.txt # (82, 105, 105, 147) # (93, 95, 119, 132) # (99, 101, 116, 123) '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル) :- '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計), 配分した候補を得て(_みかんの重さならび,_一人あたりの重さ合計,_重複を許す配分した候補), 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補). '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計) :- 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび), sum_list(_みかんの重さならび,_みかんの重さの合計), _一人あたりの重さ合計 is _みかんの重さの合計 // 3. 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび) :- see(_入力ファイル), 先頭行から行数を得る(_みかんの個数), 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび), seen. 先頭行から行数を得る(_行数) :- 整数入力(_行数). 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび) :- findall(_みかんの重さ,( between(1,_みかんの個数,_), 整数入力(_みかんの重さ)),_みかんの重さならび). 配分した候補を得て(_みかんの重さならび,_合計目標,_重複を許す配分した候補) :- findall(LL,同量に配分する(_みかんの重さならび,_合計目標,[],LL),_重複を許す配分した候補). 同量に配分する([],_,LL,LL). 同量に配分する(_みかんの重さならび,_合計目標,LL1,LL) :- 組み合計を得る(_みかんの重さならび,_合計目標,[],L,_残りみかんの重さならび), forall(member(L1,LL1),L1 @>= L), 同量に配分する(_残りみかんの重さならび,_合計目標,[L|LL1],LL). 組み合計を得る(_残りみかんの重さならび,_合計目標,L,L,_残りみかんの重さならび) :- sum_list(L,_合計目標). 組み合計を得る(_みかんの重さならび_1,_合計目標,L1,L,_残りみかんの重さならび) :- select(_一個,_みかんの重さならび_1,_残りみかんの重さならび_2), forall(member(A,L1),A @>= _一個), 組み合計を得る(_残りみかんの重さならび_2,_合計目標,[_一個|L1],L,_残りみかんの重さならび). 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補) :- 重複なく昇順に整列する(_重複を許す配分した候補,_候補リスト), 一行ずつ出力する(_出力ファイル,_候補リスト). 重複なく昇順に整列する(L1,L2) :- 重複なく昇順に整列する(L1,[],L2). 重複なく昇順に整列する([],L,L). 重複なく昇順に整列する([_軸要素|L1],L2,L3) :- 重複のない昇順分割(_軸要素,L1,LS,LB), 重複なく昇順に整列する(LS,[_軸要素|L3_2],L3), 重複なく昇順に整列する(LB,L2,L3_2). 重複のない昇順分割(_,[],[],[]). 重複のない昇順分割(_軸要素,[A|R1],[A|R2],R3) :- A @< _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[A|R1],R2,[A|R3]) :- A @> _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[_軸要素|R1],R2,R3) :- 重複のない昇順分割(_軸要素,R1,R2,R3). 一行ずつ出力する(_出力ファイル,_候補リスト) :- tell(_出力ファイル), forall(member(_三人分のみかんの重さならび,_候補リスト),配分候補ならびを三行で出力する(_三人分のみかんの重さならび)), told. 配分候補ならびを三行で出力する(_三人分のみかんの重さならび) :- forall(member(_みかんの重さならび,_三人分のみかんの重さならび),( 表示パターンのつくり(_みかんの重さならび,_表示パターン), writef(_表示パターン,_みかんの重さならび))). 表示パターンのつくり(_みかんの重さならび,_表示パターン) :- length(_みかんの重さならび,_要素数), findall('%t',between(1,_要素数,_),_表示パターンならび), atomic_list_concat(_表示パターンならび,',',_表示パターン_1), atomic_list_concat(['(',_表示パターン_1,')\n'],_表示パターン). 整数入力(_整数) :- 行入力(_行), read_term_from_atom(_行,_整数,[]). 行入力(_行) :- get_char(_文字), 行の文字ならび(_文字,_行の文字ならび), atom_chars(_行,_行の文字ならび). 行の文字ならび(end_of_file,[]) :- !. 行の文字ならび('\n',[]) :- !. 行の文字ならび(_文字,[_文字|R]) :- get_char(_次の文字), 行の文字ならび(_次の文字,R). ユーザパラメータならび(_ユーザパラメータならび) :- current_prolog_flag(argv,_ユーザパラメータならび). program :- ユーザパラメータならび([_入力ファイル,_出力ファイル]), '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル). :- program,halt. % 以下のサイトは # 出典 :: twitter_by_@a_hisame_20150219 # # "aがn回以上続いた直後にbがn回続く"ことを(拡張)正規表現で有限長で表現できるんでしたっけ? (nは0以上の任意の整数) # 'aがn回以上続いた直後にbがn回続く(nは0以上の任意の整数)'(_文字列,_n,_前文字列,_適合文字列,_後文字列) :- 'aがn回以上続いた'(_n,_文字列,_前文字列,L2,L3), '直後にbがn回続く'(_n,L2,L3,L2_2,L3_2), atom_chars(_適合文字列,L2_2), atom_chars(_後文字列,L3_2). 'aがn回以上続いた'(_n,_文字列,_前文字列,L2,L3) :- sub_atom(_文字列,_前文字列,_適合文字列_1,_後文字列_1,L1,L2,L3), all(L2,a), \+(last(L1,a)), \+(L3 = [a|_]), length(L2,Len_1), Len_1 >= _n. '直後にbがn回続く'(_n,L2,L3,L2_2,L3_2) :- findall(b,between(1,_n,_),L), append(L,L3_2,L3), \+(L3_2 = [b|_]), append(L2,L,L2_2). all([],A). all([A|R],A) :- all(R,A). sub_atom(A,H,X,T,HL,XL,TL) :- atomic(X), atom_chars(A,L), atom_chars(X,XL), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,H,X,T,HL,XL,TL) :- var(X), atom_chars(A,L), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), \+(XL = []), atom_chars(T,TL). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/910 # お題:2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を # 隣り合う文字の間に挿入した文字列を返す。 # 例 # "Personal" -> "Peerrsssoonnall" # "Hello, world!" -> "Heellllooo,, wwworrrlldd!" # # '2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列を返す。'(_文字列,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- atom_chars(_文字列,_文字ならび), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字ならび(_文字ならび,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字ならび), atom_chars(_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字ならび). '隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字ならび'([],[]). '隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字ならび'([A],[A]). '隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字ならび'([A,B|R1],[A,_大きい方の文字|R2]) :- 隣り合う文字の大きい方の文字(A,B,_大きい方の文字), '隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字ならび'([B|R1],R2). 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_1) :- _文字_1 @>= _文字_2. 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_2) :- _文字_1 @< _文字_2. % 以下のサイトは % [1] 授業単元:C言語演習課題 % http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9422.txt % 問題 % 年と月を「YYYY/MM」と入力し、入力された月のカレンダーを表示しなさい。 % % 1752年10月以前、及び10000年1月以降はエラーを返す。 % % 出力形式は以下のとおり % ・1行目は該当月の1日が月曜日でなければ、前月の最終月曜日から表示。 % ・該当月の最終日が日曜日でなければ、翌月の第1日曜日まで表示。 % ・6行目の表示が必要ない場合は表示しない。 % % うるう年判定は以下のとおり % ・年が4で割り切れる年はうるう年。 % ・年が100で割り切れる年はうるう年でない。 % ・年が400で割り切れる年はうるう年である。 % % [出力例] % 年月日を入力:2009/07 % % 月 火 水 木 金 土 日 % 29 30 01 02 03 04 05 % 06 07 08 09 10 11 12 % 13 14 15 16 17 18 19 % 20 21 22 23 24 25 26 % 27 28 29 30 31 01 02 課題のカレンダー(_年/_月) :- not((_年/_月 >= 1752/10,_年/_月 =< 10000/1)), write('エラー: 入力された年月は範囲を逸脱しています\n'),!. 課題のカレンダー(_年/_月) :- _年/_月 @=< 2009/6,!, 曜日検索(_日付,_曜日,2009/6/13,土曜), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー(_年/_月) :- _年/_月 @>= 2009/6,!, 曜日検索(2009/6/13,土曜,_日付,_曜日), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー表示(_年/_月/_日,月曜) :- 日付候補を得る(_年/_月/_日,_年/_月/_日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 課題のカレンダー表示(_年/_月/_日,_曜日) :- not(_曜日=月曜), 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日), 日付候補を得る(_年/_月/_日,_前週の月曜日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日) :- 曜日検索(_前週の月曜日,_前週の曜日,_年/_月/_日,_曜日), _前週の曜日 = 月曜,!. 日付候補を得る(_年/_月/_日,_起点日付,_曜日,_日付整数ならび) :- findall(_日付,( 曜日(_起点日付,_曜日,_日付2,_),(_日付2=_年2/_月2/7,_年2/_月2 @> _年/_月,!,fail;true)),_日付整数ならび). 課題のカレンダー週表示(_日付整数ならび) :- n個組(7,_日付整数ならび,_7個組), 月曜から日曜までヘッドゼロサプライで表示(_7個組). 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t\n',[_日文字列]),!. 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日|R]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t ',[_日付文字列]), 月曜から日曜までヘッドゼロサプライで表示(R). 課題のカレンダー見出し表示 :- write_formatted('月 火 水 木 金 土 日\n'). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_日付,_曜日,_今日,_今日の曜日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_前日,_前日の曜日,_今日,_今日の曜日), 曜日検索(_日付,_曜日,_前日,_前日の曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_日付,_曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), 曜日検索(_翌日,_翌日の曜日,_日付,_曜日). '曜日'(_日付,_曜日,_日付,_曜日) :- ! . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @> _日付2, '前日・今日'(_日付3,_曜日3,_日付1,_曜日1), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @< _日付2, '前日・今日'(_日付1,_曜日1,_日付3,_曜日3), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/550 # # [1] 授業単元: Ruby演習 [2] 問題文、http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9426.txt # Rubyの問題がわかりません 助けてください # # (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい # # p wday["sunday"] #=> "日曜日" # p wday["monday"] #=> "月曜日" # p wday["saturday"] #=> "土曜日" # # (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい # # (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ い。 # 「sunday」は日曜日のことです。 # 「monday」は月曜日のことです。 # # (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行(正 規表現で定義するなら「/\uff3cs+/」)で区切られた文字列をハッシュに変換するメソ ッドstr2hashを定義してください。 # # p str2hash("bule 青 white 白\uff3cnred赤"); # #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"} :- op(450,xfx,(=>)). % (1) wday({ "sunday" => "日曜日","monday" => "月曜日","saturday" #=> "土曜日"}). % (2) hash_count(Hashname,Count) :- functor(P,Hashname,1), call(P), arg(1,P,H), count(H,Count). count(','(A,B),Count) :- count(B,Count2), Count is Count2 + 1. count(A,1). % (3) ?- each(wday.A=>B),write_formatted('「%t」は%tのことです。\n',[A,B]),fail;true. each(Hashname.Key=>Value) :- functor(P,Hashname,1), arg(1,P,V), each(V,Key=>Value). each(','(Key=>Value,B),Key=>Value). each(','(_,B),Key=>Value) :- each(B,Key=>Value). each(Key=>Value,Key=>Value). % (4) str2hash(Atom,Hash) :- split(Atom,[' ','\t','\n'],L), findall(U,n個組(2,L,U),L2), hashを成長させる(L2,Hash). hashを成長させる([A,B],{ A=>B }) :- !. hashを成長させる([[A,B]|R], { (A=>B,R2) }) :- hashを成長させる(R,{ R2 }). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/103 # # 【質問テンプレ】 # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9753.txt # 2.入力された年月の1日が何曜日かを調べる。 #   曜日のチェックはZellerの公式を使用する。Zellerの公式は、 #    #   曜日を表す値=(y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ (( 13 * m ) + 8 ) / 5 ] + d ) % 7 # #           ※ 上記の公式中の y は年、 m は月、 d は日を表し、 #             []はその数を越えない最大の整数を表す。(例: [13.6]は13になる) # #   で、曜日を表す値は次のようになっている。 # #     日曜日 = 0, 月曜日 = 1, 火曜日 = 2, 水曜日 = 3, # # 木曜日 = 4, 金曜日 = 5, 土曜日 = 6, # #   ※但し、1月と2月は前年の13月14月として計算するものとする。 % (1) 年月の入力 年月入力処理(_年,_月) :- 年入力処理(_年), 月入力処理(_月). % (2) 曜日計算 :- op(450,xfx,が),op(500,xfx,であり),op(600,xfx,ならば),op(450,xfx,は). 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は (Y + Y // 4 - Y // 100 + Y // 400 + ((( 13 * M ) + 8 ) // 5 ) + D ) mod 7). 曜日計算処理(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値), 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値を得る'(_年,1,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,13,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,2,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,14,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値) :- _年=Y,_月=M,_日=D, 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は _Zellerの公式), _曜日を表す値 is _Zellerの公式,!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % (3) カレンダー表示 カレンダー表示 :- 年月入力処理(_年,_月), 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,1,_曜日を表す整数値), カレンダー表示データ編集(_年,_月,_曜日を表す整数値,_カレンダー表示文字列ならび), 要素に空白を挿入して全行表示(_カレンダー表示文字列ならび). カレンダー表示データ編集(_年,_月,_各月1日の曜日を表す整数値,_カレンダー表示文字列ならび) :- 年月文字列編集処理(_年,_月,_年月文字列), 月日数(_年,_月,_月日数), findall(S,for(1,N,_月日数),ヘッドゼロサプレス(2,N,S)),_表示日ならび), Length is _月日数 + _各月1日の曜日を表す整数値, M is (7 - (Length mod 7)), '7個組ならび'(Length,M,_表示日ならび,_7個組ならび), 見出しならび(_年月文字列,_見出しならび), append(_見出しならび,_7個組ならび,_カレンダー表示文字列ならび). 見出しならび(_年月文字列,[[_年月文字列],[日,月,火,水,木,金,土]]). '7個組ならび'(Length,0,_表示日ならび,_7個組ならび) :- length(L0,Length), すべての要素が(L0,' '), append(L0,_表示日ならび,L), '7個組'(L,_7個組ならび),!. '7個組ならび'(Length,M,_表示日ならび,_7個組ならび) :- not(M=0), length(L0,Length), すべての要素が(L0,' '), length(L2,M), すべての要素が(L2,' '), append(L0,_表示日ならび,L2,L), '7個組'(L,_7個組ならび),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,28) :- not(うるう年(_年)),!. 月日数(_,_月,30) :- member(_月,[4,6,9,11]). 月日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). % (4) 基礎述語の定義 年入力処理(_年) :- write('表示したいカレンダーは西暦何年 ? '), get_line(_行), 年入力処理の二(_行,_年), 年入力検査(_年),!. 年入力処理(_年) :- 年入力処理(_年). 年入力処理の二(_行,_年) :- atom_to_term(_行,_年), integer(_年),!. 年入力処理の二(_行,_年) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 年入力検査(_年) :- _年 >= 1583, _年 =< 3999,!. 年入力検査(_年) :- write_formatted('この年を表す整数%tは不正です\n',[_年]), fail. 月入力処理(_月) :- write('月は ? '), get_line(_行), 月入力処理の二(_行,_月), 月入力検査(_月),!. 月入力処理(_月) :- 月入力処理(_月). 月入力処理の二(_行,_月) :- atom_to_term(_行,_月,_), integer(_月),!. 月入力処理の二(_行,_月) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 月入力検査(_月) :- _月 >= 1, _月 =< 12,!. 月入力検査(_月) :- write_formatted('この月を表す整数%tは不正です\n',[_月]), fail. 日付文字列編集処理(_年,_月,_日,_日付文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), ヘッドゼロサプライ(2,_日,_日文字列), concat_atom([_年文字列,_月文字列,_日文字列],_日付文字列). 年月文字列編集処理(_年,_月,_年月文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), concat_atom([_年文字列,_月文字列],_年月文字列). ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). ヘッドゼロサプレス(N桁,_整数,_ヘッド空白整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプレス_1(N桁,_数字ならび,_ヘッド空白整数文字ならび), concat_atom(_ヘッド空白整数文字ならび,_ヘッド空白整数文字列),!. ヘッドゼロサプレス_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプレス_1(N桁,L,[' '|R]) :- M桁 is N桁 - 1, ヘッドゼロサプレス_1(M桁,L,R). 要素に空白を挿入して全行表示([]) :- !. 要素に空白を挿入して全行表示([L|R]) :- concat_atom(L,' ',_表示行), write_formatted('%t\n',[_表示行]), 要素に空白を挿入して全行表示(R). すべての要素が([],_). すべての要素が([V|R],V) :- すべての要素が(R,V). '7個組'([],[]) :- !. '7個組'([A,B,C,D,E,F,G|R1]),[[A,B,C,D,E,F,G]|R2]) :- '7個組'(R1,R2). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. not(P) :- \+(P). append([],L1,L2,L) :- append(L1,L2,L) . append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R) . concat_atom([],'') :- !. concat_atom([A],A) :- !. concat_atom([A|R],S) :- concat_atom(R,S1), atom_concat(A,S1,S). concat_atom([],_,'') :- !. concat_atom([A],_,A) :- !. concat_atom([A|R],_区切り文字列,S) :- concat_atom(R,_区切り文字列,S1), atom_concat(A,_区切り文字列,S2), atom_concat(S2,S1,S). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/157 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9762.txt # # 正数による正方行列のうち、全ての行、列、斜め列の合計が同じであり、 # かつ2回以上使用される数字が存在しないものを魔方陣という。 # 下図に示すa,bに数値を設定したときに、1〜9の整数によって構成される魔方陣を # 出力するプログラムを作成せよ。 # 但し、魔方陣が作成不可能な(a,b)の組み合わせが設定された場合は、「Impossible」 # と出力するとする。 # # la_lb_l__l # l__l__l__l # l__l__l__l # 魔方陣(N枡,A,B,_行列) :- 魔方陣のための行列の生成(N枡,_行列), _行列 = [[A,B|_],_,_], 行の合計が全て一致する(_行列,S), 列の合計が全て一致する(_行列,S), 正方行列の斜め要素の合計が一致する(_行列,S). 魔方陣のための行列の生成(N枡,_行列) :- N2 is N枡 ^ 2, findall(M,for(1,M,N2),NL),!, 順列(NL,N2,_順列数字ならび), findall(_N個組,n個組(N枡,_順列数字ならび,_N個組),_行列). 行の合計が全て一致する([],S) :- !. 行の合計が全て一致する([_行|R],S) :- 魔方陣の加算(_行,0,S), 行の合計が全て一致する(R,S). 列の合計が全て一致する(_行列,S) :- 行列の転置(_行列,_転置行列), 列の合計が全て一致する(_転置行列,S),!. 正方行列の斜め要素の合計が一致する(_正方行列,S) :- length(_行列,Len), 左上から右下方向の合計(1,Len,_正方行列,0,S), 右上から左下方向の合計(1,Len,_正方行列,0,S),!. 左上から右下方向の合計(M,N,_,S,S) :- M > N,!. 左上から右下方向の合計(M,N,_行列,S1,S) :- list_nth(M,_行列,_行), list_nth(M,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 左上から右下方向の合計(M2,N,_行列,S2,S),!. 右上から左下方向の合計(M,N,_,S,S) :- M > N,!. 右上から左下方向の合計(M,N,_行列,S1,S) :- M1 is N - M + 1, list_nth(M1,_行列,_行), list_nth(M1,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 右上から左下方向の合計(M2,N,_行列,S2,S),!. n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. 魔方陣の加算([],X,X) :- !. 魔方陣の加算([A|R],Y,X) :- Z is A + Y, 魔方陣の加算(R,Z,X). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/566 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 番号と点数を配列に初期化して、それらを # 5段階にランク付けをして、受験番号・ランクを表示するプログラムを作成。 # ランク付けをする部分を関数Rankとして、番号と評価を表示する部分を関数Outputとすること。 # なお、ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 # 60〜79点をB、80〜100点をAとする。 # ただし、受験者の数は、50人以下とする。 # 番号と点数は、以下の配列を使用すること。 # 番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10}; # 点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100}; # '問題文の5段階にランク付け'('ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 60〜79点をB、80〜100点をAとする。 '). 番号の定義文('番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10};'). 点数の定義文('点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100};'). 'ランクならびの生成'(_ランクならび) :- '問題文の5段階にランク付け'(_ランク定義文), ランクの定義文解析(_ランク定義文,_ランクならび). 番号ならびの生成(_番号ならび) :- 番号の定義文(_番号の定義文), 番号の定義文解析(_番号の定義文,_番号ならび). 点数ならびの生成(_点数ならび) :- 点数の定義文(_点数の定義文), 点数の定義文解析(_点数の定義文,_点数ならび). '5段階にランク付けをして、受験番号・ランクを表示する' :- ランクならびの生成(_ランクならび), 番号ならびの生成(_番号ならび), 点数ならびの生成(_点数ならび), '5段階にランク付けをして、受験番号・ランクを表示する'(_番号ならび,_点数ならび,_ランクならび). '5段階にランク付けをして、受験番号・ランクを表示する'([],[],_). '5段階にランク付けをして、受験番号・ランクを表示する'([_番号|R1],[_点数|R2],_ランクならび) :- append(_,[[_点数下限,_点数上限,_ランク]|_],_ランクならび), _点数 >= _点数下限, _点数 =< _点数上限, writef('受験番号:%t ランク:%t\n',[_番号,_ランク]), '5段階にランク付けをして、受験番号・ランクを表示する'(R1,R2,_ランクならび). ランクの定義文解析(_ランク定義文,_ランクならび) :- 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文), split(_半角数字変換されたランク定義文,[' ','。','、','〜','点を','とする'],L), n個組(3,L,_ランクならび). 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文) :- atom_chars(_ランク定義文,Chars), findall(_文字_1, append(_,[_文字|_],Chars), 全角数字ならば半角数字に変換(_文字,_文字_1)), Chars2), atom_chars(_半角数字変換されたランク定義文,Chars2). 全角数字ならば半角数字に変換([_全角数字|R1],[_半角数字|R2]) :- 全角数字半角数字変換(_全角数字,_半角数字), 全角数字ならば半角数字に変換(R1,R2). 全角数字ならば半角数字に変換([_文字|R1],[_文字|R2]) :- \+(全角数字半角数字変換(_文字,_)), 全角数字ならば半角数字に変換(R1,R2). 全角数字半角数字変換(0,0). 全角数字半角数字変換(1,1). 全角数字半角数字変換(2,2). 全角数字半角数字変換(3,3). 全角数字半角数字変換(4,4). 全角数字半角数字変換(5,5). 全角数字半角数字変換(6,6). 全角数字半角数字変換(7,7). 全角数字半角数字変換(8,8). 全角数字半角数字変換(9,9). 番号の定義文解析(_番号の定義文,_番号ならび) :- split(_番号の定義文,['=',',',';'],[_|_番号ならび]). 点数の定義文解析(_点数の定義文,_点数ならび) :- split(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1418278634/168 # お題:前に詰めた # # 初売りのためにお客さんが並んでいます。 # 店の前の32マスにはお客さん(i)、空き(.)、警備員(P)がいます。 # # ← 前 # 店 iii.ii.i..ii..P.ii..i..Pii.ii... # # 混んできたので一歩前に詰めてもらうことにしました。 # 前方のお客さんから順に前に空きがあれば一歩前に進んでもらいます。 # 空きが複数あっても、進むのは一歩だけです。 # 警備員は動かず、お客さんは警備員を越えられません。 # # 店 iii.ii.i..ii..P.ii..i..Pii.ii... # ↓ # 店 iiiii.i..ii...Pii..i...Piiii.... # # さて、前に詰めた状態が与えられたとき、 # 詰める前にあり得たすべての状態を示してください。 # たとえば、以下のようにあり得た状態がない場合もあります。 # # 店 ......iP(以下略) # # '初売りのためにお客さんが並んでいます。 店の前の32マスにはお客さん(i)、空き(.)、警備員(P)がいます。 ← 前 店 iii.ii.i..ii..P.ii..i..Pii.ii... 混んできたので一歩前に詰めてもらうことにしました。 前方のお客さんから順に前に空きがあれば一歩前に進んでもらいます。 空きが複数あっても、進むのは一歩だけです。 警備員は動かず、お客さんは警備員を越えられません。 店 iii.ii.i..ii..P.ii..i..Pii.ii... ↓ 店 iiiii.i..ii...Pii..i...Piiii.... さて、前に詰めた状態が与えられたとき、 詰める前にあり得たすべての状態を示してください。 たとえば、以下のようにあり得た状態がない場合もあります。 店 ......iP(以下略)'(A,B) :- atom_chars(A,L1), '前に詰めた状態が与えられたとき、詰める前にあり得たすべての状態を示す。'(L1,L2), atom_chars(B,L2), \+(A = B). '前に詰めた状態が与えられたとき、詰める前にあり得たすべての状態を示す。'([],[]). '前に詰めた状態が与えられたとき、詰める前にあり得たすべての状態を示す。'(['i'|R1],['.','i'|R2]) :- '前に詰めた状態が与えられたとき、詰める前にあり得たすべての状態を示す。'(R1,R2). '前に詰めた状態が与えられたとき、詰める前にあり得たすべての状態を示す。'([A|R1],[A|R2]) :- '前に詰めた状態が与えられたとき、詰める前にあり得たすべての状態を示す。'(R1,R2). % 以下のサイトは '文字列の先頭のカッコのみ外す。ただしカッコの入れ子は許さない。'(_文字列,_先頭のカッコが外された文字列) :- atom_chars(_文字列,_文字リスト), 'リストの先頭のカッコのみ外す。ただしカッコの入れ子は許さない。'(_文字リスト,_先頭のカッコが外された文字リスト), atom_chars(_先頭のカッコが外された文字列,_先頭のカッコが外された文字リスト). 'リストの先頭のカッコのみ外す。ただしカッコの入れ子は許さない。'(['('|Tail],Result) :- '最初の右カッコ以外はコピー。ただしカッコの入れ子は許さない。'(Tail,Result),!. 'リストの先頭のカッコのみ外す。ただしカッコの入れ子は許さない。'(_文字リスト,_文字リスト). '最初の右カッコ以外はコピー。ただしカッコの入れ子は許さない。'(['('|_],_) :- !,fail. '最初の右カッコ以外はコピー。ただしカッコの入れ子は許さない。'([')'|Tail],Tail) :- !. '最初の右カッコ以外はコピー。ただしカッコの入れ子は許さない。'([Head|Tail],[Head|Result]) :- '最初の右カッコ以外はコピー。ただしカッコの入れ子は許さない。'(Tail,Result). % 以下のサイトは # 出典::プログラミングのお題スレ Part5 # 与えられた文字列を三等分にして出力しなさい # きれいに三等分できない場合は四等分にしなさい '与えられた文字列を三等分にして出力しなさい。きれいに三等分できない場合は四等分にしなさい。'(_文字列) :- '与えられた文字列を三等分にして出力しなさい。'(_文字列),!. '与えられた文字列を三等分にして出力しなさい。きれいに三等分できない場合は四等分にしなさい。'(_文字列) :- 'きれいに三等分できない場合は四等分にしなさい。'(_文字列). '与えられた文字列を三等分にして出力しなさい。'(_文字列) :- sub_atom(_文字列,N,N,N,S1,S2,S3,_,_,_), writef('%t,%t,%t\n',[S1,S2,S3]). 'きれいに三等分できない場合は四等分にしなさい。'(_文字列) :- '文字数が1:2:1になるように分割する'(_文字列,S1,S2,S3), 'さらにS2を二等分して'(S2,S2_1,S2_2), 全体が四等分されたら出力する(S1,S2_1,S2_2,S3). '文字数が1:2:1になるように分割する'(_文字列,S1,S2,S3) :- sub_atom(_文字列,N,M,N,S1,S2,S3,_,_,_), M is N * 2. 'さらにS2を二等分して'(S2,S2_1,S2_2) :- sub_atom(S2,N_1,N_1,0,S2_1,S2_2,_,_,_,_). 全体が四等分されたら出力する(S1,S2_1,S2_2,S3) :- writef('%t,%t,%t,%t\n',[S1,S2_1,S2_2,S3]). sub_atom(A,S,L,R,S1,S2,S3,HL,XL,TL) :- 'Aがアトムの場合、Aを三つの文字列に分解してそれぞれの文字ならびを得る'(A,S,L,R,S1,S2,S3). sub_atom(A,S,L,R,S1,S2,S3,HL,XL,TL) :- 'Aが変数の場合、三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる'(A,S,L,R,S1,S2,S3,HL,XL,TL). 'Aがアトムの場合、Aを三つの文字列に分解してそれぞれの文字ならびを得る'(A,S,L,R,S1,S2,S3) :- atom(A), 'Aを三つの文字列に分解する'(A,S,L,R,S1,S2,S3), 三つの文字列の文字ならびを得る(S1,S2,S3,HL,XL,TL). 'Aを三つの文字列に分解する'(A,S,L,R,S1,S2,S3) :- 'S1を得る'(A,S,S1), 'S2を得る'(A,S,L,S2), 'S3を得る'(A,S,L,R,S3). 'S1を得る'(A,S,S1) :- sub_atom(A,0,S,_,S1). 'S2を得る'(A,S,L,S2) :- sub_atom(A,S,L,_,S2). 'S3を得る'(A,S,L,R,S3) :- N is S + L, sub_atom(A,N,R,0,S3). 三つの文字列の文字ならびを得る(S1,S2,S3,HL,XL,TL) :- atom_chars(S1,HL), atom_chars(S2,XL), atom_chars(S3,TL). 'Aが変数の場合、三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる'(A,S,L,R,S1,S2,S3,HL,XL,TL) :- var(A), 三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる(A,S,L,R,S1,S2,S3,HL,XL,TL). 三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる(A,S,L,R,S1,S2,S3,HL,XL,TL) :- 三つの文字列と文字ならびの関係(S1,S2,S3,HL,XL,TL), 三つの文字ならびとその要素数の関係(HL,XL,TL,S,L,R), 'Aを定数化できたら、sub_atom/10が実行できる'(A,S,L,R,S1,S2,S3,HL,XL,TL). 三つの文字列と文字ならびの関係(S1,S2,S3,HL,XL,TL) :- atom_chars(S1,HL), atom_chars(S2,XL), atom_chars(S3,TL). 三つの文字ならびとその要素数の関係(HL,XL,TL,S,L,R) :- length(HL,S), length(XL,L), length(TL,R). 'Aを定数化できたら、sub_atom/10が実行できる'(A,S,L,R,S1,S2,S3,HL,XL,TL) :- atomic_list_concat([S1,S2,S3],A), sub_atom(A,S,L,R,S1,S2,S3,HL,XL,TL). % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。' :- ある通貨の時系列為替価格ならびを得る(_ある通貨の時系列為替価格ならび), 最大の為替差の利益(_ある通貨の時系列為替価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). ある通貨の時系列為替価格ならびを得る(_ある通貨の時系列価格ならび) :- 時系列数を得る(_時系列数), findall(_価格,( 価格を得る(_時系列数,_価格)), _ある通貨の時系列価格ならび). 時系列数を得る(_時系列数) :- 整数を得る(_時系列数). 価格を得る(_時系列数,_価格) :- between(1,_時系列数,_t), 整数を得る(_価格). 最大の為替差の利益(_ある通貨の時系列価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大利益,( 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益)), _最大の為替差の利益). 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益) :- append(_,[_時刻tの価格|_その後の価格ならび],_ある通貨の時系列価格ならび), 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益). 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益) :- findmax(_時刻tの価格との価格差,( 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差)), _時刻tの投資に対する最大利益). 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差) :- member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格. 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % % 整数を入力する場合の一般型 % 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典: プログラミングのお題スレ Part5 #252 # お題: # 整数n(0<=n<1000000)をソロバンのAAに変換するプログラムを書け # # n=9563なら # ######## # #oo|||o# # #||ooo|# # ######## # #||o|oo# # #oooo|o# # #oooooo# # #ooooo|# # #oo|ooo# # ######## # # 等幅フォントじゃないとちゃんと見れないけどごめんね '整数n(0<=n<1000000)をソロバンのAAに変換するプログラムを書け'(_n) :- '整数n(0<=n<1000000)をソロバンの'(_n,[],LL), 'AAに変換する'(LL). '整数n(0<=n<1000000)をソロバンの'(0,LL,LL) :- !. '整数n(0<=n<1000000)をソロバンの'(_n,LL1,LL) :- 一桁を天下に二分する(_n,[_1,_2,_3],[_4,_5,_6,_7,_8]), _n_2 is _n // 10, '整数n(0<=n<1000000)をソロバンの'(_n_2,[[_1,_2,_3,_4,_5,_6,_7,_8]|LL1],LL). 一桁を天下に二分する(_n,_天,_下) :- _n_1 is _n mod 10, _n_1_1 is _n_1 // 5, _n_1_2 is _n_1 mod 5, 天(_n_1_1,_天), 下(_n_1_2,_下). 天(0,['O','|']). 天(1,['|','O']). 下(0,['|','O','O','O','O']). 下(1,['O','|','O','O','O']). 下(2,['O','O','|','O','O']). 下(3,['O','O','O','|','O']). 下(4,['O','O','O','O','|']). 'AAに変換する'(LL) :- 梁(LL,_梁), 転置(LL,LL2), 枠の中に描く(_梁,LL2). 枠の中に描く(_梁,LL) :- writef('#%t#\n',[_梁]), forall(上から下まで枠と珠ならびを描く(_梁,LL,_表示行),writef('%t',[_表示行])), writef('#%t#\n',[_梁]). 上から下までの枠と珠ならびを描く(_梁,LL,_表示行) :- nth1(_nth1,LL,_横方向珠ならび), atomic_list_concat(_横方向珠ならび,_横方向珠文字列), 上から下までの枠と珠ならびを描く(_nth1,_梁,_横方向珠文字列,_表示行). 上から下までの枠と珠ならびを描く(4,_梁,_横方向珠文字列,_表示行) :- swritef(_表示行,'%t\n#%t#\n',[_梁,_横方向珠文字列]). 上から下までの枠と珠ならびを描く(_nth1,_梁,_横方向珠文字列,_表示行) :- \+(_nth1=4), swritef(_表示行,'#%t#\n',[_横方向珠文字列]). 梁(LL,_梁) :- length(LL,_幅), lenth(L,_幅), all(L,'#'), atom_chars(_梁,L). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/206 # お題:文字列中の数字が一文字以上連続する部分を右ローテイトする。 # 例 # "2014-10-03 00:17:21" -> "21-2014-10 03:00:17" # "1 2 3 4" -> "4 1 2 3" # "a0=0;a1=1;a2=2;a3=3" -> "a3=0;a0=1;a1=2;a2=3" # # '文字列中の数字が一文字以上連続する部分を右ローテイトする。'(_文字列,_数字が一文字以上連続する部分を右ローテイトした文字列) :- atom_chars(_文字列,_文字ならび), '文字列ならびの数字が一文字以上連続する部分を右ローテイトする。'(_文字ならび,_数字列部分が右ローテイトしたならび), atomic_list_concat(_数字列部分が右ローテイトしたならび,_数字が一文字以上連続する部分を右ローテイトした文字列). '文字列ならびの数字が一文字以上連続する部分を右ローテイトする。'(_文字ならび,_数字列部分が右ローテイトしたならび) :- '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(_文字ならび,_数字列ならび,_数字列部分が右ローテイトしたならび), 右ローテイトしてから変数部分を埋める(_数字列ならび,_数字列部分が右ローテイトしたならび). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'([],[],[]). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(L1,[_数字列|R2],[_|R3]) :- 先頭からの数字ならびを数字列に変換(L1,_数字列,R1), '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(R1,R2,R3). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(L1,R2,[_文字列|R3]) :- 先頭からの数字以外の文字ならびを文字列に変換(L1,_文字列,R1), '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(R1,R2,R3), 先頭からの数字ならびを数字列に変換(L1,_数字列,R1) :- 先頭からの数字ならびを(L1,_数字ならび,R1), 数字列に変換(_数字ならび,_数字列). 先頭からの数字ならびを(L1,_数字ならび,R1) :- append(_数字ならび,R1,L1), 要素の全てが数字(_数字ならび), 'R1の最初の要素があればそれは数字ではない'(R1). 'R1の最初の要素があればそれは数字ではない'(R1) :- \+((R1 = [_文字|_],member(_文字,['0','1','2','3','4','5','6','7','8','9'])). 要素の全てが数字(_数字ならび) :- forall(member(_数字,_数字ならび),member(_数字,['0','1','2','3','4','5','6','7','8','9'])). 数字列に変換(_数字ならび,_数字列) :- atom_chars(_数字列,_数字ならび). 先頭からの数字以外の文字ならびを文字列に変換(L1,_文字列,R1) :- append(_文字ならび,R1,L1), 要素の全てが数字ではない(_文字ならび), 'R1の最初の要素があればそれは数字以外の文字ではない'(R1). 要素の全てが数字ではない(_文字ならび) :- forall(member(_文字,_文字ならび),\+(member(_文字,['0','1','2','3','4','5','6','7','8','9']))). 'R1の最初の要素があればそれは数字以外の文字ではない'(R1) :- \+((R1 = [A|_],\+(member(A,['0','1','2','3','4','5','6','7','8','9'])))). 右ローテイトしてから変数を埋める([],L2) :- !. 右ローテイトしてから変数を埋める(L1,L2) :- 右ローテイトしてから(L1,L3), 変数を埋める(L3,L2). 右ローテイトしてから([A|R],L3) :- append(R,[A],L3). 変数を埋める([],[]) :- !. 変数を埋める([_数字列|R1],[_数字列|R2]) :- 変数を埋める(R1,R2). 変数を埋める(R1,[_文字列|R2]) :- 変数を埋める(R1,R2). % 以下のサイトは 標準入力から整数を得る(_催促文言,_検査述語,_整数) :- 催促文言を表示して標準入力から整数を得て検査述語を実行する(_催促文言,_検査述語,_整数),!. 標準入力から整数を得る(_催促文言,_検査述語,_整数) :- 標準入力から整数を得る(_催促文言,_検査述語,_整数). 催促文言を表示して標準入力から整数を得て検査述語を実行する(_催促文言,_検査述語,_整数) :- 催促文言を表示して標準入力から整数を得て(_催促文言,_整数), 検査述語を実行する(_検査述語). 催促文言を表示して標準入力から整数を得て(_催促文言,_整数) :- 催促文言を表示して(_催促文言), 標準入力から整数を得る(_整数). 催促文言を表示して(_催促文言) :- 催促文言の編集(_催促文言,_編集された催促文言), writef('%tを入力してください : ',[_編集された催促文言]). 催促文言の編集(表示しない,'') :- !. 催促文言の編集(_催促文言,_編集された催促文言) :- atom_concat(_催促文言,'を入力して下さい : ',_編集された催促文言). 検査述語を実行する(_検査述語) :- _検査述語. 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- 入力文字列から整数が得られる(_文字列,_整数),!. 整数入力検査(_文字列,_) :- 入力文字列から整数が得られない(_文字列,_). 入力文字列から整数が得られる(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[valiables(_入力された変数),valiable_names(_入力された変数名)]),E,fail), integer(_整数). 入力文字列から整数が得られない(_文字列,_) :- writef('入力された文字列 %t からは整数が得られません。再入力をお願いします: \n',[_文字列]), fail. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # 問題文 # 高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k−1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 # # 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べたいと思いました。 # # 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # N # A1 # A2 # : # AN # 1 行目には、硬貨の種類数 N(1≦N≦50) が、1 行で与えられる。 # 2 行目から N 行では、高橋君が各硬貨を何枚持っているかが与えられる。 このうち i(1≦i≦N) 行目では、 i 番目の硬貨を、高橋君が何枚持っているかを表す整数 Ai(0≦Ai≦50000)が与えられる。 # 出力 # 高橋君が払える金額の種類数を、 1000000007 で割った余りを 1 行で出力せよ。出力の末尾は改行をいれること。 # # 入力例1 # 2 # 2 # 1 # 出力例1 # 5 # 払える金額は、1 円, 2 円, 10 円, 11 円, 12 円の 5 通りとなります。 # # 0 円は含まないことに注意してください。 # # 入力例2 # 2 # 32 # 3 # 出力例2 # 62 # 1 円から 62 円の 62 通りの金額を支払うことが出来ます。 # # 入力例3 # 4 # 12 # 3 # 7 # 34 # 出力例3 # 12039 # 入力例4 # 10 # 1234 # 2 # 857 # 3858 # 1 # 5000 # 32 # 4 # 1 # 857 # 出力例4 # 969347336 # 1000000007 で割った余りを出力してください。 # '高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k‐1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べた いと思いました。 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるた め、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。' :- 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_種類別枚数ならび), 最大何通り(_種類別枚数ならび,_最大何通り), 最大可能性から重複を差し引く(_種類別枚数ならび,_最大何通り,_何通り), '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り). 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび) :- 標準入力から整数を得る(_何種類), findall([M,_整数],( between(1,_何種類,N), succ(M,N), 標準入力から整数を得る(_整数)), _枚数ならび). 最大何通り(_種類別枚数ならび,_最大何通り) :- 最大何通り(_種類別枚数ならび,1,_最大何通り). 最大何通り([],_最大何通り,_最大何通り). 最大何通り([[_,0]|R]],_最大何通り,_最大何通り) :- 最大何通り(R,_最大何通り,_最大何通り),!. 最大何通り([[A,B]|R],N,_最大何通り) :- N_2 is B * N, 最大何通り(R,N_2,_最大何通り). 最大可能性から重複を差し引く(_種類別枚数ならび,_最大何通り,_何通り) :- findsum(_差し引き数,( append(L1,[[_種類,_枚数]|L2],_種類別枚数ならび), 差し引き数(_種類,_枚数,L1,_差し引き数)), _重複差し引き数), _何通り is _最大何通り - _重複差し引き数. 差し引き数(_種類_1,_枚数_1,L1,_差し引き数)) :- findsum(_差し引き数_3,( member([_種類,_枚数],L1), _差し引き数_1 is _枚数_1 // (_種類_1 // _種類), _差し引き数_2 is _枚数 // (_種類_1 // _種類), 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_3)), _差し引き数). 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_1) :- _差し引き数_1 =< _差し引き数_2,!. 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_2). '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り),!. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- writef('%t何通り\n',[_何通り]). '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- _何通り >= 1000000007, _何通りを1000000007で割った余り is _何通り mod 1000000007, writef('%t何通り\n',[_何通りを1000000007で割った余り]). 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # 高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k−1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 # # 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べたいと思いました。 # # 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # N # A1 # A2 # : # AN # 1 行目には、硬貨の種類数 N(1≦N≦50) が、1 行で与えられる。 # 2 行目から N 行では、高橋君が各硬貨を何枚持っているかが与えられる。 このうち i(1≦i≦N) 行目では、 i 番目の硬貨を、高橋君が何枚持っているかを表す整数 Ai(0≦Ai≦50000)が与えられる。 # 出力 # 高橋君が払える金額の種類数を、 1000000007 で割った余りを 1 行で出力せよ。出力の末尾は改行をいれること。 # # 入力例1 # 2 # 2 # 1 # 出力例1 # 5 # 払える金額は、1 円, 2 円, 10 円, 11 円, 12 円の 5 通りとなります。 # # 0 円は含まないことに注意してください。 # # 入力例2 # 2 # 32 # 3 # 出力例2 # 62 # 1 円から 62 円の 62 通りの金額を支払うことが出来ます。 # # 入力例3 # 4 # 12 # 3 # 7 # 34 # 出力例3 # 12039 # 入力例4 # 10 # 1234 # 2 # 857 # 3858 # 1 # 5000 # 32 # 4 # 1 # 857 # 出力例4 # 969347336 # 1000000007 で割った余りを出力してください。 # '高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k‐1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べた いと思いました。 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるた め、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。' :- 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび), 硬貨の合計金額種類(_枚数ならび,_何通り), '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り). 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび) :- 標準入力から整数を得る(_何種類), findall(_整数,( between(1,_何種類,_), 標準入力から整数を得る(_整数)), _枚数ならび). 硬貨の合計金額種類(_枚数ならび,_何通り) :- findall(_合計金額,合計金額(0,_枚数ならび,0,_合計金額),L1), sort(L1,L2), length(L2,_何通り). 合計金額(N,[],_合計金額,_合計金額). 合計金額(N,[_枚数|R],_合計金額_1,_合計金額) :- '1から枚数分を増やして合計金額を非決定性に計算していく'(N,_枚数,_ご金額金額_1,_合計金額_2), succ(N,N_2), 合計金額(N_2,R,_合計金額_2,_合計金額). '1から枚数分を増やして合計金額を非決定的に計算していく'(N,_枚数,_合計金額_1,_合計金額_2) :- between(1,_枚数,M), _合計金額_2 is _合計金額_1 + 10 ^ N * M. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類),!. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- writef('%t種類\n',[_種類]). '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- _種類 >= 1000000007, _種類を1000000007で割った余り is _種類 mod 1000000007, writef('%t種類\n',[_種類を1000000007で割った余り]). 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # (21:13 追記) |A|=|B|=1のケースがテスト中に一つ含まれていましたので、リジャッジを行います。なお、このケースでNOを出力するプログラムに影響はありません。 # # 文字列 A の文字をちょうど 3 回スワップすることにより、文字列 B に変換できるとき、二つの文字列 A, B を、仲良し文字列と呼ぶことにします。 # # スワップとは、文字列に含まれる 2 つの文字を、入れ替えることを指します。 例えば、abcという文字列であれば、aとcを入れ替えて、cbaのように変換することが出来ます。 # # aaのような文字列に対し、 1 文字目のaと、 2 文字目のaを入れ替えることは許されていますが、同じ場所の文字を指定することはできません。 # # 文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # B # 1 行目には、文字列 A(2≦|A|≦1000) が与えられる。 # 2 行目には、文字列 B(|B|=|A|) が与えられる。 # A, B 共に、小文字アルファベットのみで構成されていることが保障されている。 # 出力 # 与えられた 2 つの文字列が、仲良し文字列であればYES、そうでなければNOを出力せよ。 出力の末尾には改行をいれること。 # # 入力例1 # abcdef # fedcba # 出力例1 # YES # まず、文字列 A のabcdefのaとfをスワップし、fbcdeaとします。 # # 次に、bとeをスワップし、fecdbaとします。 # # 最後に、cとdをスワップし、fedcbaとすると、文字列 B と一致します。 # # よって、この 2 つの文字列は、仲良し文字列となるため、YESと出力します。 # # 入力例2 # abababab # babababa # 出力例2 # NO # 使っている文字数が同じでも、 3 回のスワップでは同じ文字列にできないパターンも存在します。 # # 入力例3 # nt # nt # 出力例3 # NO # スワップの仕方が 1 通りしかなく、 3 回のスワップを繰り返すと、tnになってしまいます。 よって、同じ 2 つの文字列ですが、仲良し文字列ではありません。 # # 入力例4 # pqqq # pqqq # 出力例4 # YES # まず、 1 番目の文字と 2 番目の文字を入れ替え、qpqqとします。 次に、 3 番目の文字と 4 番目の文字を入れ替え、qpqqとします。この際、同じ文字を選んでいますが、場所が違うので問題ありません。 最後に、1番目の文字と、2番目の文字を入れ替え、pqqqとします。 # # 入力例5 # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyzw # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz # 出力例5 # YES # 長い文字列が与えらえれることがあることにも注意してください。 # # 入力例6 # abcdef # ghijkl # 出力例6 # NO '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- 標準入力から二つの文字列を得る(A,B), '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B). '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- 文字列と仲良し文字列(A,B), write('YES\n'),!. '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- write('NO\n'). 文字列と仲良し文字列(_文字列,_仲良し文字列) :- 二つの文字列をならびに変換する(_文字列,_仲良し文字列,L1,L2), '二つのならびの差分(L3,L4)と同一部分(L5)'(L1,L2,L3,L4,L5), 三組のスワップが存在する(L3,L4,L5,Len). 二つの文字列をならびに変換する(_文字列,_仲良し文字列,L1,L2) :- atom_chars(_文字列,L1), atom_chars(_仲良し文字列,L2). '二つのならびの差分(L3,L4)と同一部分(L5)'([],[],[],[],[]). '二つのならびの差分(L3,L4)と同一部分(L5)'([A|R1],[A|R2],R3,R4,[A|R5]) :- '二つのならびの差分(L3,L4)と同一部分(L5)'(R1,R2,R3,R4),!. '二つのならびの差分(L3,L4)と同一部分(L5)'([A|R1],[B|R2],[A|R3],[B|R4],R5) :- '二つのならびの差分(L3,L4)と同一部分(L5)'(R1,R2,R3,R4,R5). 三組のスワップが存在する(L3,L4,L5,Len) :- 二つのならびは同一要素からなる(L3,L4,Len), 整列(L5,L6), 同一文字のペアの可能性を含めて三組のスワップが存在するかどうかの検査(Len,L6). 二つのならびは同一要素からなる(L3,L4,Len) :- length(L3,Len), length(L4,Len). 同一の要素からなる(L3,L4). 同一の要素からなる([],[]). 同一の要素からなる([A|R1],L2) :- select(A,L2,R2), 同一の要素からなる(R1,R2). 同一文字のペアの可能性を含めて三組のスワップが存在するかどうかの検査(Len,L6) :- 同一文字ペアを数える(L6,_同一文字ペア数), 同一文字同士のスワップ検査(Len,_同一文字ペア数). 同一文字ペアの数を数える([],[]). 同一文字ペアの数を数える([A,A|R],[_|R2]) :- 同一文字ペアの数を数える(R1,R2),!. 同一文字ペアの数を数える([_|R1],R2) :- 同一文字ペアの数を数える(R1,R2). 同一文字同士のスワップ検査(3,_) :- !. 同一文字同士のスワップ検査(2,[_|_]) :- !. 同一文字同士のスワップ検査(1,[_,_|_]) :- !. 同一文字同士のスワップ検査(0,[_,_,_|_]). 整列([],[]). 整列([_軸要素|_残りならび],_整列したならび) :- 軸要素との大小で分割してそれぞれ整列する(_軸要素,_残りならび,_整列したL1,_整列したL2), append(_整列したL1,[_軸要素|_整列したL2],_整列したならび). 軸要素との大小で分割してそれぞれ整列する(_軸要素,_残りならび,_整列したL1,_整列したL2) :- 分割(_軸要素,_残りならび,L1,L2), 整列(L1,_整列したL1), 整列(L2,_整列したL2). 分割(_軸要素,[],[],[]). 分割(_軸要素,[A|R1],[A|R2],R3) :- 軸要素より大きい時は(_軸要素,A,R1,R2,R3). 分割(_軸要素,[A|R1],[A|R2],R3) :- 軸要素と等しいか小さい時は(_軸要素,A,R1,R2,R3). 軸要素より大きい時は(_軸要素,A,R1,R2,R3) :- _軸要素 @< A, 分割(_軸要素,R1,R2,R3). 軸要素と等しいか小さい時は(_軸要素,A,R1,R2,R3) :- _軸要素 @>= A, 分割(_軸要素,R1,R2,R3). 標準入力から二つの文字列を得る(A,B) :- 標準入力から文字列を得る(A), 標準入力から文字列を得る(B). 標準入力から文字列を得る(_文字列) :- findall(_文字,( 一文字を得る(_文字), (終了文字(_文字),!,fail;true)),_文字ならび), atom_chars(_文字列,_文字ならび). 一文字を得る(_文字) :- get_char(_文字). 一文字を得る(_文字) :- 一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # (21:13 追記) |A|=|B|=1のケースがテスト中に一つ含まれていましたので、リジャッジを行います。なお、このケースでNOを出力するプログラムに影響はありません。 # # 文字列 A の文字をちょうど 3 回スワップすることにより、文字列 B に変換できるとき、二つの文字列 A, B を、仲良し文字列と呼ぶことにします。 # # スワップとは、文字列に含まれる 2 つの文字を、入れ替えることを指します。 例えば、abcという文字列であれば、aとcを入れ替えて、cbaのように変換することが出来ます。 # # aaのような文字列に対し、 1 文字目のaと、 2 文字目のaを入れ替えることは許されていますが、同じ場所の文字を指定することはできません。 # # 文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # B # 1 行目には、文字列 A(2≦|A|≦1000) が与えられる。 # 2 行目には、文字列 B(|B|=|A|) が与えられる。 # A, B 共に、小文字アルファベットのみで構成されていることが保障されている。 # 出力 # 与えられた 2 つの文字列が、仲良し文字列であればYES、そうでなければNOを出力せよ。 出力の末尾には改行をいれること。 # # 入力例1 # abcdef # fedcba # 出力例1 # YES # まず、文字列 A のabcdefのaとfをスワップし、fbcdeaとします。 # # 次に、bとeをスワップし、fecdbaとします。 # # 最後に、cとdをスワップし、fedcbaとすると、文字列 B と一致します。 # # よって、この 2 つの文字列は、仲良し文字列となるため、YESと出力します。 # # 入力例2 # abababab # babababa # 出力例2 # NO # 使っている文字数が同じでも、 3 回のスワップでは同じ文字列にできないパターンも存在します。 # # 入力例3 # nt # nt # 出力例3 # NO # スワップの仕方が 1 通りしかなく、 3 回のスワップを繰り返すと、tnになってしまいます。 よって、同じ 2 つの文字列ですが、仲良し文字列ではありません。 # # 入力例4 # pqqq # pqqq # 出力例4 # YES # まず、 1 番目の文字と 2 番目の文字を入れ替え、qpqqとします。 次に、 3 番目の文字と 4 番目の文字を入れ替え、qpqqとします。この際、同じ文字を選んでいますが、場所が違うので問題ありません。 最後に、1番目の文字と、2番目の文字を入れ替え、pqqqとします。 # # 入力例5 # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyzw # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz # 出力例5 # YES # 長い文字列が与えらえれることがあることにも注意してください。 # # 入力例6 # abcdef # ghijkl # 出力例6 # NO '文字列 A(2≦|A|≦100))、B(|B|=|A|) が与えられるので、仲良し文字列になっているかどうかを判定しなさい。' :- '文字列 A(2≦|A|≦100)'(_A), '文字列 B(|B|=|A|)'(_A,_B), 文字列と仲良し文字列(_A,_B). '文字列 A(2≦|A|≦100)'(_A) :- 行入力(_A), '(2≦|A|≦100)'(_A). 行入力(_行) :- read_line_to_codes(_Codes), atom_codes(_行,_Codes). '(2≦|A|≦100)'(_A) :- atom_length(_A,_長さ), between(2,100,_長さ). '文字列 B(|B|=|A|)'(_A,_B) :- 行入力(_B), '(|B|=|A|)'(_A,_B). '(|B|=|A|)'(_A,_B) :- atom_length(_A,_長さ), atom_length(_B,_長さ). 文字列と仲良し文字列(_文字列,_仲良し文字列) :- atom_chars(_文字列,L1), 文字列中の文字の三回スワップ(L1,[],L2), atom_chars(_仲良し文字列,L2). 文字列中の文字の三回スワップ(X,[_,_,_,_,_,_],X). 文字列中の文字の三回スワップ(L1,_履歴,X) :- スワップ(L1,_履歴,_nth0_1,_nth0_2,L2), 文字列中の文字の三回スワップ(L2,[_nth0_1,_nth0_2|_履歴],X). スワップ(L1,_履歴,_何番目_1,_何番目_2,L2) :- 交換する候補を得る(L1,_履歴,_何番目_1,_何番目_2,A,B), 交換する(L1,_何番目_1,_何番目_2,A,B,L2). 交換する候補を得る(L1,_履歴,_何番目_1,_何番目_2,_交換要素_1,_交換要素_2) :- 'まだ交換していない位置の要素を取り出す'(_何番目_1,L1,_履歴,_交換要素_1), 'まだ交換していない位置の要素を取り出す'(_何番目_2,L1,[_何番目_1|_履歴],_交換要素_2). 'まだ交換していない位置の要素を取り出す'(_何番目,L,_履歴,_交換要素) :- nth1(_何番目,L,_交換要素), \+(member(_何番目,_履歴)). 交換する(L1,_何番目_1,_何番目_2,A,B,L2) :- 'L2を生成する'(L1,L2), '交換する値をL2に埋める'(_何番目_1,_何番目_2,A,B,L2), 変数として残った要素を埋める(L1,L2). 'L2を生成する'(L1,L2) :- length(L1,Len), length(L2,Len). '交換する値をL2に埋める'(_何番目_1,_何番目_2,A,B,L2) :- nth1(_何番目_1,L2,B), nth1(_何番目_2,L2,A). 変数として残った要素を埋める([],[]). 変数として残った要素を埋める([A|R1],[A|R2]) :- 変数として残った要素を埋める(R1,R2),!. 変数として残った要素を埋める([_|R1],[A|R2]) :- 変数として残った要素を埋める(R1,R2). % 以下のサイトは # 11 で割り切れる数には、奇数桁の数の和と、偶数桁の数の和を比べると、差が 11 の倍数になっている、という性質があります。この際、一の位を 1 桁目、十の位を 2 桁目、というように、小さい数字から数えていくことに注意してください。 # # 例えば、 7392 という数字について、偶数桁に存在する数字は、 2 桁目の 9 と、 4 桁目の 7 であり、その和は 16です。 奇数桁に存在する数字は、 1 桁目の 2 と、 3 桁目の 3 であり、この和は 5 です。 16 と 5 の差は 11 であり、上記の性質を満たします。 # # あなたは、 与えられた整数が、 11 の倍数であるかどうか調べたいです。そのため、偶数桁の数の和と、奇数桁の数の和を求めようと思っています。この 2 つの値を出力するプログラムを書いてください。 'あなたは、 与えられた整数が、 11 の倍数であるかどうか調べたいです。そのため、偶数桁の数の和と、奇数桁の数の和を求めようと思っています。この 2 つの値を出力するプログラムを書いてください。' :- 標準入力から整数を得る(_与えられた整数), '偶数桁の数の和と、奇数桁の数の和を求めよう'(_与えられた整数,0,0,_偶数桁の和,_奇数桁の和), 出力する(_与えられた整数,_奇数桁の和,_偶数桁の和). '偶数桁の数の和と、奇数桁の数の和を求めよう'(0,S_1,S_2,S_1,S_2) :- !. '偶数桁の数の和と、奇数桁の数の和を求めよう'(N,S_1_1,S_2_1,S_1,S_2) :- D is N // 10, S_2_2 is S_2_1 + N mod 10, '偶数桁の数の和と、奇数桁の数の和を求めよう'(D,S_2_2,S_1_1,S_2,S_1). 出力する(_偶数桁の和,_奇数桁の和) :- writef('%t %t\n',[_偶数桁の和,_奇数桁の和]). 標準入力から整数を得る(_整数) :- 標準入力から数字ならびを得る(_数字ならび), 数字ならびを整数に変換する(_数字ならび,_整数). 標準入力から数字ならびを得る(_数字ならび) :- findall(_数字,( 一文字入力(_数字),(改行またはEOF(_数字),!,fail;'10進数字'(_数字))), _数字ならび). 一文字入力(_文字) :- get_char(_文字). 一文字入力(_文字) :- 一文字入力(_文字). 改行またはEOF('\n'). 改行またはEOF(end_of_file). '10進数字'(_数字) :- member(_数字,['0','1','2','3','4','5','6','7','8','9','-','+','.']). 数字ならびを整数に変換する(_数字ならび,_整数) :- atom_chars(_数字文字列,_数字ならび), catch(read_term_from_atom(_数字文字列,_整数,[]),E,fail). integer(_整数). % 以下のサイトは # サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 # # 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 # # この対面にある、底面に書かれた数字を出力してください。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # 1 行目には、サイコロの上の面に書かれている数字を表す 1 つの整数 A(1≦A≦6) が与えられる。 # 出力 # サイコロの底の面に書かれている数字を 1 行で出力せよ。出力の末尾には改行をいれること。 # # 入力例1 # 6 # 出力例1 # 1 # 6 の裏に書かれている数字は 1 です。 # # 入力例2 # 3 # 出力例2 # 4 # :- dynamic(対面にある数字/2). 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 この対面にある、底面に書かれた数字を出力してください。' :- 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。', '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A), 'この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字), 出力してください(_対面にある底面に書かれた数字). 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。' :- ' 1 から 6 までの数字が一つずつ書かれており、'(_1から6までの数字), 対面の和が 7 になるように作られています。'(_1から6までの数字). ' 1 から 6 までの数字が一つずつ書かれており、'(_1から6までの数字) :- between(1,6,_1から6までの数字). '対面の和が 7 になるように作られています。'(_1から6までの数字) :- '対面の和が 7 に'(_1から6までの数字,_対面にある数字), 'なるように作られています。'(_1から6までの数字,_対面にある数字). '対面の和が 7 に'(_1から6までの数字,_対面にある数字) :- length(L1,_1から6までの数字), length(_対面の和を表すならび,7), append(L1,L2,_対面の和を表すならび), length(L2,_対面にある数字). 'なるように作られています。'(_1から6までの数字,_対面にある数字) :- assertz(対面にある数字(_1から6までの数字,_対面にある数字)). '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A) :- 標準入力から整数を得る(_A). 'この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字) :- 対面にある数字(_A,_対面にある底面に書かれた数字). 出力してください(_対面にある底面に書かれた数字) :- writef('%t\n',[_対面にある底面に書かれた数字]). 標準入力から整数を得る(_A) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 # # 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 # # この対面にある、底面に書かれた数字を出力してください。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # 1 行目には、サイコロの上の面に書かれている数字を表す 1 つの整数 A(1≦A≦6) が与えられる。 # 出力 # サイコロの底の面に書かれている数字を 1 行で出力せよ。出力の末尾には改行をいれること。 # # 入力例1 # 6 # 出力例1 # 1 # 6 の裏に書かれている数字は 1 です。 # # 入力例2 # 3 # 出力例2 # 4 # 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 この対面にある、底面に書かれた数字を出力してください。' :- '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A), 'このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字), 出力してください(_対面にある底面に書かれた数字). '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A) :- 標準入力から整数を得る(_A). 'このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字) :- length(L1,_A), length(L2,_対面にある底面に書かれた数字), length(_対面の和を表すならび,7), append(L1,L2,_対面の和を表すならび). 出力してください(_対面にある底面に書かれた数字) :- writef('%t\n',[_対面にある底面に書かれた数字]). 標準入力から整数を得る(_A) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0.0,200.0,_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), read_term_from_atom(_身長文字列,_身長,[]), read_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重) :- 収束条件を満たす(_体重_下,_体重_上,_体重),!. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下_1,_体重_上_1,_身長,_BMI,_体重) :- '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重). 収束条件を満たす(_体重_下,_体重_上,_体重) :- (_体重_上 - _体重_下) < 0.1, _体重 is (_体重_上 + _体重_下) / 2. '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上) :- '新しい体重とその時のBMIを計算する'(_体重_下_1,_体重_上_1,_身長,_BMI_2,_体重_2), '次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_体重_2,_BMI,_BMI_2,_体重_下,_体重_上). '新しい体重とその時のBMIを計算する'(_体重_下,_体重_上,_身長,_BMI_2,_体重_2) :- _体重_2 is (_体重_下 + _体重_上) / 2, _BMI_2 is _体重_2 / ((_身長 / 100) ^ 2). '次の体重の計算区間を得る'(_体重_下,_,_体重_2,_BMI,_BMI_2,_体重_下,_体重_2) :- _BMI_2 =< _BMI,!. '次の体重の計算区間を得る'(_体重_下,_体重_上,_体重_2,_BMI,_BMI_2,_体重_2,_体重_上). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % これはsplitをわかりやすいように簡略化した定義です。 % より完全なsplit/3の定義はこちらをご覧ください % split(_文,_区切り語ならび,_区切られた語ならび) :- 区切り語ならびの変形(_区切り語ならび,SeparatersL), atom_chars(_文,_文字ならび), split_list_1(_文字ならび,SeparatersL,_区切られた語ならび). sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. 'SPLIT'(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Z), Z = X,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% split_list([],SeparatersL,[]). split_list(L1,SeparatersL,[L2|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), split_list(R2,SeparatersL,R). split_list(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list(R2,SeparatersL,X). split_list_1([],SeparatersL,[]). split_list_1(L1,SeparatersL,[A|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), atom_chars(A,L2), split_list_1(R2,SeparatersL,R). split_list_1(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list_1(R2,SeparatersL,X). split_list_2([],_,[],[]). split_list_2(L1,SeparatersL,[],R) :- member(L2,SeparatersL), append(L2,R,L1). split_list_2([A|R1],SeparatersL,[A|R2],R) :- \+((member(L2,SeparatersL),append(L2,_,[A|R1]))), split_list_2(R1,SeparatersL,R2,R). 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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), catch(atom_chars(C,NL),_,fail),!. 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([],[],'',_,[]) :- !. 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),!. number(A,B) :- number_codes(A,B). % 以下のサイトは # 問題文 # 天下一王国では整数は辞書順比較で表します。入国したばかりのダイキ君はとりあえず 1000 までの整数を書き出すことにしました。 # # 1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力してください。 # # 辞書順比較について # 文字列 A に対して、 Ai で i 番目の文字を表し、 |A| で文字列 A の文字数を表すことにすると、文字列 A と文字列 B を辞書順比較で比較するとは、 # # Ai≠Bi となる最小の i (1?i?min(|A|, |B|))に対して # AiBi であれば、文字列 A は文字列 B より大きい # そのような i が存在しなければ、文字数が少ない方を小さいとする # として文字列 A と文字列 B の大小関係を決めることである。 # # 例えば、 1, 2, 11, 12, 21 を辞書順比較で昇順にソートすると 1, 11, 12, 2, 21 となる。 # # 入力 # この問題では入力は与えられない。 # # # 出力 # 1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力せよ。 # # なお、行の終端には改行が必要である。 '1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力してください。' :- '1 以上 1000 以下のすべての整数を十進数で表した文字列を'(_十進文字列ならび), '辞書順比較で昇順にソートして、'(_十進文字列ならび,_辞書順比較で昇順にソートされた文字列ならび), '1 行ずつ出力してください。'(_辞書順比較で昇順にソートされた文字列ならび). '1 以上 1000 以下のすべての整数を十進数で表した文字列を'(_十進文字列ならび) :- findall(_十進文字列,'1 以上 1000 以下のすべての整数を十進数で表した'(_十進数文字列),_十進文字列ならび). '1 以上 1000 以下のすべての整数を十進数で表した'(_十進数文字列) :- '1 以上 1000 以下のすべての整数を'(_整数), 十進数で表した(_整数,_十進数で表した). '1 以上 1000 以下のすべての整数を'(_整数) :- between(1,1000,_整数). 十進数で表した文字列を(_整数,_十進数で表した文字列) :- number_chars(_整数,Chars), atom_chars(_十進数で表した文字列,Chars). '辞書順比較で昇順にソートして、'([],[]). '辞書順比較で昇順にソートして、'([_軸要素|L1],L2) :- '辞書順比較で軸要素との大小で分割'(_軸要素,L1,L1_1,L1_2), '辞書順比較で昇順にソートして、'(L1_1,L1_1_2), '辞書順比較で昇順にソートして、'(L1_2,L1_2_2), append(L1_1_2,[_軸要素|L1_2_2],L2). '辞書順比較で軸要素との大小で分割'(_,[],[],[]). '辞書順比較で軸要素との大小で分割'(_軸要素,[A|R2],[A|R3],R4) :- '辞書順に小さい'(A,_軸要素),!, '辞書順比較で軸要素との大小で分割'(_軸要素,R2,R3,R4). '辞書順比較で軸要素との大小で分割'(_軸要素,[A|R2],R3,[A|R4]) :- '辞書順比較で軸要素との大小で分割'(_軸要素,R2,R3,R4). '辞書順に小さい'(_文字列_1,_文字列_2) :- '文字列_1に小さい文字が先に出現した'(_文字列_1,_文字列_2),!. '辞書順に小さい'(_文字列_1,_文字列_2) :- 文字列の差分が文字列_2にある(_文字列_1,_文字列_2). '文字列_1に小さい文字が先に出現した'(_文字列_1,_文字列_2) :- 先頭から同一位置の文字を比較して(_文字列_1,_文字列_2,_文字_1,_文字_2), \+(_文字_1 = _文字_2),!, _文字_1 @< _文字_2. 先頭から同一位置の文字を比較して(_文字列_1,_文字列_2,_文字_1,_文字_2) :- sub_atom(_文字列_1,_同一位置,1,_,_文字_1), sub_atom(_文字列_2,_同一位置,1,_,_文字_2). '文字列の差分が文字列_2にある'(_文字列_1,_文字列_2) :- sub_atom(_文字列_2,0,_文字列_1の長さ,_差分文字数,_文字列_1), _差分文字数 > 0. '1 行ずつ出力してください。'(L2) :- forall(member(M,L2),writef('%t\n',[M])). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/831 # [1] 授業単元:プログラミング基礎 # [2] 問題文 # 文字配列buffを100バイト確保して、キーボードから繰り返し入力して # その文字列を空白を作り、連結していくプログラムを作ります # キーボードから入力できる文字は30バイトまでです # byeと入力で、終了 # '文字配列buffを100バイト確保して、キーボードから繰り返し入力して その文字列を空白を作り、連結していくプログラムを作ります キーボードから入力できる文字は30バイトまでです byeと入力で、終了'(L) :- length(L,100), get_line(_行文字列), 'キーボードから繰り返し入力してその文字列を空白を作り、連結していく'(_行文字列,L), atom_chars(_文字列,L). 'キーボードから繰り返し入力してその文字列を空白を作り、連結していく'(bye,L) :- 残りに空白を埋める(L). 'キーボードから繰り返し入力してその文字列を空白を作り、連結していく'(_文字列,L) :- atom_chars(_文字列,_文字ならび), 文字列を埋める(_文字ならび,L,R), get_line(_次の行文字列), 'キーボードから繰り返し入力してその文字列を空白を作り、連結していく'(_次の行文字列,R). 文字列を埋める([],[' '|R],R). 文字列を埋める([_文字|R1],[_文字|R2],R) :- 文字列を埋める(R1,R2,R). 残りに空白を埋める([]). 残りに空白を埋める([' '|R]) :- 残りに空白を埋める(R). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/736 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成しなさい. # 文字列を5つ入力し、その中の # 一番小さい文字列を表示 # (英数字のみ) # (文字列は、50文字以内) # (英字の大文字と小文字は、 #  特に考慮しないで、そのまま比較 #  して良いこととする) # # 実行例) # abc 入力1 # aaaa 入力2 # wsdd 入力3 # gfd 入力4 # xxxd 入力5 # aaaa 出力 # 19dfc 入力1 # xuw29 入力2 # 12k2 入力3 # mnnn 入力4 # bccd1 入力5 # 12k2 出力 # '文字列を5つ入力し、その中の一番小さい文字列を表示 (英数字のみ)(文字列は、50文字以内)(英字の大文字と小文字は、特に考慮しないで、そのまま比較して良いこととする)' :- '文字列を5つ入力し、'(_文字列ならび), 一番小さい文字列を表示(_文字列ならび). '文字列を5つ入力し、'(_文字列ならび) :- findall(_文字列,( between(1,5,_), get_line(_文字列)), _文字列ならび). 一番小さい文字列を表示([_文字列|_残り文字列ならび],_一番小さい文字列) :- 一番小さい文字列を(_残り文字列ならび],_文字列,_一番小さい文字列), 表示(_一番小さい文字列). 一番小さい文字列を([],_一番小さい文字列,_一番小さい文字列). 一番小さい文字列を([_文字列|_残り文字列ならび],_現時点で一番小さい文字列,_一番小さい文字列) :- _文字列 @< _現時点で一番小さい文字列, 一番小さい文字列を(_残り文字列ならび,_文字列,_一番小さい文字列). 一番小さい文字列を([_文字列|_残り文字列ならび],_現時点で一番小さい文字列,_一番小さい文字列) :- _文字列 @>= _現時点で一番小さい文字列, 一番小さい文字列を(_残り文字列ならび,_現時点で一番小さい文字列,_一番小さい文字列). 表示(_一番小さい文字列) :- writef('%t\n',[_一番小さい文字列]). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは # S(1≦S≦10) # L(100≦L≦100) # 標準入力から以下の形式で与えられる # S L # # 例を参考にoとxを配置せよ # # 例 # 3 2 # oooxxx # oooxxx # oooxxx # xxxooo # xxxooo # xxxooo # # 2 3 # ooxxoo # ooxxoo # xxooxx # xxooxx # ooxxoo # ooxxoo # # 1 1 # o # # 2 1 # oo # '_行数 is S * L, S(1≦S≦10) L(100≦L≦100) 標準入力から以下の形式で与えられる S L' :- 'S Lを得る'(S,L), 行パターンABを得る(S,L,A,B), findall(AorB,( between(1,L,N), 'AorB'(N,A,B,AorB)), X), 出力する(X). 'S Lを得る'(S,L) :- get_line(Line), split(Line,[' '],[S,L]). 出力する(LL) :- flatten(LL,L), forall(member(A,L),format('~w\n',[A])). 'AorB'(N,A,_,A) :- 1 is N mod 2. 'AorB'(N,_,B,B) :- 0 is N mod 2. 行パターンABを得る(S,L,A,B) :- 合計L行(L,白,黒,S,L,A), 合計L行(L,黒,白,S,L,B). 合計L行(0,_,_,_,_,[]) :- !. 合計L行(L_2,_文字_1,_文字_2,S,L,[_行文字列|R]) :- 行文字列(_文字_1,_文字_2,S,L,_行文字列), succ(L_1,L_2), 合計L行(L_1,_文字_1,_文字_2,S,L,R). 行文字列(_,_,_,0,'') :- !. 行文字列(_文字_1,_文字_2,S,L,_文字列) :- 連続文字列(_文字_1,S,_連続文字列), succ(L_1,L), 行文字列(_文字_2,_文字_1,S,L_1,_連続文字列_1), atom_concat(_連続文字列,_連続文字列_1,_文字列). 連続文字列(_文字,S,_連続文字列) :- findall(_文字,between(1,S,_),L), atom_chars(_連続文字列,L). % 以下のサイトは # プログラミングのお題スレ Part4 #197 # アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 # 例に沿って連続する文字をカウントするプログラムを作成せよ。 # # 出力の最後に改行を挿入すること。 # 標準入力から以下の形式で与えられる。 # S # # 例) # In: # aaaaaaaaaabbbbbbbbbbbbcccccccddddddddddeeeeeeefffffffffghiiiiiiiii # # Out: # a10b12c7d10e7f9ghi9 # # In: # # Out: # 0 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 例に沿って連続する文字をカウントするプログラムを作成せよ。 出力の最後に改行を挿入すること。 標準入力から以下の形式で与えられる。'(LL) :- 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(Line), atom_chars(Line,Chars), '連続する文字をカウントするプログラムを作成せよ。'(Chars,LL), 出力する(LL). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(Line) :- write('In: '), get_line(Line). '連続する文字をカウントするプログラムを作成せよ。'([],[]) :- !. '連続する文字をカウントするプログラムを作成せよ。'(Chars,[[_連続文字,_文字数]|R]) :- 先頭からの連続文字(Chars,Chars1,Chars2,_連続文字), length(L1,_文字数), '連続する文字をカウントするプログラムを作成せよ。'(L2,R). 先頭からの連続文字(Chars,Chars1,Chars2,_連続文字) :- append(Chars1,Chars2,Chars), 連続文字(Chars1,_連続文字), \+((Chars2 = [A|R],_連続文字 = A)). 連続文字([],_). 連続文字([_連続文字|R],_連続文字) :- 連続文字(R,_連続文字). 出力する(LL) :- flatten(LL,L), atomic_list_concat(L,S), writef('Out:\n%t\n',[S]). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #935 # # W=横の長さ、H=縦の長さ # 2<=W<=1000、2<=H<=1000 # 箱の枠は「+」、箱の中は「@」で出力しなさい # # 入力は以下の形式で標準入力から与えられます # W H # # 例 # --------------------- # 2 2 # ++ # ++ # --------------------- # 10 4 # ++++++++++ # +@@@@@@@@+ # +@@@@@@@@+ # ++++++++++ '# W=横の長さ、H=縦の長さ 2<=W<=1000、2<=H<=1000 箱の枠は「+」、箱の中は「@」で出力しなさい 入力は以下の形式で標準入力から与えられます W H' :- 標準入力からWとHを得る(W,H), split(Line,[' '],[W,H]), 全体像(W,H,_全体像), 全体像を描画する(_全体像). 標準入力からWとHを得る(W,H) :- read_line_to_codes(Codes,[]), 中間の32を一個のの44に置き換える(Codes,Codes2), string_to_atom(Codes2,Atom), read_term_from_atom(Atom,(W,H,[]). 中間の32を一個のカンマに置き換える(Codes,Codes2) :- append(L1,L2,L3,Codes), all(L2,32), \+(member(32,L1)), \+(member(32,L2)), append(L1,[44|L3],Codes2). 全体像(W,H,_全体像) :- findall(L,( between(1,H,_), findall(_,( between(1,W,_)), L)), _全体像), 全体像(_全体像). 全体像(_全体像) :- append([_第一行],_中間行ならび,[_最終行],_全体像), all(_第一行,'+'), all(_最終行,'+'), '内側は先頭要素と最後の要素が+、中間要素は@となる'(_中間行ならび). '内側は先頭要素と最後の要素が+、中間要素は@となる'([]). '内側は先頭要素と最後の要素が+、中間要素は@となる'([L|R]) :- '先頭要素と最後の要素が+、中間要素は@となる'(L), '内側は先頭要素と最後の要素が+、中間要素は@となる'(R). '先頭要素と最後の要素が+、中間要素は@となる'(L) :- append(['+'],L2,['+'],L), all(L2,'@'),!. 全体像を描画する([]). 全体像を描画する([L|R]) :- atom_chars(_行表示,L), writef('%t\n',[_行表示]), 全体像を描画する(R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all([]). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([A|L1],L2,L3,[A|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出題: プログラミングのお題スレ Part3 #902 # # お題:文字列sにあるn個の文字からなる集合を # 要素とする集合をつくる # # 例1:以下n=2 # "today"-> {to td ta ty od oa oy da dy ay} # "book" -> {bo bk ok} # "ababab" -> {ab} # "ab" -> {ab} # "aa" -> {} # "a" -> {} # "" -> {} # # 例2:以下n=3 # "today"-> {tod toa toy oda ody day dat ayt ayo} # "book" -> {boo bok okb} # "abc" -> {abc} # "ababab" ->{} # "ab" -> {} # "a" -> {} # "" -> {} 文字列にあるn個の文字からなる集合を要素とする集合をつくる(_文字列,_n,_文字列集合要素) :- atom_chars(_文字列,_文字ならび), 要素の重複を取り除いた文字ならび(_文字ならび,_要素に重複のない文字ならび), 組合せ(_要素に重複のない文字ならび,_n,_組合せ), atom_chars(_文字列集合要素,_組合せ). 要素の重複を取り除いた文字ならび(_文字ならび,_要素に重複のない文字ならび) :- findall(_文字,( append(L1,[_文字|_],_文字ならび), \+(member(_文字,L1))), _要素に重複のない文字ならび). 組合せ(L,1,[A]) :- !, member(A,L). 組合せ([A|R1],N,[A|R2]) :- N_1 is N - 1, 組合せ(R1,N_1,R2). 組合せ([_|R1],N,L) :- 組合せ(R1,N,L). % 以下のサイトは # 出題: プログラミングのお題スレ Part3 #902 # # お題:文字列sにあるn個の文字からなる集合を # 要素とする集合をつくる # # 例1:以下n=2 # "today"-> {to td ta ty od oa oy da dy ay} # "book" -> {bo bk ok} # "ababab" -> {ab} # "ab" -> {ab} # "aa" -> {} # "a" -> {} # "" -> {} # # 例2:以下n=3 # "today"-> {tod toa toy oda ody day dat ayt ayo} # "book" -> {boo bok okb} # "abc" -> {abc} # "ababab" ->{} # "ab" -> {} # "a" -> {} # "" -> {} 文字列にあるn個の文字からなる集合を要素とする集合をつくる(_文字列,_n,_文字列集合要素) :- atom_chars(_文字列,_文字ならび), 文字列の要素の重複を取り除いた文(_文字ならび,_要素に重複のない文字ならび), 組合せ(_要素に重複のない文字ならび,_n,_組合せ), atom_chars(_文字列集合要素,_組合せ). 文字列の要素の重複を取り除いた文(_文字ならび,_要素に重複のない文字ならび) :- findall(_文字,( append(L1,[_文字|_],_文字ならび), \+(member(_文字,L1))), _要素に重複のない文字ならび). 組合せ(L,1,[A]) :- member(A,L). 組合せ([_先頭要素|_残りならび],N,[_先頭要素|_組合せ]) :- 'Nが1より大きい時、_残りならびから、一個少ない選択の組合せの前に先頭要素を付加する'(_残りならび,N,L). 組合せ([_|_残りならび],N,_組合せ) :- 'Nが1より大きい時、ならびの先頭要素を取り去った_残りならびから同じくN個取り出す組合せ'(_残りならび,N,L). 'Nが1より大きい時、_残りならびから、一個少ない選択の組合せの前に先頭要素を付加する'(_残り要素,N,_組合せ) :- N > 1, _一個少ない選択 is N - 1, 組合せ(_残りならび,_一個少ない選択,_組合せ). 'Nが1より大きい時、ならびの先頭要素を取り去った_残りならびから同じくN個取り出す組合せ'(_残りならび,N,_組合せ) :- N > 1, 組合せ(_残りならび,N,_組合せ). % 以下のサイトは # 出題: プログラミングのお題スレ Part3 #902 # # お題:文字列sにあるn個の文字からなる集合を # 要素とする集合をつくる # # 例1:以下n=2 # "today"-> {to td ta ty od oa oy da dy ay} # "book" -> {bo bk ok} # "ababab" -> {ab} # "ab" -> {ab} # "aa" -> {} # "a" -> {} # "" -> {} # # 例2:以下n=3 # "today"-> {tod toa toy oda ody day dat ayt ayo} # "book" -> {boo bok okb} # "abc" -> {abc} # "ababab" ->{} # "ab" -> {} # "a" -> {} # "" -> {} 文字列にあるn個の文字からなる集合を要素とする集合をつくる(_文字列,_n,_文字列集合要素) :- 文字列の重複文字を取り除く(_文字列,_重複を取り除いた文字列), 文字列組合せ(_重複を取り除いた文字列,_n,_文字列集合要素). 文字列の重複文字を取り除く(_文字列,_重複を取り除いた文字列) :- findall(_文字,( 既に採用されていない文字(_文字列,_文字)), _重複を取り除いた文字ならび), atom_chars(_重複を取り除いた文字列,_重複を取り除いた文字ならび). 既に採用されていない文字(_文字列,_文字) :- sub_atom(_文字列,S,1,_,_文字), sub_atom(_文字列,0,S,_,_前文字列), \+(sub_atom(_前文字列,_,1,_,_文字)). 文字列組合せ(_文字列,1,_文字) :- sub_atom(_文字列,_,1,_,_文字). 文字列組合せ(_文字列_1,N,_文字列) :- 先頭文字と残り文字列(_文字列,N,M,_先頭文字,_残り文字列), 文字列組合せ(_残り文字列,M,_残り文字列_2), atom_concat(_先頭文字,_残り文字列_2,_文字列). 文字列組合せ(_文字列_1,N,_文字列) :- 先頭文字を除く残り文字列(_文字列,1,_,0,_残り文字列), 文字列組合せ(_残り文字列,N,_文字列). 先頭文字と残り文字列(_文字列,N,M,_先頭文字,_残り文字列) :- N > 1, M is N - 1, sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,1,_,0,_残り文字列). 先頭文字を除く残り文字列(_文字列,1,_,0,_残り文字列) :- N > 1, sub_atom(_文字列,1,_,0,_残り文字列). % 以下のサイトは 副文字列(_文字列,_開始位置,_副文字列の長さ,_残り文字数,_副文字列) :- sub_atom(_文字列,_開始位置,_副文字列の長さ,_残り文字数,_副文字列). 副文字列(_文字列,_副文字列) :- sub_atom(_文字列,_,_,_,_副文字列). 副文字列(_文字列,_前文字列,_中間文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,S,_,R,_中間文字列), sub_atom(_文字列,_,R,0,_後文字列). 副文字列(_文字列,_前文字列,_中間文字列,_後文字列,L1,L2,L3) :- 前文字列(_文字列,S,_前文字列,L1), 中間文字列(_文字列,S,R,_中間文字列,L2), 後文字列(_文字列,R,_後文字列,L3). 前文字列(_文字列,S,_前文字列,L1) :- sub_atom(_文字列,0,S,_,_前文字列), length(L1,S), atom_chars(_前文字列,L1). 中間文字列(_文字列,S,R,_中間文字列,L2) :- sub_atom(_文字列,S,Len,R,_中間文字列), length(L2,Len), atom_chars(_中間文字列,L2). 後文字列(_文字列,R,_後文字列,L3) :- sub_atom(_文字列,_,R,0,_後文字列), length(L3,R), atom_chars(_後文字列,L3). % 以下のサイトは 覆面算(kadokawa+dwango+kada=kandouii,N1+N2+N3=N4,_文字と数字の対応) :- 覆面(kadokawa+dwango+kada=kandouii,L0_1,L0_2,L0_3,L1,L2,L3,L4), 覆面算(L0_3,L0_2), 覆面算計算(L1,L2,L3,L4,N1,N2,N3,N4), 文字と数字の対応(L0_1,L0_2,_文字と数字の対応). 覆面(A_1+A_2+A_3=A_4,L0_1,L0_2,L0_3,L1,L2,L3,L4) :- 文字出現順の決定([A_1,A_2,A_3,A_4],L0_1), findall(N,between(1,9,_),L0_2), L0_3 = ['1','2','3','4','5','6','7','8','9','0'], 覆面文字と変数の対応付け(L0_1,L0_2,A_1,A_2,A_3,A_4,L1,L2,L3,L4). 文字出現順の決定(L,L0_1) :- atomic_list_concat(L,A), atom_chars(A,Chars), 唯一の文字ならびを得る(Chars,L0_1). 要素に重複のない文字ならび(_文字ならび,_要素に重複のない文字ならび) :- findall(_文字,( append(L1,[_文字|_],_文字ならび), \+(member(_文字,L1))), _要素に重複のない文字ならび). 数式の対応付け(L0_1,L0_2,A_1,A_2,A_3,A_4,L1,L2,L3,L4) :- 数式の対応付け(L0_1,L0_2,A_1,L1), 数式の対応付け(L0_1,L0_2,A_2,L2), 数式の対応付け(L0_1,L0_2,A_3,L3), 数式の対応付け(L0_1,L0_2,A_4,L4). 覆面文字と変数の対応付け(L0_1,L0_2,_覆面文字列,_変数ならび) :- atom_chars(_覆面文字列,_覆面文字ならび), findall(V,( nth1(_nth1,_覆面文字ならび,_文字), nth1(_nth1,L0_1,_文字), nth1(_nth1,L0_2,V)), _変数ならび). 覆面算計算(L1,L2,L3,L4,N1,N2,N3,N4) :- number_chars(N1,L1), number_chars(N2,L2), number_chars(N3,L3), number_chars(N4,L4), N1 + N2 + N3 =:= N4. 覆面算(_,[]). 覆面算(L,[A|R2]) :- select(A,L,R), 覆面算(R,R2). 文字と数字の対応(L0_1,L0_2,_文字と数字の対応) :- findall(A=B,( nth1(_nth1,L0_1,A), nth1(_nth1,L0_2,B)), _文字と数字の対応). 唯一の文字ならびを得る([],[]). 唯一の文字ならびを得る([A|R1],[A|R2]) :- \+(member(A,R1)), 唯一の文字ならびを得る(R1,R2). 唯一の文字ならびを得る([A|R1],R2) :- member(A,R1), 唯一の文字ならびを得る(R1,R2). % 以下のサイトは # 出典 :: プログラミングのお題スレ3 #623 # お題:1のビットが3個ある二進表記文字列が与えられたとき、次に大きい # 1のビットが3個ある二進表記文字列を求める。 # 例 # 111 -> 1011 # 1110 -> 10011 # 101100 -> 110001 '1のビットが3個ある二進表記文字列が与えられたとき、次に大きい1のビットが3個ある二進表記文字列を求める。'(_1のビットが3個ある二進表記文字列,_次に大きい1のビットが3個ある二進表記文字列) :- 先頭に0を付加した二進表記文字列で探索する(_1のビットが3個ある二進表記文字列,_探索した数字ならび), '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(_探索した数字ならび,_次に大きい1のビットが3個ある二進表記文字列),!. 先頭に0を付加した二進表記文字列で探索する(_1のビットが3個ある二進表記文字列,_生成された数字ならび) :- atom_concat('0',_1のビットが3個ある二進表記文字列,_先頭に0を付加した1のビットが3個ある二進表記文字列), atom_chars(_先頭に0を付加した1のビットが3個ある二進表記文字列,_先頭に0を付加した1のビットが3個ある二進表記文字ならび), 順列で数字ならびを生成する(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_生成された数字ならび), _生成された数字ならび @> _先頭に0を付加した1のビットが3個ある二進表記文字ならび. 順列で数字ならびを生成する(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_生成された数字ならび) :- length(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_要素数), '最後の3要素だけが数字1、それより前は数字0のならび'(_要素数,_最後の3要素だけ数字1それより前は数字0のならび), 順列(_最後の3要素だけ数字1それより前は数字0のならび,_要素数,_生成された数字ならび). '最後の3要素だけが数字1、それより前は数字0のならび'(_要素数,_最後の3要素だけ数字1それより前は数字0のならび) :- length(_最後の3要素だけ数字1それより前は数字0のならび,_要素数), append(_全ての要素が数字0のならび,['1','1','1'],_最後の3要素だけ数字1それより前は数字0のならび), 全ての要素が数字0のならび(_全ての要素が数字0のならび). '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(['0'|L],_次に大きい1のビットが3個ある二進表記文字列) :- atomic_list_concat(L,_次に大きい1のビットが3個ある二進表記文字列). '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(['1'|L],_次に大きい1のビットが3個ある二進表記文字列) :- atomic_list_concat(['1'|L],_次に大きい1のビットが3個ある二進表記文字列). 全ての要素が数字0のならび([]). 全ての要素が数字0のならび(['0'|_全ての要素が数字0のならび]) :- 全ての要素が数字0のならび(_全ての要素が数字0のならび). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは # # 全て同じ文字からなる文字列だ # 全て同じ文字からなる文字列だ(_文字列) :- atom_chars(_文字列,_文字ならび), all(_文字ならび,_同じ文字). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出題: http://toro.2ch.net/test/read.cgi/tech/1387257592/395 # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 同じ文字の4回以上の繰り返しを3回にしたい # # ●対象データ # ああああああああああああああああああいいいいいいいいいいいいいいいうえおおおおおおおおおおおおおお # # ●希望する結果 # あああいいいうえおおお 同じ文字の4回以上の繰り返しを3回にしたい(_文字列,_置換した文字列) :- atom_chars(_文字列,Chars_1), ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(Chars_1,Chars_2), atom_chars(_置換した文字列,Chars_2). ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([],[]). ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(L1,L2) :- ならびの同じ文字要素の4回以上の繰り返しを(L1,_同じ要素,R1_1), '3回にしたい'(R1_1,_同じ要素,R1_2,L2,R2), ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(R1_2,R2),!. ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([A|R1],[A|R2]) :- ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(R1,R2),!. ならびの同じ文字要素の4回以上の繰り返しを([A,A,A,A|R],A,R). '3回にしたい'(R1_1,_同じ要素,R1_2,L2,R2) :- ならびの先頭からの指定要素を読み飛ばす(R1_1,_同じ要素,R1_2), L2 = [_同じ要素,_同じ要素,_同じ要素|R2]. ならびの先頭からの指定要素を読み飛ばす([],_,[]) :- !. ならびの先頭からの指定要素を読み飛ばす([A|R],B,[A|R]) :- \+(A = B),!. ならびの先頭からの指定要素を読み飛ばす([A|R1],A,R2) :- ならびの先頭からの指定要素を読み飛ばす(R1,A,R2). % 以下のサイトは # ●Regular Expressionの使用環境 # サクラエディタ 2.1.1.1 # # ●検索か置換か? # 置換 # # ●説明 # []内の文字だけにしたい # ※ [ と ] と (半角スペース)の3つを消したい # # ●対象データ # [あいうえお] ←最後に半角スペースあり(以下同じ) # [カキクケコ] # [AIUEO] # [漢字等々] # # ●希望する結果 # あいうえお←最後の半角スペースも消したい(以下同じ) # カキクケコ # AIUEO # 漢字等々 '[]内の文字だけとしたい'(_文字列,_変換されたデータ) :- '[]内の文字だけとしたい'(_文字列,S1,S2_2,S3), '[]内の文字だけにしたい'(S3,S3_2), atomic_list_concat([S1,S2_2,S3_2],_変換されたデータ),!. '[]内の文字だけとしたい'(_文字列,_文字列). '[]内の文字だけとしたい'(_文字列,S1,S2_2,S3) :- sub_atom(_文字列,S1,S2,S3,L1,L2,L3), sub_atom(S2,0,1,_,'['), sub_atom(S2,_,1,0,']'), '[]とスペースを削除する'(S2,S2_2),!. '[]とスペースを削除する'(S2,S2_2) :- '[]を削除する'(S2,S2_1), スペースを削除する(S2_1,S2_2). '[]を削除する'(S2,S2_1) :- sub_atom(S2,1,_,1,S2_2). スペースを削除する(S2_1,S2_2) :- findall(A,( スペースでない文字を取り出す(S2_1,A)), L), atom_chars(S2_2,L). スペースでない文字を取り出す(S2,A) :- sub_atom(S2,_,1,_,A), \+(A = ' ')). % 以下のサイトは # 問題 # # 「mldsg」のうち3文字からなる英小文字の文字列を # 英大文字に変換して標準出力してください。 # 同じ文字を複数回使っても構いません。 # 言語はideoneで選択可能な言語を利用可能です。 # '「mldsg」のうち3文字からなる英小文字の文字列を 英大文字に変換して標準出力してください。 同じ文字を複数回使っても構いません。 言語はideoneで選択可能な言語を利用可能です。' :- forall( '「mldsg」のうち3文字からなる英小文字の文字列を'(_3文字からなる英小文字の文字列), '英大文字に変換して標準出力してください。'(_3文字からなる英小文字の文字列)). '「mldsg」のうち3文字からなる英小文字の文字列を'(_3文字からなる英小文字の文字列) :- '3文字からなる英小文字の文字列を'(mldsg,[],_3文字からなる英小文字の文字列). '3文字からなる英小文字の文字列を'(_,[_1,_2,_3],_3文字の文字列) :- atom_chars(_3文字の文字列,[_1,_2,_3]),!. '3文字からなる英小文字の文字列を'(_文字列,L,_3文字の文字列) :- sub_atom(_文字列,_,1,_,_文字), '3文字からなる英小文字の文字列を'(_文字列,[_文字|L],_3文字の文字列). '英大文字に変換して標準出力してください。'(_3文字からなる英小文字の文字列) :- 英大文字に変換して(_3文字からなる英小文字の文字列,_3文字からなる英大文字の文字列), '標準出力してください。'(_3文字からなる英大文字の文字列). 英大文字に変換して(_3文字からなる英小文字の文字列,_3文字からなる英大文字の文字列) :- findall(_大文字,( sub_atom(_3文字からなる英小文字の文字列,_,1,_,_小文字), 英小文字大文字(_小文字,_大文字)), _3文字からなる英大文字のならび), atom_chars(_3文字からなる英大文字の文字列,_3文字からなる英大文字のならび). 英小文字大文字(a,'A'). 英小文字大文字(b,'B'). 英小文字大文字(c,'C'). 英小文字大文字(d,'D'). 英小文字大文字(e,'E'). 英小文字大文字(f,'F'). 英小文字大文字(g,'G'). 英小文字大文字(h,'H'). 英小文字大文字(i,'I'). 英小文字大文字(j,'J'). 英小文字大文字(k,'K'). 英小文字大文字(l,'L'). 英小文字大文字(m,'M'). 英小文字大文字(n,'N'). 英小文字大文字(o,'O'). 英小文字大文字(p,'P'). 英小文字大文字(q,'Q'). 英小文字大文字(r,'R'). 英小文字大文字(s,'S'). 英小文字大文字(t,'T'). 英小文字大文字(u,'U'). 英小文字大文字(v,'V'). 英小文字大文字(w,'W'). 英小文字大文字(x,'X'). 英小文字大文字(y,'Y'). 英小文字大文字(z,'Z'). '標準出力してください。'(_3文字からなる英大文字の文字列) :- writef('%t\n',[_3文字からなる英大文字の文字列]). :- '「mldsg」のうち3文字からなる英小文字の文字列を 英大文字に変換して標準出力してください。 同じ文字を複数回使っても構いません。 言語はideoneで選択可能な言語を利用可能です。'. % 以下のサイトは # 出題 :: プログラミングのお題スレ Part3 #482 # # お題:二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。 # 例 # aabaabbab -> a '二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_多数派の文字) :- 二種類の文字からなる長さが奇数の文字列があるとき(_二種類の文字からなる長さが奇数の文字列,_文字種_1,_文字種_2,Ln1,Ln2), 多数派の文字を求める(_文字種_1,_文字種_2,Ln1,Ln2,_多数派の文字). 二種類の文字からなる長さが奇数の文字列があるとき(_二種類の文字からなる長さが奇数の文字列,_文字種_1,_文字種_2,Ln1,Ln2) :- atom_chars(_二種類の文字からなる長さが奇数の文字列,Chars), 二種類の文字に分類して度数を示すならびを得る(Chars,_文字種_1,_文字種_2,Ln1,Ln2). 二種類の文字に分類して度数を示すならびを得る([],_,_,[],[]) :- !. 二種類の文字に分類して度数を示すならびを得る([A|R],A,B,[_|Ln1],Ln2) :- 二種類の文字に分類して度数を示すならびを得る(R,A,B,Ln1,Ln2). 二種類の文字に分類して度数を示すならびを得る([B|R],A,B,Ln1,[_|Ln2]) :- 二種類の文字に分類して度数を示すならびを得る(R,A,B,Ln1,Ln2). 多数派の文字を求める(_,B,Ln1,Ln2,B) :- append(Ln1,[_|_],Ln2),!. 多数派の文字を求める(A,_,_,_,A). % 以下のサイトは '1' :- '2'(_1),'3'(_1),'11'. '1'. '2'(_1) :- '12'(mldsg,_2),'4'(_2,3,_4),'12'(_1,_4). '3'(_1) :- '5'(_1,_2),'7'(_2). '4'(_,0,[]). '4'(_1,_2,[_3|_4]) :- '13'(_2,0),'14'(_3,_1),'15'(_5,_2 - 1),'4'(_1,_5,_4). '5'(_1,_2) :- '16'(_3,('17'(_1,_,1,_,_4),'6'(_4,_3)),_5),'12'(_2,_5). '6'(_1,_2) :- '18'(_1,_3),'15'(_4,_3 - 32),'18'(_2,_4). '7'(_1) :- '19'(_1),'20'. '11' :- fail. '12'(_1,_2) :- atom_chars(_1,_2). '13'(_1,_2) :- _1 > _2. '14'(_1,_2) :- member(_1,_2). '15'(_1,_2) :- _1 is _2. '16'(_1,_2,_3) :- findall(_1,_2,_3). '17'(_1,_2,_3,_4,_5) :- sub_atom(_1,_2,_3,_4,_5). '18'(_1,_2) :- char_code(_1,_2). '19'(_1) :- write(_1). '20' :- nl. :- initialization('1'). % 以下のサイトは '1' :- '2'(_1),'3'(_1),'11'. '1'. '2'(_1) :- '12'(mldsg,_2),'4'(_2,3,_4),'12'(_1,_4). '3'(_1) :- '5'(_1,_2),'7'(_2). '4'(_,0,[]). '4'(_1,_2,[_3|_4]) :- _2 > 0,'13'(_3,_1),_5 is _2 - 1,'4'(_1,_5,_4). '5'(_1,_2) :- '14'(_3,('15'(_1,_,1,_,_4),'6'(_4,_3)),_5),'12'(_2,_5). '6'(_1,_2) :- '16'(_1,_3),_4 is _3 -32,'16'(_2,_4). '7'(_1) :- '17'(_1),'18'. '11' :- fail. '12'(_1,_2) :- atom_chars(_1,_2). '13'(_1,_2) :- member(_1,_2). '14'(_1,_2,_3) :- findall(_1,_2,_3). '15'(_1,_2,_3,_4,_5) :- sub_atom(_1,_2,_3,_4,_5). '16'(_1,_2) :- char_code(_1,_2). '17'(_1) :- write(_1). '18' :- nl. '19'(_1) :- initialization(_1). :- '19'('1'). % 以下のサイトは '1' :- '2'(_1),'3'(_1),fail. '1'. '2'(_1) :- atom_chars(mldsg,_2),'4'(_2,3,_4),atom_chars(_1,_4). '3'(_1) :- '5'(_1,_2),'7'(_2). '4'(_,0,[]). '4'(_1,_2,[_3|_4]) :- _2 > 0,member(_3,_1),_5 is _2 - 1,'4'(_1,_5,_4). '5'(_1,_2) :- findall(_3,(sub_atom(_1,_,1,_,_4),'6'(_4,_3)),_5),atom_chars(_2,_5). '6'(_1,_2) :- char_code(_1,_3),_4 is _3 -32,char_code(_2,_4). '7'(_1) :- write(_1),nl. :- initialization('1'). % 以下のサイトは mecab(文,_文,LL) :- tmpnam(TMPNAM), tell(TMPNAM), writef('%t\n',[_文]), told, mecab(TMPNAM,LL). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,_,_,_,S1,'\t',S3,_,_,_)), LL). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,S1,'\t',S3)), LL). sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y), split(V,[' ',','],U)), X). split(_文字列,_区切り文字ならび,L) :- atom_chars(_文字列,_文字ならび), split_list(_文字ならび,_区切り文字ならび,L). split_list([],_,[]). split_list(L1,_区切り文字ならび,[_文字列|R]) :- split_list_2(_区切り文字ならび,L1,_文字列), split_list(L3,_区切り文字ならび,R),!. split_list(L1,_区切り文字ならび,[_文字列]) :- atom_chars(_文字列,L1). split_list_2(_区切り文字ならび,L,_文字列,L3) :- append(L1,L2,L3,L), member(_区切り文字,_区切り文字ならび), split_list_3(_区切り文字,L1,L2,L3), atom_chars(_文字列,L1),!. split_list_3(_区切り文字,L1,L2,L3) :- all(L2,_区切り文字), \+(append(_,[_区切り文字],L1)), \+(L3 = [_区切り文字|_]),!. tmpnam(TMPNAM) :- 'TMPNAM'(TMPNAM), \+(exist_file(TMPNAM)),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). 'TMPNAM'(TMPNAM) :- '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび), atomic_list_concat(['/tmp/file'|_6要素の文字ならび],TMPNAM). '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび) :- findall(_任意の文字,( between(1,6,_), '英小文字大文字数字から任意の文字'(_任意の文字)), _6要素の文字ならび). '英小文字大文字数字から任意の文字'(_任意の文字) :- _文字コード is random(75) + 48, '文字コード48-122の範囲で記号のコードではない'(_文字コード), char_code(_任意の文字,_文字コード),!. '英小文字大文字数字から任意の文字'(_任意の文字) :- '英小文字大文字数字から任意の文字'(_任意の文字). '文字コード48-122の範囲で記号のコードではない'(_文字コード) :- '文字コード範囲58-64ではない'(_文字コード), '文字コード範囲91-96ではない'(_文字コード). '文字コード範囲58-64ではない'(_文字コード) :- \+((_文字コード>=58,_文字コード=<64)). '文字コード範囲91-96ではない'(_文字コード) :- \+((_文字コード>=91,_文字コード=<96)). sub_atom(A,H,X,T) :- atom(A), sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), sub_atom(A,_,R,0,T). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1392388003/270 # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):入力した1桁の整数を行数と解釈し、その後、その行数分だけキーボードから入力された # 文字をディスプレイに出力する。 # [条件1]整数(行数)入力にはgetchar関数を使用する。 # [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。 # [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。 # [3] 環境 #  [3.1] OS:Windows7 #  [3.2] コンパイラ名とバージョン:gcc 3.4 #  [3.3] 言語: C # [4] 期限:2014/03/30 '入力した1桁の整数を行数と解釈し、その後、その行数分だけキーボードから入力された文字をディスプレイに出力する。 [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。' :- '入力した1桁の整数を行数と解釈し、 [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_行数), 'その後、', 'その行数分だけキーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。'(_行数),!. '入力した1桁の整数を行数と解釈し、 [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_行数) :- '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数), 行数と解釈し(_入力した1桁の整数,_行数). '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数) :- '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。'(_入力した1桁の整数),!. '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数) :- write('Input error 再入力をお願いします\n'), '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数). '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。'(_入力した1桁の整数) :- 行入力(_行文字列), get_term_from_atom(_行文字列,_入力した1桁の整数,[]), integer(_入力した1桁の整数), number_chars(_入力した1桁の整数,[_]),!. 行数と解釈し(_入力した1桁の整数,_行数) :- _入力した1桁の整数 = _行数. 'その後、'. 'その行数分だけキーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。'(_行数) :- reawmode, between(1,_行数,_行目), 'キーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。', _行目 = _行数, norawmode. 'キーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。' :- repeat, get_char(_文字), put_char(_文字), _文字 = '\n',!. 行入力(_行文字列) :- get_char(_文字), 行文字ならび(_文字,_行文字ならび), atom_chars(_行文字列,_行文字ならび). 行文字ならび(end_of_file,[]) :- !. 行文字ならび('\n',[]) :- !. 行文字ならび(_文字,[_文字|R]) :- get_char(_次の文字), 行文字ならび(_次の文字,R). rawmode :- shell('stty raw -echo',_). norawmode :- shell('stty -raw echo',_). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # # かたやん印刷所では、いまの時代においてもグーテンベルグ印刷にこだわって印刷をしています。 # グーテンベルグ印刷とは、活版(活字を組み合わせて作った版)で印刷する方法です。(Wikipedia) # # かたやん印刷所の所長かたやんは、使った活字を元の場所に戻さないので、 # いつも活字を入れているボックスはぐちゃぐちゃで、 # ほしい活字をすぐに見つけ出すことができません。 # # そこで見かねた印刷所の副所長エミーは、活字を入れているボックスビデオで撮影し、 # 画像解析し、ボックスのどこにどの活字があるかを解析し、 # ほしい文字列の活字がどこにあるか瞬時にみつけだすプログラミングを作ることにしました。 # # 現状の状態のボックスは以下のようになっています。 # # # 6×6のボックスの中から"PRO, PROGRAMMER"という活字を探し出したいです。 # カンマやスペースは1つの活字としてカウントします。 # ですので、今回は文字13個、カンマ1個、スペース1個の合計15個の活字が必要です。 # 一度使った活字は2回使うことはできません。 # # 活字の場所は、(縦番号,横番号)で表すと以下のような順番で活字を取り出すことができます。 # 縦番号は上から下の方向に、横番号は左から右の方向に、1から数えます。 # 1,4 = P # 2,1 = R # 1,6 = O # 5,2 = , # 5,4 = space # 2,2 = P # 3,4 = R # 4,5 = O # 5,1 = G # 4,3 = R # 1,1 = A # 2,5 = M # 6,1 = M # 2,4 = E # 6,6 = R # # # 上記の例では、例えば"P"という文字が2回でてきますが、(1,4)と(2,2)にある"P"はどちらを先につかってもかまいません。 # また場所の特定は1つのみ記述すればよいです。すべての場所番号を書く必要はありません。 # # 画像解析したボックスのデータはCSVで出力されます。 # ボックスのデータを使ってほしい文字列を作るための活字の在り処を探しだしてください。 # # ■資料 # gutenberg.zip # zipファイルを解凍すると以下のファイルが入っています。 # # gutenberg.csv # このボックスから"STAY HUNGRY, STAY FOOLISH"という活字を取り出してください。 # 文字21個、カンマ1個、スペース3個で、合計25個の活字が必要です。 # # answer.txt # 解答用テキストファイルです。 # # ■解答方法 # 解答用テキストファイル(answer.txt)を完成させ、アップロードしてください。 # ※解答用テキストファイル(answer.txt)以外のファイル形式(zipなど)をアップロードした場合は評価対象外となります。 # '20×20のボックスの生成' :- open('gutenberg.csv',read,Instream), '20×20のボックスの生成'(Instream,_20掛ける20のボックス), close(Instream), assertz('20×20のボックス'(_20掛ける20のボックス)). '20×20のボックスの生成'(Instream,[]) :- at_end_of_stream(Instream),!. '20×20のボックスの生成'(Instream,[L|R]) :- get_line(Instream,Line), split(Line,['\t'],L), '20×20のボックスの生成'(Instream,R). '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス) :- atom_chars(_ある文字列,_文字ならび), '20×20のボックスの中からある文字列を取り出す'(_文字ならび,_20掛ける20のボックス,L), 解の表示(L). '20×20のボックスの中からある文字列を取り出す'([],_20掛ける20のボックス,[]) :- !. '20×20のボックスの中からある文字列を取り出す'([_文字|_残り文字ならび],_20掛ける20のボックス_1,[[_文字,_行目,_列目]|R]) :- ある文字を取り出す(_文字,_20掛ける20のボックス_1,1,_列目,_20掛ける20のボックス_2), '20×20のボックスの中からある文字列を取り出す'(_残り文字ならび,_20掛ける20のボックス_2,R). ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行_2|R_1]) :- nth1(_列目,_行,_文字), 行を更新する(_行,_列目,_行_2),!. ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行|R_2]) :- _行目_2 is _行目 + 1, ある文字を取り出す(_文字,R_1,_行目_2,_列目,R_2). 行を更新する(_行,_列目,_行_2) :- length([_|L1],_列目), append(L1,[_|R],_行), append(L1,[''|R],_行_2),!. 解の表示(L) :- tell('ans.txt'), forall(member([_文字,_行目,_列目],L),writef('%t,%t,%t\n',[_文字,_行目,_列目])), told. get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). split('',_,[],[]) :- !. split(_文字列,_区切り文字列ならび,[_区切り文字列|R3],[_副文字列|R4]) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R3,R4). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), atom_length(_区切り文字列,_長さ), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). :- '20×20のボックスの生成'(_CSVファイル). :- '20×20のボックス'(_20掛ける20のボックス), '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス). % 以下のサイトは % スケルトン 文字列の要素文字から重複を許しN文字の文字列を作る(_文字列,N,_N文字の文字列) :- length(L,N), 文字列の要素文字から重複を許しN文字の文字列を作る(_文字列,[],L,_N文字の文字列). 文字列の要素文字から重複を許しN文字の文字列を作る(_文字列,L,L,_N文字の文字列) :- atom_chars(_N文字の文字列,L),!. 文字列の要素文字から重複を許しN文字の文字列を作る(_文字列,L1,L,_N文字の文字列) :- sub_atom(_文字列,_,1,_,_文字), 文字列の要素文字から重複を許しN文字の文字列を作る(_文字列,[_文字|L1],L,_N文字の文字列). % 以下のサイトは # 出題: http://toro.2ch.net/test/read.cgi/tech/1387257592/395 # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 同じ文字の4回以上の繰り返しを3回にしたい # # ●対象データ # ああああああああああああああああああいいいいいいいいいいいいいいいうえおおおおおおおおおおおおおお # # ●希望する結果 # あああいいいうえおおお 同じ文字の4回以上の繰り返しを3回にしたい(_文字列,_置換した文字列) :- atom_chars(_文字列,Chars_1), ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(Chars_1,Chars_2), atom_chars(_置換した文字列,Chars_2). ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([],[]). ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([A,A,A,A|R1],[A,A,A|R2]) :- ならびの先頭からの指定要素を読み飛ばす(R1,A,R1_1), ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(R1_1,R2),!. ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([A|R1],[A|R2]) :- ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(R1,R2),!. ならびの先頭からの指定要素を読み飛ばす([],_,[]) :- !. ならびの先頭からの指定要素を読み飛ばす([A|R],B,[A|R]) :- \+(A = B),!. ならびの先頭からの指定要素を読み飛ばす([A|R1],A,R2) :- ならびの先頭からの指定要素を読み飛ばす(R1,A,R2). % 以下のサイトは # twitter_by_@mog_shi_20140225 # #  【ググった?】 #      /      \ #    YES        NO #   /            \ # 【見つかった?】       死ね #   |    | #   YES   NO #   |     \ # じゃあ聞くな  なら、無ぇよ # % % ?- ググリ信仰(_御託宣). % ググッた? YES % 見つかった? NO % _御託宣 = じゃ、無ぇよ. % true. % ?- ググリ信仰(_御託宣) :- '【ググった?】'(_答え), ググッた(_答え,_御託宣). ググッた('YES',_御託宣) :- '【見つかった?】'(_答え), 見つかった(_答え,_御託宣),!. ググッた('NO','死ね'). 見つかった('YES',じゃあ聞くな). 見つかった('NO','なら、無ぇよ'). '【ググった?】'(_答え) :- write('ググった? '), get_line(_答え), member(_答え,['YES','NO']),!. '【ググった?】'(_答え) :- '【ググった?】'(_答え). '【見つかった?】'(_答え) :- write('見つかった? '), get_line(_答え), member(_答え,['YES','NO']),!. '【見つかった?】'(_答え) :- '【見つかった?】'(_答え). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # # シェル経由の他言語インターフェイス shs/3 です。 # shs(Command,_コマンドへの入力ならび,_コマンドからの出力ならび) :- popen(Command,Outstream,Instream), コマンドへの入力(Outstream,_コマンドへの入力ならび), close(Outstream), コマンドからの出力の収集(Instream,_コマンドからの出力ならび), close(Instream). popen(Command,Outstream,Instream) :- open(pipe(Command),write,Outstream), open(pipe(Outstream),read,Instream). コマンドへの入力(Outstream,_コマンドへの入力ならび) :- tell(Outstream), forall(member(_入力行,_コマンドへの入力ならび),writef('%t\n',[_入力行])), told. コマンドからの出力の収集(Instream,[]) :- at_end_of_stream(Instream),!. コマンドからの出力の収集(Instream,[_行|R]) :- get_line(Instream,_行), コマンドからの出力の収集(Instream,R). 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). % 以下のサイトは shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/885 # 夜分遅くに申し訳ございません… # 本日9時提出の課題を今になって気づいたのですが、私の頭ではさっぱりわからないのでお助け下さい… # # [1]プログラミングC # [2] 問題文(含コード&リンク): # 問1:以下の実行結果に示すような、3つの実数を入力した後、最大値と最小値の差を求めるプログラムを作成せよ。 # ※例 # 3つの整数を入力してください。 # na=12 # nb=65 # nc=44 # 65と12の差は53です。 # # 問2:以下の文字列(programming_jissyu)が配列に格納されているとする。 # この文字列を任意の位置で2つ分割して表示するプログラムを作成せよ。 # ※例 # 難文字目で分割しますか:11 # 文字列の前半 # programming # 文字列の後半 # _jissyu # '問1:以下の実行結果に示すような、3つの整数を入力した後、最大値と最小値の差を求めるプログラムを作成せよ。 ※例 3つの整数を入力してください。 na=12 nb=65 nc=44 65と12の差は53です。' :- '3つの整数を入力した後、'(_3つの整数), 最大値と最小値の差(_3つの整数,_最大値,_最小値,_最大値と最小値の差), writef('%tと%tの差は%tです。',[_最大値,_最小値,_最大値と最小値の差]). '3つの整数を入力した後、'(_3つの整数) :- write('3つの整数を入力してください。\n'), findall(_整数,( member(A,[na,nb,nc]), writef('%t=',[A]), 整数を得る(_整数)), _3つの整数). 最大値と最小値の差(_3つの整数,_最大値,_最小値,_最大値と最小値の差) :- 最大値(_3つの整数,_最大値), 最小値(_3つの整数,_最小値), _最大値と最小値の差 is _最大値 - _最小値. 最大値(_整数ならび,_最大値) :- select(N,_整数ならび,R), forall(member(M,R),M =< N). 最小値(_整数ならび,L_最小値) :- select(N,_整数ならび,R), forall(member(M,R),M >= N). 整数を得る(_整数) :- 一行読み込む(Line), '診断: 整数を得る'(Line,_整数),!. 整数を得る(_整数) :- 整数を得る(_整数). '診断: 整数を得る'(Line,_整数) :- read_term_from_atom(Line,_整数,[]), integer(_整数),!. '診断: 整数を得る'(Line,_整数) :- writef('入力された値"%t"から整数は得られません。再入力をお願いします。\n',[Line]), fail. 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/837 # [2] 配列の大きさ6で、それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。 # 'ならびの要素数6で、それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。'(_ならび) :- 'ならびの要素数6で、'(_ならび), 'それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。'(_ならび). 'それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。'(_ならび) :- 'それを超えると受け取れないようにする。'(_ならび),!. 'それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。'([_正の整数|R]) :- '整数を得る。負の数を入力した場合、入力処理を中断する。'(正の整数,_正の整数 >= 0,_正の整数), 'それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。'(R). 'それを超えると受け取れないようにする。'([]). '整数を得る。負の数を入力した場合、入力処理を中断する。'(_正の整数) :- 整数を得る(_整数), '負の数を入力した場合、入力処理を中断する。'(_整数,_正の整数). 整数を得る(_整数) :- get_line(Line), '診断: 整数入力'(Line,_整数). 整数を得る(_整数) :- 整数を得る(_整数). '診断: 整数入力'(Line,_整数) :- get_term_from_atom(Line,_整数), integer(_整数),!. '診断: 整数入力'(Line,_整数) :- writef('入力された行"%t"からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '負の数を入力した場合、入力処理を中断する。'(_整数,_正の整数) :- _整数 < 0, writef('入力された整数"%t"は正の整数ではありませんから\n入力と見なされません。\n',[_整数]), !, fail. '負の数を入力した場合、入力処理を中断する。'(_正の整数,_正の整数). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/745 # [2] キーボードから読み込む、実数の3乗を求めて表示するプログラム(floatを用いて) # 'キーボードから実数を読み込む、実数の3乗を求めて表示する' :- キーボードから実数を読み込む(_実数), 実数の3乗を求めて(_実数,_実数の3乗), 表示する(_実数,_実数の3乗). キーボードから実数を読み込む(_実数) :- get_line(_行), 実数入力検査(_行,_実数),!. キーボードから実数を読み込む(_実数) :- キーボードから実数を読み込む(_実数). 実数入力検査(_行,_実数) :- read_term_from_atom(_行,_実数,[]), float(_実数),!. 実数入力検査(_行,_実数) :- writef('入力された%tは実数ではありません。再入力をお願いします。\n',[_行]), fail. 実数の3乗を求めて(_実数,_実数の3乗) :- _実数の3乗 is _実数 ^ 3. 表示する(_実数,_実数の3乗) :- writef('%t ^ 3 = %t\n',[_実数,_実数の3乗]). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/696 # [1] 授業単元: Cプログラミング # [2] 問題文(含コード&amp;リンク): データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が # 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の # 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 # 探索は二分探索法を使いソートにはクイックソートを使うこと。 # # 表示は以下のようにすること。 # Input A Student Number: 14【Enter】 # Ranking : #269 /*最高得点は1位とせよ.*/ # Subject A : 86 # Subject B : 59.1 # Subject C : 220.42 # Total : 365.52 # # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/697 # 【備考】 # 科目 A の得点は int 型,科目 B,C の得点は double 型で扱うこと. # 合計点が同じになる学生はいないということは既知とせよ. # データの人数は 1000 人であることもわかっているとせよ. # 学籍番号には抜けがある.学籍番号が存在しない場合は,”No data”と表示するようにせよ. # 雛型 (121.c) を用いよ.main 関数は完成しているので,main 関数内で呼び出している関数を作成せよ. # 'データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 探索は二分探索法を使いソートにはクイックソートを使うこと。' :- 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび), 合計得点の順位表を作る(_学生成績ならび,_合計得点の順位表), キーボードから入力された学籍番号の(_学籍番号), 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績), '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績). 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび) :- get_lines('rep_data.txt',Lines), findall(L,( member(_行,Lines), split(_行,[','],L)), _学生成績ならび). 合計得点の順位表を作る(_学生成績ならび,_合計得点の重複要素を許す降順ならび) :- findall(_合計,( member([_,A,B,C],_学生成績ならび), _合計 is A + B + C), _合計得点ならび), 重複要素を許す降順整列(_合計得点ならび,_合計得点の重複要素を許す降順ならび). キーボードから入力された学籍番号の(_学籍番号) :- 整数を得る(学籍番号,_学籍番号 >= 0,_学籍番号). キーボードから入力された学籍番号の(_学籍番号) :- キーボードから入力された学籍番号の(_学籍番号). 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績) :- length(Lines,_最大要素位置), 二分探索法を使い学生の成績を得る(1,_最大要素位置,_最大要素位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_要素位置,_要素位置,Lines,_学籍番号,_学生の成績) :- !, nth1(_要素位置,Lines,[_学籍番号|_学生の成績]). 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- succ(_要素位置_1,1,_要素位置_2),!, 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績), 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- _検索位置 is (_要素位置_1 + _要素位置_2) // 2, nth1(_検索位置,Lines,[_学籍番号_1|_学生の成績_1]), 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_学生の成績_1,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績,_学籍番号,_学生の成績) :- !. 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @< _学籍番号, 二分探索法を使い学生の成績を得る(_要素位置_1,_検索位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @> _学籍番号, 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_2,Lines,_学籍番号,_学生の成績). 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_1,Lines,[_学籍番号|_学生の成績]),!. 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_2,Lines,[_学籍番号|_学生の成績]). 重複要素を許す降順整列([],[]). 重複要素を許す降順整列([_軸要素|_残りならび],_合計得点の重複要素を許す降順ならび) :- 重複要素を許す降順分割(_軸要素,_残りならび,_軸要素と等しいか大きいならび,_軸要素より小さいならび), 重複要素を許す降順整列(_軸要素と等しいか大きいならび,_合計得点の重複要素を許す降順ならび_1), 重複要素を許す降順整列(_軸要素より小さいならび,_合計得点の重複要素を許す降順ならび_2), append(_合計得点の重複要素を許す降順ならび_1,[_軸要素|_合計得点の重複要素を許す降順ならび_2],_合計得点の重複要素を許す降順ならび). 重複要素を許す降順分割(_,[],[],[]) :- !. 重複要素を許す降順分割(_軸要素,[A|R],[A|R2],R3) :- A @>= _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). 重複要素を許す降順分割(_軸要素,[A|R],R2,[A|R3]) :- A @< _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績) :- _学生の成績 = [_科目Aの得点,_科目Bの得点,_科目Cの得点], _学生の合計得点 = _科目Aの得点+_科目Bの得点+_科目Cの得点, nth1(_順位,_合計得点の重複を許す降順ならび,_学生の合計得点), writef('学籍番号 :: %t\n順位 :: #%t\n,科目%t :: %t\n科目%t :: %t\n科目%t :: %t\n',[_学籍番号,_順位,'A',_科目Aの得点,'B',_科目Bの得点,'C',_科目Cの得点]). get_lines(Lines) :- get_lines(user_input,Lines). get_lines(Stream,Lines) :- findall(Line,( get_line(Stream,Line), ( Line=end_of_file,!,fail; true)), Lines). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/775 # お題:文字を円形に並べる。一番上が最初の文字。時計回りに等間隔で並べる。 # 半径は文字間隔が離れすぎず近すぎない程度になるよう適当に選ぶ。 # # '文字を円形に並べる。一番上が最初の文字。時計回りに等間隔で並べる。'(_文字列) :- atom_chars(_文字列,_文字ならび), 文字盤を用意する(_文字ならび,_文字盤), 文字盤に円形に文字を書き込む(_文字ならび,_文字盤), 文字を表示する(_文字盤). 文字盤を用意する(_文字ならび,_文字盤) :- length(_文字ならび,_文字数), '_文字数+1の文字盤を作る'(_文字数,_文字盤). '_文字数+1の文字盤を作る'(_文字数,_文字盤) :- _文字数_1 is _文字数 + 1, length(_文字盤,_文字数_1), findall(L,( length(L,_文字数_1)), _文字盤). 円形に文字を書き込む(_文字ならび,_文字盤) :- length(_文字ならび,_文字ならびの要素数), _半径 is _文字ならびの要素数 // 2, 点に文字を書き込む(0,_文字ならび,_文字ならびの要素数,_半径,_文字盤). 点に文字を書き込む(_,[],_,_,_文字盤) :- !. 点に文字を書き込む(_n,[_文字|R],_分割数,_半径,_文字盤) :- '_x,_yの座標点を得る'(_n,_半径,_分割数,_x,_y), '文字盤の_x,_yに_文字を埋める'(_x,_y,_文字,_文字盤), _n_2 is _n + 1, 点に文字を書き込む(_n_2,R,_分割数,_半径,_文字盤). '_x,_yの座標点を得る'(_n,_半径,_分割数,_x,_y) :- _x is truncate(sin((2 * pi) / _分割数 * _n + (pi / 2)) * _半径 + _半径 + 0.5), _y is truncate(cos((2 * pi) / _分割数 * _n + (pi / 2)) * _半径 + _半径 + 0.5). '文字盤の_x,_yに_文字を埋める'(_x,_y,_文字,_文字盤) :- nth1(_y,_文字盤,L), nth1(_x,L,_文字),!. 文字を表示する([]) :- !. 文字を表示する([L|R]) :- forall(member(A,L),変数は空白に埋めて文字を出力する(A)), write('\n'), 文字を表示する(R). 変数は空白に埋めて文字を出力する(A) :- var(A), write(' '),!. 変数は空白に埋めて文字を出力する(A) :- write(A). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/756 # お題:ジグザグに表示する。 # 例 # 123456789 #  ↓ # 1 3 5 7 9 # 2 4 6 8 # # The earth turns around the sun. #  ↓ # T e e r h t r s a o n h u . # h a t u n r u d t e s n # # 'ジグザグに表示する。'(_文字列) :- 文字列をならびに変換する(_文字列,_文字ならび), ジグザグになるように空白を挿入する(_文字ならび,_空白を挿入された文字ならび), 二行に分解して表示する(_空白を挿入された文字ならび). 文字列をならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). ジグザグになるように空白を挿入する([],[]). ジグザグになるように空白を挿入する([' '|R1],[' '|R2]) :- ジグザグになるように空白を挿入する(R1,R2),!. ジグザグになるように空白を挿入する([A|R1],[A,' ',' '|R2]) :- ジグザグになるように空白を挿入する(R1,R2). 二行に分解して表示する(L) :- 二つのならびに分解して(L,L1,L2), atom_chars(_第一行,L1), atom_chars(_第二行,L2), writef('%t\n%t\n',[_第一行,_第二行]). 二つのならびに分解して([],[],[]). 二つのならびに分解して([A],[A],[]). 二つのならびに分解して([A,B|R1],[A|R2],[B|R3]) :- 二つのならびに分解して(R1,R2,R3). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/576 # 西暦何年かを入力するとその年に月曜日が何回あるか数え # 52回なら1を、53回なら0を出力するプログラムお願いします… # # 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします # (0を入力したら終わりです) # # 入力できるのは1989〜5000です # # '西暦何年かを入力するとその年に月曜日が何回あるか数え 52回なら1を、53回なら0を出力するプログラムお願いします… 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします (0を入力したら終わりです) 入力できるのは1989〜5000です' :- '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_西暦ならび). '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび) :- findall(_西暦,( '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('西暦(1989~5000)を入力して下さい',_西暦),( _西暦=0,!,fail;true)),_西暦ならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([]). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([_西暦|_残りならび]) :- 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1), writef('%t年 %t\n',[_西暦,_0または1]), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_残りならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,_0または1). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,_0または1). うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,0) :- うるう年(_西暦), '1月1日が日曜か月曜の時は'(_西暦),!. うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,1) :- うるう年(_西暦). '1月1日が日曜か月曜の時は'(_西暦) :- 'Zellerの公式を用いて曜日を得る'(_西暦,1,1,_曜日を表す値,_曜日), member(_曜日,[日曜,月曜]). うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,0) :- \+(うるう年(_西暦)), 'Zellerの公式を用いて曜日を得る'(_西暦,1,1,_曜日を表す値,月曜),!. うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,1) :- \+(うるう年(_西暦)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- writef('%t ',[_催促文]), get_line(_入力行), '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦). '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('0',0) :- !. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦) :- read_term_from_atom(_入力行,_西暦,[]), integer(_西暦), between(1989,5000,_西暦),!. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_) :- writef('入力された文字列"%t"から1899年から5000年範囲の西暦が得られませんでした\n再入力をお願いします\n',[_入力行]), fail. get_line(Line) :- get_line(user_input,Line). get_line(Instream,Line) :- get_char(Instream,C), get_line_1(Instream,C,Chars), atom_chars(Line,Chars) . get_line_1(_,'\n',[]) :- !. get_line_1(_,end_of_file,[]) :- !. get_line_1(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_1(Instream,C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/667 # Cゲンガーの逆襲! # スレにコントリビュートするために問題作ったよ!! # 64ビット変数の基数62のハッシュを作ってみよう。 # あぁ、別に64ビットじゃなくてもいいや。とにかく基数62のハッシュを作ってみよう。 # これを知っていると、例えばURLの字数短縮したりとかまぁチョイチョイ使い道がある。 # 数学苦手だからこの程度しかできなくてごめんね。 # ちなみに62なのは、数字と、アルファベットの大文字小文字を全部足すと62になるから。 # 64のほうがキリがいいよね。 '64ビット変数の基数62のハッシュを作ってみよう。'(_64ビット整数) :- atom_chars('0123456789abcdefghijkomnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',_変換符号ならび), 基数62のハッシュを作る(_64ビット整数,_変換符号ならび,[],_ハッシュ値), writef('%t -> %t\n',[_64ビット整数,_ハッシュ値]),!. 基数62のハッシュを作る(0,_,L,_ハッシュ値) :- atomic_list_concat(L,_ハッシュ値),!. 基数62のハッシュを作る(_実,_変換符号ならび,L,_ハッシュ値) :- 基数62のハッシュ符号化(_実,_変換符号ならび,_商,_変換された符号), 基数62のハッシュを作る(_商,_変換符号ならび,[_変換された符号|L],_ハッシュ値). 基数62のハッシュ符号化(_実,_変換符号ならび,_商,_変換された符号) :- _剰余 is _実 mod 62, _商 is _実 // 62, nth0(_剰余,_変換符号ならび,_変換された符号). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/642 # お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 # "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を # 返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 # 例 # 1 # 11 # 21 # 1211 # 111221 # 312211 # 13112221 # 1113213211 # 31131211131221 # 13211311123113112211 # 11131221133112132113212221 # # '"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。"11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を返す。"1"から始めてこの操作(以下、"この操作"とする)を10回繰り返し、途中経過を表示する。' :- length(Ln,10), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],'1'). '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([],_文字列) :- !. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],_文字列) :- writef('%t\n',[_文字列]), この操作を(_文字列,_次の文字列), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,_次の文字列). この操作を(_文字列,_次の文字列) :- findall(_個数と連続した記号の結合文字列,( '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数), atomic_list_concat([_個数,_連続した記号],_個数と連続した記号の結合文字列)), _個数と連続した記号の結合文字列ならび), 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列). '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数) :- atom_chars(_文字列,_文字ならび), 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数). 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数) :- append([L1,L2,L3],_文字ならび), 'L2は_記号が_個数連続している'(L2,_連続した記号,_個数), '両隣は_連続した記号と異なる'(_連続した記号,L1,L3). '両隣は_連続した記号と異なる'(_連続した記号,L1,L3) :- \+((last(L1,A0),A0=_連続した記号)), \+((nth1(1,L3,A3),A3=_連続した記号)). 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列) :- atomic_list_concat(_個数と連続した記号の結合文字列ならび,_次の文字列). 'L2は_記号が_個数連続している'(L2,_記号,_個数) :- L2 = [_記号|R], all(R,_記号), length([_記号|R],_個数). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/642 # お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 # "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を # 返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 # 例 # 1 # 11 # 21 # 1211 # 111221 # 312211 # 13112221 # 1113213211 # 31131211131221 # 13211311123113112211 # 11131221133112132113212221 # # '"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。"11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を返す。"1"から始めてこの操作(以下、"この操作"とする)を10回繰り返し、途中経過を表示する。' :- length(Ln,10), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,'1'). '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([],_文字列) :- !. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],_文字列) :- writef('%t\n',[_文字列]), この操作を(_文字列,_次の文字列), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,_次の文字列). この操作を(_文字列,_次の文字列) :- findall(_個数と連続した記号の結合文字列,( '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数), atomic_list_concat([_個数,_連続した記号],_個数と連続した記号の結合文字列)), _個数と連続した記号の結合文字列ならび), 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列). '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数) :- atom_chars(_文字列,_文字ならび), 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数). 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数) :- append(L1,L2,L3,_文字ならび), 'L2は_記号が_個数連続している'(L2,_連続した記号,_個数), '両隣は_連続した記号と異なる'(_連続した記号,L1,L3). '両隣は_連続した記号と異なる'(_連続した記号,L1,L3) :- \+((last(L1,A0),A0=_連続した記号)), \+((nth1(1,L3,A3),A3=_連続した記号)). 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列) :- atomic_list_concat(_個数と連続した記号の結合文字列ならび,_次の文字列). 'L2は_記号が_個数連続している'(L2,_記号,_個数) :- L2 = [_記号|R], all(R,_記号), length([_記号|R],_個数). all([],_). all([V|R],V) :- all(R,V). append([],L2,L3,L) :- append(L2,L3,L). append([U|R1],L2,L3,[U|R4]) :- append(R1,L2,L3,R4). % 以下のサイトは '文字列で()の対応を取る'(_文字列,_前文字列,_括弧対応文字列,_後文字列) :- atom_chars(_文字列,_文字ならび), '文字ならびで()の対応を取る'(_文字ならび,_前文字ならび,_括弧対応文字ならび,_後文字ならび), atom_chars(_前文字列,_前文字ならび), atom_chars(_括弧対応文字列,_括弧対応文字ならび), atom_chars(_後文字列,_後文字ならび). '文字ならびで()の対応を取る'(_文字ならび,_前文字ならび,_括弧対応文字ならび,_後文字ならび) :- '文字ならびで()の対応を取る'(0,0,_文字ならび,_前文字ならび_1,_括弧対応文字ならび_1,_後文字ならび_1), '文字ならびで()の対応を非決定性に得る'(_前文字ならび_1,_括弧対応文字ならび_1,_後文字ならび_1,_前文字ならび,_括弧対応文字ならび,_後文字ならび). '文字ならびで()の対応を非決定性に得る'(_前文字ならび,_括弧対応文字ならび,_後文字ならび,_前文字ならび,_括弧対応文字ならび,_後文字ならび). '文字ならびで()の対応を非決定性に得る'(_前文字ならび_1,_括弧対応文字ならび_1,_後文字ならび_1,_前文字ならび,_括弧対応文字ならび,_後文字ならび) :- '文字ならびで()の対応を取る'(_後文字ならび_1,_前文字ならび_2,_括弧対応文字ならび,_後文字ならび), append(_前文字ならび_1,_括弧対応文字ならび_1,_前文字ならび_2,_前文字ならび),!. '文字ならびで()の対応を取る'(0,0,_文字ならび,_前文字ならび,['('|_括弧対応文字ならび],_後文字ならび) :- append(_前文字ならび,['('|R],_文字ならび),!, '文字ならびで()の対応を取る'(1,0,R,_括弧対応文字ならび,_後文字ならび),!. '文字ならびで()の対応を取る'(N,N,R,[],R) :- !. '文字ならびで()の対応を取る'(M,N,[')'|R1],[')'|R2],R) :- N_2 is N + 1, '文字ならびで()の対応を取る'(M,N_2,R1,R2,R). '文字ならびで()の対応を取る'(M,N,['('|R1],['('|R2],R) :- M_2 is M + 1, '文字ならびで()の対応を取る'(M_2,N,R1,R2,R). '文字ならびで()の対応を取る'(M,N,[A|R1],[A|R2],R) :- '文字ならびで()の対応を取る'(M,N,R1,R2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/542 # イマイチ出力や入力、パイプについて深く理解できなかったので質問します # よろしくお願いします。 # # [1] システムプログラム # [2] 一般の実行プログラムである/usr/bin/lessを子プロセスとして起動して、pipeを通して子プロセスの標準入力にデータ(複数行のテキスト)を渡すプログラムを作りなさい。 # '一般の実行プログラムである/usr/bin/lessを子プロセスとして起動して、 pipeを通して子プロセスの標準入力にデータ(複数行のテキスト)を渡すプログラムを作りなさい。'(_複数行のならび) :- '一般の実行プログラムを子プロセスとして起動して、 pipeを通して子プロセスの標準入力にデータ(複数行のテキスト)を渡す'('/usr/bin/less',_複数行ならび). '一般の実行プログラムを子プロセスとして起動して、 pipeを通して子プロセスの標準入力にデータ(複数行のテキスト)を渡す'(_実行プログラム,_複数行ならび) :- atomic_list_concat(_複数行ならび,'\n',_文字列), atom_chars(_文字列,_文字ならび), popen(_実行プログラム,_文字ならび). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/423 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 問題(戻り値がある場合の引数あり) # 円錐の半径rと高さhを入力し、円錐の体積を求めるプログラムを作りなさい。 # ただし、main関数で円錐の半径rと高さhの入力と計算された円錐の体積の表示を行い、 # 円錐の体積の計算はtaisekiという関数で行うこと。 # また、円周率は3.14を使用すること。 # # ../test/read.cgi/tech/1381909900/422に続きます # '円錐の半径rと高さhを入力し、円錐の体積を求めるプログラムを作りなさい。 ただし、主述語で円錐の半径rと高さhの入力と計算された円錐の体積の表示を行い、 円錐の体積の計算は体積という述語で行うこと。 また、円周率は3.14を使用すること。' :- 数を得る(円錐の半径r,_円錐の半径r), 数を得る(円錐の高さh,_円錐の高さh), '円錐の体積の計算と表示は体積という述語で行うこと。 また、円周率は3.14を使用すること。'(_円錐の半径r,_円錐の高さh,_円錐の体積), writef('半径%t,高さ%t の円錐の体積は %t\n',[_円錐の半径r,_円錐の高さh,_円錐の体積]). '円錐の体積の計算は体積という関数で行うこと。 また、円周率は3.14を使用すること。'(_円錐の半径r,_円錐の高さh,_円錐の体積) :- _円周率 = 3.14, 体積(_円錐の半径r,_円錐の高さh,_円周率,_円錐の体積). 体積(_円錐の半径r,_円錐の高さh,_円周率,_円錐の体積) :- _円錐の体積 is _円周率 * _円錐の半径r * _円錐の半径r * _円錐の高さh / 3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). n個の数を得る(_n,_催促文,_数ならび) :- length(_数ならび,_n), findall(_数,( 部分ならび(_数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 数を得る(_催促文,_数)), _数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出題場所 # # ●Regular Expressionの使用環境 # Python3.3 # # ●検索か置換か? # 置換 # # ●説明 # 均等割りにしているスペースを削除したい # 一文字ずつスペースが入っている文字のスペースを削除したい # # ●対象データ # あ い う え お # かき くけ ここ # # ●希望する結果 # あいうえお # かき くけ ここ # '一文字ずつスペースが入っている文字列のスペースを削除したい'(_文字列,_スペースを削除された文字列) :- atom_chars(_文字列,_文字ならび), '一文字ずつスペースが入っている文字ならびのスペースを削除したい'(_文字ならび,_スペースを削除された文字ならび), atom_chars(_スペースを削除された文字列,_スペースを削除された文字ならび). '一文字ずつスペースが入っている文字ならびのスペースを削除したい'([_文字],[_文字]) :- \+(_文字=' '). '一文字ずつスペースが入っている文字ならびのスペースを削除したい'([_文字,' '|R1],[_文字|R2]) :- '一文字ずつスペースが入っている文字ならびのスペースを削除したい'(R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/309 # # C500問って本にあった # # * # ** # *** # **** # ***** # ****** # ******* # ******** # ********* # ********** # ってのもいい問題かと 'C500問って本にあった * ** *** **** ***** ****** ******* ******** ********* ********** ってのもいい問題かと' :- atom_chars('**********',L), forall(append([H|R],_,L),(atomic_list_concat([H|R],S),writef('%t\n',[S])). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/53 # # # お題:nの階乗の末尾の連続した0の個数を求める。 # :- dynamic(階乗保存計算/2). 'nの階乗の末尾の連続した0の個数を求める。'(_n,_末尾の連続した0の個数) :- 階乗保存計算(_n,_nの階乗), 末尾の連続した0の個数(_nの階乗,_末尾の連続した0の個数). 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). 末尾の連続した0の個数(_nの階乗,_末尾の連続した0の個数) :- atom_chars(_nの階乗,L), append(_,L1,L), all(L1,'0'), length(L1,_末尾の連続した0の個数). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # お題: # 入力 # AND # # 出力 # DDDDD # DNNND # DNAND # DNNND # DDDDD # 囲み(_入力) :- atom_chars(_入力,[_中心の文字|_囲み文字ならび]), 囲み(_囲み文字ならび,[[_中心の文字]],_囲み), 出力(_囲み). 囲み([],_囲み,_囲み) :- !. 囲み([_文字|R],_囲み_1,_囲み) :- 文字で囲む(_文字,_囲み_1,_囲み_2), 囲み(R,_囲み_2,_囲み). 文字で囲む(_文字,_囲み_1,_囲み_2) :- 囲みの先頭と末尾に_文字の行を付加する(_文字,_囲み_1,_先頭と末尾に_文字の行を付加された囲み_1), 囲みの各行の先頭と末尾に_文字を付加する(_文字,_先頭と末尾に_文字の行を付加された囲み_1,_囲み_2). 囲みの先頭と末尾に_文字の行を付加する(_文字,_囲み,_先頭と末尾に_文字の行を付加された囲み_1) :- 転置(_囲み_1,_転置された囲み_1), 行の先頭と末尾に文字を付加する(_文字,_転置された囲み_1,_行の先頭と末尾に_文字を付加された転置された囲み_1), 転置(_行の先頭と末尾に文字を付加された転置された囲み_1,_先頭と末尾に_文字の行を付加された囲み_1). 囲みの各行の先頭と末尾に_文字を付加する(_文字,_囲み,_行の先頭と末尾に_文字を付加された囲み) :- findall(_先頭と末尾に_文字を付加された行,( member(_行,_囲み), append([_文字|_行],[_文字],_先頭と末尾に_文字を付加された行)), _行の先頭と末尾に_文字を付加された囲み). 出力(_囲み) :- forall(member(_行,_囲み),(atomic_list_concat(_行,_行文字列),writef('%t\n',[_行文字列])). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # # ●Regular Expressionの使用環境 # Visual C# # # ●検索か置換か? # 検索 # # ●説明 # 同じ文字が5回以上繰り返されている箇所のある行を検索したい # # ●対象データ→結果 # うわあああああい → マッチ # aaaaaaaa      → マッチ # あいあいあい   → マッチせず # 同じ文字が5回以上繰り返されている箇所のある行を検索したい(_文字列,_行) :- split(_文字列,['\n'],_行ならび), 同じ文字が5回以上繰り返されている箇所のある行ならびを検索する(_行ならび,_行). 同じ文字が5回以上繰り返されている箇所のある行ならびを検索する(_行ならび,_行) :- nth1(_,_行ならび,_行), 同じ文字が5回以上繰り返されている箇所のある行(_行). 同じ文字が5回以上繰り返されている箇所のある行(_文字列) :- sub_atom(_文字列,_,5,_,_適合文字列), atom_chars(_適合文字列,[A,A,A,A,A]),!. % 以下のサイトは # "0000000000"のような文字列を用意しておいて、"123" のような # 任意の文字列を"0000000123"のように置き換えるのって簡単にできますか? # 置き換える方の文字列は3桁じゃなくて、いろんな数字があり得ます。 # # C言語でいうsprintf(%10d, 123)みたいなフォーマットを正規表現で簡単に # 再現できますか? '"0000000000"のような文字列を用意しておいて、"123" のような 任意の文字列を"0000000123"のように置き換えるのって簡単にできますか? 置き換える方の文字列は3桁じゃなくて、いろんな数字があり得ます。'(_置換対象文字列,_置換文字列,_置換された文字列) :- atom_length(_置換文字列,_文字長), sub_atom(_置換対象文字列,S1,S2,S3), atom_length(S2,_文字長), atomic_list_concat([S1,_置換文字列,S3],_置換された文字列). % *** user: sub_atom / 4 *** sub_atom(A,H,X,T) :- atomic(X), atom_chars(A,L), atom_chars(X,XL), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,H,X,T) :- var(X), atom_chars(A,L), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), \+(XL = []), atom_chars(T,TL). % 以下のサイトは # # xxxx0xxxx # xxx000xxx # xx00000xx # # こういうピラミッドを作るコードを教えてください # 言語は何でも良いですけどコードが長くなるのはNGです # この例だと頂上の0は1個で、底辺は5個ですけど # 頂上n個、底辺k個、'0'と'x'の 文字は任意の文字を指定できるようなコードをおしえてください。 # また層は2個ずつちがいますけど、この部分も任意の値を指定できるようにしてください # # こういうのもあり # xx0xx # 00000 ピラミッドを作る(_基壇の幅,_頂上の数,_底辺の数,_段ごとの増分,_ピラミッドの文字,_周囲の文字) :- _左右の捌きの文字数初期値 is (_基壇の幅 - _頂上の数) // 2, _段数 is (_底辺の数 - _頂上の数) // _段ごとの増分, ピラミッドを作る(_段数,_左右の捌きの文字数初期値,_段ごとの増分,_頂上の数,_ピラミッドの文字,_周囲の文字). ピラミッドを作る(0,_,_,_,_,_) :- !. ピラミッドを作る(_段数,_左右の捌き文字数,_段ごとの増分,_ピラミッドの段の文字数,_ピラミッドの文字,_周囲の文字) :- 左右の捌き(_左右の捌き文字数,_段ごとの増分,_周囲の文字,_捌き文字列,_左右の捌き文字数_1), ピラミットの段(_ピラミッドの段の文字数,_段ごとの増分,_ピラミッドの文字,_捌き文字列,_ピラミッドの段の数_2), _段数_1 is _段数 - 1, ピラミッドを作る(_段数_1,_左右の捌き文字数_1,_段ごとの増分,_ピラミッドの段の数_2,_ピラミッドの文字,_周囲の文字). 左右の捌き(_左右の捌き文字数,_段ごとの増分,_周囲の文字,_捌き文字列,_左右の捌き文字数_1) :- n個の連続した文字列(_左右捌きの文字数,_周囲の文字,_左右捌きの文字列), _左右の捌き文字数_1 is _左右の捌き文字数 - _段ごとの増分 // 2. ピラミットの段(_ピラミッドの段の文字数,_段ごとの増分,_ピラミッドの文字,_捌き文字列,_ピラミッドの段の数_2) :- n個の連続した文字列(_ピラミッドの段の文字数,_ピラミッドの文字,_ピラミッド段の文字列), writef('%t%t%t\n',[_捌き文字列,_ピラミット段の文字列,_捌き文字列]), _ピラミッドの段の文字数_2 is _ピラミッドの段の文字数 + _段ごとの増分. n個の連続した文字列(_n個,_文字,_n個の連続した文字列) :- length(L,_n個), all(L,_文字), atom_chars(_n個の連続した文字列,L). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # いろいろな環境の中には、先読みの否定である (?! ) が # 使えない環境があります。 このような環境では、 # 「ABC」 という文字列を含まない # というような、文字列の否定をする正規表現を作るのは # とても難しい作業になります # ※ (?! ) が使える環境での作り方は こちら 。 # # では、例として、 # 以下のようなテキストにマッチする正規表現を考えてみましょう★ # ・ テキストの先頭が AA から始まる # ・ テキストの末尾が AA で終わる # ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない # '・ テキストの先頭が AA から始まる ・ テキストの末尾が AA で終わる ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト) :- sub_atom(_テキスト,'AA',S2,'AA',_,_,_), \+(sub_atom(S2,_,_,_,'AA')). %%%%%%%% sub_atom/7 %%%%%%%% sub_atom(A,H,X,T,HL,XL,TL) :- atom(A), atom_chars(A,Chars), append(HL,XL,TL,Chars), 'HL_XL_TL_H_X_T'(HL,XL,TL,H,X,T). 'HL_XL_TL_H_X_T'(HL,XL,TL,H,X,T) :- \+(XL=[]), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). %%%%%%%% append/4 %%%%%%%% append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # いろいろな環境の中には、先読みの否定である (?! ) が # 使えない環境があります。 このような環境では、 # 「ABC」 という文字列を含まない # というような、文字列の否定をする正規表現を作るのは # とても難しい作業になります # ※ (?! ) が使える環境での作り方は こちら 。 # # では、例として、 # 以下のようなテキストにマッチする正規表現を考えてみましょう★ # ・ テキストの先頭が AA から始まる # ・ テキストの末尾が AA で終わる # ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない # '・ テキストの先頭が AA から始まる ・ テキストの末尾が AA で終わる ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト) :- sub_atom(_テキスト,_,_,_,'AA',S2,'AA',_,_,_), \+(sub_atom(S2,_,_,_,'AA')). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% sub_atom(A,S,Len,R,H,X,T,HL,XL,TL) :- atomic(X), atom_chars(A,L), atom_chars(X,XL), subatom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,Len,R,H,X,T,HL,XL,TL) :- var(X), atom_chars(A,L), subatom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), \+(XL = []), atom_chars(T,TL). sub_atom_2(L,S,Len,R,L1,XL,L2) :- append(L1,XL,L2,L), length_cut(L1,S), length_cut(L2,R), length_cut(XL,Len). length_cut(L,Len) :- length(L,Len),!. % 以下のサイトは # 出典 :: Regular Expression(正規表現) Part11 #535 # "123,456,789"から","だけを削除して"123456789"にするにはどうすればいいの? # 前後が数字になっている","だけにマッチするのって正規表現だけでできるの? # "[0-9],[0-9]だと前後の数字にもマッチしちゃうよね。 '"123,456,789"から","だけを削除して"123456789"にするにはどうすればいいの? 前後が数字になっている","だけにマッチするのって正規表現だけでできるの? "[0-9],[0-9]だと前後の数字にもマッチしちゃうよね。'(_文字列,_カンマを削除した文字列) :- 文字列からアラビア数字に囲まれたカンマを削除する(_文字列,_カンマを削除した文字列). 文字列からアラビア数字に囲まれたカンマを削除する(_文字列,_カンマを削除した文字列) :- sub_atom(_文字列,_開始点,_検索語の長さ,_残り長さ,S1,',',S3,L1,L2,L3),!, 検索語の前後はアラビア数字である(_文字列,_開始点,_検索語の長さ), 文字列からアラビア数字に囲まれたカンマを削除する(S1,S3,_カンマを削除した文字列). 文字列からアラビア数字に囲まれたカンマを削除する(S1,S3,_カンマを削除した文字列) :- atomic_list_concat([S1,S3],_カンマを削除した文字列). 文字列からアラビア数字に囲まれたカンマを削除する(S1,S3,_カンマを削除した文字列) :- 文字列からアラビア数字に囲まれたカンマを削除する(S3,_カンマを削除した文字列_2), atomic_list_concat([S1,_カンマを削除した文字列_2],_カンマを削除した文字列). 検索語の前後はアラビア数字である(_文字列,_開始点,_検索語の長さ) :- 検索語の前はアラビア数字である(_文字列,_開始点), 検索語の後はアラビア数字である(_文字列,_開始点,_検索語の長さ). 検索語の前はアラビア数字である(_文字列,_開始点) :- _開始点_1 is _開始点 - 1, sub_atom(_文字列,_開始点_1,1,_,A), アラビア数字(A). 検索語の後はアラビア数字である(_文字列,_開始点,_検索語の長さ) :- _開始点_2 is _開始点 + _検索語の長さ, sub_atom(_文字列,_開始点_2,1,_,A), アラビア数字(A). アラビア数字('0'). アラビア数字('1'). アラビア数字('2'). アラビア数字('3'). アラビア数字('4'). アラビア数字('5'). アラビア数字('6'). アラビア数字('7'). アラビア数字('8'). アラビア数字('9'). sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- atom(A), sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), N is S + L, sub_atom(A,N,R,_,T), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- var(A), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL), length(HL,S), length(XL,L), length(TL,R), concat_atom([H,X,T],A), sub_atom(A,S,L,R,H,X,T,HL,XL,TL). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/528 # # ●Regular Expressionの使用環境 # サクラエディタ # # ●検索か置換か? # 置換 # # ●説明 # 1行の中に同じ単語が2連続しているのを1つだけにしたいです。 # # ●対象データ # appleapple # orangeorange # grapegrape # # ●希望する結果 # apple # orange # grape # # よろしくお願いします。 # # '1行の中に同じ単語が2連続しているのを1つだけにしたいです。'(_文字列,_短縮した文字列) :- findmax([Len,S],( sub_atom(_文字列,_,Len,_,S1,_,S3,_,L2,_), append(L,L,L2), atom_chars(S4,L), atomic_list_concat([S1,S4,S3],S)), [_,_短縮した文字列]). % 以下のサイトは # # お題:テキストファイルを読み込み、その中で最もよく使われている単語ベスト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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/782 # # 読み込むiniファイルのセクション名を、string配列にpushし続けて、 # セクション名すべてpushしたらループから外れるって仕組みなんですけど、tmp = strtok_s()の代入がうまくいきません # どうしたらいいですか # # char SectionNames[1024]; # GetPrivateProfileSectionNames(SectionNames,1024,FilePath.c_str()); # # char *WTF;//謎の内部パラメータ,strtok_sの仕様 # vector<string> SquadNameList; # SquadNameList.push_back(strtok_s( SectionNames, "0" ,&WTF)); # # for(int i=0; i < SquadNameList.size();i++){ # char tmp[256]; # tmp = strtok_s( NULL, "0" ,&WTF); # if( tmp != NULL){ # SquadNameList.push_back(tmp); # } # } # # '読み込むiniファイルのセクション名を、string配列にpushし続けて、 セクション名すべてpushしたらループから外れるって仕組みなんですけど、 tmp = strtok_s()の代入がうまくいきませんどうしたらいいですか'(_iniファイル,_セクション名ならび) :- 読み込むiniファイルの(_iniファイル,_iniファイル文字ならび), 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_iniファイル文字ならび,[],_セクション名ならび). 読み込むiniファイルの(_iniファイル,_iniファイル文字ならび) :- get_chars(_iniファイル,_iniファイル文字ならび). 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_iniファイル文字ならび,L1,_セクション名ならび) :- セクション名を(_iniファイル文字ならび,_セクション名,_セクション名後の文字ならび), 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_セクション名後の文字ならび,[_セクション名|L1],_セクション名ならび). 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_iniファイル文字ならび,_セクション名ならび,_セクション名ならび). セクション名を(_iniファイル文字ならび,_セクション名,_セクション名後の文字ならび) :- append(L0,['['|_セクション名からの文字ならび],_iniファイル文字ならび), 'L0に[も]も存在しない'(L0), append(L0_1,[']'|_セクション名後の文字ならび],_セクション名からの文字ならび), 'L0_1に]が存在しない'(_セクション名後の文字ならび), atom_chars(_セクション名,_セクション名後の文字ならび). 'L0に[も]も存在しない'(L0) :- \+(member('[',L0)), \+(member(']',L0)),!. 'L0_1に]が存在しない'(L0_1) :- \+(member(']',L0_1)). % 以下のサイトは # プログラム: 言語(a) を受理するNDFA # # a # ------------------------- # 状態_0 | # <------------------------ # # # 図 簡単なオートマトン # '次の文字列を非決定性有限オートマトンが言語(a)を受理するまで検索する'(_文字列,_前文字列,_受理された文字列,_後文字列) :- '文字列を、前・受理された・後文字ならび候補に分解する'(_文字列,_前文字ならび,_受理された文字ならび,_後文字ならび), '言語(a)を受理する非決定性有限オートマトン'(_受理された文字ならび), '各部文字ならびを文字列に変換する'(_前文字ならび,_受理された文字ならび,_後文字ならび,_前文字列,_受理された文字列,_後文字列). '文字列を、前・受理された・後文字ならび候補に分解する'(_文字列,_前文字ならび,_受理された文字ならび,_後文字ならび) :- atom_chars(_文字列,_文字ならび), append([_前文字ならび,_受理された文字ならび,_後文字ならび],_文字ならび), \+(_受理された文字ならび=[]). '各部文字ならびを文字列に変換する'(_前文字ならび,_受理された文字ならび,_後文字ならび,_前文字列,_受理された文字列,_後文字列) :- atom_chars(_前文字列,_前文字ならび), atom_chars(_受理された文字列,_受理された文字ならび), atom_chars(_後文字列,_後文字ならび). '言語(a)を受理する非決定性有限オートマトン'(_記号ならび) :- '言語(a)初期状態'(_状態), '言語(a)を受理する非決定性有限オートマトン'(_状態,_記号ならび). '言語(a)を受理する非決定性有限オートマトン'(_状態,[_記号|R]) :- '言語(a)'(_状態,_記号,_状態_1), '言語(a)を受理する非決定性有限オートマトン'(_状態_1,R). '言語(a)を受理する非決定性有限オートマトン'(_状態,[]) :- '言語(a)終了状態'(_状態). '言語(a)初期状態'(状態_0). '言語(a)終了状態'(状態_0). '言語(a)'(状態_0,a,状態_0). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/767 # # どなたか助けてください。困ってます。 # [1] 授業単元: 課題 # [2] 問題文: テキストファイル test.txtを呼び出し、平滑化したデータを # 違うファイルtest1.txtに出力しなさい。 # 'テキストファイル test.txtを呼び出し、平滑化したデータを違うファイルtest1.txtに出力しなさい。' :- 'テキストファイル test.txtを呼び出し、平滑化したデータを'(_平滑化したデータならび), '違うファイルtest1.txtに出力しなさい。'(_平滑化したデータならび). 'テキストファイル test.txtを呼び出し、平滑化したデータを'(_平滑化したデータならび) :- 'テキストファイル test.txtを呼び出し、'(_データならび), 平滑化したデータを'(_データならび,_平滑化したデータならび). 'テキストファイル test.txtを呼び出し、'(_データならび) :- get_chars('test.txt',Chars), atom_chars(Atom,Chars), split(Atom,[' ','\n','\t'],_データならび). 平滑化したデータを(_データならび,_平滑化したデータならび). 'テキストファイル test.txtを呼び出し、'(_データならび) :- get_chars('test.txt',Chars), atom_chars(Atom,Chars), split(Atom,[' ','\n','\t'],_データならび). 平滑化したデータを(_データならび,_平滑化したデータならび) :- 単純移動平均(_データならび,_平滑化したデータならび). 単純移動平均(_データならび,_平滑化したデータならび) :- length(L2,25), findall(_相加平均,( append(L1,L2,L3,_データならび), 相加平均(L2,_相加平均)), _平滑化したデータならび). '違うファイルtest1.txtに出力しなさい。'(_平滑化したデータならび) :- open('test1.txt',write,Outstream), '違うファイルtest1.txtに出力しなさい。'(Outstream,_平滑化したデータならび), close(Outstream). '違うファイルtest1.txtに出力しなさい。'(Outstream,[]). '違うファイルtest1.txtに出力しなさい。'(Outstream,[V|R]) :- writef('%t ',[V]), '違うファイルtest1.txtに出力しなさい。'(Outstream,R). % 以下のサイトは ある文字数以上の単語をすべて抽出する(_ある文字数以上の単語ならび) :- 形態素解析(_文字列,_形態素ならび), findall(_ある文字数以上の単語,( member(_ある文字数以上の単語,_形態素ならび), atom_length(_ある文字数以上の単語,_文字数), _文字数 >= _ある文字数), _ある文字数以上の単語ならび). 形態素解析(S,L) :- tmpnam(F), tell(F), writef('%t',[S]), told, 形態素解析サーバによる形態素解析(ファイル,F,L) . 形態素解析サーバによる形態素解析(_ファイル名,_形態素ならび) :- 形態素解析サーバー(_形態素解析サーバー), atomic_list_concat(['cat ',_ファイル名,' | ',_形態素解析サーバー],S), sh(S,L1), 形態素解析(L1,L2), 形態素解析_3(L2,L). 形態素解析_1([],[]) :- !. 形態素解析_1([['EOS'|_]|_],[]) :- !. 形態素解析_1([[A|_],[@,B|_]|R],[R1_1|R3]) :- 形態素解析_2(R,R1,R2), 形態素解析_2_重複削除([A,B|R1],[],R1_1), 形態素解析_1(R2,R3),!. 形態素解析_1([[A|_]|R],[B|R2]) :- mecabサーバーによる形態素解析(A,B,R,R2),!. 形態素解析_1([[A|_]|R],[A|R2]) :- jumanサーバーによる形態素解析(A,B,R,R2). mecabサーバーによる形態素解析(A,B,R,R2) :- 形態素解析サーバー(mecab), split(A,['\t'],AL), AL = [B|_], 形態素解析_1(R,R2),!. jumanサーバーによる形態素解析(A,B,R,R2) :- 形態素解析サーバー(juman), 形態素解析_1(R,R2),!. 形態素解析_2([],[],[]) :- !. 形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :- \+(A = (@)),!. 形態素解析_2([[@,A|_]|R],[A|R2],R3) :- 形態素解析_2(R,R2,R3),!. 形態素解析_3([],[]). 形態素解析_3([A|R],[A|R2]) :- \+(list(A)), '形態素解析_3(R,R2) . 形態素解析_3([A|R],[B|R2]) :- list(A), member(B,A), 形態素解析_3(R,R2) . 形態素解析_2_重複削除([],L1,L) :- reverse(L1,L),!. 形態素解析_2_重複削除([A|R],Y,X) :- member(A,Y), 形態素解析_2_重複削除(R,Y,X),!. 形態素解析_2_重複削除([A|R],Y,X) :- \+(member(A,Y)), 形態素解析_2_重複削除(R,[A|Y],X) . sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y), split(V,[' ',','],U)), X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは 偶数に一致させる(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,Len1,_,Len2,_適合文字列), 適合文字列は数字だけで構成される(_適合文字列), 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列), 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列), 適合文字列を数値に変換すると偶数になる(_適合文字列). 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列) :- sub_atom(_文字列,0,Len1,_,_前文字列), sub_atom(_文字列,_,Len2,0,_後文字列). 適合文字列は数字だけで構成される(_文字列) :- \+(_文字列=''), forall(sub_atom(_文字列,_,1,_,_数字),数字(_数字)). 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列) :- \+((sub_atom(_前文字列,_,1,0,A),数字(A))), \+((sub_atom(_後文字列,0,1,_,B),数字(B))). 適合文字列を数値に変換すると偶数になる(_適合文字列) :- 適合文字列を数値に変換すると(_適合文字列,_数値), 偶数になる(_数値). 適合文字列を数値に変換すると(_適合文字列,_数値) :- atom_chars(_適合文字列,Chars), number_chars(_数値,Chars). 偶数になる(N) :- 1 is N mod 2. 数字(A) :- A @>= '0', A @=< '9'. % 以下のサイトは 奇数に一致させる(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,Len1,_,Len2,_適合文字列), 適合文字列は数字だけで構成される(_適合文字列), 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列), 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列), 適合文字列を数値に変換すると奇数になる(_適合文字列). 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列) :- sub_atom(_文字列,0,Len1,_,_前文字列), sub_atom(_文字列,_,Len2,0,_後文字列). 適合文字列は数字だけで構成される(_文字列) :- \+(_文字列=''), forall(sub_atom(_文字列,_,1,_,_数字),数字(_数字)). 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列) :- \+((sub_atom(_前文字列,_,1,0,A),数字(A))), \+((sub_atom(_後文字列,0,1,_,B),数字(B))). 適合文字列を数値に変換すると奇数になる(_適合文字列) :- 適合文字列を数値に変換すると(_適合文字列,_数値), 奇数になる(_数値). 適合文字列を数値に変換すると(_適合文字列,_数値) :- atom_chars(_適合文字列,Chars), number_chars(_数値,Chars). 奇数になる(N) :- 1 is N mod 2. 数字(A) :- A @>= '0', A @=< '9'. % 以下のサイトは 奇数に一致させる(_文字列,_前文字列,_適合文字列,_後文字列) :- 数値候補の取り出し(L,L1,L2,L3,N), 1 is N mod 2, atom_chars(_前文字列,L1), atom_chars(_適合文字列,L2), atom_chars(_後文字列,L3). 数値候補の取り出し(L,L1,L2,L3,N) :- atom_chars(_文字列,L), append(L1,L2,L3,L), すべてが数字(L2), 'L1の最後の文字とL2の最初の文字は数字ではない'(L1,L2), number_chars(N,L2). すべてが数字([]). すべてが数字([A|R]) :- 数字(A), すべてが数字(R). 'L1の最後の文字とL2の最初の文字は数字ではない'(L1,L2) :- \+((last(L1,A),数字(A))), \+((L=[B|_],数字(B))). 数字(A) :- A @>= '0', A @=< '9'. % 以下のサイトは 偶数に一致させる(_文字列,_前文字列,_適合文字列,_後文字列) :- 数値候補の取り出し(L,L1,L2,L3,N), 0 is N mod 2, atom_chars(_前文字列,L1), atom_chars(_適合文字列,L2), atom_chars(_後文字列,L3). 数値候補の取り出し(L,L1,L2,L3,N) :- atom_chars(_文字列,L), append(L1,L2,L3,L), すべてが数字(L2), 'L1の最後の文字とL2の最初の文字は数字ではない'(L1,L2), number_chars(N,L2). すべてが数字([]). すべてが数字([A|R]) :- 数字(A), すべてが数字(R). 'L1の最後の文字とL2の最初の文字は数字ではない'(L1,L2) :- \+((last(L1,A),数字(A))), \+((L=[B|_],数字(B))). 数字(A) :- A @>= '0', A @=< '9'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/370 # # ●Regular Expressionの使用環境 # ActivePerl5.8 # # ●検索か置換か? # 検索 # # ●説明 # 連続する数を検索したい(1965から2011までの数) # # ●対象データ(配列内に格納) # 1952 # 1965 # 1986 # 2012 # 1972 # 2011 #  ・ #  ・ # ●希望する結果(配列の各要素を正規表現で検索して、マッチする要素だけ抽出) # 1965 # 1986 # 1972 # 2011 #  ・ #  ・ # # 配列の各要素が1955から2011までの数の場合にマッチする正規表現を教えてください # # '●検索か置換か? 検索 ●説明 連続する数を検索したい(1965から2011までの数) ●対象データ(配列内に格納) 1952 1965 1986 2012 1972 2011  ・  ・ ●希望する結果(配列の各要素を正規表現で検索して、マッチする要素だけ抽出) 1965 1986 1972 2011  ・  ・'(_文字列,_前文字列,_適合文字列,_後文字列) :- '連続する数を検索したい(1965から2011までの数)'(_文字列,_前文字列,_適合文字列,_後文字列). '連続する数を検索したい(1965から2011までの数)'(_文字列,_前文字列,_適合文字列,_後文字列) :- atom_chars(_文字列,_文字ならび), '文字ならびから連続する数を検索したい(1965から2011までの数)'(_文字ならび,_前文字列,_適合文字列,_後文字列). '文字ならびから連続する数を検索したい(1965から2011までの数)'(_文字ならび,_前文字列,_適合文字列,_後文字列) :- '数値を切り出す(1965から2011までの数)'(_文字ならび,L1,L2,L3,N), atom_chars(_前文字列,L1), atom_chars(_後文字列,L3), atom_chars(_適合文字列,L2). '数値を切り出す(1965から2011までの数)'(_文字ならび,L1,L2,L3,N) :- append(L1,L2,L3,_文字ならび), 全てが数字(L2), 'L1の最後の文字とL3の最初の文字は数字ではない'(L1,L3), number_chars(_数,L2), '1965から2011までの数'(_数). 全てが数字(_ならび) :- forall(member(_数字,_ならび),数字(_数字)). 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. 'L1の最後の文字とL3の最初の文字は数字ではない'(L1,L3) :- 'L1の最後の文字は数字ではない'(L1), 'L3の最初の文字は数字では無い'(L3). 'L1の最後の文字は数字ではない'(L1) :- \+((last(L1,A),数字(A))). 'L3の最初の文字は数字では無い'(L3) :- \+(([B|_]=L3,数字(B))). '1965から2011までの数'(_数) :- between(1965,2011,_数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/835 # # お願いします。 # [1] 授業単元:情報処理演習 # [2] 問題文:3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表 # 示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表 # 示するようにすること. # '3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表示するようにすること.' :- '3 つの整数a, b, s を入力として'(_a,_b,_s), 'ax + by = s を満たす整数x, y を一組求めて'(_a,_b,_s,_x,_y), それらを表示する(_a,_b,_s,_x,_y),!. '3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表示するようにすること.'(_a,_b,_s) :- 'ただし、望みの整数x, y が存在しないときは, その旨を表示する'. '3 つの整数a, b, s を入力として'(_a,_b,_s) :- 整数を得る('ax+by=s のa',true,_a), 整数を得る('ax+by=s のb',true,_b), 整数を得る('ax+by=s のs',true,_s). 'ax + by = s を満たす整数x, y を一組求めて'(_a,_b,_s,_x,_y) :- _a_1 is _a * -1, _b_1 is _b * -1, for(_a_1,_x,_a), for(_b_1,_y,_b), _s is _a * _x + _b * _y. それらを表示する(_a,_b,_s,_x,_y) :- write(' ax + by = s\n'), writef('%t*%t + %t*%t = %t\n',[_a,_x,_b,_y,_s]). 'ただし, 望みの整数x, y が存在しないときは, その旨を表示する' :- writef('望みのx,yが存在しません。\n'). for(S,N,E) :- E >= S, for_2(S,N,E). for(S,N,E) :- E < S, for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(S,N,E) :- N is S. for_1(S,N,E) :- S1 is S - 1, for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(S,N,E) :- N is S. for_2(S,N,E) :- S1 is S + 1, for_2(S1,N,E). 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/ # # # お題:ヴィジュネル暗号で暗号・復号化する関数を作成せよ。 # ・平文は "programming" とする。 # ・鍵は任意とする。 # ヴィジュネル復号化(_平文,_鍵,_暗号文) :- \+(atom(_平文)), atom_chars(_暗号文,_暗号文文字ならび), atom_chars(_鍵,_鍵文字ならび), ヴィジュネル暗号(_平文文字ならび,_鍵文字ならび,_暗号文文字ならび), atom_chars(_平文,_平文文字ならび). ヴィジュネル暗号化(_平文,_鍵,_暗号文) :- atom(_平文), atom_chars(_平文,_平文文字ならび), atom_chars(_鍵,_鍵文字ならび), ヴィジュネル暗号(_平文文字ならび,_鍵文字ならび,_暗号文文字ならび), atom_chars(_暗号文,_暗号文文字ならび). ヴィジュネル暗号([],_,[]). ヴィジュネル暗号([_文字|R1],_鍵文字ならび,[_暗号文字|R3]) :- ヴィジュネル暗号の文字変換(_文字,_鍵文字ならび,_一文字回転した鍵文字ならび,_暗号文字), ヴィジュネル暗号(R1,_一文字回転した鍵文字ならび,R3). ヴィジュネル暗号の文字変換(_文字,[_鍵文字|R2],_一文字回転した鍵文字ならび,_暗号文字) :- ならびの回転(左方向,_,['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'],[_鍵文字|R]), nth1(_nth1,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_文字), nth1(_nth1,[_鍵文字|R],_暗号文字), ならびの回転(左方向,1,[_鍵文字|R2],_一文字回転した鍵文字ならび),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1232627790/958 # # 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】7/14 am6:00 # 【 Ver  】Eclipse Version: 3.4.2 # 【 補足 】 # あいう # かきく # さしす # 上記のようなテキストファイルを読み込み、 # さかあ # しきい # すくう # のように別のテキストファイルに書き出す感じです。 'テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す'(InFile,OutFile) :- テキストファイルから文字列5行を読み込み(Infile,_文字列5行), 別のテキストへ右縦書きで(_文字列5行,_右書き用に置換された文字列ならび), 書き出す(OutFile,_右書きように置換された文字列ならび), テキストファイルから文字列5行を読み込み(Infile,_文字列5行) :- open(InFile,read,Instream), findall(_行,( between(1,5,N), get_line(Instream,_行)), _文字列5行), close(InFile). 別のテキストへ右縦書きで(_文字列5行,_右書き用に置換された文字列ならび) :- findmax(_行の長さ,( member(_行,_文字列5行), atom_length(_行,_行の長さ), _最長文字数), 空白文字を付加して文字数一致させる(_最長文字数,_文字列5行,_空白文字を付加して矩形にした文字列5行), 右書き用に置換する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび). 右書き用に置換する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび) :- 行を反転しながら転置する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび). 行を反転しながら転置する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび) :- '一旦文字ならびに変換して、行を反転して転置する'(_空白文字を付加して矩形にした文字列5行,LL2), 文字列に戻す(LL2,_右書き用に置換された文字列ならび). '一旦文字ならびに変換して、行を反転して転置する'(_空白文字を付加して矩形にした文字列5行,LL2) :- findall(L,( member(_行,_空白文字を付加して矩形にした文字列5行), atom_chars(_行,Chars), reverse(Chars,L)), LL1), 転置(LL1,LL2). 文字列に戻す(LL2,_右書き用に置換された文字列ならび) :- findall(_文字列,( member(Chars,LL2), atom_chars(_文字列,Chars)), _右書き用に置換された文字列ならび). 空白文字を付加して文字数を一致させる(_最大文字数,_文字列5行,_空白を付加した文字列5行) :- findall(_空白を付加された文字列,( member(_文字列,_文字列5行), atom_length(_文字列,_文字列長さ), 空白文字を付加する(_最大文字数,_文字列の長さ,_文字列,_空白を付加された文字列)), _空白を付加された文字列5行). 空白文字を付加する(_最大文字数,_文字列の長さ,_文字列,_空白を付加された文字列) :- _空白文字数 is _最大文字数 - _文字列の長さ, findall(' ',between(1,_空白文字数,_),_空白文字ならび), atomic_list_concat([_文字列|_空白文字ならび],_空白を付加された文字列). 書き出す(OutFile,_右書き用に置換された文字列ならび) :- open(OutFile,write,Outstream), append(_,[_行|R],_右書き用に置換された文字列ならび), writef(Outstream,'%t\n',[_行]), R = [], close(Outstream). % % この符にはfindall/3だけで表現するという主題がある。 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/764 # # 【質問テンプレ】 # ・DBMS名とバージョン # SQLiteバージョン3 # # ・テーブルデータ # ドメインID,ドメイン名 # ------------ # 1,test1.co.jp # 2,test2.co.jp # # ・欲しい結果 # "server1.test1.co.jp"という入力に対し # "test1.co.jp"のドメインIDである1 # # ・説明 # 自分のサイトへのアクセスを行うドメインを管理しています。 # "server1.test1.co.jp"や、"server2.test1.co.jp"等、第4レベルだけが違う同じ業者からのアクセスがあります。 # それらを"test1.co.jp"からのアクセスであると判断し、ドメインIDである1を取得したいのです。 # # 以上、宜しくお願いします。 '・DBMS名とバージョン SQLiteバージョン3 ・テーブルデータ ドメインID,ドメイン名 ------------ 1,test1.co.jp 2,test2.co.jp ・欲しい結果 "server1.test1.co.jp"という入力に対し "test1.co.jp"のドメインIDである1 ・説明 自分のサイトへのアクセスを行うドメインを管理しています。 "server1.test1.co.jp"や、"server2.test1.co.jp"等、第4レベルだけが違う同じ業者からのアクセスがあります。 それらを"test1.co.jp"からのアクセスであると判断し、ドメインIDである1を取得したいのです。'(_URL,_第三レベルドメイン名,_ドメインID) :- 第三ドメイン名を取得する(_URL,_第三レベルドメイン名), ドメインIDを取り出す(_第三レベルドメイン名,_ドメインID). 第三ドメイン名を取得する(_URL,_第三レベルドメイン名) :- split(_URL,['/','ftp://','file:///','http://','mailto://'],[A|_]), '第二・第一レベルドメインを切り捨てる'(A,C), split(C,['.'],L). last(L,_第三レベルドメイン名),!. '第二・第一レベルドメインを切り捨てる'(A,C) :- '第二・第一レベルドメイン'(A), sub_atom(A,St,Len,0,B), sub_atom(A,0,St,Len,C),!. ドメインIDを取り出す(_第三レベルドメイン名,_ドメインID) :- atom_chars(_第三レベルドメイン名,Chars), append(L1,L2,Chars), forall(member(E,L2),数字(E)), atomic_list_concat(L2,_ドメインID),!. 数字(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']). '第二・第一レベルドメイン'(a). '第二・第一レベルドメイン'(ab). '第二・第一レベルドメイン'(abo). '第二・第一レベルドメイン'(abog). '第二・第一レベルドメイン'(aboga). '第二・第一レベルドメイン'(abogad). '第二・第一レベルドメイン'(abogado). '第二・第一レベルドメイン'(ac). '第二・第一レベルドメイン'(ad). '第二・第一レベルドメイン'(adu). '第二・第一レベルドメイン'(adul). '第二・第一レベルドメイン'(adult). '第二・第一レベルドメイン'(ae). '第二・第一レベルドメイン'(aer). '第二・第一レベルドメイン'(aero). '第二・第一レベルドメイン'(af). '第二・第一レベルドメイン'(afr). '第二・第一レベルドメイン'(afri). '第二・第一レベルドメイン'(afric). '第二・第一レベルドメイン'(africa). '第二・第一レベルドメイン'(ag). '第二・第一レベルドメイン'(ai). '第二・第一レベルドメイン'(al). '第二・第一レベルドメイン'(am). '第二・第一レベルドメイン'(ams). '第二・第一レベルドメイン'(amst). '第二・第一レベルドメイン'(amste). '第二・第一レベルドメイン'(amster). '第二・第一レベルドメイン'(amsterd). '第二・第一レベルドメイン'(amsterda). '第二・第一レベルドメイン'(amsterdam). '第二・第一レベルドメイン'(ap). '第二・第一レベルドメイン'(app). '第二・第一レベルドメイン'(as). '第二・第一レベルドメイン'(asi). '第二・第一レベルドメイン'(asia). '第二・第一レベルドメイン'(at). '第二・第一レベルドメイン'(au). '第二・第一レベルドメイン'(auc). '第二・第一レベルドメイン'(auct). '第二・第一レベルドメイン'(aucti). '第二・第一レベルドメイン'(auctio). '第二・第一レベルドメイン'(auction). '第二・第一レベルドメイン'(ax). '第二・第一レベルドメイン'(az). '第二・第一レベルドメイン'(b). '第二・第一レベルドメイン'(ba). '第二・第一レベルドメイン'(bab). '第二・第一レベルドメイン'(baby). '第二・第一レベルドメイン'(ban). '第二・第一レベルドメイン'(bank). '第二・第一レベルドメイン'(bar). '第二・第一レベルドメイン'(barc). '第二・第一レベルドメイン'(barce). '第二・第一レベルドメイン'(barcel). '第二・第一レベルドメイン'(barcelo). '第二・第一レベルドメイン'(barcelon). '第二・第一レベルドメイン'(barcelona). '第二・第一レベルドメイン'(bb). '第二・第一レベルドメイン'(be). '第二・第一レベルドメイン'(bee). '第二・第一レベルドメイン'(beer). '第二・第一レベルドメイン'(ber). '第二・第一レベルドメイン'(berl). '第二・第一レベルドメイン'(berli). '第二・第一レベルドメイン'(berlin). '第二・第一レベルドメイン'(bg). '第二・第一レベルドメイン'(bi). '第二・第一レベルドメイン'(bik). '第二・第一レベルドメイン'(bike). '第二・第一レベルドメイン'(biz). '第二・第一レベルドメイン'(bj). '第二・第一レベルドメイン'(bl). '第二・第一レベルドメイン'(blo). '第二・第一レベルドメイン'(blog). '第二・第一レベルドメイン'(bm). '第二・第一レベルドメイン'(bo). '第二・第一レベルドメイン'(boo). '第二・第一レベルドメイン'(book). '第二・第一レベルドメイン'(booki). '第二・第一レベルドメイン'(bookin). '第二・第一レベルドメイン'(booking). '第二・第一レベルドメイン'(bos). '第二・第一レベルドメイン'(bost). '第二・第一レベルドメイン'(bosto). '第二・第一レベルドメイン'(boston). '第二・第一レベルドメイン'(br). '第二・第一レベルドメイン'(bru). '第二・第一レベルドメイン'(brus). '第二・第一レベルドメイン'(bruss). '第二・第一レベルドメイン'(brusse). '第二・第一レベルドメイン'(brussel). '第二・第一レベルドメイン'(brussels). '第二・第一レベルドメイン'(bs). '第二・第一レベルドメイン'(bu). '第二・第一レベルドメイン'(bud). '第二・第一レベルドメイン'(buda). '第二・第一レベルドメイン'(budap). '第二・第一レベルドメイン'(budape). '第二・第一レベルドメイン'(budapes). '第二・第一レベルドメイン'(budapest). '第二・第一レベルドメイン'(by). '第二・第一レベルドメイン'(bz). '第二・第一レベルドメイン'(c). '第二・第一レベルドメイン'(ca). '第二・第一レベルドメイン'(cap). '第二・第一レベルドメイン'(cape). '第二・第一レベルドメイン'(capet). '第二・第一レベルドメイン'(capeto). '第二・第一レベルドメイン'(capetow). '第二・第一レベルドメイン'(capetown). '第二・第一レベルドメイン'(car). '第二・第一レベルドメイン'(care). '第二・第一レベルドメイン'(caree). '第二・第一レベルドメイン'(career). '第二・第一レベルドメイン'(cas). '第二・第一レベルドメイン'(cash). '第二・第一レベルドメイン'(cat). '第二・第一レベルドメイン'(cc). '第二・第一レベルドメイン'(cd). '第二・第一レベルドメイン'(cf). '第二・第一レベルドメイン'(cg). '第二・第一レベルドメイン'(ch). '第二・第一レベルドメイン'(chr). '第二・第一レベルドメイン'(chri). '第二・第一レベルドメイン'(chris). '第二・第一レベルドメイン'(christ). '第二・第一レベルドメイン'(christm). '第二・第一レベルドメイン'(christma). '第二・第一レベルドメイン'(christmas). '第二・第一レベルドメイン'(ci). '第二・第一レベルドメイン'(cl). '第二・第一レベルドメイン'(cli). '第二・第一レベルドメイン'(clic). '第二・第一レベルドメイン'(click). '第二・第一レベルドメイン'(cm). '第二・第一レベルドメイン'(cn). '第二・第一レベルドメイン'(co). '第二・第一レベルドメイン'('co.'). '第二・第一レベルドメイン'('co.a'). '第二・第一レベルドメイン'('co.ao'). '第二・第一レベルドメイン'('co.at'). '第二・第一レベルドメイン'('co.b'). '第二・第一レベルドメイン'('co.bw'). '第二・第一レベルドメイン'('co.c'). '第二・第一レベルドメイン'('co.ck'). '第二・第一レベルドメイン'('co.cm'). '第二・第一レベルドメイン'('co.cr'). '第二・第一レベルドメイン'('co.f'). '第二・第一レベルドメイン'('co.fk'). '第二・第一レベルドメイン'('co.h'). '第二・第一レベルドメイン'('co.hu'). '第二・第一レベルドメイン'('co.i'). '第二・第一レベルドメイン'('co.id'). '第二・第一レベルドメイン'('co.il'). '第二・第一レベルドメイン'('co.in'). '第二・第一レベルドメイン'('co.ir'). '第二・第一レベルドメイン'('co.j'). '第二・第一レベルドメイン'('co.jp'). '第二・第一レベルドメイン'('co.k'). '第二・第一レベルドメイン'('co.ke'). '第二・第一レベルドメイン'('co.kr'). '第二・第一レベルドメイン'('co.l'). '第二・第一レベルドメイン'('co.ls'). '第二・第一レベルドメイン'('co.m'). '第二・第一レベルドメイン'('co.mz'). '第二・第一レベルドメイン'('co.n'). '第二・第一レベルドメイン'('co.nl'). '第二・第一レベルドメイン'('co.no'). '第二・第一レベルドメイン'('co.nz'). '第二・第一レベルドメイン'('co.r'). '第二・第一レベルドメイン'('co.rs'). '第二・第一レベルドメイン'('co.t'). '第二・第一レベルドメイン'('co.th'). '第二・第一レベルドメイン'('co.tt'). '第二・第一レベルドメイン'('co.tz'). '第二・第一レベルドメイン'('co.u'). '第二・第一レベルドメイン'('co.ug'). '第二・第一レベルドメイン'('co.uk'). '第二・第一レベルドメイン'('co.z'). '第二・第一レベルドメイン'('co.za'). '第二・第一レベルドメイン'('co.zw'). '第二・第一レベルドメイン'(cof). '第二・第一レベルドメイン'(coff). '第二・第一レベルドメイン'(coffe). '第二・第一レベルドメイン'(coffee). '第二・第一レベルドメイン'(com). '第二・第一レベルドメイン'('com.'). '第二・第一レベルドメイン'('com.a'). '第二・第一レベルドメイン'('com.ag'). '第二・第一レベルドメイン'('com.ai'). '第二・第一レベルドメイン'('com.al'). '第二・第一レベルドメイン'('com.an'). '第二・第一レベルドメイン'('com.ar'). '第二・第一レベルドメイン'('com.au'). '第二・第一レベルドメイン'('com.aw'). '第二・第一レベルドメイン'('com.az'). '第二・第一レベルドメイン'('com.b'). '第二・第一レベルドメイン'('com.bd'). '第二・第一レベルドメイン'('com.bh'). '第二・第一レベルドメイン'('com.bn'). '第二・第一レベルドメイン'('com.bo'). '第二・第一レベルドメイン'('com.br'). '第二・第一レベルドメイン'('com.bs'). '第二・第一レベルドメイン'('com.bt'). '第二・第一レベルドメイン'('com.c'). '第二・第一レベルドメイン'('com.cm'). '第二・第一レベルドメイン'('com.cn'). '第二・第一レベルドメイン'('com.co'). '第二・第一レベルドメイン'('com.cy'). '第二・第一レベルドメイン'('com.d'). '第二・第一レベルドメイン'('com.de'). '第二・第一レベルドメイン'('com.dz'). '第二・第一レベルドメイン'('com.e'). '第二・第一レベルドメイン'('com.ec'). '第二・第一レベルドメイン'('com.eg'). '第二・第一レベルドメイン'('com.es'). '第二・第一レベルドメイン'('com.et'). '第二・第一レベルドメイン'('com.f'). '第二・第一レベルドメイン'('com.fj'). '第二・第一レベルドメイン'('com.g'). '第二・第一レベルドメイン'('com.ge'). '第二・第一レベルドメイン'('com.gh'). '第二・第一レベルドメイン'('com.gi'). '第二・第一レベルドメイン'('com.gl'). '第二・第一レベルドメイン'('com.gn'). '第二・第一レベルドメイン'('com.gr'). '第二・第一レベルドメイン'('com.gt'). '第二・第一レベルドメイン'('com.gu'). '第二・第一レベルドメイン'('com.h'). '第二・第一レベルドメイン'('com.hk'). '第二・第一レベルドメイン'('com.hr'). '第二・第一レベルドメイン'('com.j'). '第二・第一レベルドメイン'('com.jm'). '第二・第一レベルドメイン'('com.jo'). '第二・第一レベルドメイン'('com.k'). '第二・第一レベルドメイン'('com.kh'). '第二・第一レベルドメイン'('com.kw'). '第二・第一レベルドメイン'('com.l'). '第二・第一レベルドメイン'('com.lb'). '第二・第一レベルドメイン'('com.lr'). '第二・第一レベルドメイン'('com.lv'). '第二・第一レベルドメイン'('com.ly'). '第二・第一レベルドメイン'('com.m'). '第二・第一レベルドメイン'('com.mg'). '第二・第一レベルドメイン'('com.mk'). '第二・第一レベルドメイン'('com.mo'). '第二・第一レベルドメイン'('com.mt'). '第二・第一レベルドメイン'('com.mx'). '第二・第一レベルドメイン'('com.my'). '第二・第一レベルドメイン'('com.n'). '第二・第一レベルドメイン'('com.na'). '第二・第一レベルドメイン'('com.ng'). '第二・第一レベルドメイン'('com.ni'). '第二・第一レベルドメイン'('com.np'). '第二・第一レベルドメイン'('com.o'). '第二・第一レベルドメイン'('com.om'). '第二・第一レベルドメイン'('com.p'). '第二・第一レベルドメイン'('com.pa'). '第二・第一レベルドメイン'('com.pe'). '第二・第一レベルドメイン'('com.ph'). '第二・第一レベルドメイン'('com.pk'). '第二・第一レベルドメイン'('com.pl'). '第二・第一レベルドメイン'('com.pr'). '第二・第一レベルドメイン'('com.pt'). '第二・第一レベルドメイン'('com.py'). '第二・第一レベルドメイン'('com.q'). '第二・第一レベルドメイン'('com.qa'). '第二・第一レベルドメイン'('com.r'). '第二・第一レベルドメイン'('com.ro'). '第二・第一レベルドメイン'('com.s'). '第二・第一レベルドメイン'('com.sg'). '第二・第一レベルドメイン'('com.sn'). '第二・第一レベルドメイン'('com.sv'). '第二・第一レベルドメイン'('com.sy'). '第二・第一レベルドメイン'('com.t'). '第二・第一レベルドメイン'('com.tn'). '第二・第一レベルドメイン'('com.tr'). '第二・第一レベルドメイン'('com.tw'). '第二・第一レベルドメイン'('com.u'). '第二・第一レベルドメイン'('com.ua'). '第二・第一レベルドメイン'('com.uy'). '第二・第一レベルドメイン'('com.v'). '第二・第一レベルドメイン'('com.ve'). '第二・第一レベルドメイン'('com.vn'). '第二・第一レベルドメイン'(con). '第二・第一レベルドメイン'(cond). '第二・第一レベルドメイン'(condo). '第二・第一レベルドメイン'(condos). '第二・第一レベルドメイン'(cons). '第二・第一レベルドメイン'(consu). '第二・第一レベルドメイン'(consul). '第二・第一レベルドメイン'(consult). '第二・第一レベルドメイン'(consulti). '第二・第一レベルドメイン'(consultin). '第二・第一レベルドメイン'(consulting). '第二・第一レベルドメイン'(coo). '第二・第一レベルドメイン'(coop). '第二・第一レベルドメイン'(cor). '第二・第一レベルドメイン'(cors). '第二・第一レベルドメイン'(corsi). '第二・第一レベルドメイン'(corsic). '第二・第一レベルドメイン'(corsica). '第二・第一レベルドメイン'(cr). '第二・第一レベルドメイン'(cre). '第二・第一レベルドメイン'(cred). '第二・第一レベルドメイン'(credi). '第二・第一レベルドメイン'(credit). '第二・第一レベルドメイン'(cu). '第二・第一レベルドメイン'(cv). '第二・第一レベルドメイン'(cw). '第二・第一レベルドメイン'(cx). '第二・第一レベルドメイン'(cy). '第二・第一レベルドメイン'(cym). '第二・第一レベルドメイン'(cymr). '第二・第一レベルドメイン'(cymru). '第二・第一レベルドメイン'(cz). '第二・第一レベルドメイン'(d). '第二・第一レベルドメイン'(de). '第二・第一レベルドメイン'('de.'). '第二・第一レベルドメイン'('de.c'). '第二・第一レベルドメイン'('de.co'). '第二・第一レベルドメイン'('de.com'). '第二・第一レベルドメイン'(den). '第二・第一レベルドメイン'(dent). '第二・第一レベルドメイン'(denta). '第二・第一レベルドメイン'(dental). '第二・第一レベルドメイン'(dj). '第二・第一レベルドメイン'(dk). '第二・第一レベルドメイン'(dm). '第二・第一レベルドメイン'(do). '第二・第一レベルドメイン'(dow). '第二・第一レベルドメイン'(down). '第二・第一レベルドメイン'(downl). '第二・第一レベルドメイン'(downlo). '第二・第一レベルドメイン'(downloa). '第二・第一レベルドメイン'(download). '第二・第一レベルドメイン'(du). '第二・第一レベルドメイン'(dub). '第二・第一レベルドメイン'(duba). '第二・第一レベルドメイン'(dubai). '第二・第一レベルドメイン'(dz). '第二・第一レベルドメイン'(e). '第二・第一レベルドメイン'(ec). '第二・第一レベルドメイン'(eco). '第二・第一レベルドメイン'(ed). '第二・第一レベルドメイン'(edu). '第二・第一レベルドメイン'(ee). '第二・第一レベルドメイン'(eg). '第二・第一レベルドメイン'(em). '第二・第一レベルドメイン'(ema). '第二・第一レベルドメイン'(emar). '第二・第一レベルドメイン'(emara). '第二・第一レベルドメイン'(emarat). '第二・第一レベルドメイン'(es). '第二・第一レベルドメイン'(eu). '第二・第一レベルドメイン'('eu.'). '第二・第一レベルドメイン'('eu.c'). '第二・第一レベルドメイン'('eu.co'). '第二・第一レベルドメイン'('eu.com'). '第二・第一レベルドメイン'(ev). '第二・第一レベルドメイン'(eve). '第二・第一レベルドメイン'(even). '第二・第一レベルドメイン'(event). '第二・第一レベルドメイン'(events). '第二・第一レベルドメイン'(f). '第二・第一レベルドメイン'(fi). '第二・第一レベルドメイン'(fil). '第二・第一レベルドメイン'(film). '第二・第一レベルドメイン'(fl). '第二・第一レベルドメイン'(fli). '第二・第一レベルドメイン'(flig). '第二・第一レベルドメイン'(fligh). '第二・第一レベルドメイン'(flight). '第二・第一レベルドメイン'(flights). '第二・第一レベルドメイン'(fly). '第二・第一レベルドメイン'(fm). '第二・第一レベルドメイン'(fo). '第二・第一レベルドメイン'(foo). '第二・第一レベルドメイン'(food). '第二・第一レベルドメイン'(foot). '第二・第一レベルドメイン'(footb). '第二・第一レベルドメイン'(footba). '第二・第一レベルドメイン'(footbal). '第二・第一レベルドメイン'(football). '第二・第一レベルドメイン'(for). '第二・第一レベルドメイン'(foru). '第二・第一レベルドメイン'(forum). '第二・第一レベルドメイン'(fr). '第二・第一レベルドメイン'(fre). '第二・第一レベルドメイン'(free). '第二・第一レベルドメイン'(fri). '第二・第一レベルドメイン'(frie). '第二・第一レベルドメイン'(frien). '第二・第一レベルドメイン'(friend). '第二・第一レベルドメイン'(friends). '第二・第一レベルドメイン'(fu). '第二・第一レベルドメイン'(fun). '第二・第一レベルドメイン'(fund). '第二・第一レベルドメイン'(fut). '第二・第一レベルドメイン'(futb). '第二・第一レベルドメイン'(futbo). '第二・第一レベルドメイン'(futbol). '第二・第一レベルドメイン'(g). '第二・第一レベルドメイン'(ga). '第二・第一レベルドメイン'(gam). '第二・第一レベルドメイン'(game). '第二・第一レベルドメイン'(gay). '第二・第一レベルドメイン'(gd). '第二・第一レベルドメイン'(ge). '第二・第一レベルドメイン'(gen). '第二・第一レベルドメイン'(gent). '第二・第一レベルドメイン'(gf). '第二・第一レベルドメイン'(gg). '第二・第一レベルドメイン'(gl). '第二・第一レベルドメイン'(gm). '第二・第一レベルドメイン'(gmb). '第二・第一レベルドメイン'(gmbh). '第二・第一レベルドメイン'(go). '第二・第一レベルドメイン'(gol). '第二・第一レベルドメイン'(gold). '第二・第一レベルドメイン'(gov). '第二・第一レベルドメイン'(gp). '第二・第一レベルドメイン'(gr). '第二・第一レベルドメイン'('gr.'). '第二・第一レベルドメイン'('gr.c'). '第二・第一レベルドメイン'('gr.co'). '第二・第一レベルドメイン'('gr.com'). '第二・第一レベルドメイン'(gs). '第二・第一レベルドメイン'(gt). '第二・第一レベルドメイン'(gy). '第二・第一レベルドメイン'(h). '第二・第一レベルドメイン'(he). '第二・第一レベルドメイン'(hel). '第二・第一レベルドメイン'(hels). '第二・第一レベルドメイン'(helsi). '第二・第一レベルドメイン'(helsin). '第二・第一レベルドメイン'(helsink). '第二・第一レベルドメイン'(helsinki). '第二・第一レベルドメイン'(hi). '第二・第一レベルドメイン'(hiv). '第二・第一レベルドメイン'(hk). '第二・第一レベルドメイン'(hn). '第二・第一レベルドメイン'(ho). '第二・第一レベルドメイン'(hoc). '第二・第一レベルドメイン'(hock). '第二・第一レベルドメイン'(hocke). '第二・第一レベルドメイン'(hockey). '第二・第一レベルドメイン'(hol). '第二・第一レベルドメイン'(holi). '第二・第一レベルドメイン'(holid). '第二・第一レベルドメイン'(holida). '第二・第一レベルドメイン'(holiday). '第二・第一レベルドメイン'(hor). '第二・第一レベルドメイン'(hors). '第二・第一レベルドメイン'(horse). '第二・第一レベルドメイン'(hos). '第二・第一レベルドメイン'(hosp). '第二・第一レベルドメイン'(hospi). '第二・第一レベルドメイン'(hospit). '第二・第一レベルドメイン'(hospita). '第二・第一レベルドメイン'(hospital). '第二・第一レベルドメイン'(hot). '第二・第一レベルドメイン'(hote). '第二・第一レベルドメイン'(hotel). '第二・第一レベルドメイン'(hou). '第二・第一レベルドメイン'(hous). '第二・第一レベルドメイン'(house). '第二・第一レベルドメイン'(hr). '第二・第一レベルドメイン'(ht). '第二・第一レベルドメイン'(hu). '第二・第一レベルドメイン'(i). '第二・第一レベルドメイン'(ie). '第二・第一レベルドメイン'(im). '第二・第一レベルドメイン'(in). '第二・第一レベルドメイン'(inc). '第二・第一レベルドメイン'(inf). '第二・第一レベルドメイン'(info). '第二・第一レベルドメイン'(ins). '第二・第一レベルドメイン'(insu). '第二・第一レベルドメイン'(insur). '第二・第一レベルドメイン'(insure). '第二・第一レベルドメイン'(io). '第二・第一レベルドメイン'(iq). '第二・第一レベルドメイン'(ir). '第二・第一レベルドメイン'(iri). '第二・第一レベルドメイン'(iris). '第二・第一レベルドメイン'(irish). '第二・第一レベルドメイン'(is). '第二・第一レベルドメイン'(isl). '第二・第一レベルドメイン'(isla). '第二・第一レベルドメイン'(islam). '第二・第一レベルドメイン'(ist). '第二・第一レベルドメイン'(ista). '第二・第一レベルドメイン'(istan). '第二・第一レベルドメイン'(istanb). '第二・第一レベルドメイン'(istanbu). '第二・第一レベルドメイン'(istanbul). '第二・第一レベルドメイン'(it). '第二・第一レベルドメイン'(j). '第二・第一レベルドメイン'(je). '第二・第一レベルドメイン'(jo). '第二・第一レベルドメイン'(job). '第二・第一レベルドメイン'(jobs). '第二・第一レベルドメイン'(jp). '第二・第一レベルドメイン'(k). '第二・第一レベルドメイン'(kg). '第二・第一レベルドメイン'(ki). '第二・第一レベルドメイン'(kit). '第二・第一レベルドメイン'(kitc). '第二・第一レベルドメイン'(kitch). '第二・第一レベルドメイン'(kitche). '第二・第一レベルドメイン'(kitchen). '第二・第一レベルドメイン'(kn). '第二・第一レベルドメイン'(ko). '第二・第一レベルドメイン'(koe). '第二・第一レベルドメイン'(koel). '第二・第一レベルドメイン'(koeln). '第二・第一レベルドメイン'(kr). '第二・第一レベルドメイン'(ky). '第二・第一レベルドメイン'(kz). '第二・第一レベルドメイン'(l). '第二・第一レベルドメイン'(la). '第二・第一レベルドメイン'(lat). '第二・第一レベルドメイン'(law). '第二・第一レベルドメイン'(lc). '第二・第一レベルドメイン'(li). '第二・第一レベルドメイン'(lim). '第二・第一レベルドメイン'(limi). '第二・第一レベルドメイン'(limit). '第二・第一レベルドメイン'(limite). '第二・第一レベルドメイン'(limited). '第二・第一レベルドメイン'(lk). '第二・第一レベルドメイン'(lo). '第二・第一レベルドメイン'(lon). '第二・第一レベルドメイン'(lond). '第二・第一レベルドメイン'(londo). '第二・第一レベルドメイン'(london). '第二・第一レベルドメイン'(lot). '第二・第一レベルドメイン'(lott). '第二・第一レベルドメイン'(lotto). '第二・第一レベルドメイン'(lt). '第二・第一レベルドメイン'(lu). '第二・第一レベルドメイン'(lv). '第二・第一レベルドメイン'(ly). '第二・第一レベルドメイン'(m). '第二・第一レベルドメイン'(ma). '第二・第一レベルドメイン'(mc). '第二・第一レベルドメイン'(md). '第二・第一レベルドメイン'(me). '第二・第一レベルドメイン'(med). '第二・第一レベルドメイン'(medi). '第二・第一レベルドメイン'(medic). '第二・第一レベルドメイン'(medica). '第二・第一レベルドメイン'(medical). '第二・第一レベルドメイン'(mel). '第二・第一レベルドメイン'(melb). '第二・第一レベルドメイン'(melbo). '第二・第一レベルドメイン'(melbou). '第二・第一レベルドメイン'(melbour). '第二・第一レベルドメイン'(melbourn). '第二・第一レベルドメイン'(melbourne). '第二・第一レベルドメイン'(men). '第二・第一レベルドメイン'(menu). '第二・第一レベルドメイン'(mg). '第二・第一レベルドメイン'(mi). '第二・第一レベルドメイン'(mia). '第二・第一レベルドメイン'(miam). '第二・第一レベルドメイン'(miami). '第二・第一レベルドメイン'(mk). '第二・第一レベルドメイン'(mn). '第二・第一レベルドメイン'(mo). '第二・第一レベルドメイン'(mob). '第二・第一レベルドメイン'(mobi). '第二・第一レベルドメイン'(mos). '第二・第一レベルドメイン'(mosc). '第二・第一レベルドメイン'(mosco). '第二・第一レベルドメイン'(moscow). '第二・第一レベルドメイン'(mp). '第二・第一レベルドメイン'(ms). '第二・第一レベルドメイン'(mu). '第二・第一レベルドメイン'(mus). '第二・第一レベルドメイン'(musi). '第二・第一レベルドメイン'(music). '第二・第一レベルドメイン'(mv). '第二・第一レベルドメイン'(mw). '第二・第一レベルドメイン'(mx). '第二・第一レベルドメイン'(my). '第二・第一レベルドメイン'(n). '第二・第一レベルドメイン'(na). '第二・第一レベルドメイン'(nam). '第二・第一レベルドメイン'(name). '第二・第一レベルドメイン'(ne). '第二・第一レベルドメイン'(net). '第二・第一レベルドメイン'('net.'). '第二・第一レベルドメイン'('net.a'). '第二・第一レベルドメイン'('net.au'). '第二・第一レベルドメイン'('net.b'). '第二・第一レベルドメイン'('net.bn'). '第二・第一レベルドメイン'('net.br'). '第二・第一レベルドメイン'('net.c'). '第二・第一レベルドメイン'('net.cm'). '第二・第一レベルドメイン'('net.cn'). '第二・第一レベルドメイン'('net.g'). '第二・第一レベルドメイン'('net.gt'). '第二・第一レベルドメイン'('net.h'). '第二・第一レベルドメイン'('net.hk'). '第二・第一レベルドメイン'('net.i'). '第二・第一レベルドメイン'('net.il'). '第二・第一レベルドメイン'('net.m'). '第二・第一レベルドメイン'('net.mx'). '第二・第一レベルドメイン'('net.n'). '第二・第一レベルドメイン'('net.nz'). '第二・第一レベルドメイン'('net.p'). '第二・第一レベルドメイン'('net.ph'). '第二・第一レベルドメイン'('net.u'). '第二・第一レベルドメイン'('net.uk'). '第二・第一レベルドメイン'(new). '第二・第一レベルドメイン'(news). '第二・第一レベルドメイン'(nl). '第二・第一レベルドメイン'(no). '第二・第一レベルドメイン'(nom). '第二・第一レベルドメイン'('nom.'). '第二・第一レベルドメイン'('nom.e'). '第二・第一レベルドメイン'('nom.es'). '第二・第一レベルドメイン'(nr). '第二・第一レベルドメイン'(nu). '第二・第一レベルドメイン'(o). '第二・第一レベルドメイン'(or). '第二・第一レベルドメイン'(org). '第二・第一レベルドメイン'('org.'). '第二・第一レベルドメイン'('org.b'). '第二・第一レベルドメイン'('org.bn'). '第二・第一レベルドメイン'('org.c'). '第二・第一レベルドメイン'('org.cn'). '第二・第一レベルドメイン'('org.e'). '第二・第一レベルドメイン'('org.es'). '第二・第一レベルドメイン'('org.i'). '第二・第一レベルドメイン'('org.il'). '第二・第一レベルドメイン'('org.l'). '第二・第一レベルドメイン'('org.lv'). '第二・第一レベルドメイン'('org.n'). '第二・第一レベルドメイン'('org.nz'). '第二・第一レベルドメイン'('org.p'). '第二・第一レベルドメイン'('org.ph'). '第二・第一レベルドメイン'('org.pl'). '第二・第一レベルドメイン'('org.u'). '第二・第一レベルドメイン'('org.uk'). '第二・第一レベルドメイン'(orga). '第二・第一レベルドメイン'(organ). '第二・第一レベルドメイン'(organi). '第二・第一レベルドメイン'(organic). '第二・第一レベルドメイン'(p). '第二・第一レベルドメイン'(pa). '第二・第一レベルドメイン'(par). '第二・第一レベルドメイン'(pari). '第二・第一レベルドメイン'(paris). '第二・第一レベルドメイン'(pe). '第二・第一レベルドメイン'(ph). '第二・第一レベルドメイン'(pho). '第二・第一レベルドメイン'(phot). '第二・第一レベルドメイン'(photo). '第二・第一レベルドメイン'(pi). '第二・第一レベルドメイン'(pin). '第二・第一レベルドメイン'(pink). '第二・第一レベルドメイン'(piz). '第二・第一レベルドメイン'(pizz). '第二・第一レベルドメイン'(pizza). '第二・第一レベルドメイン'(pk). '第二・第一レベルドメイン'(pl). '第二・第一レベルドメイン'(pm). '第二・第一レベルドメイン'(pn). '第二・第一レベルドメイン'(po). '第二・第一レベルドメイン'(pok). '第二・第一レベルドメイン'(poke). '第二・第一レベルドメイン'(poker). '第二・第一レベルドメイン'(por). '第二・第一レベルドメイン'(porn). '第二・第一レベルドメイン'(pr). '第二・第一レベルドメイン'(pro). '第二・第一レベルドメイン'(ps). '第二・第一レベルドメイン'(pt). '第二・第一レベルドメイン'(pu). '第二・第一レベルドメイン'(pub). '第二・第一レベルドメイン'(pw). '第二・第一レベルドメイン'(q). '第二・第一レベルドメイン'(qa). '第二・第一レベルドメイン'(qu). '第二・第一レベルドメイン'(que). '第二・第一レベルドメイン'(queb). '第二・第一レベルドメイン'(quebe). '第二・第一レベルドメイン'(quebec). '第二・第一レベルドメイン'(r). '第二・第一レベルドメイン'(re). '第二・第一レベルドメイン'(rei). '第二・第一レベルドメイン'(reis). '第二・第一レベルドメイン'(reise). '第二・第一レベルドメイン'(rep). '第二・第一レベルドメイン'(repo). '第二・第一レベルドメイン'(repor). '第二・第一レベルドメイン'(report). '第二・第一レベルドメイン'(res). '第二・第一レベルドメイン'(rest). '第二・第一レベルドメイン'(resta). '第二・第一レベルドメイン'(restau). '第二・第一レベルドメイン'(restaur). '第二・第一レベルドメイン'(restaura). '第二・第一レベルドメイン'(restauran). '第二・第一レベルドメイン'(restaurant). '第二・第一レベルドメイン'(ro). '第二・第一レベルドメイン'(rom). '第二・第一レベルドメイン'(roma). '第二・第一レベルドメイン'(rs). '第二・第一レベルドメイン'(ru). '第二・第一レベルドメイン'(rug). '第二・第一レベルドメイン'(rugb). '第二・第一レベルドメイン'(rugby). '第二・第一レベルドメイン'(ruh). '第二・第一レベルドメイン'(ruhr). '第二・第一レベルドメイン'(rw). '第二・第一レベルドメイン'(s). '第二・第一レベルドメイン'(sa). '第二・第一レベルドメイン'(sc). '第二・第一レベルドメイン'(sco). '第二・第一レベルドメイン'(scot). '第二・第一レベルドメイン'(sd). '第二・第一レベルドメイン'(se). '第二・第一レベルドメイン'(sec). '第二・第一レベルドメイン'(secu). '第二・第一レベルドメイン'(secur). '第二・第一レベルドメイン'(secure). '第二・第一レベルドメイン'(sg). '第二・第一レベルドメイン'(sh). '第二・第一レベルドメイン'(sho). '第二・第一レベルドメイン'(shoe). '第二・第一レベルドメイン'(shoes). '第二・第一レベルドメイン'(shop). '第二・第一レベルドメイン'(si). '第二・第一レベルドメイン'(sk). '第二・第一レベルドメイン'(ska). '第二・第一レベルドメイン'(skat). '第二・第一レベルドメイン'(skate). '第二・第一レベルドメイン'(ski). '第二・第一レベルドメイン'(sl). '第二・第一レベルドメイン'(sm). '第二・第一レベルドメイン'(sn). '第二・第一レベルドメイン'(so). '第二・第一レベルドメイン'(sp). '第二・第一レベルドメイン'(spa). '第二・第一レベルドメイン'(spac). '第二・第一レベルドメイン'(space). '第二・第一レベルドメイン'(spo). '第二・第一レベルドメイン'(spor). '第二・第一レベルドメイン'(sport). '第二・第一レベルドメイン'(sr). '第二・第一レベルドメイン'(st). '第二・第一レベルドメイン'(sto). '第二・第一レベルドメイン'(stoc). '第二・第一レベルドメイン'(stock). '第二・第一レベルドメイン'(stockh). '第二・第一レベルドメイン'(stockho). '第二・第一レベルドメイン'(stockhol). '第二・第一レベルドメイン'(stockholm). '第二・第一レベルドメイン'(su). '第二・第一レベルドメイン'(sup). '第二・第一レベルドメイン'(supp). '第二・第一レベルドメイン'(suppo). '第二・第一レベルドメイン'(suppor). '第二・第一レベルドメイン'(support). '第二・第一レベルドメイン'(sur). '第二・第一レベルドメイン'(surf). '第二・第一レベルドメイン'(sv). '第二・第一レベルドメイン'(sx). '第二・第一レベルドメイン'(sy). '第二・第一レベルドメイン'(syd). '第二・第一レベルドメイン'(sydn). '第二・第一レベルドメイン'(sydne). '第二・第一レベルドメイン'(sydney). '第二・第一レベルドメイン'(t). '第二・第一レベルドメイン'(ta). '第二・第一レベルドメイン'(tat). '第二・第一レベルドメイン'(tatt). '第二・第一レベルドメイン'(tatto). '第二・第一レベルドメイン'(tattoo). '第二・第一レベルドメイン'(tc). '第二・第一レベルドメイン'(td). '第二・第一レベルドメイン'(te). '第二・第一レベルドメイン'(tel). '第二・第一レベルドメイン'(ten). '第二・第一レベルドメイン'(tenn). '第二・第一レベルドメイン'(tenni). '第二・第一レベルドメイン'(tennis). '第二・第一レベルドメイン'(tf). '第二・第一レベルドメイン'(tg). '第二・第一レベルドメイン'(th). '第二・第一レベルドメイン'(tha). '第二・第一レベルドメイン'(thai). '第二・第一レベルドメイン'(ti). '第二・第一レベルドメイン'(tir). '第二・第一レベルドメイン'(tiro). '第二・第一レベルドメイン'(tirol). '第二・第一レベルドメイン'(tj). '第二・第一レベルドメイン'(tk). '第二・第一レベルドメイン'(tl). '第二・第一レベルドメイン'(tm). '第二・第一レベルドメイン'(tn). '第二・第一レベルドメイン'(to). '第二・第一レベルドメイン'(tok). '第二・第一レベルドメイン'(toky). '第二・第一レベルドメイン'(tokyo). '第二・第一レベルドメイン'(tr). '第二・第一レベルドメイン'(tra). '第二・第一レベルドメイン'(trai). '第二・第一レベルドメイン'(train). '第二・第一レベルドメイン'(traini). '第二・第一レベルドメイン'(trainin). '第二・第一レベルドメイン'(training). '第二・第一レベルドメイン'(trav). '第二・第一レベルドメイン'(trave). '第二・第一レベルドメイン'(travel). '第二・第一レベルドメイン'(tv). '第二・第一レベルドメイン'(tw). '第二・第一レベルドメイン'(u). '第二・第一レベルドメイン'(ua). '第二・第一レベルドメイン'(ug). '第二・第一レベルドメイン'(uk). '第二・第一レベルドメイン'('uk.'). '第二・第一レベルドメイン'('uk.c'). '第二・第一レベルドメイン'('uk.co'). '第二・第一レベルドメイン'('uk.com'). '第二・第一レベルドメイン'(us). '第二・第一レベルドメイン'('us.'). '第二・第一レベルドメイン'('us.c'). '第二・第一レベルドメイン'('us.co'). '第二・第一レベルドメイン'('us.com'). '第二・第一レベルドメイン'('us.o'). '第二・第一レベルドメイン'('us.or'). '第二・第一レベルドメイン'('us.org'). '第二・第一レベルドメイン'(uy). '第二・第一レベルドメイン'(uz). '第二・第一レベルドメイン'(v). '第二・第一レベルドメイン'(vc). '第二・第一レベルドメイン'(vg). '第二・第一レベルドメイン'(vi). '第二・第一レベルドメイン'(via). '第二・第一レベルドメイン'(viaj). '第二・第一レベルドメイン'(viaje). '第二・第一レベルドメイン'(viajes). '第二・第一レベルドメイン'(vn). '第二・第一レベルドメイン'(vo). '第二・第一レベルドメイン'(voy). '第二・第一レベルドメイン'(voya). '第二・第一レベルドメイン'(voyag). '第二・第一レベルドメイン'(voyage). '第二・第一レベルドメイン'(w). '第二・第一レベルドメイン'(wa). '第二・第一レベルドメイン'(wal). '第二・第一レベルドメイン'(wale). '第二・第一レベルドメイン'(wales). '第二・第一レベルドメイン'(we). '第二・第一レベルドメイン'(web). '第二・第一レベルドメイン'('web.'). '第二・第一レベルドメイン'('web.d'). '第二・第一レベルドメイン'('web.do'). '第二・第一レベルドメイン'(wf). '第二・第一レベルドメイン'(wi). '第二・第一レベルドメイン'(wie). '第二・第一レベルドメイン'(wien). '第二・第一レベルドメイン'(win). '第二・第一レベルドメイン'(wine). '第二・第一レベルドメイン'(ws). '第二・第一レベルドメイン'(x). '第二・第一レベルドメイン'(xx). '第二・第一レベルドメイン'(xxx). '第二・第一レベルドメイン'(y). '第二・第一レベルドメイン'(yt). '第二・第一レベルドメイン'('м'). '第二・第一レベルドメイン'('мо'). '第二・第一レベルドメイン'('мос'). '第二・第一レベルドメイン'('моск'). '第二・第一レベルドメイン'('москв'). '第二・第一レベルドメイン'('москва'). '第二・第一レベルドメイン'('р'). '第二・第一レベルドメイン'('рф'). '第二・第一レベルドメイン'('с'). '第二・第一レベルドメイン'('ср'). '第二・第一レベルドメイン'('срб'). '第二・第一レベルドメイン'('香'). '第二・第一レベルドメイン'('香港'). '第二・第一レベルドメイン'('中'). '第二・第一レベルドメイン'('中国'). % 以下のサイトは # ^.*\d{2}[a-zA-Z]?\.gif # という表現がマッチする文字列があるとします。 # 例えば、img01A.gifです。 # この文字列から、頭のゼロを外した数字を抜き出したいです。 # 上の例では、「1」を抜き出したいです。 # 「01」を抜き出すのでよければ、 # ^.*(\d{2})[a-zA-Z]?\.gif # として、「$1」で受ければいいですが、 # 頭のゼロをスマートに取り除く方法を模索しています。 # よろしくお願いします。有難うございます。 '^.*\d{2}[a-zA-Z]?\.gif という表現がマッチする文字列があるとします。 例えば、img01A.gifです。 この文字列から、頭のゼロを外した数字を抜き出したいです。 上の例では、「1」を抜き出したいです。 「01」を抜き出すのでよければ、 ^.*(\d{2})[a-zA-Z]?\.gif として、「$1」で受ければいいですが、 頭のゼロをスマートに取り除く方法を模索しています。 よろしくお願いします。有難うございます。'(_文字列,_頭部のゼロを取り除いた数字文字列) :- '文字列から、頭のゼロを外した数字を抜き出したいです。'(_文字列,_頭のゼロを取り除いた数字文字列). '文字列から、頭のゼロを外した数字を抜き出したいです。'(_文字列,_頭のゼロを取り除いた数字文字列) :- 数字文字ならびを切り取る(_文字列,_数字文字ならび), 頭のゼロを取り除く(_数字文字ならび,_頭のゼロを取り除いた数字文字ならび), atom_chars(_頭のゼロを取り除いた数字文字列,_頭のゼロを取り除いた数字文字ならび). 数字文字ならびを切り取る(_文字列,_数字文字ならび) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,_数字文字ならび,L3), '_数字文字ならびは数字のみで構成され、L1に数字は含まず、L3の先頭文字は数字ではない'(L1,_数字文字ならび,L3). '_数字文字ならびは数字のみで構成され、L1に数字は含まず、L3の先頭文字は数字ではない'(L1,_数字文字ならび,L3) :- forall(member(_数字文字,_数字文字ならび),数字(_数字文字)), forall(member(_文字,L1),\+(数字(_文字))), \+((L3 = [_文字|_],数字(_文字))),!. 頭のゼロを取り除く([],[]). 頭のゼロを取り除く([A|R],[A|R]) :- \+(A='0'),!. 頭のゼロを取り除く(['0'|R1],R2) :- 頭のゼロを取り除く(R1,R2). 頭のゼロを取り除く([A|R1],[A|R2]) :- 頭のゼロを取り除く(R1,R2). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/233 # # ●Regular Expressionの使用環境 # 秀丸 8.2.1 # ●検索か置換か? # 置換 # # ●説明 # 二つ目のTab以降を削除したいです。 # # ●対象データ # 100 こくご えいご 100 20 固定 # 共通 シャカイ スウガク 100 10 ランダム # # (データの間の空白は全部Tabです) # # ●希望する結果 # 100 こくご # 共通 すうがく # # # 下の正規表現で試してみました。 # ^(.*)?\t(.*)?\t[あ-ん ア-ン].* # \1\t\2 # (.*)?\t(.*)?\tでTabまでの最短マッチ(のつもり)二つで、えいご、スウガクまでを指定しています。 # # 3つめのカラムの1文字目がひらがなとカタカナなので、[あ-ん ア-ン]で指定しているのですが、 # 後ろの"ランダム"がマッチしてしまい、2行目が下のような結果になってしまいます。 # # 100 こくご # 共通 シャカイ スウガク 100 10 # # やり方教えて貰えればうれしいです。 # よろしくお願いします。 # '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- atom_chars(_文字列,Chars), '二つ目のTab以降を削除したいです。'(Chars,['\t','\t'],_二つ目のTab以降を削除後の文字ならび), atom_chars(_二つ目のTab以降を削除後の文字列,_二つ目のTab以降を削除後の文字ならび). '二つ目のTab以降を削除したいです。'([A|_二つめのTab以降],[A],[A]) :- !. '二つ目のTab以降を削除したいです。'([A|R1],[A|R2],[A|R3]) :- '二つ目のTab以降を削除したいです。'(R1,R2,R3). '二つ目のTab以降を削除したいです。'([B|R1],L2,[B|R3]) :- '二つ目のTab以降を削除したいです。'(R1,L2,R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- atom_chars(_文字列,Chars), '一文字ずつ最初のTabが来るまで'(Chars,_Tabまでの文字ならび,_残り文字ならび_1), '二個目のTabが来るまで'(_残り文字ならび_1,_二個目のTabまでの文字ならび), append(_Tabまでの文字ならび,_二個目のTabまでの文字ならび,_二つ目のTabまでの文字ならび), atom_chars(_二つ目のTab以降を削除後の文字列,_二つ目のTabまでの文字ならび). '一文字ずつ最初のTabが来るまで'(['\t'|_残り文字ならび],['\t'],_残り文字ならび) :- !. '一文字ずつ最初のTabが来るまで'([A|_残り文字ならび],[],_残り文字ならび) :- '一文字ずつ最初のTabが来るまで'([A|_残り文字ならび],[],_残り文字ならび),!. '二個目のTabが来るまで'(['\t'|_],['\t']) :- !. '二個目のTabが来るまで'([A|R1],[A|R2]) :- '二個目のTabが来るまで'(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- 文字ならびに変換する(_文字列,_文字ならび), 二つのTabが来るまで(_文字ならび,_最初のTabまで,_その後二つ目のTabまで), 文字列を復元(_最初のTabまで,_その後二つ目のTabまで,_二つ目のTab以降を削除後の文字列). 文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 二つのTabが来るまで(_文字ならび,_最初のTabまで,_その後二つ目のTabまで) :- append(L1,['\t'|R2],['\t'|_],_文字ならび). 文字列を復元(_最初のTabまで,_その後二つ目のTabまで,_二つ目のTab以降を削除後の文字列) :- append(_最初のTabまで,['\t'|_その後二つめのTabまで],['\t'],_二つ目のTab以降を削除後の文字ならび), atom_chars(_二つ目のTab以降を削除後の文字列,_二つ目のTab以降を削除後の文字ならび),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- 最初のTabから後の副文字列を得る(_文字列,_最初のTabを含めた文字列の長さ,_それ以後の文字列), それ以後の文字列の最初に現れたTabを含めた長さ(_それ以後の文字列,_それ以後の文字列の最初に現れたTabを含めた長さ), _長さ is _最初のTabを含めたそこまでの文字列の長さ + _それ以後の文字列の最初に現れたTabを含めた長さ, sub_atom(_文字列,0,_長さ,_,_二つ目のTab以降を削除後の文字列),!. 最初のTabから後の副文字列を得る(_文字列,_最初のTabを含めた文字列の長さ,_それ以後の文字列) :- sub_atom(_文字列,St1,1,R,'\t'), _最初のTabを含めたそこまでの文字列の長さ is St1 + 1, sub_atom(_文字列,_最初のTabを含めた文字列の長さ,R,0,_それ以後の文字列). それ以後の文字列の最初に現れたTabを含めた最初からの長さ(_それ以後の文字列,_それ以後の文字列の最初に現れたTabを含めた長さ) :- sub_atom(_それ以後の文字列,St,1,_,'\t'), _それ以後の文字列の最初に現れたTabを含めた長さ is St + 1,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/172 # # ●Regular Expressionの使用環境 # PHP5 # # ●検索か置換か? # 置換 # # ●説明 # Javaのコメント・文字列を抽出してタグで囲みたいです。 # /**/, "", '' が入れ子になってる場合に外側だけ適応するのができません # 失敗例 <ダブル>"これは<シングル>'ペン'</シングル>です"</ダブル> # 成功例 <ダブル>"これは'ペン'です"</ダブル> # # ●対象データ() # /* "hello" 'world' */ # String var="これは'ペン'です"; # String apos='apopo "/* moge'; # # ●希望する結果 # <コメント>/* "hello" 'world' */</コメント> # String var=<ダブル>"これは'ペン'です"</ダブル>; # String apos=<シングル>'apopo "/* moge'</シングル>; # # 'Javaのコメント・文字列を抽出してタグで囲みたいです。'(_文字列,_置換された文字列) :- atom_chars(_文字列,Chars), '文字ならびからコメント・文字列を抽出してタグで囲む'(Chars,_置換された文字ならび), atom_chars(_置換された文字列,_置換された文字ならび). '文字ならびからコメント・文字列を抽出してタグで囲む'([],[]). '文字ならびからコメント・文字列を抽出してタグで囲む'([''''|R1],[<,シ,ン,グ,ル,>,''''|L1]) :- 'シングルクォートの外側入れ子を変換'(R1,L1,R2),!, '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). '文字ならびからコメント・文字列を抽出してタグで囲む'(['"'|R1],[<,ダ,ブ,ル,>,'"'|L1]) :- 'ダブルクォートの外側入れ子を変換'(R1,L1,R2),!, '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). '文字ならびからコメント・文字列を抽出してタグで囲む'([/,*|R1],[<,コ,メ,ン,ト,>,/,*|L1]) :- 'コメントの外側入れ子を変換'(R1,L1,R2),!, '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). '文字ならびからコメント・文字列を抽出してタグで囲む'([A|R1],[A|R2]) :- '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). シングルクォートの外側入れ子を変換(L,L1,R) :- append(L0,[''''|R],L), \+(member('''',R)), append(L0,['''',<,/,シ,ン,グ,ル,>|R],L1),!. ダブルクォートの外側入れ子を変換(L,L1,R) :- append(L0,['"'|R],L), \+(member('"',R)), append(L0,['"',<,/,ダ,ブ,ル,>|R],L1),!. コメントの外側入れ子を変換(L,L1,R) :- append(L0,[*,/|R],L), \+(append(_,[*,/|_],R)), append(L0,[*,/,<,/,コ,メ,ン,ト,>|R],L1),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/91 # # Youtubeみたいなランダムでユニークなn文字数の文字列を作る方法を教えてください 選択可能文字リスト( ['0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). 'Youtubeみたいなランダムでユニークなn文字数の文字列を作る'(_n,_ランダムでユニークなn文字数の文字列) :- findall(_ランダムでユニークな文字,~( ランダムでユニークな文字(_n,_ランダムでユニークな文字)), _ランダムでユニークなn文字数の文字リスト). atom_chars(_ランダムでユニークなn文字数の文字列,_ランダムでユニークなn文字数の文字リスト). ランダムでユニークな文字(_n,_ランダムでユニークな文字) :- length(Ln,_n), 選択可能文字リスト(_選択可能文字リスト), ランダムでユニークな文字_1(Ln,_選択可能文字リスト,_ランダムでユニークな文字). ランダムでユニークな文字_1([_|Ln],_選択可能文字リスト,_ランダムでユニークな文字) :- リストからランダムに値を抜き取る(_選択可能文字リスト,_文字_1,_選択文字を抜き取った選択可能文字リスト), ランダムでユニークな文字_2([_|Ln],_文字_1,_選択文字を抜き取った選択可能文字リスト,_ランダムでユニークな文字). ランダムでユニークな文字_2([_|Ln],_文字,_,_文字). ランダムでユニークな文字_2([_|Ln],_,_選択文字を抜き取った選択可能文字リスト,_文字) :- ランダムでユニークな文字(Ln,_選択文字を抜き取った選択可能文字リスト,_文字). リストからランダムに値を抜き取る(_リスト,_値,_値を抜き取ったリスト) :- 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト), リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト). 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト) :- length(_リスト,_要素数), _乱数値 is random(_要素数), length(_乱数値を要素数とした変数リスト,_乱数値). リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト) :- append(_乱数値を要素数とした変数リスト,[_値|_残りリスト],_リスト), append(_乱数値を要素数とした変数リスト,_残りリスト,_値を抜き取ったリスト). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/91 # # Youtubeみたいなランダムでユニークなn文字数の文字列を作る方法を教えてください 選択可能文字リスト( ['0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). 'Youtubeみたいなランダムでユニークなn文字数の文字列を作る'(_n,_ランダムでユニークなn文字数の文字列) :- length(Ln,_n), 選択可能文字リスト(_選択可能文字リスト), ランダムでユニークなn要素の文字リストを作る(Ln,_選択可能文字リスト,_ランダムでユニークなn文字数の文字リスト), atom_chars(_ランダムでユニークなn文字数の文字列,_ランダムでユニークなn文字数の文字リスト). ランダムでユニークなn要素の文字リストを作る([],_,[]). ランダムでユニークなn要素の文字リストを作る([_|Ln],_選択可能文字リスト,[_選択値|R]) :- リストからランダムに値を抜き取る(_選択可能文字リスト,_選択値,_選択値を抜き取った選択可能文字リスト), ランダムでユニークなn要素の文字リストを作る(Ln,_選択値を抜き取った選択可能文字リスト,R). リストからランダムに値を抜き取る(_リスト,_値,_値を抜き取ったリスト) :- 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト), リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト). 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト) :- length(_リスト,_要素数), _乱数値 is random(_要素数), length(_乱数値を要素数とした変数リスト,_乱数値). リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト) :- append(_乱数値を要素数とした変数リスト,[_値|_残りリスト],_リスト), append(_乱数値を要素数とした変数リスト,_残りリスト,_値を抜き取ったリスト). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/727 # # [1] 授業単元: 暇つぶし # [2] 問題文:迷路を解くプログラム。 #  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 # ----- ここからテキスト ----- # 5 5 # sxrrr # rxrrr # rrrxr # rrxgr # ----- ここまでテキスト ----- #  テキストの1行目は順番に迷路の横幅と縦幅を表します。 #  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。 #  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。 #  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 # 1 step # sxrrr # +xrrr # rrrxr # rrxgr # <中略> # 9 step # sxrrr # +x+++ # +++x+ # rrxg+ # '問題文:迷路を解くプログラム。  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 ----- ここからテキスト ----- 5 5 sxrrr rxrrr rrrxr rrxgr ----- ここまでテキスト -----  テキストの1行目は順番に迷路の横幅と縦幅を表します。  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 1 step sxrrr +xrrr rrrxr rrxgr <中略> 9 step sxrrr +x+++ +++x+ rrxg+ '(_テキスト) :- 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト). 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト) :- テキストを入力とし(_テキスト,LL1,LL2), スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順), '道を表示してください。'(_スタートからゴールまでの道順,LL1). スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順) :- スタートを探す(LL1,LL2,_スタートの行,_スタートの列), ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列), 隣に移動する(_スタートの行,_スタートの列,_ゴールの行,_ゴールの列,LL1,LL2,[],_スタートからゴールまでの道順). テキストを入力とし(_テキスト,LL1,LL2) :- get_lines(_テキスト,[_不要要素|_行ならび]), findall(_文字ならび,( member(_一行,_行ならび), atom_chars(_一行,_文字ならび)), LL1), 転置(LL1,LL2). スタートを探す(LL1,LL2,_スタートの行,_スタートの列) :- nth1(_スタートの行,LL1,L), nth1(_スタートの列,L,s). ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列) :- nth1(_ゴールの行,LL1,L), nth1(_ゴールの列,L,g). 隣に移動する(_ゴールの行,_ゴールの列,_ゴールの行,_ゴールの列,LL1,LL2,_,[[_ゴールの行,_ゴールの列]]). 隣に移動する(_行,_列,_ゴールの行,_ゴールの列,LL1,LL2,_履歴1,[[_行,_列]|R]) :- 移動可能な隣接点を得る(_行,_列,LL1,LL2,_隣の行,_隣の列), \+(member([_隣の行,_隣の列],_履歴1)), 隣に移動する(_隣の行,_隣の列,_ゴールの行,_ゴールの列,LL1,LL2,[[_行,_列]|_履歴1],R). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 列の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列) :- nth1(_行,LL1,L), length([_|L0],_列), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の列). 列の移動可能な隣接点(_行,_列,LL1,LL2,_隣の行,_隣の列) :- nth1(_列,LL2,L), length([_|L0],_行), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の行). 移動可能な隣接点(L0,R,_隣) :- last(L0,r), length(L0,_隣). 移動可能な隣接点(L0,R,_隣) :- R = [r|_], length([_,_|L0],_隣). '道を表示してください。'(_スタートからゴールまでの道順,LL) :- append(LL0,[[_行,_列]|RR],_スタートからゴールまでの道順), length([_|LL0],_ステップ), write('%t\n',[_ステップ]), '通過点を+に置換してLLを表示する'(_行,_列,LL), R = []. '通過点を+に置換してLLを表示する'(_行,_列,LL) :- append(L0,[L1|R],LL), length([_|L0],_行_1), 列の置換(_行_1,_行,_列,L1,L2), ならびを文字列に変換して表示(L2), R = []. 列の置換(_行,_行,_列,L1,L2) :- length([_|L0],_列), append(L0,[_|R],L1), append(L0,[+|R],L2),!. 列の置換(_,_,_,L,L). ならびを文字列に変換して表示(L) :- atomic_list_concat(L,S), writef('%t\n',[S]). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # p=1231, q=4567を選びます。 # eに65537 # e^-1=d mod φ(n) のdを計算して求めます。 #     d=3988493 # となります。 # # 暗号化と複合化の手順 # 公開鍵:N = 1231 * 4567 # E = 65537 # d = 3988493 # 文字コード:「a〜z」=01〜26、「A〜Z」=27〜52、空白=53 # 文書:This Anser p(1231). q(4567). 'E'(65537). d(3988493). n(5621977). 'RSA暗号化'(_文書,_暗号文字コードならび) :- 文書を文字コードで数値化します(_文書,_文字コードならび), 'RSA方式によるコード暗号化'(_文字コードならび,_暗号文字コードならび). 'RSA復号化'(_暗号文字コードならび,_文書) :- 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび), 文字コードならびから文書を復元します(_文字コードならび,_文書). 'RSA方式によるコード暗号化'(_文字コードならび,_暗号コードならび) :- 'E'(_E), n(_n), findall(_暗号コード,( member(_文字コード,_文字コードならび), _暗号コード is _文字コード ^ _E mod _n), _暗号コードならび). 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび) :- d(_d), n(_n), findall(_複合コード,( member(_暗号文字コード,_暗号文字コードならび), _複合コード is _暗号文字コード ^ _d mod _n), _文字コードならび). 文書を文字コードで数値化します(_文書,_文字コードならび) :- findall(_文字コード,( sub_atom(_文書,_,1,_,_文字), 文字コード(_文字,_文字コード)), _文字コードならび). 暗号コードを暗号文に変換(_暗号コードならび,_暗号文) :- findall(_暗号文字,( member(_暗号コード,_暗号コードならび), 文字コード(_暗号文字,_暗号コード)), _暗号文字ならび), atom_chars(_暗号文,_暗号文字ならび). 文字コードならびから文書を復元します(_文字コードならび,_文書) :- findall(_文字,( member(_文字コード,_文字コードならび), 文字コード(_文字,_文字コード)), _文字ならび), atom_chars(_文書,_文字ならび). 文字コード(_文字,_コード) :- char_code(_文字,_コード). % 以下のサイトは % ユーティリティ述語 sub_atom/10 の提案 % % A .. 文字列 (atom) % S .. 検索文字列開始変位 (integer) % L .. 検索文字列の長さ (integer) % R .. 残り長さ (integer) % H .. 検索文字列より前側の文字列 (atom) % X .. 検索文字列 (atom) % T .. 検索文字列より後の残り文字列 (atom) % HL .. 検索文字列より前側の文字ならび (chars) % XL .. 検索文字列文字ならび (chars) % TL .. 検索文字列より後の残り文字ならび (chars) % A がvarである時はH-HL,X-XL,T-TLの3組の中にvar-varの組があってはなりません。 sub_atom_12(A,W1,W2,S,L,R,H,X,T,HL,XL,TL) :- '文字列W1から始まりW2で終わる。W1,W2の間にW1,W2は現れない'(A,V,W,S,L,R,H,X,T,HL,XL,TL). '文字列W1から始まりW2で終わる。W1,W2の間にW1,W2は現れない'(A,W1,W2,S,L,R,H,X,T,HL,XL,TL) :- sub_atom(A,S,L,R,H,X,T,HL,XL,TL), 文字列W1から始まりW2で終わる(X,W1,W2,S1,S2), 'W1,W2の間の文字列にW1,W2は現れない'(X,S1,S2,W1,W2). 文字列W1から始まりW2で終わる(X,W1,W2,S1,S2) :- sub_atom(X,0,S1,_,W1), sub_atom(X,S2,_,0,W2). 'W1,W2の間の文字列にW1,W2は現れない'(X,W1,W2,S1,S2) :- sub_atom(X,S1,_,S2,_W1とW2の間の文字列), \+(sub_atom(_W1とW2の間の文字列,_,_,_,W1)), \+(sub_atom(_W1とW2の間の文字列,_,_,_,W2)). count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- atom(A), !, sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), N is S + L, sub_atom(A,N,R,_,T), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- var(A), !, atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL), length(HL,S), length(XL,L), length(TL,R), concat_atom([H,X,T],A), sub_atom(A,S,L,R,H,X,T,HL,XL,TL). % 以下のサイトは % % 文字列検索/8 % 文字列検索(_文字列,_切り取り開始文字列ならび,_切り取り終了文字列ならび,_切り取り開始以前文字列,_切り取り開始文字列,_切り取り文字列,_切り取り終了文字列,_残り文字列) :- atom_chars(_文字列,_文字ならび), 切り取り文字列ならびを文字ならびのならびに変換(_切り取り開始文字列ならび,_切り取り終了文字列ならび,_切り取り開始文字ならび候補,_切り取り終了文字ならび候補), 切り取り文字列まで読み飛ばし(_文字ならび,_切り取り開始文字ならび候補,_切り取り開始以前文字ならび,_切り取り開始文字ならび,_残り文字ならびの一), 文字ならび切り取り(_残り文字ならびの一,_切り取り終了文字ならび候補,_切り取り文字ならび,_切り取り終了文字ならび,_残り文字ならび), 切り取り文字列文字ならび変換(_切り取り開始以前文字ならび,_切り取り文字ならび,_切り取り終了文字ならび,_残り文字ならび,_切り取り開始文字ならび,_切り取り開始以前文字列,_切り取り文字列,_切り取り終了文字列,_残り文字列,_切り取り開始文字列). 切り取り文字列ならびを文字ならびのならびに変換(_切り取り開始文字列ならび,_切り取り終了文字列ならび,_切り取り開始文字ならび候補,_切り取り終了文字ならび候補) :- findall(_切り取り開始文字ならびの一,( member(_切り取り開始文字列の一,_切り取り開始文字列ならび) , atom_chars(_切り取り開始文字列の一,_切り取り開始文字ならびの一)), _切り取り開始文字ならび候補), findall(_切り取り終了文字ならびの一,( member(_切り取り終了文字列の一,_切り取り終了文字列ならび), atom_chars(_切り取り終了文字列の一,_切り取り終了文字ならびの一)), _切り取り終了文字ならび候補). 切り取り文字列文字ならび変換(_切り取り開始以前文字ならび,_切り取り文字ならび,_切り取り終了文字ならび,_残り文字ならび,_切り取り開始文字ならび,_切り取り開始以前文字列,_切り取り文字列,_切り取り終了文字列,_残り文字列,_切り取り開始文字列) :- atom_chars(_切り取り開始以前文字列,_切り取り開始以前文字ならび), atom_chars(_切り取り文字列,_切り取り文字ならび), atom_chars(_切り取り終了文字列,_切り取り終了文字ならび), atom_chars(_残り文字列,_残り文字ならび), atom_chars(_切り取り開始文字列,_切り取り開始文字ならび). 切り取り文字列まで読み飛ばし(_文字ならび,[],[],[],_文字ならび) :- !. 切り取り文字列まで読み飛ばし(_文字ならび,_切り取り開始文字ならび候補,[],_切り取り開始文字ならび,_残り文字ならび) :- member(_切り取り開始文字ならび,_切り取り開始文字ならび候補), append(_切り取り開始文字ならび,_残り文字ならび,_文字ならび). 切り取り文字列まで読み飛ばし([A|R1],_切り取り開始文字ならび候補,[A|R2],_切り取り開始文字ならび,R3) :- 切り取り文字列まで読み飛ばし(R1,_切り取り開始文字ならび候補,R2,_切り取り開始文字ならび,R3). 文字ならび切り取り([],_,[],[],[]) :- !. 文字ならび切り取り(_文字ならび,[],_文字ならび,[],[]) :- !. 文字ならび切り取り(_残り文字ならびの一,_終了文字ならび候補,_切り取り文字ならび,_終了文字ならび,_残り文字ならび) :- member(_終了文字ならび,_終了文字ならび候補), append(_終了文字ならび,_残り文字ならび,_終了文字ならびの二), append(_切り取り文字ならび,_終了文字ならびの二,_残り文字ならびの一). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/600 # # お願いします。 # # ●正規表現の使用環境 # Javascript # # ●検索か置換か? # 検索 # # ●説明 # HMVの商品IDらしき番号を取得したい # # ●対象データ # http://ime.nu/www.hmv.co.jp/artist_松平健_000000000039225/item_マツケンサンバ-2-リミックス-トラックス-dvd_1789889 # # http://ime.nu/www.hmv.co.jp/artist_松平健_000000000039225/item_マツケンサンバ-2-リミックス-トラックス-dvd_1789889/ref/1448035_8 # # ●希望する結果 # 1789889 # # 説明 # アンダーバー以降の末尾の自然数が商品IDなのですが(これなら簡単) # リファラー付きの場合は末尾じゃなくなるので初心者の自分には難しいです。 # なお、商品IDは0(ゼロ)で桁合わせはしていません # # 'HMVの商品IDらしき番号を取得したい'(_文字列,_商品ID) :- sub_atom(_文字列,S,5,_,'/ref/'), sub_atom(_文字列,0,S,_,_文字列_1), '商品IDは最後の_から末尾までの副文字列'(_文字列_1,_商品ID),!. 'HMVの商品IDらしき番号を取得したい'(_文字列,_商品ID) :- '商品IDは最後の_から末尾までの副文字列'(_文字列,_商品ID),!. '商品IDは最後の_から末尾までの副文字列'(_文字列,_商品ID) :- atom_chars(_文字列,Chars), append(_,['_'|R1],Chars), \+(member('_',R1)), atom_chars(_商品ID,R1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/587 # # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):キーボードより本体価格と税率を入力し、その税込価格を #                表示するプログラムを作成せよ。 # #                任意の数値xを小数点以下第n位で四捨五入する作れ(nは任意) # 'キーボードより本体価格と税率を入力し、その税込価格を 表示するプログラムを作成せよ。 任意の数値xを小数点以下第n位で四捨五入する作れ(nは任意)'(_小数点以下第n位で四捨五入) :- 'キーボードより本体価格と税率を入力し'(_本体価格,_税率), その税込み価格を表示する(_小数点以下第n位で四捨五入,_本体価格,_税率). 'キーボードより本体価格と税率を入力し'(_本体価格,_税率) :- 数を得る(本体価格,_本体価格 >= 0.0,_本体価格), 数を得る(税率,_税率 >= 0.0,_税率),!. その税込み価格を表示する(_小数点以下第n位で四捨五入,_本体価格,_税率) :- V is 10 ^ (_小数点以下第n位で四捨五入 - 1), _税込み価格 is floor(_本体価格 * (1 + _税率) * V + 0.5) / V, writef('%w\n',[_税込み価格]). 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). n個の数を得る(_n,_催促文,_数ならび) :- length(_数ならび,_n), findall(_数,( 部分ならび(_数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 数を得る(_催促文,_数)), _数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/610 # # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # program :- '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA配列,0,0,0,0). '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする' :- 入力したDNA塩基配列(_DNA配列), atom_chars(_DNA配列,_DNA塩基ならび), '入力したDNA塩基ならび中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA塩基ならび,0,0,0,0). 入力したDNA塩基配列(_DNA配列) :- write('DNA塩基配列を入力してください : '), get_line(_DNA配列). '入力したDNA塩基ならび中にある塩基 t, c, a, g それぞれの個数をカウントする'([],_t,_c,_a,_g) :- 塩基カウント出力([[t,_t],[c,_c],[a,_a],[g,_g]]),!. '入力したDNA塩基ならび中にある塩基 t, c, a, g それぞれの個数をカウントする'([_塩基|R],_t_1,_c_1,_a_1,_g_1) :- カウントする(_塩基,_t_1,_c_1,_a_1,_g_1,_t_2,_c_2,_a_2,_g_2), '入力したDNA塩基ならび中にある塩基 t, c, a, g それぞれの個数をカウントする'(R,_t_2,_c_2,_a_2,_g_2). カウントする(t,_t,_c,_a,_g,_t_2,_c,_a,_g) :- _t_2 is _t + 1,!. カウントする(c,_t,_c,_a,_g,_t,_c_2,_a,_g) :- _c_2 is _c + 1,!. カウントする(a,_t,_c,_a,_g,_t,_c,_a_2,_g) :- _a_2 is _a + 1,!. カウントする(g,_t,_c,_a,_g,_t,_c,_a,_g_2) :- _g_2 is _g + 1,!. 塩基カウント出力(LL) :- append(_,[[_塩基記号,_個数]|R],LL), 塩基(_塩基名,_塩基記号), writef('%t (%t) : %t\n',[_塩基名,_塩基記号,_個数]), R = []. 塩基('Thymine',t). 塩基('Cytosine',c). 塩基('Adenine',a). 塩基('Guanine',g). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/638 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # # int型の数値を文字列に変換する関数を自作せよ。(itoa関数の自作) # 'int型の数値を文字列に変換する関数'(_int型の数値,_文字列) :- 'int型の数値を文字列に変換する関数'(_int型の数値,[],_文字ならび), atom_chars(_文字列,_文字ならび). 'int型の数値を文字列に変換する関数'(0,_文字ならび,_文字ならび) :- !. 'int型の数値を文字列に変換する関数'(_int型の数値,L1,_文字ならび) :- M is _int型の数値 mod 10, _int型の数値_1 is _int型の数値 // 10, 'int型の数値を文字列に変換する関数'(_int型の数値_1,[M|L1],_文字ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/637 # # 1] 授業単元: プログラミング 演習(構造体) # [2] 問題文(含コード&リンク): 3冊の本の名前、ISBN、著者名を入力し一覧表示しなさい。 # ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。 # '3冊の本の名前、ISBN、著者名を入力し一覧表示しなさい。ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。' :- '3冊の本の名前、ISBN、著者名を入力し'(_3冊の本), 一覧表示しなさい(_3冊の本). '3冊の本の名前、ISBN、著者名を入力し'(_3冊の本) :- findall([_本の名前,_ISBN,_著者名],( between(1,3,_), 本の名前の入力(_本の名前), 'ISBNの入力'(_ISBN), 著者名の入力(_著者名)), _3冊の本). 本の名前の入力(_本の名前) :- write('本の名前を入力してください : '), get_line(_本の名前). 'ISBNの入力'(_本の名前) :- write('ISBNを入力してください : '), get_line(_ISBN). 著者名の入力(_著者名) :- write('著者名を入力してください : '), get_line(_著者名). 一覧表示しなさい([]). 一覧表示しなさい([[_本の名前,_ISBN,_著者名]|R]) :- writef('%20l %17l %12l',[_本の名前,_ISBN,_著者名]), 'ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。'(_ISBN), write('\n'), 一覧表示しなさい(R). 'ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。'(_ISBN文字列) :- atom_chars(_ISBN文字列,[_,_,_,-,_,-,_,_,_,_,_,-,_,_,_,-|_]),!. 'ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。'(_ISBN文字列) :- write(' %ISBN形式エラー '). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/586 # # [1] 授業単元: プログラミングC # [2] 問題文(含コード&リンク): # キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字を大文字にするプログラムを作成せよ。 # # 実行例 文字列入力 :AbCdEfG123 #     変換文字列 :aBcDeFg123 # 'キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字を大文字にする' :- write('文字列入力 : '), get_line(_文字列), '入力された文字列の英字については大文字を小文字に、小文字を大文字にする'(_文字列,_変換文字列), writef('変換文字列 : %t\n',[_変換文字列]). '入力された文字列の英字については大文字を小文字に、小文字を大文字にする'(_文字列,_変換文字列) :- atom_chars(_文字列,_文字ならび), '文字ならびの英字については大文字を小文字に、小文字を大文字にする'(_文字ならび,_変換されたもじれならび), atom_chars(_変換文字列,_変換された文字ならび). '文字ならびの英字については大文字を小文字に、小文字を大文字にする'([],[]) :- !. '文字ならびの英字については大文字を小文字に、小文字を大文字にする'([_文字_1|R1],[_文字_2|R2]) :- 文字を変換する(_文字_1,_文字_2), '文字ならびの英字については大文字を小文字に、小文字を大文字にする'(R1,R2). '文字ならびの英字については大文字を小文字に、小文字を大文字にする'([_|R1],R2) :- '文字ならびの英字については大文字を小文字に、小文字を大文字にする'(R1,R2). 文字を変換する(_文字,_変換された文字) :- _文字 @>= 'A', _文字 @=< 'Z', nth1(_nth1,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_文字), nth1(_nth1,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_変換された文字),!. 文字を変換する(_文字,_変換された文字) :- _文字 @>= 'a', _文字 @=< 'z', nth1(_nth1,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_文字), nth1(_nth1,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_変換された文字),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/561 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 問題A # 0と1だけで構成されたテキストファイルAがある。このファイルを読み込み、文字数をカウントし、 # 同じ文字数の0と1で構成された乱数列を生成し、テキストファイルBとして出力するプログラムを作成せよ。 # シード値はシステム時刻など適当なものを使用せよ。 # 問題B # 問題Aで使用したテキストファイルA、Bを一文字ずつXORしテキストファイルCとして出力するプログラムを作成せよ。 # '問題A 0と1だけで構成されたテキストファイルAがある。このファイルを読み込み、文字数をカウントし、 同じ文字数の0と1で構成された乱数列を生成し、テキストファイルBとして出力するプログラムを作成せよ。'(_テキストファイルA,_テキストファイルB) :- 'このファイルを読み込み、文字数をカウントし、同じ文字数の0と1で構成された乱数列を生成し'(_テキストファイルA,_要素数,_乱数数字ならび), テキストファイルBとして出力する(_テキストファイルB,_乱数数字ならび). 'このファイルを読み込み、文字数をカウントし、同じ文字数の0と1で構成された乱数列を生成し'(_テキストファイルA,_要素数,_乱数数字ならび) :- このファイルを読み込み(_テキストファイルA,Chars), 文字数をカウントし(Chars,_文字数), 同じ文字数の0と1で構成された乱数列を生成し(_文字数,Chars,_乱数数字ならび). このファイルを読み込み(_テキストファイルA,Chars) :- get_chars(_テキストファイルA,Chars). 文字数をカウントし(Chars,_文字数) :- length(Chars,_文字数). 同じ文字数の0と1で構成された乱数列を生成し(0,[],[]) :- !. 同じ文字数の0と1で構成された乱数列を生成し(N,L1,[A|R]) :- M is random(N), 一文字取り出す(M,L1,A,L2), N_1 is N - 1, 同じ文字数の0と1で構成された乱数列を生成し(N_1,L2,R). 一文字取り出す(M,L1,A,L2) :- length(L0,M), append(L0,[A|R],L1), append(L0,R,L2). テキストファイルBとして出力する(_テキストファイルB,L) :- atom_chars(_乱数文字列,L), open(_テキストファイルB,write,Outstream), write(Outstream,A), close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1359210850/199 # # テキストで # 11111 # 22222 # 33333 # 44444 # 55555 # # というのを # # 12345 # 12345 # 12345 # 12345 # 12345 # # という風に90度変更したようにする方法を教えてください # # 'テキストで 11111 22222 33333 44444 55555 というのを 12345 12345 12345 12345 12345 という風に90度変更したようにする方法を教えてください' :- 'テキストで 11111 22222 33333 44444 55555 というのを'(LL1), '12345 12345 12345 12345 12345 という風に90度変更する'(LL1,_転置された文字列). 'テキストで 11111 22222 33333 44444 55555 というのを'(LL) :- split('11111 22222 33333 44444 55555',['\n'],L1), findall(L,( member(_文字列,L1), atom_chars(_文字列,L)), LL). '12345 12345 12345 12345 12345 という風に90度変更する'(LL1,_転置された文字列) :- 転置(LL1,LL2), findall(S,( member(L,LL2), atomic_list_concat(L,S)), L4), atomic_list_concat(L4,'\n',_転置された文字列). % 以下のサイトは 加算器型相加平均(_累計,_相加平均) :- 加算器型相加平均([],0,_累計,_相加平均). 加算器型相加平均(Ln,_累計_1,_累計,_相加平均) :- 数を得る(_数), _累計_2 is _累計_1 + _数, 加算器型相加平均_1(Ln,_累計_2,_累計,_相加平均). 加算器型相加平均_1(Ln,_累計,_累計,_相加平均) :- length([_|Ln],Len), _相加平均 is _累計 / Len. 加算器型相加平均_1(Ln,_累計_2,_累計,_相加平均) :- 加算器型相加平均([_|Ln],_累計_2,_累計,_相加平均). 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). n個の数を得る(_n,_催促文,_数ならび) :- length(_数ならび,_n), findall(_数,( 部分ならび(_数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 数を得る(_催促文,_数)), _数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/176 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 下記の文字列を2次元配列に入力する。 # LISP # C++ # Ada # 次に配列の2列の文字 # S+a # を表示する。 # '下記の文字列を2次元配列に入力する。 LISP C++ Ada 次に配列の2列の文字 S+a を表示する。' :- '下記の文字列を2次元配列に入力する。'('LISP C++ Ada',_二次元配列), '次に配列の2列の文字 S+a を表示する。'(_二次元配列). '下記の文字列を2次元配列に入力する。'('LISP C++ Ada',_二次元配列) :- split('LISP C++ Ada',['\n'],L), findall(Chars,( member(A,L), atom_chars(A,Chars)), _二次元配列). '次に配列の2列の文字 S+a を表示する。'(_二次元配列) :- append(_,[[_,_,_文字|_]|R],_二次元配列), writef('%t',[_文字]), R = [], write('\n'). % 以下のサイトは yes. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/158 # # [1] 授業単元: プログラミング 〜構造体〜 # [2] 問題文(含コード&リンク): 3名の名前と性別、10桁の会員番号を入力し表示せよ # *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ # 入力(1234567890)→出力(12-3456-7890) # *入力された会員番号が10桁に満たない場合、 # または大きい場合は再度入力する指示を入れること # '3名の名前と性別、10桁の会員番号を入力し表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890) *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること' :- '3名の名前と性別、10桁の会員番号を入力し *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_3名の名前と性別と会員番号), '表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890)'(_3名の名前と性別と会員番号). '3名の名前と性別、10桁の会員番号を入力し *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_3名の名前と性別と会員番号) :- findall([_名前,_性別,_会員番号],( between(1,3,_), 名前を得る(_名前), 性別を得る(_性別), '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号)), _3名の名前と性別と会員番号). 名前を得る(_名前) :- write('名前を入力してください : '), get_line(_名前). 性別を得る(_性別) :- 整数を得る('性別を番号で入力してください 1..男 2..女\n',between(1,2,_性別番号),_性別番号), 性別番号から性別を得る(_性別番号,_性別). 性別番号から性別を得る(1,男). 性別番号から性別を得る(2,女). '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号) :- write('会員番号(数字10桁)を入力してください : '), get_line(Line), '診断:: 会員番号を得る'(Line,_会員番号),!. '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号) :- '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号). '診断:: 会員番号を得る'(Line,_会員番号) :- atom_chars(Line,Chars), 会員番号は数字のみで入力し(Chars), '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars),!. '診断:: 会員番号を得る'(Line,_会員番号) :- write('再入力をお願いします\n'), fail. 会員番号は数字のみで入力し(Chars) :- forall((member(A,Chars), member(A,['0','1','2','3','4','5','6','7','8','9'])),true),!. 会員番号は数字のみで入力し(Chars) :- writef('入力された文字列 %t には数字以外の文字が混入しています\n',[Chars]), fail. '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars) :- length(Chars,10),!. '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars) :- writef('入力された文字列 %t は10桁でありません\n',[Chars]), fail. '表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890)'(_3名の名前と性別と会員番号) :- append(_,[[_名前,_性別,_会員番号]|R],_3名の名前と性別と会員番号), number_chars(_会員番号,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), atomic_list_concat([[_1,_2,-,_3,_4,_5,_6,-,_7,_8,_9,_10],_会員表示文字列), writef('名前: %t\n性別: %t\n会員番号: %t\n\n',[_会員番号表示文字列]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元: リスト処理 # [2] 問題文(含コード&) http://codepad.org/3DdhcBUM # # /* # # seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 # また、整列する際に要素どうしを比較した回数も表示しなさい。 # # 【実行例】 # # 番号 氏名      得点 # 1021 Machida Masato 100 # 1017 Nonaka Fujio 98 # 1011 Suzuki kenichi 93 # 1019 Fujimoto Kaoru 92 # 1006 kato Ichiro 91 # ・ ・     ・ # ・ ・     ・ # ・ ・     ・ # 1020 Hoshi Izumi 32 # 整列の為の比較回数=132回 # # ※長いので実行結果は途中省略しています。 # ※比較回数はコードによって異なる場合があります。 # # */ 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 また、整列する際に要素どうしを比較した回数も表示しなさい。' :- 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび), リスト処理による挿入法で得点の降順に整列して(_生徒ならび,[],_整列済み生徒ならび,0,_比較回数), 表示しなさい(_整列済み生徒ならび,_比較回数). 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび) :- get_split_lines('seito.dat',[' '],_生徒ならび). リスト処理による挿入法で得点の降順に整列して([[_学籍番号,_姓,_名,_得点]|R1],L1,_整列済み生徒ならび,_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,L1,L2,_比較回数_1,_比較回数_2), リスト処理による挿入法で得点の降順に整列して(R1,L2,_整列済み生徒ならび,_比較回数_2,_比較回数),!. リスト処理による挿入法で得点の降順に整列して([],_整列済み生徒ならび,_整列済み生徒ならび,_比較回数,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],[[_学籍番号,_名,_名,_得点],[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],_比較回数_1,_比較回数) :- 比較回数 is _比較回数_1 + 1, _得点 >= _得点_1,!. 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R1],[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R2],_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,R1,R2,_比較回数_1,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[],[[_学籍番号,_名,_名,_得点]],_比較回数,_比較回数) :- !. 表示しなさい(_整列済み生徒ならび,_比較回数) :- 見出しの表示, append(_,[[_学籍番号,_姓,_名,_得点]|R],_整列済み生徒ならび), 整形して表示する(_学籍番号,_姓,_名,_得点), R = [], writef('整列の為の比較回数=%t回\n',[_比較回数]). 見出しの表示 :- write('番号 氏名      得点\n'). 整形して表示する(_学籍番号,_姓,_名,_得点) :- 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列), 得点を頭部空白3桁に(_得点,_得点文字列), atomic_list_concat([_学籍番号,_姓文字列,_名文字列,_得点文字列],' ',_表示文字列), writef('%t\n',[_表示文字列]). 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列) :- '8桁に'(_姓,_姓文字列), '8桁に'(_名,_名文字列). '8桁に'(_項,_8桁文字列) :- atom_chars(_項,Chars_1), length(L,8), append(L1,L2,L), all(L2,' '), atom_chars(_8桁文字列,L). 得点を頭部空白3桁に(_得点,_得点文字列) :- number_chars(_得点,Chars), length(L,3), append(L0,Chars,L), all(L0,' '), atom_chars(_得点文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,( member(A,Lines1), split(A,Sep,Line)), Lines). get_lines(Instream,end_of_file,_,_,[]) :-!. get_lines(Instream,S,[],_終了検索対象ならび,[S]) :- member(A,_終了検索対象ならび), 検索(S,A),!. get_lines(Instream,S,[],[],[S|R]) :- get_line(Instream,S2), get_lines(Instream,S2,[],[],R),!. get_lines(Instream,S,[],_終了検索対象ならび,[S|R]) :- member(A,_終了検索対象ならび), \+(検索(S,A)), get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), member(B,_終了検索対象ならび), 検索(S,B),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S|R]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), !, get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,_,_開始検索対象ならび,_終了検索対象ならび,X) :- get_line(Instream,S2), get_lines(Instream,S2,_開始検索対象ならび,_終了検索対象ならび,X),!. get_lines(_ファイル,_スタート行,_最終行,X) :- integer(_スタート行), integer(_最終行), 行位置指定選択(_ファイル,_スタート行,_最終行,X). get_lines(_ファイル,_開始検索対象ならび,_終了検索対象ならび,X) :- \+(integer(_開始検索対象ならび)), \+(integer(_終了検索対象ならび)), open(_ファイル,read,Instream), get_line(Instream,S), get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,X), close(Instream),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat, get_line(user_input,Line), (Line = end_of_file , (!) , fail ; true)), Lines). get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_chars(Instream,end_of_file,[]) :- !. get_chars(Instream,_,[]) :- at_end_of_stream(Instream),!. get_chars(Instream,X,[X|R]) :- get_char(Instream,Y), get_chars(Instream,Y,R) . get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists_file(File_1), open(File_1,read,Instream), get_char(Instream,X), get_chars(Instream,X,L), close(Instream),!. get_chars(Instream,L) :- is_stream(_,Instream,_), get_char(Instream,X), get_chars(Instream,X,L),!. get_chars(L) :- findall(U,( repeat, get_char(U), (U = end_of_file , (!) , fail ; true)), L). get_line(X) :- get_line(user_input,X). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,_,[]) :- at_end_of_stream(Instream),!. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), atomic_list_concat(U,A), chars_lines(R,R2). split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y) , \+(member(U,_区切り符号ならび))), Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), C number Nl,!. split_5(B,C) :- atomic_list_concat(B,C),!. all([],_). all([V|R],V) :- all(R,V). 検索(_文字列,_副文字列) :- atom_length(_文字列,_文字列の文字数), atom_length(_副文字列,_副文字列の文字数), Max is _文字列の文字数 - _副文字列の文字数, between(0,Max,N), sub_atom(_文字列,N,_副文字列の文字数,_副文字列),!. 行位置指定選択(_ファイル,_選択先頭行,_選択最終行,X) :- wc(_ファイル,[[_行,_,_,_]]), _行数_1 is _行 - _選択先頭行 + 1, _行数_2 is _選択最終行 - _選択先頭行, atomic_list_concat(['tail -',_行数_1,' ',_ファイル,' | head -',_行数_2],S), shs(S,X). wc(F,X) :- exists_file(F1), atomic_list_concat(['wc ',F1],S), sh(S,X),!. wc(F,X) :- atomic_list_concat([F,' | wc'],S), sh(S,X),!. sh(Command,X) :- shs(Command,Y), findall(U,(member(V,Y) , make_list(V,[' ',','],U)),X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,_,[]) :- at_end_of_stream(Instream),!. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元:リスト構造 # [2] 問題文(含コード&amp;リンク): # http://ime.nu/iup.2ch-library.com/i/i0825590-1357830189.gif # # 以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作 成せよ. # リストは1つとし,初期値は「15 4 32 1」である. # ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. # ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. # ・データのソート(降順)を行う関数を作成する. # ・リストの平均値を計算し出力する関数を作成する。 # # ------表示例------ # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : # ------------------ # # ------実行例------- # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 1 # 追加するデータを入力してください : 10 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 4 # リストの平均値 : 12.4 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 3 # リスト : 32 15 10 4 1 # :- dynamic(リスト/1). '以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作成せよ. リストは1つとし,初期値は「15 4 32 1」である. ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. ・データのソート(降順)を行う関数を作成する. ・リストの平均値を計算し出力する関数を作成する。 ------表示例------ 1. データの追加 2. データの削除 3. データのソート(降順) 4. リストの平均値 5. 終了 何を実行しますか : ' :- 'リストは1つとし,初期値は「15 4 32 1」である', メニューを表示, 各項目の機能を実現して結果を表示する. 'リストは1つとし,初期値は「15 4 32 1」である' :- assertz(リスト([15,4,32,1])). メニューを表示 :- write('1. データの追加\n2. データの削除\n3. データのソート(降順)\n4. リストの平均値\n5. 終了\n何を実行しますか : '). メニューを表示 :- メニューを表示. 各項目の機能を実現して結果を表示する :- 機能番号を選択する(_機能番号), 機能を実現して結果を表示する(_機能番号), _機能番号 = 5,!. 機能番号を選択する(_機能番号) :- get_line(Line), '診断:: メニューの選択'(Line,_機能番号),!. 機能番号を選択する(_機能番号) :- 機能番号を選択する(_機能番号). '診断:: メニューの選択'(Line,_機能番号) :- atom_number(Line,_機能番号), integer(_機能番号), between(1,5,_機能番号),!. '診断:: メニューの選択'(Line,_機能番号) :- writef('選択された %t からは適切な機能番号が得られません。再入力をお願いします。\n',[Line]), fail. 機能を実現して結果を表示する(5) :- !. 機能を実現して結果を表示する(1) :- データの追加. 機能を実現して結果を表示する(2) :- データの削除. 機能を実現して結果を表示する(3) :- 'データのソート(降順)'. 機能を実現して結果を表示する(4) :- リストの平均値. データの追加 :- write('追加するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), append(L1,[_データ],L2), assertz(リスト(L2)). データの削除 :- write('削除するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), ならびから削除(_データ,L1,L2), assertz(リスト(L2)). 'データのソート(降順)' :- リスト(L1), 降順整列(L1,L2), atomic_list_concat(L2,' ',S), writef('リスト : %t\n',[S]). リストの平均値 :- リスト(L1), findavg(_データ,( member(_データ,L1)), _平均値), atomic_list_concat(L1,_リスト表示), writef('平均値 : %t\nリスト : %t\n',[_平均値,_リスト表示]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,_,[e,n,d,'_',o,f,'_',f,i,l,e]) :- at_end_of_stream(Stream),!. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. 降順整列([],[]). 降順整列([_軸要素|R1],_降順に整列されたならび) :- 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび), 降順整列(_軸要素に等しいか大きいならび,_整列した軸要素に等しいか大きいならび), 降順整列(_軸要素より小さいならび,_整列した軸要素より小さいならび), append(_整列した軸要素に等しいか大きいならび,[_軸要素|_整列した軸要素より小さいならび],_降順に整列したならび). 降順分割(_,[],[],[]). 降順分割(_軸要素,[_要素|R],[_要素|_軸要素に等しいか大きいならび],_軸要素より小さいならび) :- _要素 @>= _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). 降順分割(_軸要素,[_要素|R],_軸要素に等しいか大きいならび,[_要素|_軸要素より小さいならび]) :- _要素 @< _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). findavg(_集約項,_項,_相加平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _相加平均 is _合計値 / _ならびの長さ,!. sum([],0). sum([N|R],S) :- sum(R,S_1), S is N + S_1. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 161代目 #983 # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ.' :- '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントする'. '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントする' :- 入力したDNA塩基配列中にある(_DNA塩基ならび), '塩基 t, c, a, gそれぞれの個数をカウントする'(_DNA塩基ならび,0,0,0,0,_t,_c,_a,_g), writef('Thymine (t) : %w\nCytoshine (c) : %w\nAdenine (a) : %w\nGuanime (g) : %w\n',[_t,_c,_a,_g]). 入力したDNA塩基配列中にある(_DNA塩基ならび) :- 行入力(_行), atom_chars(_行,_DNA塩基ならび). '塩基 t, c, a, gそれぞれの個数をカウントする'([],_t,_c,_a,_g,_t,_c,_a,_g). '塩基 t, c, a, gそれぞれの個数をカウントする'([_塩基|R],_t_1,_c_1,_a_1,_g_1,_t,_c,_a,_g) :- 塩基の集計欄に加算(_塩基,_t_1,_c_1,_a_1,_g_1,_t_2,_c_2,_a_2,_g_2), '塩基 t, c, a, gそれぞれの個数をカウントする'(R,_t_2,_c_2,_a_2,_g_2,_t,_c,_a,_g). 塩基の集計欄に加算(t,_t_1,_c,_a,_g,_t,_c,_a,_g) :- succ(_t_1,_t). 塩基の集計欄に加算(c,_t,_c_1,_a,_g,_t,_c,_a,_g) :- succ(_c_1,_c). 塩基の集計欄に加算(a,_t,_c,_a_1,_g,_t,_c,_a,_g) :- succ(_a_1,_a). 塩基の集計欄に加算(g,_t,_c,_a,_g_1,_t,_c,_a,_g) :- succ(_g_1,_g). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/983 # # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ.' :- '入力したDNA塩基配列中にある'(_DNA塩基ならび), '塩基 t, c, a, gそれぞれの個数をカウントする'(_DNA塩基ならび,_t,_c,_a,_g), writef('Thymine (t) : %t\nCytoshine (c) : %t\nAdenine (a) : %t\nGuanime (g) : %t\n',[_t,_c,_a,_g]). '入力したDNA塩基配列中にある'(_DNA塩基ならび) :- get_line(Line), atom_chars(Line,_DNA塩基ならび). '塩基 t, c, a, gそれぞれの個数をカウントする'([],0,0,0,0). '塩基 t, c, a, gそれぞれの個数をカウントする'([_塩基|R],_t,_c,_a,_g) :- '塩基 t, c, a, gそれぞれの個数をカウントする'(R,_t_1,_c_1,_a_1,_g_1), 塩基個数を加算(_塩基,_t_1,_c_1,_a_1,_g_1,_t,_c,_a,_g). 塩基個数を加算(t,_t_1,_c,_a,_g,_t,_c,_a,_g) :- _t is _t_1 + 1. 塩基個数を加算(c,_t,_c_1,_a,_g,_t,_c,_a,_g) :- _c is _c_1 + 1. 塩基個数を加算(a,_t,_c,_a_1,_g,_t,_c,_a,_g) :- _a is _a_1 + 1. 塩基個数を加算(g,_t,_c,_a,_g_1,_t,_c,_a,_g) :- _g is _g_1 + 1. % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/829 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # 1行最大80文字の空白を挟まない英字文字列を入力し、 # 10文字続けて表示するごとに改行を挿入して表示するプログラムを作成しなさい # '1行最大80文字の空白を挟まない英字文字列を入力し、10文字続けて表示するごとに改行を挿入して表示する' :- '1行最大80文字の空白を挟まない英字文字列を入力し'(_英字文字列), '10文字続けて表示するごとに改行を挿入して表示する'(_英字文字列). '1行最大80文字の空白を挟まない英字文字列を入力し'(_英字文字列) :- length(Ln,80), get_char(_文字), '1行最大80文字の空白を挟まない英字ならびを入力し'(Ln,_文字,_英字ならび), atom_chars(_英字文字列,_英字ならび). '1行最大80文字の空白を挟まない英字ならびを入力し'([],_英字,[_英字]) :- !. '1行最大80文字の空白を挟まない英字ならびを入力し'(_,'\n',[]) :- !. '1行最大80文字の空白を挟まない英字ならびを入力し'([_|Ln],_文字,[A|R]) :- 英字(_文字), get_char(_次の文字), '1行最大80文字の空白を挟まない英字ならびを入力し'(Ln,_次の文字,R),!. '1行最大80文字の空白を挟まない英字ならびを入力し'([_|Ln],_,_英字ならび) :- get_char(_文字), '1行最大80文字の空白を挟まない英字ならびを入力し'([_|Ln],_文字,_英字ならび),!. 英字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z',!. 英字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. '10文字続けて表示するごとに改行を挿入して表示する'('') :- !. '10文字続けて表示するごとに改行を挿入して表示する'(_英字文字列) :- '10文字続けて表示するごとに改行を挿入して'(_英字文字列,_残り文字列), '10文字続けて表示するごとに改行を挿入して表示する'(_残り文字列),!. '10文字続けて表示するごとに改行を挿入して表示する'(_英字文字列) :- writef('%t\n',[_英字文字列]). '10文字続けて表示するごとに改行を挿入して'(_英字文字列,_残り文字列) :- sub_atom(_英字文字列,0,10,R,_10文字), sub_atom(_英字文字列,10,R,0,_残り文字列), writef('%t',[_10文字]), write('\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/717 # # [1] 授業単元: C演習 # [2] 問題文(含コード&リンク): # (問題文)http://imgur.com/bAeG1 # (途中まで書いたコード)://codepad.org/nwwt2hgU # (使用するテキストファイル、結果含む) # http://s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/joyful.cgi? のNo.396 # :- dynamic(転置索引/2). テキストのダウンロード(_サイトファイル名,_出力ファイル名) :- atomic_list_concat(['w3m -dump ',_サイトのファイル名],S), popen(S,Chars), open(_出力ファイル名,write,Outstream), ファイルに書き込む(Outstream,Chars), close(Outstream). ファイルに書き込む(Outstream,[]). ファイルに書き込む(Outstream,[C|R]) :- put_char(Outstream,C), ファイルに書き込む(Outstream,R). 転置索引を作る(_ファイル名) :- open(_ファイル名,read,Instream), ストリームから転置索引を作る(Instream,0), close(Instream). ストリームから転置索引を作る(Instream,_) :- at_end_of_stream(Instream),!. ストリームから転置索引を作る(Instream,N) :- get_line(Instream,Line), N_2 is N + 1, 語彙を転置索引に登録する(Line,N), ストリームから転置索引を作る(Instream,N_2). 語彙を転置索引に登録する(Line,N) :- split(Line,[' ',',','.',':','(',')'],L), member(_語彙,L), \+(転置索引(_語彙,N)), assertz(転置索引(_語彙,N)), fail. 語彙を転置索引に登録する(_,_). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/682 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 以下の手順に従ってプログラムを作成せよ。 # 適宜printfを利用して、入力支援(「文字列を入力してください」等の画面表示)を行うこと。 # 1.文字配列name[5][64]を作成 # 2.キーボードから5人分の名前を入力し、name配列に格納 # 3.キーボードから名前を入力し、name配列の何番目に格納されているかを検索して表示 # (見つからなかった場合は「見つかりません」と表示) # 4.「quit」が入力されるまで3の処理を繰り返す # '以下の手順に従ってプログラムを作成せよ。 適宜printfを利用して、入力支援(「文字列を入力してください」等の画面表示)を行うこと。 1.文字配列名前[5][64]を作成 2.キーボードから5人分の名前を入力し、名前配列に格納 3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す' :- '1.文字配列名前[5][64]を作成'(_名前配列), '2.キーボードから5人分の名前を入力し、名前配列に格納'(_名前配列), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前). '1.文字配列名前[5][64]を作成'(LL) :- length(_名前配列,5), findall(L,( member(L,_名前配列), length(L,64)), _名前配列). '2.キーボードから5人分の名前を入力し、名前配列に格納'(_名前配列) :- findall(L,( member(L,_名前配列), 名前を入力し(_名前), 名前配列に格納(_名前,L)), _名前配列). 名前を入力し(_名前) :- write('名前を入力してください : '), get_line(_名前). 名前配列に格納(_名前,L) :- atom_chars(_名前,Chars), append(Chars,R,L), all(R,' '). '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前) :- 'キーボードから名前を入力し'(_名前), '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前). 'キーボードから名前を入力し'(_名前) :- write('検索する名前を入力してください : '), get_line(_名前). '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '4.「quit」が入力されるまで3の処理を繰り返す'(_名前),!. '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '名前配列の何番目に格納されているかを検索して'(_名前,_名前配列,_nth1), writef('%t番目 %t\n',[_nth,_名前]),!, fail. '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '見つからなかった場合は「見つかりません」と表示', fail. '見つからなかった場合は「見つかりません」と表示' :- write('見つかりません\n'). '名前配列の何番目に格納されているかを検索して'(_名前,_名前配列,_nth1) :- atom_chars(_名前,Chars), nth1(_nth1,_名前配列,L), append(Chars,R,L), all(R,' '). '4.「quit」が入力されるまで3の処理を繰り返す'(quit). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/434 # # [1] C言語 # [2] 1) codepad.org/u1WNoZPtの関数と反対の動作をする関数、 #     及び二つの関数の動作確認が出来るmain関数を作成せよ。 #   2) キーボードから入力されたアルファベット及び数字の数を数えて、 #     少ないほうを消去するプログラムを作成せよ。 #     ただし、同数の場合は両方とも消去する。 # [3.1] Windows7 # [3.3] C言語 # [4] 12/19 19時まで # [5] 特になし # # 'キーボードから入力されたアルファベット及び数字の数を数えて、少ないほうを消去するプログラムを作成せよ。ただし、同数の場合は両方とも消去する。'(_残った文字列) :- 'キーボードから入力された'(_文字列), 'アルファベット及び数字の数を数えて'(_文字列,_アルファベットの数,_数字の数), '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列). 'キーボードから入力された'(_文字列) :- write('アルファベットと数字だけからなる文字列を入力してください : '), get_line(_文字列). 'アルファベット及び数字の数を数えて'(_文字列,_アルファベットの数,_数字の数) :- count((sub_atom(_文字列,_,1,_,_文字),アルファベット(_文字)),_アルファベットの数), count((sub_atom(_文字列,_,1,_,_文字),数字(_文字)),_アルファベットの数). アルファベット(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. アルファベット(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 数字(_文字) :- _文字 @>= '0', _文字 @=< '9'. '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- 少ないほうを消去する。(_文字列,_アルファベットの数,_数字の数,_残った文字列). '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- 'ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列). '少ないほうを消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット < _数字の数, アルファベットを消去する(_文字列,_残った文字列). '少ないほうを消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット > _数字の数, 数字を消去する(_文字列,_残った文字列). 'ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット = _数字の数, 両方とも消去する(_文字列,_残った文字列). アルファベットを消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(アルファベット(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). 数字を消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(数字(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). 両方とも消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(数字(_文字)), \+(アルファベット(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). count(P,Count) :- findall(1,P,L), length(L,Count). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/150 # # [1] c言語 # [2] # (1) # キーボードから二つの文字列を配列x[256],y[256] に入力する.配列xに含まれる文字列の # 後ろに配列yに含まれる文字列をつなげたものを配列z[256] に代入し,画面表示するプログ # ラムを作成せよ.例えば二つの文字列が「sch」,「ool」の場合,配列z に「school」が代入され, # 画面表示される.なお,NULL文字「\0」の扱いに注意し,配列z の文字列の後ろにNULL文 # 字を入れておくこと # # (2)以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入 # 力して下さい」などの画面表示)を行うこと. # 文字配列name[5][64] を作成する. # キーボードから5 人分の名前を入力し,name 配列に格納する. # キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示 # する.ただし,見つからなかった場合には,「見つかりません」と表示する. # 「quit」が入力されるまでの処理を繰り返す. # # '以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入力して下さい」などの画面表示)を行うこと. 1) 文字配列name[5][64] を作成する. 2) キーボードから5 人分の名前を入力し,name 配列に格納する. 3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する. 4) 「quit」が入力されるまで3)の処理を繰り返す.' :- '1) 文字配列name[5][64] を作成する.'(_name), '2) キーボードから5 人分の名前を入力し,name 配列に格納する.'(_name), '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,_名前), '4) 「quit」が入力されるまで3)の処理を繰り返す.'(_名前). '1) 文字配列name[5][64] を作成する.'(_name) :- length(_name,5), findall(L,( member(L,LL), length(L,64)), _name). '2) キーボードから5 人分の名前を入力し,name 配列に格納する.'(_name) :- findall(L,( member(L,_name), '名前を入力し,name 配列に格納する'(L)), _name). '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,名前) :- キーボードから名前を入力し(_名前), 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(_名前,_name). '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,_名前) :- '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,_名前). 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(quit,_) :- !. 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(_名前,_name) :- 'name 配列の何番目に格納されているかを検索して'(_名前,_name), 表示する(_名前,_何番目),!. 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(_,_) :- writef('見つかりません\n'), fail. 'name 配列の何番目に格納されているかを検索して'(_名前,_name) :- atom_chars(_名前,Chars), nth1(_何番目,_name,L), append(Chars,_,L). 表示する(_名前,_何番目) :- writef('%tは%t番目にあります。\n',[_名前,_何番目]),!. '4) 「quit」が入力されるまで3)の処理を繰り返す.'(quit). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/144 # # [1] 授業単元:文字列処理・ポインタ # [2] 問題文(含コード&リンク): #  C言語でhtml文内のタグをとり、文字のみを端末内に出力するようなプログラムを完成させよ #  *サンプルのhtml文を以下のように表示できるすること # # TITLE # # text1 # text2 # text3 # text4 # text5 # # リンク1 # url # # リンク2 # url # # リンク3 # url # # # ※サンプルhtml文 # # TITLE # #

#

リンク1

#

url

#

リンク2

#

url

#

リンク3

#

url

# # 文字列から必ず閉じたタグの値だけ取得する(_文字列,_値ならび) :- atom_chars(_文字列,Chars), 文字ならびから必ず閉じたタグの値だけ取得する(_文字列,_値ならび). 文字ならびから必ず閉じたタグの値だけ取得する(Chars,_タグ値ならび) :- findall(_タグの値,( タグの値を切り取る(Chars,_タグの値)), _値ならび). タグの値を切り取る(_文字のならび,_タグの値) :- append(L1,[>|R2],[<|_],_文字のならび), '<,>を含まない文字ならび'(R2), atomic_list_concat(R2,_タグの値). '<,>を含まない文字ならび'(L) :- \+(L = []), \+(member(<,L)), \+(member(>,L)). append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/read.cgi/tech/1354393458/2 # # # お題:摂氏温度入力で華氏温度表示。 # 摂氏温度入力で華氏温度表示 :- 摂氏温度入力で(_摂氏温度), 華氏温度表示(_摂氏温度). 摂氏温度入力で(_摂氏温度) :- write('摂氏温度を入力してください : '), 一行の読み込み(Line), '診断: 摂氏温度入力'(Line,_摂氏温度),!. 摂氏温度入力で(_摂氏温度) :- 摂氏温度入力で(_摂氏温度). '診断: 摂氏温度入力'(Line,_摂氏温度) :- atom_to_term(Line,_摂氏温度,_), number(_摂氏温度),!. '診断: 摂氏温度入力'(Line,_) :- writef('摂氏温度は整数または実数ですが、入力された %t からは数値情報が得られません。再入力をお願いします。\n',[Line]), fail. 華氏温度表示(_摂氏温度) :- _華氏温度 is 9 * _摂氏温度 / 5 + 32, writef('華氏温度は %t です。\n',[_華氏温度]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 逆順に出力する(_入力した文字列) :- 逆順に(_入力した文字列,_逆順文字ならぴ), 出力する(_逆順文字ならび). 逆順に(_入力した文字列,_逆順文字ならぴ) :- atom_chars(_入力した文字列,_文字ならび), reverse(_文字ならび,_逆順文字ならぴ). 出力する([]) :- write('\n'). 出力する([_文字|_残りならび]) :- wrire(_文字), 出力する(_残りならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 逆順に出力する(_入力した文字列) :- atom_chars(_入力した文字列,_文字ならび), reverse(_文字ならび,_逆順文字ならぴ), atom_chars(_逆順文字列,_逆順文字ならび), writef('%t\n',[_逆順文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/228 # # ご教示お願いいたします。 # # ・DBMS名とバージョン # SQL Server2008 # # ・テーブルデータ # テーブル名:住所_MST # ID 住所 # ------------ # 001 住所A # 002 住所B # 003 住所C # 004 住所D # 005 住所E # 006 住所F # 008 住所G # 010 住所H # # ・欲しい結果 # IDに007を設定してINSERTしたいのですが上手くSQL文が浮かびませんでした # 仕様としましては一番若いIDから、設定されていないIDを取得してINSERTします # なお、IDはキー設定されています # # 結果は下記のようになります # ID 住所 # ------------ # 001 住所A # 002 住所B # 003 住所C # 004 住所D # 005 住所E # 006 住所F # 007 新住所 # 008 住所G # 010 住所H # # '・DBMS名とバージョン SQL Server2008 ・テーブルデータ テーブル名:住所_MST ID 住所 ------------ 001 住所A 002 住所B 003 住所C 004 住所D 005 住所E 006 住所F 008 住所G 010 住所H ・欲しい結果 IDに007を設定してINSERTしたいのですが上手くSQL文が浮かびませんでした 仕様としましては一番若いIDから、設定されていないIDを取得してINSERTします なお、IDはキー設定されています 結果は下記のようになります ID 住所 ------------ 001 住所A 002 住所B 003 住所C 004 住所D 005 住所E 006 住所F 007 新住所 008 住所G 010 住所H '(_住所) :- '一番若いIDから、設定されていないIDを取得してINSERTします'(_住所). '一番若いIDから、設定されていないIDを取得してINSERTします'(_住所) :- between(1,999,N), 頭部零文字列(3,N,_ID), \+(住所_MST(_ID,_)), assertz(住所_MST(_ID,_住所)),!. 頭部零文字列(_長さ,_整数,_頭部零文字列) :- length(_頭部零文字ならび,_長さ), number_chars(_整数,Chars), append(L0,Chars,_頭部零文字ならび), all(L0,'0'), atom_chars(_頭部零文字列,_頭部零文字ならび),!. all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/437 # # 【 形態 】Javaアプリケーション # 【 期限 】一週間後まで # 【 Ver  】java version "1.7.0_03" # 【 課題 】2次元配列、1次元配列を使って科目得点表を表示するプログラムを作成する。 #       平均点に関しては、プログラム内で求めて表示する。また、配列の要素は必要な個数分だけにする。 #        #           国語  数学  英語  社会  理科  平均 #       青木   50   90   76           72 #       木村   80   46   84   67       69 #       山田   30   69   72   89   56   63 # #       科目名、生徒はStringクラスの1次元配列、点数はint型の2次元配列で初期化。 # # 【 補足 】点数、平均点の表示は何とか出来たのですが、表にしようとすると、青木の社会、理科、木村の理科の部分が足りず、ArrayIndexOutOfBoundsExceptionが発生してしまいます。 # '2次元配列、1次元配列を使って科目得点表を表示するプログラムを作成する。 平均点に関しては、プログラム内で求めて表示する。また、配列の要素は必要な個数分だけにする。                  国語  数学  英語  社会  理科  平均       青木   50   90   76           72       木村   80   46   84   67       69       山田   30   69   72   89   56   63 科目名、生徒はStringクラスの1次元配列、点数はint型の2次元配列で初期化。' :- 科目名ならび(_科目名ならび), 生徒ならび(_生徒ならび), 得点ならび(_得点ならび), 科目得点表を表示する(_得点ならび,_生徒ならび,_得点ならぴ). 科目名ならび([国語,数学,英語,社会,理科]). 生徒ならび([青木,木村,山田]). 得点ならび([[50,90,76,[],[],72],[80,46,84,67,[],69],[30,69,72,89,56,63]]). 科目得点表を表示する(_科目ならび,_生徒ならび,_得点ならぴ) :- 科目見出し(_科目ならび), 行表示(_生徒ならび,_得点ならび). 科目見出し(_科目ならび) :- write(' '), append(_,[A|R],_科目ならび), 幅は8桁で表示(A), R = [], write('\n'). 行表示([],[]). 行表示([_生徒|R1],[_得点ならび|R2]) :- writef(' %t',[_生徒]), 得点列を表示する(_得点ならび), 行表示(R1,R2). 得点列を表示する(_得点ならび) :- append(_,[N|R],_得点ならび), 幅は8桁で表示(N), R = [], write('\n'). 幅は8桁で表示(A) :- atom(A), 文字列の末尾を空白で埋める(A,S), writef('%t',[S]). 幅は8桁で表示(N) :- integer(N), 整数の頭部を空白で埋める(N,S), writef('%t',[S]). 文字列の末尾を空白で埋める(A,S) :- length(L,8), atom_chars(A,L1), append(L1,L2,L), all(L2,' '), atom_chars(S,L2). 整数の頭部を空白で埋める(A,S) :- length(L,8), number_chars(A,L2), append(L1,L2,L), all(L1,' '), atom_chars(S,L2). % 以下のサイトは # # @kamizen1 @sym_num 最初の述語は多分こんな感じ。 http://nojiriko.asia/prolog/twitter_by_kamizen1_20121109.html … 実行して確かめてはいないけれど。 # % ?- hir_zen( 'う゛おう゛う゛お---;;;;,,,,...', P ). の様に使う。ひらがな -> 全角カタカナ (ひらがな ではない文字は、素通りします。) hir_zen( _文字列, _変換後 ) :- /* ここが質問のはじめ : main() */ atom(_文字列), atom_chars( _文字列, _処理前リスト ), hir_zen_henkan( _処理前リスト, _処理後リスト ), atom_chars( _変換後, _処理後リスト ). hir_zen( _変換後, _文字列 ) :- /* ここが質問のはじめ : main() */ atom(_文字列), var(_変換後), atom_chars( _文字列, _処理前リスト ), hir_zen_henkan( _処理後リスト,_処理前リスト ), atom_chars( _変換後, _処理後リスト ). hir_zen_henkan( [], [] ). /* 停止判定 */ hir_zen_henkan( [A,B|L], ['ヴ'|Z] ) :- /* _処理前リストの最初の2文字が 'う', '゛' の場合 */ atom_chars('う゛', V), V=[A,B], !, hir_zen_henkan( L, Z ). hir_zen_henkan(L1, [ZZ|Z]) :- /* _処理前リストの最初の1文字が、hir( **リスト** ). にある場合 */ \+(var(L1)), L1 = [A|L], hir( Hira ), nth1( N, Hira, A ), zen( Zen ), nth1( N, Zen, ZZ ), !, hir_zen_henkan( L, Z ). hir_zen_henkan(L1, L2) :- /* _処理前リストの最初の1文字が、hir( **リスト** ). にある場合 */ var(L1), \+(var(L2)), L2 = [ZZ|Z], L1 = [A|L], zen( Zen ), nth1( N, Zen, ZZ ), hir( Hira ), nth1( N, Hira, A ), !, hir_zen_henkan( L, Z ). hir_zen_henkan( [A|L], [A|Z] ) :- /* _処理前リストの最初の1文字が、hir( **リスト** ). にない場合 */ !, hir_zen_henkan( L, Z ). % 以下のサイトは # 全角カタカナ、半角カタカナ、ひらがなを相互に変換することができます。 # 平仮名には 「ヴ」に対応する文字がないので、かわりに 「う゛」で表します。 # 数字については、半角カタカナでは半角で、全角カタカナ及び平仮名では全角で # 表します。 変換関数は以下の6種類です。 # jz(s) # 文字列 s に含まれる平仮名を全角カタカナに置き換えます。 # jh(s) # 文字列 s に含まれる平仮名を半角カタカナに置き換えます。 # zj(s) # 文字列 s に含まれる全角カタカナを平仮名に置き換えます。 # zh(s) # 文字列 s に含まれる全角カタカナを半角カタカナに置き換えます。 # hj(s) # 文字列 s に含まれる半角カタカナを平仮名に置き換えます。 # hz(s) # 文字列 s に含まれる半角カタカナを全角カタカナに置き換えます。 jz(_文字列,_変換された文字列) :- atom_chars(_文字列,L1), 平仮名全角カタカナ変換(L1,L2), atom_chars(_変換された文字列,L2),!. 平仮名全角カタカナ変換([],[]) :- !. 平仮名全角カタカナ変換(L1,L2) :- 平仮名全角カタカナ対応(L1,L2,R1,R2), 平仮名全角カタカナ変換(R1,R2). 平仮名全角カタカナ変換([A|R1],[B|R2]) :- 平仮名全角カタカナ対応(A,B), 平仮名全角カタカナ変換(R1,R2). 平仮名全角カタカナ変換([A|R1],[A|R2]) :- 平仮名全角カタカナ変換(R1,R2). 平仮名全角カタカナ対応([う,'゛'|R1],[ヴ|R2],R1,R2). 平仮名全角カタカナ対応(あ,ア). 平仮名全角カタカナ対応(い,イ). 平仮名全角カタカナ対応(う,ウ). 平仮名全角カタカナ対応(え,エ). 平仮名全角カタカナ対応(お,オ). 平仮名全角カタカナ対応(か,カ). 平仮名全角カタカナ対応(き,キ). 平仮名全角カタカナ対応(く,ク). 平仮名全角カタカナ対応(け,ケ). 平仮名全角カタカナ対応(こ,コ). 平仮名全角カタカナ対応(さ,サ). 平仮名全角カタカナ対応(し,シ). 平仮名全角カタカナ対応(す,ス). 平仮名全角カタカナ対応(せ,セ). 平仮名全角カタカナ対応(そ,ソ). 平仮名全角カタカナ対応(た,タ). 平仮名全角カタカナ対応(ち,チ). 平仮名全角カタカナ対応(つ,ツ). 平仮名全角カタカナ対応(て,テ). 平仮名全角カタカナ対応(と,ト). 平仮名全角カタカナ対応(な,ナ). 平仮名全角カタカナ対応(に,ニ). 平仮名全角カタカナ対応(ぬ,ヌ). 平仮名全角カタカナ対応(ね,ネ). 平仮名全角カタカナ対応(の,ノ). 平仮名全角カタカナ対応(は,ハ). 平仮名全角カタカナ対応(ひ,ヒ). 平仮名全角カタカナ対応(ふ,フ). 平仮名全角カタカナ対応(へ,ヘ). 平仮名全角カタカナ対応(ほ,ホ). 平仮名全角カタカナ対応(ま,マ). 平仮名全角カタカナ対応(み,ミ). 平仮名全角カタカナ対応(む,ム). 平仮名全角カタカナ対応(め,メ). 平仮名全角カタカナ対応(も,モ). 平仮名全角カタカナ対応(や,ヤ). 平仮名全角カタカナ対応(ゆ,ユ). 平仮名全角カタカナ対応(よ,ヨ). 平仮名全角カタカナ対応(わ,ワ). 平仮名全角カタカナ対応(を,ヲ). 平仮名全角カタカナ対応(ん,ン). % 以下のサイトは # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク):() # # アルファベット小文字からなる文字列 s が与えられる. # s から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい. # 最小何文字削除すれば回文となるか計算するプログラムを作れ. # なお,s の文字数は 100000 以下としてよい. # # 例: # s = ababba → 1 (右から 2 番目の b を消して ababa) # s = abcdef → 5 (1 文字残して残りを削除する) # # # [3] 環境 #  [3.1,2] OS,コンパイラ: 問わず #  [3.3] 言語: どちらでも可 # [4] 期限: 2008/06/08 # [5] その他の制限: 特に無し 'アルファベット小文字からなる文字列 s が与えられる.s から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい.最小何文字削除すれば回文となるか計算するプログラムを作れ.なお,s の文字数は 100000 以下としてよい.' :- 'アルファベット小文字からなる文字列 s が与えられる'(_s), 's から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい.最小何文字削除すれば回文となるか計算するプログラムを作れ.なお,s の文字数は 100000 以下としてよい.'(_s,_最小何文字の削除で済む), writef('最小 %t 文字の削除で回文は出来上がります\n',[_最小何文字の削除で済む]),!. 's から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい.最小何文字削除すれば回文となるか計算するプログラムを作れ.なお,s の文字数は 100000 以下としてよい.'(_s,_最小何文字の削除で済む) :- sの文字ならびと反転した文字ならびを用意する(_s,Chars_1,Chars_2), atom_length(_s,_文字列数), findmax(_回文の文字数,( 回文を生成(Chars_1,Chars_2,0,_回文の文字数)), _回文は最大何文字), _最小何文字の削除で済む is _文字列数 - _回文は最大何文字. sの文字ならびと反転した文字ならびを用意する(_s,Chars_1,Chars_2) :- atom_chars(_s,Chars_1), reverse(Chars_1,Chars_2). 回文を生成([],_,N,N). 回文を生成([A|R1],[A|R2],N_1,N) :- N_2 is N_1 + 1, 回文を生成(R1,R2,N_2,N). 回文を生成(L1,[B|R2],N_1,N) :- 回文を生成(L1,R2,N_1,N). 回文を生成([_|R1],L2,N_1,N) :- 回文を生成(R1,L2,N_1,N). % 以下のサイトは # [1]プログラム演習 # [2] # 一定の文字からなる列sを読み込み、以下の条件を満たす同じ個数の文字からなる列tを出力するプログラムを作りなさい。 # ただし、以下での単語とは空白以外の文字からなる列のこととする。 # 1,s中の単語は同じ順番で t に現われる # 2,t中では単語は一つの空白に区切られる # 3,t中に最初の単語の最初の文字から最後の単語の文字までは列全体のちゅうおうに位置し、前後は空白である # 例えば文字の列 # _This___is__a____good___program___ # を入力すると # ______This_is_a_good_program______ # が出力される。ここで、_は空白を表すものとする。 # [3]C言語 # [4]12/7 # [5]for,while,if文 ポインター 文字列 1,2次配列 関数の書き方 '一定の文字からなる列sを読み込み、以下の条件を満たす同じ個数の文字からなる列tを出力するプログラムを作りなさい。 ただし、以下での単語とは空白以外の文字からなる列のこととする。 1,s中の単語は同じ順番で t に現われる 2,t中では単語は一つの空白に区切られる 3,t中に最初の単語の最初の文字から最後の単語の文字までは列全体のちゅうおうに位置し、前後は空白である' :- '一定の文字からなる列sを読み込み、上記条件を満たす同じ個数の文字からなる列tを出力する'. '一定の文字からなる列sを読み込み、上記条件を満たす同じ個数の文字からなる列tを出力する' :- '一定の文字からなる列sを読み込み'(_s), tの語彙部を確定する(_s,_sの文字列長,_tの語彙部), tの語彙部の前後の文字列を確定する(_tの語彙部,_sの文字列長,_前の空白列,_後の空白列), tを出力する(_前の空白列,_空白を挟んだ連結した語彙,_後の空白列). tの語彙部を確定する(_s,_tの語彙部) :- atom_chars(_s,L_1), length(L_1,_sの文字列長), split(_s,[' '],_語彙ならび),  atomic_list_concat(_語彙ならび,' ',_tの語彙部). tの語彙部の前後の文字列を確定する(_tの語彙部,_sの文字列長,_前の空白列,_後の空白列) :- atom_length(_tの語彙部,_tの語彙部の長さ), _前後の空白合計 is _sの文字列長さ - _tの語彙部の長さ, length(_空白ならび,_前後の空白合計), all(_空白ならび,' '), 空白を割り振る(_空白ならび,_前の空白列,_後の空白列). 空白を割り振る(L,S,S) :- append(L1,L1,L), atomic_list_concat(L1,S),!. 空白を割り振る(L,S1,S2) :- append([_|L1],L1,L), atomic_list_concat(L1,S2), atom_concat(' ',S2,S1). tを出力する(_前の空白列,_空白を挟んだ連結した語彙,_後の空白列) :- atomic_list_concat([_前の空白列,_空白を挟んだ連結した語彙,_後の空白列],_t), writef('%t\n',[_t]). % 以下のサイトは # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): あるテキストファイルに含まれるA〜Zの個数をカウントするプログラムをつくれ。 # [3] 環境 #  [3.1] OS: Windows #  [3.2] コンパイラ名とバージョン: lcc #  [3.3] 言語: C # [4] 期限: 11月28日まで # お願いします。どう検索すればいいかも分からないので教えていただきたいです。 # 答えがほしいですが、ヒントをいただければ自分でも努力はします。 あるテキストファイルに含まれるA〜Zの個数をカウントする(_文字列,_カウントならび) :- atom_chars(_文字列,Chars), 'A〜Zの個数をカウントする'(Chars,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],_カウントならび). 'A〜Zの個数をカウントする'([],_カウントならび,_カウントならび). 文字カウント([_文字|R],_カウントならび_1,_カウントならび) :- 文字カウント(_文字,_カウントならび_1,_カウントならび_2), 'A〜Zの個数をカウントする'(R,_カウントならび_2,_カウントならび). 文字カウント('A',[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],[AA,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]) :- AA is A + 1,!. 文字カウント('B',[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,BB,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- BB is B + 1,!. 文字カウント('C',[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,CC,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- CC is C + 1,!. 文字カウント('D',[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,DD,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- DD is D + 1,!. 文字カウント('E',[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,EE,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- EE is E + 1,!. 文字カウント('F',[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,FF,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- FF is F + 1,!. 文字カウント('G',[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,GG,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- GG is G + 1,!. 文字カウント('H',[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,HH,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- HH is H + 1,!. 文字カウント('I',[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,II,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- II is I + 1,!. 文字カウント('J',[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,JJ,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- JJ is J + 1,!. 文字カウント('K',[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,KK,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- KK is K + 1,!. 文字カウント('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,LL,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- LL is L + 1,!. 文字カウント('M',[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,MM,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- MM is M + 1,!. 文字カウント('N',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,NN,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- NN is N + 1,!. 文字カウント('O',[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,OO,P,Q,R,S,T,U,V,W,X,Y,Z]) :- OO is O + 1,!. 文字カウント('P',[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,PP,Q,R,S,T,U,V,W,X,Y,Z]) :- PP is P + 1,!. 文字カウント('Q',[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,QQ,R,S,T,U,V,W,X,Y,Z]) :- QQ is Q + 1,!. 文字カウント('R',[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,RR,S,T,U,V,W,X,Y,Z]) :- RR is R + 1,!. 文字カウント('S',[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,SS,T,U,V,W,X,Y,Z]) :- SS is S + 1,!. 文字カウント('T',[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,TT,U,V,W,X,Y,Z]) :- TT is T + 1,!. 文字カウント('U',[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,UU,V,W,X,Y,Z]) :- UU is U + 1,!. 文字カウント('V',[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,VV,W,X,Y,Z]) :- VV is V + 1,!. 文字カウント('W',[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,WW,X,Y,Z]) :- WW is W + 1,!. 文字カウント('X',[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,XX,Y,Z]) :- XX is X + 1,!. 文字カウント('Y',[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,YY,Z]) :- YY is Y + 1,!. 文字カウント('Z',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,ZZ]) :- ZZ is Z + 1,!. 文字カウント(_,L,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/189 # # [1] 授業単元:C言語 文字列 # [2] 問題文 # http://ime.nu/s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/img/382.txt # # 文字列処理 キーボードからアルファベット小文字で入力し、イニシャルで表示する # プログラムを作成しなさい。 # 入力できる文字数は姓、名、最大20文字、配列を宣言すること。 # 文字変換関数を使用すること。 # (実行結果) 氏名をアルファベット小文字で入力して下さい # tanaka # hanako # tanaka hanako さんのイニシャルはH,Tです # # キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、 # その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントするプログラムを作成しなさい。 # ただし、入力する文字数は最大30文字とする。 # 文字列操作関数を必ず用いること # # (実行結果) 文字列を入力して下さい. # TanakaHanako1234          # 入力文字列は TanakaHanako1234 で          小文字は10文字,大文字は2文字,数字は4文字です. 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)、その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする' :- 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数). 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列) :- write('文字列を入力してください\n'), get_line(Line), 最大30文字(Line,_入力文字列). 最大30文字(Line,_入力文字列) :- atom_length(Line,_長さ), _長さ > 30, sub_atom(Line,0,30,_,_入力文字列),!. 最大30文字(_入力文字列,_入力文字列). 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数) :- atom_chars(_入力文字列,_文字ならび), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_文字ならび,0,0,0,_小文字の数,_大文字の数,_数字の数). 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'([],_小文字の数,_大文字の数,_数字の数,_小文字の数,_大文字の数,_数字の数) :- !. 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'([_文字|R],_小文字の数_1,_大文字の数_1,_数字の数_1,_小文字の数,_大文字の数,_数字の数) :- '一文字単位のカウント'(_文字,_小文字の数_1,_大文字の数_1,_数字の数_1,_小文字の数_2,_大文字の数_2,_数字の数_2), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(R,_小文字の数_2,_大文字の数_2,_数字の数_2,_小文字の数,_大文字の数,_数字の数). '一文字単位のカウント'(_文字,_小文字の数_1,_大文字の数,_数字の数,_小文字の数_2,_大文字の数,_数字の数) :- _文字 @>= 'a', _文字 @=< 'z', _小文字の数 is _小文字の数_1 + 1. '一文字単位のカウント'(_文字,_小文字の数,_大文字の数_1,_数字の数,_小文字の数,_大文字の数,_数字の数) :- _文字 @>= 'A', _文字 @=< 'Z', _大文字の数 is _大文字の数_1 + 1. '一文字単位のカウント'(_文字,_小文字の数,_大文字の数,_数字の数_1,_小文字の数,_大文字の数,_数字の数) :- _文字 @>= '0', _文字 @=< '9', _数字の数 is _数字の数_1 + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/161 # # [1] 授業単元:プログラミング言語 # [2] 問題文 # 1.空白、タブ、改行を数えるプログラムを書け。 # 2.二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーするプログラムを書け。 # '空白、タブ、改行を数える'(_文字列,_空白数,_タブ数,_改行数) :- atom_chars(_文字列,Chars), '空白、タブ、改行を数える'(Chars,0,0,0,_空白数,_タブ数,_改行数). '空白、タブ、改行を数える'([],_空白数,_タブ数,_改行数,_空白数,_タブ数,_改行数). '空白、タブ、改行を数える'([' '|R],_空白数_1,_タブ数_1,_改行数_1,_空白数,_タブ数,_改行数) :- _空白数_2 is _空白数_1 + 1, '空白、タブ、改行を数える'(R,_空白数_2,_タブ数_1,_改行数_1,_空白数,_タブ数,_改行数). '空白、タブ、改行を数える'(['\t'|R],_空白数_1,_タブ数_1,_改行数_1,_空白数,_タブ数,_改行数) :- _タブ数_2 is _タブ数_1 + 1, '空白、タブ、改行を数える'(R,_空白数_1,_タブ数_2,_改行数_1,_空白数,_タブ数,_改行数). '空白、タブ、改行を数える'(['\n'|R],_空白数_1,_タブ数_1,_改行数_1,_空白数,_タブ数,_改行数) :- _改行数_2 is _改行数_1 + 1, '空白、タブ、改行を数える'(R,_空白数_1,_タブ数_1,_改行数_2,_空白数,_タブ数,_改行数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/79 # # [1] 授業単元:C言語 文字列 # [2] 問題文 # http://ime.nu/codepad.org/kqhMSJiH # # /* # # ・問題文 # 名字と名前(null文字を除き10文字以内)を入力し、実行例のように氏名を表示する。 # なお、 # # 氏名は名前の次に1文字あけて名字を表示する # 名前は最初の文字を大文字に、2文字以降を小文字に変換して表示する。 # 名字はすべて大文字に変換して表示する # # とし、文字列関数を用いて行う。 # # ・実行例 # # 名字と名前を入力してください # yamada taro # 出力: Taro YAMADA # 名字と名前を入力してください # kawada hanako # 出力: Hanako KAWADA # .... # # */ '名字と名前(null文字を除き10文字以内)を入力し、実行例のように氏名を表示する。なお、氏名は名前の次に1文字あけて名字を表示する。名前は最初の文字を大文字に、2文字以降を小文字に変換して表示する。名字はすべて大文字に変換して表示する' :- '名字と名前(null文字を除き10文字以内)を入力し'(_名字,_名前), '名前は最初の文字を大文字に、2文字以降を小文字に変換して'(_名前,_変換後の名前), '名字はすべて大文字に変換して'(_名字,_大文字に変換された名字), '実行例のように氏名を表示する。なお、氏名は名前の次に1文字あけて名字を表示する'(_変換後の名前,_大文字に変換されたの名字). '名字と名前(null文字を除き10文字以内)を入力し'(_名字,_名前) :- write('名字と名前を入力してください\n'), 一行読み込む(_入力された名字), 一行読み込む(_入力された名前), 名字はnull文字をのぞき10文字以内(_入力された名字,_名字), 名前はnull文字をのぞき10文字以内(_入力された名前,_名前). 名字はnull文字をのぞき10文字以内(_入力された名字,_名字) :- null文字をのぞき10文字以内(_入力された名字,_名字). 名前はnull文字をのぞき10文字以内(_入力された名前,_名前) :- null文字をのぞき10文字以内(_入力された名前,_名前). null文字をのぞき10文字以内(_文字列,_null文字をのぞき10文字以内に制限された文字列) :- null文字をのぞき(_文字列,_null文字を除いた文字列), '10文字以内'(_null文字を除いた文字列,_null文字をのぞき10文字以内に制限された文字列). null文字をのぞき(_文字列,_null文字を除いた文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(_文字 = '')), _文字ならび), atom_chars(_null文字を除いた文字列,_文字ならび). '10文字以内'(_文字列,_10文字以内に制限された文字列) :- sub_atom(_文字列,0,10,_,_10文字以内に制限された文字列),!. '10文字以内'(_文字列,_文字列). '名前は最初の文字を大文字に、2文字以降を小文字に変換して'(_名前,_変換後の名前) :- 名前は最初の文字を大文字に(_名前,_大文字化された最初の文字), '2文字以降を小文字に変換して'(_名前,_小文字化された2文字以降), atomic_list_concat([_大文字化された最初の文字,_小文字化された2文字以降],_変換後の名前). 名前は最初の文字を大文字に(_名前,_大文字化された最初の文字) :- sub_atom(_名前,0,1,R,_最初の文字), to_upper(_最初の文字,_大文字化された最初の文字). '2文字以降を小文字に変換して'(_名前,_小文字化された2文字以降) :- sub_atom(_名前,1,_,0,_2文字以降), to_lower(_2文字以降,_小文字化された2文字以降). '名字はすべて大文字に変換して'(_名字,_大文字に変換された名字) :- to_upper(_名字,_大文字に変換された名字). '実行例のように氏名を表示する。なお、氏名は名前の次に1文字あけて名字を表示する'(_変換後の名前,_大文字に変換された名字) :- writef('出力: %t %t\n',[_変換後の名前,_変換後の名字]). % ・実行例 % % 名字と名前を入力してください % yamada taro % 出力: Taro YAMADA % 名字と名前を入力してください % kawada hanako % 出力: Hanako KAWADA % .... % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/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/1340383120/296 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 検索 # # ●説明 # タグの外にある文字列を順に取り出したい # # ●対象データ # <hoge><hoge></hoge>あああ<hoge><hoge></hoge>いいい<hoge></hoge>ううう<hoge><hoge>・・・ # # ●希望する結果 # while (m.Success) # の繰り返しの中であああ、いいい、ううう・・・と順に取り出していきたい # # よろしくお願いします。 # # タグの外にある文字列を順に取り出したい(_文字列,_タグの外にある文字列) :- atom_chars(_文字列,Chars), タグの外にある文字列を順に取り出したい(Chars,[],_タグの外にある文字列). タグの外にある文字列を順に取り出したい([],L,_タグの外にある文字列) :- \+(L=[]), atom_chars(_タグの外にある文字列,L). タグの外にある文字列を順に取り出したい(Chars,L,_タグの外にある文字列) :- タグを読み飛ばす(Chars,_残り文字ならび), atom_chars(_タグの外にある文字列,L). タグの外にある文字列を順に取り出したい([A|R],L,_タグの外にある文字列) :- append(L,[A],L2), タグの外にある文字列を順に取り出したい(R,L2,_タグの外にある文字列). タグを読み飛ばす(Chars,_残り文字ならび) :- タグで始まっている(Chars,_タグ,_終了タグ,_タグの後の文字ならび), append(_,_終了タグ,_残り文字ならび,_タグの後文字ならび),!. タグで始まっている(Chars,_タグ,_終了タグ,_タグの後の文字ならび) :- append(['<'|R1],['>'|_タグの後の文字ならび],Chars), \+(member('<',R1)), \+(member('>',R1)), append(['<','/'|R1],['>'],_終了タグ),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/466 # # # [1] 授業単元:C言語 # [2] 問題文:プレイフェア暗号の作成 #       参考:http://ime.nu/www.tamagaki.com/math/PlayfairCipher.html # # #  プレイフェア暗号(Playfair cipher) # # プレイフェア暗号はイギリス人サー・チャールズ・ホイートストン(Sir Charles Wheatstone)により開発されライアン・プレイフェア(Lyon Playfair)が普及させました。プレイフェア暗号を用いて暗号化するとき、まずキーワードまたはキーフレーズをあらかじめ決めておきます。仮にキーワードをPlayfairとします。次にこのキーワードをアルファベットが重複することなく下の5×5の表に入れていきます。 # # ここで残りのセルに余ったアルファベットを挿入していくわけですが、アルファベットは26文字あって5×5では一字余ります。そこで I と J は同じセルに入れるとあらかじめ決めておきます。そこで新たに作られた表が下のようになります。 # # 準備ができたところで、次のメッセージを暗号化してみましょう。 # # メッセージ Abandon hope, all ye who enter here. # # このメッセージをまず二文字ずつ区切っていきます。 # # Ab-an-do-nh-op-ea-ll-ye-wh-oe-nt-er-he-re # # ここで7番目に ll と同じ文字が重複しているので間に x を入れます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-e # # そうすると最後に e が一つ余ります。ここにもやはり x を入れておきます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # まず最初の二文字 ab を暗号化してみましょう。ab は先ほど作った表では同じ列にあります。このときは ab の列のすぐ下の文字で置き換えます。 # # つまり ab は BH に変わります。ただし一番下の文字例えば w は一番上の文字 A に変換されます。 # # 同様に同じ行に入る二文字も出てきたとします。例えば ap などは右隣の文字に置き換えます。 # # つまり ap は YL になるわけですね。この場合も一番右の文字例えば f は一番左の文字 p に変換されます。 # # 最後に行も列も違う二文字が出てきた場合は次のようにします。例えば an を考えます。下の表のように a n それぞれの行および列を塗り分け、その交点となる文字を見ます。この場合、P と Q になります。 # # そこで a は、a h と同じ行の P に、n は、n と同じ行の Q に変換します。つまり、 # # do → RT # # nh → QE # # op → NL # # となるわけです。このルールに従って、先ほどのメッセージを暗号化すると、 # # 平文  Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # 暗号文 BH PQ RT QE NL HP YV AF HU GQ NU NM BG GI KU # # これでプレイフェア暗号による暗号化が終了したわけです。 # # この暗号はイギリスがボーア戦争(ブール戦争 BoreWar)で使用したといわれています。 プレイフェア暗号表の作成(_鍵文,_暗号表) :- 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字以外の変数ならび), 'Jを除いたA-Zならびを切る'(_Jを除いたA_Zならび), 変数を埋める(_Jを除いたA_Zならび,Chars,_鍵文字以外の変数ならび), 'N個組'(5,_25要素のならび,_暗号表). 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字ならび,_鍵文字以外の変数ならび) :- length(_25要素ならび,25), atom_chars(_鍵文,_鍵文字ならび), append(_鍵文字ならび,_鍵文字以外の変数ならび,_25要素ならび). 'A-Zならびを切る'(_Jを除いたA_Zならび) :- _切る回数 is random(113) + 1, トランプを切るようにならびを切る(_切る回数,25,['A','B','C','D','E','F','G','H','I','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_Jを除いたA_Zならび). 変数を埋める(_,_,[]). 変数を埋める(L_1,Chars,[V|R]) :- select(V,L_1,L_R), \+(member(V,Chars)), 変数を埋める(L_R,Chars,R). プレイフェア暗号による暗号化(_平文,_暗号文) :- メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび), atomic_list_concat(_暗号文字ならび,_暗号文). メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび) :- atom_chars(_平文,Chars), すべての文字を大文字に変換(Chars,_大文字の文字ならび), メッセージをまず二文字ずつ区切っていきます(_大文字の文字ならび,_二文字ずつに区切られたならび). メッセージをまず二文字ずつ区切っていきます([],[]). メッセージをまず二文字ずつ区切っていきます(['J'|R1],[['J','J']|R2]) :- メッセージをまず二文字ずつ区切っていきます(R1,R2). メッセージをまず二文字ずつ区切っていきます([A],[[A,'X']]). メッセージをまず二文字ずつ区切っていきます([A,A|R1],[[A,'X']|R2]) :- メッセージをまず二文字ずつ区切っていきます([A|R1],R2). メッセージをまず二文字ずつ区切っていきます([A,B|R1],[[A,B]|R2]) :- \+(A=B), メッセージをまず二文字ずつ区切っていきます(R1,R2). プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび) :- 暗号表(_暗号表), 転置(_暗号表,_転置された暗号表), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号表,_転置された暗号表,_暗号文字ならび). プレイフェア暗号化([],_,_,[]). プレイフェア暗号化([['J','J']|R1],_暗号表,_転置された暗号表,['J'|R2]) :- プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). プレイフェア暗号化([[A,B]|R1],_暗号表,_転置された暗号表,[C,D|R2]) :- 暗号に変換(A,B,_暗号表,C,D), プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_転置された暗号表), 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_暗号表), 'A,Bが暗号表の同一行にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- 暗号コードは矩形を仮想した時の他の二角(A,B,_暗号表,C,D). 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D) :- member(A,L), member(B,L), 'A,Bの次の要素'(L,A,C), 'A,Bの次の要素'(L,B,D). 'A,Bの次の要素'(L,X,Y) :- append([Y|_],[X],L). 'A,Bの次の要素'(L,X,Y) :- append(_,[X,Y|_],L). 暗号コードは矩形を仮想した時の他の二角(A,B,_表,C,D) :- 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B), nth1(_列_B,L_1,C), nth1(_列_A,L_2,D). 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B) :- nth1(_行_A,_表,L_1), nth1(_列_A,L_1,A), nth1(_行_B,_表,L_2), nth1(_列_B,L_2,B). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/830 # # 誰か助けて # # 問題1 # はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示するプログラムをex08-02.rbで保存して実行してください. # # 問題2 # 問題1のプログラムは、nilのスロットが指定されると、そのままnilを返します.このときには「そのスロットには文字列はありません.」と表示されるように、書き換えて、ex08-03.rbで保存して実行してください. # # 問題3 # はじめに文字列の値を設定した配列変数の各スロットについて、その文字列の文字数を表示するプログラムをex08-04.rbで保存して実行してください.たとえばstrings=[’dog’,’cat’,’mouse’]の場合、以下のように出力させます. # dogは3文字 # catは3文字 # mouseは5文字 # # 問題4 # はじめに文字列の値を設定した配列変数の各スロットの内容を3回ずつ表示するプログラムをex08-05.rbで保存して実行してください. # # 問題5 # 以下のように入力したいだけの文字列を入力するよう求めて、Enterが押されたらそれを入力した順につなげて1行に出力するプログラムをex08-07.rbで保存して実行してください. # 文字列を入力してください # dog[Enter] # 文字列を入力してください # cat[Enter] # 文字列を入力してください # elephant[Enter] # 文字列を入力してください # [Enter] # あなたの入力した文字列は # dog,cat,elephant # です. # # 問題6 # 問題5のプログラムを、文字列を入力とは逆順に出力するように書き換えたプログラムをex08-08.rbで保存して実行してください. # # 問題7 # 問題5のプログラムを、3文字の文字列のみを出力するように書き換えたプログラムをex08-09.rbで保存して実行してください. # # '問題1: はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示する' :- 入力された数字(_入力された数字), 文字列ならび(_文字列ならび), nth1(_入力された数字,_文字列ならび,_文字列), writef('%t\n',[_文字列]). 入力された数字(_入力された数字) :- 数を得る(数字,_入力された数字). '問題2: はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する' :- 入力された数字(_入力された数字), 文字列ならび(_文字列ならび), nth1(_入力された数字,_文字列ならび,_文字列), 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'(_文字列). 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'('') :- writef('%t\n',['そのスロットには文字列はありません.']). 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'(_文字列) :- \+(_文字列=''), writef('%t\n',[_文字列]). '問題3: はじめに文字列の値を設定した配列変数の各スロットについて、その文字列の文字数を表示する' :- 文字列ならび(_文字列ならび), append(_,[_文字列|R],_文字列ならび), atom_length(_文字列,_文字数), writef('%tの文字数は%t\n',[_文字列,_文字数]), R = []. '問題4: はじめに文字列の値を設定した配列変数の各スロットの内容を3回ずつ表示する' :- 文字列ならび(_文字列ならび), append(_,[_文字列|R],_文字列ならび), writef('%t\n%t\n%t\n',[_文字列,_文字列,_文字列]), R = []. '問題5: 入力したいだけの文字列を入力するよう求めて、Enterが押されたらそれを入力した順につなげて1行に出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), それを入力した順につなげて1行に出力する(_文字列ならび). 文字列を入力する(_文字列) :- writef('%t ',[文字列を入力してください]), get_line(_文字列). 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'('',[]) :- !. 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列,[_文字列|R]) :- 文字列を入力する(_文字列_2), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_2,R). それを入力した順につなげて1行に出力する(_行ならび) :- atomic_list_concat(_行ならび,_表示文字列), writef('%t\n',[_表示文字列]). '問題6: 問題5のプログラムを、文字列を入力とは逆順に出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), reverse(_文字列ならび,_反転した文字列ならび), 各文字列を反転して表示する(_反転した文字列ならび). 各文字列を反転して表示する(_反転した文字列ならび) :- append(_,[_文字列|R],_反転した文字列ならび), 文字列を反転する(_文字列,_反転した文字列), writef('%t\n',[_反転した文字列]), R = []. 文字列を反転する(_文字列,_反転した文字列) :- atom_chars(_文字列,Chars), reverse(Chars,Chars_2), atom_chars(_反転した文字列,Chars_2). '問題7: 問題5のプログラムを、3文字の文字列のみを出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), '入力された文字列のうち3文字の文字列のみを出力する'(_文字列ならび). '入力された文字列のうち3文字の文字列のみを出力する'([]). '入力された文字列のうち3文字の文字列のみを出力する'([_文字列|R]) :- '3文字の文字列のみを出力する'(_文字列), '入力された文字列のうち3文字の文字列のみを出力する'(R). '3文字の文字列のみを出力する'(_文字列) :- atom_length(_文字列,3), writef('%t\n',[_文字列]),!. '3文字の文字列のみを出力する'(_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/829 # # 問題 # 数独の解答が9行9列の文字列で与えられたとき正しいかどうか判定せよ。 # # '数独の解答が9行9列の文字列で与えられたとき正しいかどうか'(_文字列) :- '数独の解答が9行9列の文字列で与えられたとき'(_文字列,L), 数独の回答が正しい(L). '数独の解答が9行9列の文字列で与えられたとき'(_9行9列の文字列,L) :- atom_chars(_9行9列の文字列,Chars), 改行を取り除きながら数字列を数値ならびに変換(Chars,L). 改行を取り除きながら数字列を数値ならびに変換([],[]). 改行を取り除きながら数字列を数値ならびに変換(['\n'|R1],R2) :- 改行を取り除きながら数字列を数値ならびに変換(R1,R2). 改行を取り除きながら数字列を数値ならびに変換([A|R1],[N|R2]) :- atom_number(A,N), 改行を取り除きながら数字列を数値ならびに変換(R1,R2). 数独の回答が正しい([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69,_70,_71,_72,_73,_74,_75,_76,_77,_78,_79,_80,_81]) :- 数独診断([[_1,_2,_3,_4,_5,_6,_7,_8,_9], [_10,_11,_12,_13,_14,_15,_16,_17,_18], [_19,_20,_21,_22,_23,_24,_25,_26,_27], [_28,_29,_30,_31,_32,_33,_34,_35,_36], [_37,_38,_39,_40,_41,_42,_43,_44,_45], [_46,_47,_48,_49,_50,_51,_52,_53,_54], [_55,_56,_57,_58,_59,_60,_61,_62,_63], [_64,_65,_66,_67,_68,_69,_70,_71,_72], [_73,_74,_75,_76,_77,_78,_79,_80,_81], [_1,_10,_19,_28,_37,_46,_55,_64,_73], [_2,_11,_20,_29,_38,_47,_56,_65,_74], [_3,_12,_21,_30,_39,_48,_57,_66,_75], [_4,_13,_22,_31,_40,_49,_58,_67,_76], [_5,_14,_23,_32,_41,_50,_59,_68,_77], [_6,_15,_24,_33,_42,_51,_60,_69,_78], [_7,_16,_25,_34,_43,_52,_61,_70,_79], [_8,_17,_26,_35,_44,_53,_62,_71,_80], [_9,_18,_27,_36,_45,_54,_63,_72,_81], [_1,_2,_3,_10,_11,_12,_19,_20,_21], [_4,_5,_6,_13,_14,_15,_22,_23,_24], [_7,_8,_9,_16,_17,_18,_25,_26,_27], [_28,_29,_30,_37,_38,_39,_46,_47,_48], [_31,_32,_33,_40,_41,_42,_49,_50,_51], [_34,_35,_36,_43,_44,_45,_52,_53,_54], [_55,_56,_57,_64,_65,_66,_73,_74,_75], [_58,_59,_60,_67,_68,_69,_76,_77,_78], [_61,_62,_63,_70,_71,_72,_79,_80,_81]]). 数独診断([]) :- !. 数独診断([L|R]) :- sort(L,L1), length(L1,9), 数独診断(R). 数独([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69,_70,_71,_72,_73,_74,_75,_76,_77,_78,_79,_80,_81]) :- 数独生成([[_1,_2,_3,_4,_5,_6,_7,_8,_9], [_10,_11,_12,_13,_14,_15,_16,_17,_18], [_19,_20,_21,_22,_23,_24,_25,_26,_27], [_28,_29,_30,_31,_32,_33,_34,_35,_36], [_37,_38,_39,_40,_41,_42,_43,_44,_45], [_46,_47,_48,_49,_50,_51,_52,_53,_54], [_55,_56,_57,_58,_59,_60,_61,_62,_63], [_64,_65,_66,_67,_68,_69,_70,_71,_72], [_73,_74,_75,_76,_77,_78,_79,_80,_81], [_1,_10,_19,_28,_37,_46,_55,_64,_73], [_2,_11,_20,_29,_38,_47,_56,_65,_74], [_3,_12,_21,_30,_39,_48,_57,_66,_75], [_4,_13,_22,_31,_40,_49,_58,_67,_76], [_5,_14,_23,_32,_41,_50,_59,_68,_77], [_6,_15,_24,_33,_42,_51,_60,_69,_78], [_7,_16,_25,_34,_43,_52,_61,_70,_79], [_8,_17,_26,_35,_44,_53,_62,_71,_80], [_9,_18,_27,_36,_45,_54,_63,_72,_81], [_1,_2,_3,_10,_11,_12,_19,_20,_21], [_4,_5,_6,_13,_14,_15,_22,_23,_24], [_7,_8,_9,_16,_17,_18,_25,_26,_27], [_28,_29,_30,_37,_38,_39,_46,_47,_48], [_31,_32,_33,_40,_41,_42,_49,_50,_51], [_34,_35,_36,_43,_44,_45,_52,_53,_54], [_55,_56,_57,_64,_65,_66,_73,_74,_75], [_58,_59,_60,_67,_68,_69,_76,_77,_78], [_61,_62,_63,_70,_71,_72,_79,_80,_81]]). 数独生成([]) :- !. 数独生成([L|R]) :- 変数に数値を埋める(L), 数独生成(R). 変数に数値を埋める(L) :- 既に使われている数値は候補から外す(L,[1,2,3,4,5,6,7,8,9],_数字候補), 変数に数値を埋める(_数字候補,L). 既に使われている数値は候補から外す([],L,L). 既に使われている数値は候補から外す([V|R1],L1,L) :- var(V), 既に使われている数値は候補から外す(R1,L1,L). 既に使われている数値は候補から外す([N|R1],L1,L) :- integer(N), select(N,L1,L2), 既に使われている数値は候補から外す(R1,L2,L). 変数に数値を埋める([],[]). 変数に数値を埋める(_数字候補,[N|R]) :- integer(N), 変数に数値を埋める(_数字候補,R). 変数に数値を埋める(_数字候補,[V|R]) :- var(V), select(V,_数字候補,_残り数字候補), 変数に数値を埋める(_残り数字候補,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/243 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文(含コード&リンク): # ・問 マルチキークイックソートを非再帰で実装せよ。 # マルチキークイックソートは文字列を辞書順にソートする手法である。 # 例えば、文字列appleを5回巡回し、5つの文字列を生成する。 # この5つの文字列を辞書順にソートすると、以下のようになる。 # # 巡回     ソート後 # apple apple # pplea  eappl # pleap  → leapp # leapp pleap # eappl pplea # # 実際には文字列appleを2倍にし巡回文字列を得る。 # 例 : appleapple # この文字列に対して非再帰のマルチキークイックソートを適用せよ。 # マルチキークイックソートは文字列を辞書順にソートする(_文字列,_辞書順に整列した文字列) :- マルチキークイックソートの整列対象文字列の生成(_文字列,_整列対象文字列ならび), 辞書順整列(_整列対象文字列ならび,_辞書順に整列した文字列). マルチキークイックソートの整列対象文字列の生成(_文字列,_整列対象文字列ならび) :- atom_chars(_文字列,_文字ならび), atom_length(_文字列,_n), findall(_回転した文字列,( between(1,_n,N), ならびの回転(左方向,N,L,_回転した文字ならび), atom_chars(_回転した文字列,_回転した文字ならび)), _整列対象文字列ならび). 辞書順整列([],[]). 辞書順整列([_軸要素文字列|_残り文字列],_辞書順に整列した文字列) :- 辞書順分割(_軸要素文字列,_残り文字列,_より小さい文字列,_等しいかより大きい文字列), 辞書順整列(_より小さい文字列,_整列したより小さい文字列), 辞書順整列(_等しいかより大きい文字列,_整列した等しいかより大きい文字列), append(_整列したより小さい文字列,[_軸要素文字列|_整列した等しいかより大きい文字列],_辞書順に整列した文字列). 辞書順分割(_軸要素文字列,[],[],[]). 辞書順分割(_軸要素文字列,[_文字列|R1],L1,L2) :- atom_chars(_軸文字列,_文字ならび_1), atom_chars(_文字列,_文字列ならび_2), 辞書順分割(_文字ならび_1,_文字ならび_2,L1,L2,R1,R2), 辞書順分割(_軸要素文字列,R1,R1,R2). 辞書順分割(_文字ならび_1,_文字ならび_2,L1,R2,R1,R2) :- 辞書順文字列の比較(_軸要素文字ならび_1,_文字ならび,_文字ならび,_), atom_chars(_文字列,_文字ならび), L1 = [_文字列|R1],!. 辞書順分割(_文字ならび_1,_文字ならび_2,R1,L2,R1,R2) :- 辞書順文字列の比較(_軸要素文字ならび_1,_文字ならび,_,_文字ならび), atom_chars(_文字列,_文字ならび), L2 = [_文字列|R2],!. 辞書順文字列の比較([],[],[],[]) :- !. 辞書順文字列の比較(L,[],[],L) :- !. 辞書順文字列の比較([],L,[],L) :- !. 辞書順文字列の比較([_文字|R1],[_文字|R2],[_文字|R3],[_文字|R4]) :- 辞書順文字列の比較(R1,R2,R3,R4),!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_1|R1],[_文字_2|R2]) :- 英大文字(_文字_1), 英小文字(_文字_2), to_upper(_文字_2,_文字_1),!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_2|R2],[_文字_1|R1]) :- 英小文字(_文字_1), 英大文字(_文字_2), to_upper(_文字_1,_文字_2),!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_1|R1],[_文字_2|R2]) :- _文字_1 @< _文字_2,!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_2|R2],[_文字_1|R1]) :- _文字_1 @>= _文字_2,!. 英小文字(_英小文字) :- _英小文字 @>= 'a', _英小文字 @=< 'z'. 英大文字(_英大文字) :- _英大文字 @>= 'A', _英大文字 @=< 'Z'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/16 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/aARzaP9m # 次のプログラムのポイントを説明せよ。 # # #include # #include # # long int myatoi(const char *); # # int main(void) # { # char str1[] = "123"; # char str2[] = "+234"; # char str3[] = " -234"; # char str4[] = " -123abc"; # char str5[] = " - 123"; /* '-'と'1'の間にスペースあり */ # char str6[] = " "; # int n; # # n = myatoi(str1); # printf("myatoi(str1) returns %d\n", n); # # n = myatoi(str2); # printf("myatoi(str2) returns %d\n", n); # # n = myatoi(str3); # printf("myatoi(str3) returns %d\n", n); # # n = myatoi(str4); # printf("myatoi(str4) returns %d\n", n); # # n = myatoi(str5); # printf("myatoi(str5) returns %d\n", n); # # n = myatoi(str6); # printf("myatoi(str6) returns %d\n", n); # # return(0); # } # # #define POSITIVE (0) # #define NEGATIVE (-1) # # long int myatoi (const char *str) # { # int flag; # long int value; # # flag = POSITIVE; /* positive */ # value = 0; # # while (isspace(*str)) { # ++str; # } # switch (*str) { # case '+': # ++str; # break; # case '-': # flag = NEGATIVE; # ++str; # break; # default: # break; # } # while (isdigit(*str)) { # value = value * 10 + (*str - '0'); # ++str; # } # if (flag == POSITIVE) { # return(value); # } else { # return(-value); # } # } myatoi(_文字列,_整数) :- atom_chars(_文字列,_文字ならび), 数字構成要素だけ切り取る(_文字ならび,_数字構成要素ならび), 符号がある場合は先頭にある(_数字構成要素ならび,_符号の意味を示す整数,_数字ならび), 数字ならびから整数を得る(_数字ならび,_整数_1), _整数 is _整数_1 * _符号の意味を示す整数,!. 数字構成要素だけ切り取る(_文字ならび,_数字構成要素ならび) :- append(L0,_数字構成要素ならび,L2,_文字ならび), 全てが数字構成要素(_数字構成要素ならび), 空集合であるか全てが空白(L0), 空集合であるか全てが空白(L2). 全てが数字構成要素([]). 全てが数字構成要素([A|R]) :- 数字構成要素(A), 全てが数字構成要素(R). 空集合であるか全てが空白([]). 空集合であるか全てが空白([' '|R]) :- 空集合であるか全てが空白(R). 符号がある場合は先頭にある([+|R],1,R). 符号がある場合は先頭にある([-|R],-1,R). 符号がある場合は先頭にある(L,1,L). 数字ならびから整数を得る(_数字ならび,_整数) :- 数字ならびから整数を得る(_数字ならび,0,_整数). 数字ならびから整数を得る([],N,N). 数字ならびから整数を得る([A|R],N_1,N) :- 数字整数変換(A,M), N_2 is N_1 * 10 + M, 数字ならびから整数を得る(R,N_2,N). 数字構成要素(+) :- !. 数字構成要素(-) :- !. 数字構成要素(A) :- 数字整数変換(A,_). 数字整数変換('0',0). 数字整数変換('1',1). 数字整数変換('2',2). 数字整数変換('3',3). 数字整数変換('4',4). 数字整数変換('5',5). 数字整数変換('6',6). 数字整数変換('7',7). 数字整数変換('8',8). 数字整数変換('9',9). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/915 # # [1] 授業単元:C言語 # [2] 問題文: # ある地域の書数言語を調べたところ、その言語では数が五進法で表されており # また我々が使う数字の0〜4に対応する記号としてアルファベットのr,h,f,m,yによく似た形の文字が使われていることが分かった。 # この表記法で表された五進数をキーボードから文字列として受け取り、我々のの十進法表記に変換して表示するプログラムを作成せよ # 例えばキーボードから「rfym」という文字列(我々の表記では0423という五進数)を受け取った場合、 # これを「73」という十進法に変換し、画面に表示できればよい。ただし、受け取る五進数は4桁以下の非負正数(十進法の0〜624)であると仮定する。 # なお、この問題では以下のquin2dec()を作成しそれを用いて前記の処理を行うこと。 # ・4つの文字を因数として受けとる # ・受け取った4文字中r,h,f,m,y以外の文字が一文字でも含まれた場合エラーメッセージを出してプログラムを終了する。 # ・4文字をそれぞれ五進数の各桁の値と考え、それから定まる4桁の五進数を十進法整数値に変換する。 # ・前記の十進法整数値を戻り値として返す # ただし変換結果の画面表示はquin2dec()関数中ではなくmain()関数中で行うこと # # ある地域の書数表記文字(r,0). ある地域の書数表記文字(h,1). ある地域の書数表記文字(f,2). ある地域の書数表記文字(m,3). ある地域の書数表記文字(y,4). 'ある地域の書数表記法で表された五進数をキーボードから文字列として受け取り、我々の十進法表記に変換して表示する' :- 'ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(_五進数表記文字列), ある地域の書数表記法による五進数表記文字列を我々の十進数表記文字列に変換(_五進数表記文字列,_十進数表記文字列), writef('%五進数表記 = %t, 我々の十進数表記 = %t\n',[_五進数表記文字列,_十進数表記文字列]). 'ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(_五進数表記文字列) :- write('ある地域の書数言語表記法で表された五進数を入力してください : '), get_line(Line), '診断: ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(Line,_五進数表記文字列),!. 'ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(_五進数表記文字列) :- 'ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(_五進数表記文字列). '診断: ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(Line,_五進数表記文字列) :- sub_atom(Line,_,1,_,_文字), \+(ある地域の書数表記文字(_文字,_)),!, fail. '診断: ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(_五進数表記文字列,_五進数表記文字列). ある地域の書数表記法による五進数表記文字列を我々の十進数表記文字列に変換(_五進数表記文字ならび,0,_十進数表記文字列) :- 五進数表記文字列を文字ならびに変換(_五進数表記文字列,_五進数表記文字ならび), ある地域の書数表記法による五進数文字ならびを十進数に変換(_五進数表記文字ならび,[],_十進数), 十進数を十進数表記文字列に変換(_十進数表記文字列,_十進数). 五進数表記文字列を文字ならびに変換(_五進数表記文字列,_五進数表記文字ならび) :- atom_chars(_五進数表記,_五進数表記文字ならび). ある地域の書数表記法による五進数文字ならびを十進数に変換([],_十進数,_十進数). ある地域の書数表記法による五進数文字ならびを十進数に変換([A|R1],Y_1,X) :- ある地域の書数表記文字(A,N), Y_2 is Y_1 * 5 + N, ある地域の書数表記法による五進数文字ならびを十進数に変換(R1,Y_2,X). 十進数を十進数表記文字列に変換(_十進数表記文字列,_十進数) :- atom_number(_十進数表記文字列,_十進数). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #880 # [1]授業単元:C言語 # [2]問題文 # マインスイーパのような爆弾ゲームプログラムを作成する。 # 1. マス目を8× 8に設定する。 # 2. 爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)。 # 3.まだ指定していないマス目には数字の0の代わりに記号'-'を表示する。 # 4.爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を # 表示する(最小で0、最大で8)。 # 5. 爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字 # の'x'を表示し、"Bomb!"と表示して終了する。 # # [3]環境 # [3.1]windows7 # [3.2]gcc # [3.3]C/C++ # [4]7月20日 # よろしくお願いします。 # マインスイーパ :- 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面). 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面) :- 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面), '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(_平坦なならびで表現された盤面). マインスイーパ(_平坦なならびで表現された盤面) :- 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面),!. マインスイーパ(_平坦なならびで表現された盤面) :- マインスイーパを継続する(_平坦なならびで表現された盤面). 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面) :- 度数((member(A,_平坦なならびで表現された盤面),atom(A)),64), write('あなたの勝ちです。\n'). マインスイーパを継続する(_平坦なならびで表現された盤面) :- '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置), マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置) :- 爆弾を隠して盤面を表示する(_平坦なならびで表現された盤面), マス目を選択させる(_行位置,_列位置). マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面),!. マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面), 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面) :- 平坦化した位置に変換(_行位置,_列位置,_nth1), nth1(_nth1,_平坦なならびで表現された盤面,0). 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面) :- 爆弾は周囲にいくつあるか(_nth1,_平坦なならびで表現された盤面,_個数), writef('周囲に爆弾は %w 個あります\n',[_個数]),!. '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面) :- 得点は(_平坦なならびで表現された盤面,_得点), 爆弾が置かれたすべてのマス目に小文字のxを表示し(_平坦なならびで表現された盤面), writef('\n Bomb! \n\n\n あなたの得点は %t です\n',[_得点]). 得点は(_平坦なならびで表現された盤面,_得点) :- 度数((member(A,_平坦なならびで表現された盤面),\+(var(A)),A==0),_得点). 爆弾が置かれたすべてのマス目に小文字のxを表示し([]) :- !. 爆弾が置かれたすべてのマス目に小文字のxを表示し(L) :- 爆弾が置かれたすべてのマス目に小文字のxを表示して行く(L). 爆弾が置かれたすべてのマス目に小文字のxを表示して行く([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾が置かれたすべてのマス目に小文字のxを表示し(R). 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 行末まで表示する(A,R). 行末まで表示する(A,R) :- 爆弾を含むマス目表示文字(A,_表示文字), 爆弾を含むマス目表示(R,_表示文字). 爆弾を含むマス目表示(R,_表示文字) :- writef('%w',[_表示文字]), R = [], write('\n'). マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R) :- append(_,[A|R],[_1,_2,_3,_4,_5,_6,_7,_8]). 爆弾を含むマス目表示文字(V,'-') :- var(V),!. 爆弾を含むマス目表示文字('x','x') :- !. 爆弾を含むマス目表示文字(_,0). 爆弾を隠して盤面を表示する([]). 爆弾を隠して盤面を表示する([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を隠して盤面を表示する(R). 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 爆弾を隠して行末まで表示する(A,R). 爆弾を隠して行末まで表示する(A,R) :- 爆弾を隠すマス目表示文字(A,_表示文字), 爆弾を隠すマス目表示(_表示文字,R). 爆弾を隠すマス目表示(_表示文字,R) :- writef('%w',[_表示文字]), R = [], write('\n'). 爆弾を隠すマス目表示文字(V,'-') :- var(V),!. 爆弾を隠すマス目表示文字('x','-') :- !. 爆弾を隠すマス目表示文字(_,0). 平坦化した位置に変換(_行位置,_列位置,_nth1) :- _nth1 is (_行位置-1) * 8 + _列位置. 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面) :- length(_平坦なならびで表現された盤面,64). '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(L) :- 爆弾は10個にし(Lp), 同じマス目に重ならないようにランだけに配置する(Lp,L). 爆弾は10個にし(Lp) :- length(Lp,10). 同じマス目に重ならないようにランだけに配置する([],L) :- !. 同じマス目に重ならないようにランだけに配置する([_|R1],L) :- 同じマス目に重ならないようにランダムに一個爆弾を設置する(L), 同じマス目に重ならないようにランだけに配置する(R1,L). 同じマス目に重ならないようにランダムに一個爆弾を設置する(L) :- ランダムに(L,_nth0), 同じマス目に重ならないように一個爆弾を設置する(_nth0,L),!. ランダムに(L,_nth0) :- repeat, _nth0 is random(64). 同じマス目に重ならないように一個爆弾を設置する(_nth0,L) :- 同じマス目に重ならないように(_nth0,L,V), 一個爆弾を設置する(V). 同じマス目に重ならないように(_nth0,L,V) :- nth0(_nth0,L,V), var(V). 一個爆弾を設置する(x). 爆弾は周囲にいくつあるか(N,L,_個数) :- 度数(周囲の八箇所の中で爆弾があるのは(N,L),_個数). 周囲の八箇所の中で爆弾があるのは(N,L) :- 周辺の八箇所の中で(N,_nth1), '_nth1には爆弾がある'(_nth1,L). 周辺の八箇所の中で(N,_nth1) :- member(_式,[N-9,N-8,N-7,N-1,N,N+1,N+7,N+8,N+9]), _nth1 is _式. '_nth1には爆弾がある'(_nth1,L) :- nth1(_nth1,L,V), 変数ではなく爆弾がある(V). 変数ではなく爆弾がある(V) :- 変数ではなく(V), V = x. 変数ではなく(V) :- \+(var(V)). マス目を選択させる(_行位置,_桁位置) :- 整数を得る('マス目の行位置(1-8) ',between(1,8,_行位置),_行位置), 整数を得る('マス目の桁位置(1-8) ',between(1,8,_桁位置),_桁位置),!. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数),!. 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- catch(_条件,E,fail),!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/855 # # [1] 授業単元:C言語 # [2] 問題文: # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ。 # <実行例> # 文字列を入力せよ:one-two-three-four # three-four # # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ :- 入力された文字列で(_文字列), '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列), 表示せよ(_2つ目のハイフン以降の文字列). 入力された文字列で(_文字列) :- get_line(_文字列). '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列) :- atom_chars(_文字列,_文字ならび), '2つ目のハイフン以降の文字列だけを'(0,_文字列ならび,0,_2つ目のハイフン以降の文字ならび), atom_chars(_2つ目のハイフン以降の文字列,_2つ目のハイフン以降の文字ならび). '2つ目のハイフン以降の文字列だけを'(_文字列ならび,2,_文字列ならび) :- !. '2つ目のハイフン以降の文字列だけを'(['-'|R1],_度数_1,_2つ目のハイフン以降の文字列) :- _度数_2 is _度数_1 + 1, '2つ目のハイフン以降の文字列だけを'(R1,_度数_2,_2つ目のハイフン以降の文字列). '2つ目のハイフン以降の文字列だけを'([_|R1],_度数_1,_2つ目のハイフン以降の文字列) :- '2つ目のハイフン以降の文字列だけを'(R1,_度数_2,_2つ目のハイフン以降の文字列). 表示せよ(_2つ目のハイフン以降の文字列) :- writef('%t\n',[_2つ目のハイフン以降の文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/855 # # [1] 授業単元:C言語 # [2] 問題文: # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ。 # <実行例> # 文字列を入力せよ:one-two-three-four # three-four # # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ :- 入力された文字列で(_文字列), '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列), 表示せよ(_2つ目のハイフン以降の文字列). 入力された文字列で(_文字列) :- get_line(_文字列). '2つ目のハイフン以降の文字列だけ'(_文字列,_2つ目のハイフン以降の文字列) :- '2つ目のハイフン'(_文字列,_残り文字ならび), atom_chars(_2つ目のハイフン以降の文字列,_残り文字ならび),!. '2つ目のハイフン'(_文字列,_残りならび) :- atom_chars(_文字列,_文字ならび), append(L1,['-'|_残り文字ならび],_文字ならび), member('-',L1),!. 以降の文字列だけ(_残り文字ならび,_2つ目のハイフン以降の文字列) :- atom_chars(_2つ目のハイフン以降の文字列,_残り文字ならび). 表示せよ(_2つ目のハイフン以降の文字列) :- writef('%t\n',[_2つ目のハイフン以降の文字列]). % 以下のサイトは # 出典:: 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']). % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/836 # # 【質問テンプレ】 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 文字列の操作 # キーボードから複数(50以内)の文字列(20文字以内)を入力する。 # 入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。 # 次に、入力した文字列の第1文字のアルファベット('a'〜'z','A'〜'Z')を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。 # なお、アルファベット以外の文字は変換しないこと。 # 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。' :- '文字列(20文字いない)を入力する'(_文字列), 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(_文字列,_文字列ならび), '次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'(_文字列ならび). 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(_文字列,[]) :- sub_atom(_文字列,0,1,_,'0'),!. 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(50,_文字列,[_文字列]) :- !. 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(N,_文字列,[_文字列|R]) :- '文字列(20文字いない)を入力する'(_次の文字列), N_2 is N + 1, 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(N_2,_次の文字列,R). '文字列(20文字いない)を入力する'(_文字列) :- get_char(_最初の文字), '文字列(20文字いない)を入力する'(_最初の文字,_文字ならび), '20文字いない'(_文字ならび,_文字列). '文字列(20文字いない)'(_文字ならび,_文字列) :- length(_文字ならび,_要素数), '20文字いないに補正'(_要素数,_文字ならび,_文字列). '20文字いないに補正'(_要素数,_文字ならび,_文字列) :- _要素数 > 20, atom_chars(_文字列_1,_文字ならび), sub_atom(_文字列_1,0,20,_,_文字列). '20文字いないに補正'(_要素数,_文字ならび,_文字列) :- _要素数 =< 20, atom_chars(_文字列,_文字ならび). '文字列(20文字いない)を入力する'('\n',[]) :- !. '文字列(20文字いない)を入力する'(_文字,[_文字]) :- get_char(_次の文字), '文字列(20文字いない)を入力する'(N,_文字,[_文字]). '次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'([],[]). '次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'([_文字列|R1],[_変換された文字列|R2]) :- '入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して'(_文字列,_変換された文字列), 表示する(_変換された文字列), '次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'(R1,R2). '入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して'(_文字列,_変換された文字列) :- sub_atom(_文字列,0,1,_残り文字数,_第1文字), sub_atom(_文字列,1,_残り文字列,_,_残りの文字列), to_upper(_第一文字,_大文字化した文字), to_lower(_残り文字列,_小文字化した文字), atomic_list_concat([_大文字化した文字,_小文字化した文字],_変換された文字列). 表示する(_変換された文字列) :- writef('%t\n',[_変換された文字列]). % 最初、文字列を20文字まで読み取る部分はきっちり、20文字を越えたら述語を % 終了させていた。これだと、20文字以上の部分がキーボードバッファ上に残って % しまい、次の入力機会に、この文字列から入力されてしまう可能性がある。 % それで、文字数がオーバーしても、改行まで読み取りオーバーしている場合は % 切り取る方針にした。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/771 # # 【 課題 】迷路の最短経路を与えるプログラムを考えよ. # 壁は#, 通路は.で表されている. # また迷路の外側は全て壁(即ち#)となっている. # スタート地点はS, ゴール地点はGである. # スタートからゴールまでの道のりを表わせ. # 上へ移動する場合にはu, 同様に下はd, 右はr, 左はlとせよ. # 最短経路が複数ある場合は, それらのうちどれかひとつを出力せよ。 # # 例1) # ####### # #..S..# # #.....# # #..G..# # ####### # 答え) # dd # # 例2) # ####### # #.....# # #.G.#.# # #..#..# # #.#.S.# # #.....# # ####### # 答え) # ldlluuru # 最短経路(_迷路文字列ならび,_最短経路) :- 迷路の定義(_迷路文字列ならび), 出発点(Y0,X0), findmin([_距離,_経路],( 道に迷う([[Y0,X0]],Y0,X0,_方向ならび), length(_方向ならび,_距離), atom_chars(_経路,_方向ならび)), [_,_最短経路]). 道に迷う(_,Y,X,[]) :- 終着点(Y,X). 道に迷う(_既に通過した点ならび,Y_1,X_1,[_方向|R]) :- 隣接点を得る(_既に通過した点ならび,Y_1,X_1,Y_2,X_2,_方向), 道に迷う([[Y_2,X_2]|_既に通過した点ならび],Y_2,X_2,R). 隣接点を得る(_既に通過した点ならび,Y_1,X_1,Y_2,X_2,_方向) :- member([_方向,A,B],[[r,1,0],[l,-1,0],[d,0,1],[u,0,-1]]), Y_2 is Y_1 + B, X_2 is X_1 + A, 道(Y_2,X_2), \+(member([Y_2,X_2],_既に通過した点ならび)). 迷路の定義(_行文字列ならび) :- append(L0,[_行文字列|R],_行文字列ならび), length(L0,Y), sub_atom(_行文字列,X,1,_,_点), 迷路の道部分の点定義(_点,Y,X), R = []. 迷路の道部分の定義(_点,Y,X) :- '道ならば位置を定義'(_点,Y,X), '出発点・終着点ならば位置を定義'(_点,Y,X),!. 迷路の道部分の定義(_,_,_). '出発点・終着点ならば位置を定義'('S',Y,X) :- assertz(出発点(Y,X)),!. '出発点・終着点ならば位置を定義'('G',Y,X) :- assertz(終着点(Y,X)),!. 道ならば位置を定義(A,Y,X) :- \+(A = '#'), assertz(道(Y,X)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/573 # # [1] 授業単元: STL # [2] 問題文(含コード&リンク): # 問 二つの値xとyを使用して差を返す関数形式マクロdiff(x,y)を使用し, # キーボードからint型の2つの数値n1とn2を入力した場合に、入力した2つの数値とその差を出力するmain関数のプログラムを作成しなさい。 # 問 四季を表す列挙体seasonを定義し、キーボードから0,1,2,3を入力した場合に、 # それぞれ"Spring", "Summer", "Fall", "Winter"と表示するプログラムを作成しなさい。ただし、enum season {Spring, Summer, Fall, Winter};を使用し、キーボードから0,1,2,3以外の数字が入力された場合には、入力し直す処理を含めなさい。 # 問 数字文字の出現回数の百分率を小数点以下1桁まで求め、 # '*'のグラフと共に表示するmain関数のプログラムを作成しなさい。 # 問 キーボードから入力した行数と空白以外の文字数を求め, # 行数と文字数を表示するmain関数のプログラムを作成しなさい。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。 # 数字文字の出現回数の百分率を小数点以下1桁まで求め(_文字列) :- atom_chars(_文字列,_文字ならび), length(_文字ならび,_総文字数), 数字文字の出現回数の百分率を小数点以下1桁まで求め(_文字ならび,[[],[],[],[],[],[],[],[],[],[]],_出現度数ならび), '*のグラフと共に百分率を小数点以下1桁まで求めて表示する'(_総文字数,_出現度数ならび). 数字文字の出現回数の百分率を小数点以下1桁まで求め([_文字|R],L1,L) :- 出現回数ならびを得る(L1,L). 数字文字の出現回数の百分率を小数点以下1桁まで求め([_文字|R],L1,L) :- 度数加算(_文字,L1,L2), 数字文字の出現回数の百分率を小数点以下1桁まで求め(R,L2,L),!. 数字文字の出現回数の百分率を小数点以下1桁まで求め([_文字|R],L1,L) :- 数字文字の出現回数の百分率を小数点以下1桁まで求め(R,L1,L). 出現回数ならびを得る(L1,L) :- findall(N,( member(L0,L1), length(L0,N)), L). 度数加算('0',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[[_|_0],_1,_2,_3,_4,_5,_6,_7,_8,_9]). 度数加算('1',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,[_|_1],_2,_3,_4,_5,_6,_7,_8,_9]). 度数加算('2',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,[_|_2],_3,_4,_5,_6,_7,_8,_9]). 度数加算('3',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,[_|_3],_4,_5,_6,_7,_8,_9]). 度数加算('4',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,[_|_4],_5,_6,_7,_8,_9]). 度数加算('5',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,[_|_5],_6,_7,_8,_9]). 度数加算('6',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,[_|_6],_7,_8,_9]). 度数加算('7',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,_6,[_|_7],_8,_9]). 度数加算('8',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,_6,_7,[_|_8],_9]). 度数加算('9',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,_6,_7,_8,_[_|9]]). '*のグラフと共に百分率を小数点以下1桁まで求めて表示する'(_総文字数,_出現度数ならび) :- append(L0,[_出現度数|R],_出現度数ならび), length(L0,N), '百分率を小数点以下1桁まで求めてNの星グラフを表示する'(N,_出現度数,_百分率), R = []. '百分率を小数点以下1桁まで求めてNの星グラフを表示する'(N,_総文字数,_出現度数) :- 星表示文字列(_出現度数,_星表示文字列), _百分率 is _出現度数 / _総文字数, format(S,'~4.1f',[_百分率]), writef('[%t] %t%% %t\n',[N,_百分率,_星表示文字列]). 星表示文字列(_出現度数,_星表示文字列) :- length(L,_出現度数), all(L,'*'), atomic_list_concat(L,_星文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/559 # # [1] 授業単元: C言語 # [2] 問題文:文字列の全パターンを表示するプログラム # 実行結果例 # >abc # abc # acb # bca # … # 文字列の全パターンを表示する(_文字列) :- atom_chars(_文字列,_文字ならび), length(_文字ならび,_要素数), 全パターンを(_文字ならび,_要素数,N,L), 表示する(L), N = _要素数. 全パターンを(_文字ならぴ,_要素数,L) :- between(1,N,_要素数), 順列(_文字ならび,N,L). 表示する(L) :- atomic_list_concat(L,S), writef('%t\n',[S]). % 順列/3 % 以下のサイトは # 問題 # 数字がひとつ不明な13桁のISBNコードを復元せよ。 # 例(不明な所を?とする) # 9784062?72211 => 9784062772211 # 978415031?684 => 9784150310684 '数字がひとつ不明な13桁のISBNコードを復元せよ。'(_未知符号を含む13桁のISBNコード,_復元された13桁のISBNコード) :- atom_chars(_未知符号を含む13桁のISBNコード,_未知符号を含む13要素のならび), '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(_未知符号を含む13要素のならび,_未知符号を解決した12要素の数値ならび,_最終桁の数), '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_未知符号を解決した12要素の数値ならび,_加算された数), '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数), 'ISBNコードを復元する'(_未知符号を解決した12要素の数値ならび,_最終桁の数,_復元された13桁のISBNコード). '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(L1,L2,_最終桁の数) :- 各桁を数値に変換したならび(L1,L3), append(L2,[_最終桁の数],L3). 各桁を数値に変換したならび([],[]). 各桁を数値に変換したならび([_文字|R1],[_数値または変数|R2]) :- 数値または変数に変換(_文字,_数値または変数), 各桁を数値に変換したならび(R1,R2). 数値または変数に変換((?),_数値または変数) :- member(_数値または変数,[0,1,2,3,4,5,6,7,8,9]). 数値または変数に変換(A,_数値または変数) :- atom_number(A,_数値または変数). '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_12要素の数値ならび,_加算された数) :- reverse(_12要素の数値ならび,_反転した12要素の数値ならび), findsum(S,( append(L0,[N1,N2|_],_反転した12要素の数値ならび), 要素数が偶数(L0), S is N1 * 3 + N2 * 1), _加算された数). '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数) :- _最終桁の数 is 10 - (_加算された数 mod 10). 要素数が偶数(L) :- length(L,_要素数), 0 is _要素数 mod 2. 'ISBNコードを復元する'(_未知符号を解決した12要素の数値ならび,_最終桁の数,_復元された13桁のISBNコード) :- append(_未知符号を解決した12要素の数値ならび,[_最終桁の数],L1), atomic_list_concat(L1,_復元された13桁のISBNコード). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/71 # # 数値比較を正規表現だけでやることになって、たった4桁なのに泣きそう。 # # '数値比較を正規表現だけでやることになって、たった4桁なのに泣きそう。'(_4桁ブラス4桁の数字列,_診断) :- atom_chars(_4桁ブラス4桁の数字列,[A,B,C,D,E,F,G,H]), '診断: 4桁の数字ならび比較'([A,B,C,D],[E,F,G,H],_診断),!. '診断: 4桁の数字ならび比較'(L,L,=) :- !. '診断: 4桁の数字ならび比較'(L1,L2,<) :- L1 @< L2,!. '診断: 4桁の数字ならび比較'(L1,L2,>) :- L1 @> L2,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/633 # # 問題 # 13桁のISBNコードを検査せよ。 # 例 # 9784062772211 => OK # 9784150315684 => NG # # '13桁のISBNコードを検査せよ。'(_13桁のISBNコード) :- sub_atom(_13桁のISBNコード,0,12,1,_12桁の文字列), sub_atom(_13桁のISBNコード,12,1,0,_冗長符号), atom_chars(_12桁の文字列,_12要素の数字ならび), モジュラス10ウェイト3(_12要素の数字ならび,[1,3,1,3,1,3,1,3,1,3,1,3],0,_冗長符号). モジュラス10ウェイト3([],[],S,_冗長符号) :- _冗長符号整数 is 10 - (S mod 10), atom_number(_冗長符号,_冗長符号整数). モジュラス10ウェイト3([_数字|R1],[M|R2],S1,_冗長符号) :- atom_number(_数字,N), S2 is S1 + N * M, モジュラス10ウェイト3(R1,R2,S2,_冗長符号),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/267 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):問題が長いので http://ime.nu/ideone.com/1FVot ここにあげさせてもらいました。 # # 共用体を用いてビット単位で操作できる1バイトの仮想レジスタを定義し、 # 「2進数8桁の文字列」で入力した2つの数値データの、 # 加算、減算、論理積、論理和、排他的論理和、否定の演算結果を # 2進数8桁で出力するプログラムを作成せよ。 # # という課題がでて以下の様なソースを書いたのですが、エラー処理の方法が # よくわかりません。やりたいことは0と1以外の数を入力したら # エラーと表示、8桁でなければエラーと表示してもらいたいです。 # それと先生に出力の書き方が少しおかしいと言われたのですが、このソースで # 動いてしまいました。プログラミングの授業的になにかまずいことでもあるのでしょうか? # それも出来れば教えてもらいたいです。 '1バイトの仮想レジスタ'(加算,_2進数8桁の文字列_1,_2進数8桁の文字列_2,_2進数8桁の文字列_3) :- atom_chars(_2進数8桁の文字列_1,L1), atom_chars(_2進数8桁の文字列_2,L2), ビット加算(L1,L2,L), atom_chars(_2進数8桁の文字列_3,L). '1バイトの仮想レジスタ'(減算,_2進数8桁の文字列_1,_2進数8桁の文字列_2,_2進数8桁の文字列_3) :- atom_chars(_2進数8桁の文字列_1,L1), atom_chars(_2進数8桁の文字列_2,L2), ビット減算(L1,L2,L), atom_chars(_2進数8桁の文字列_3,L). '1バイトの仮想レジスタ'(論理積,_2進数8桁の文字列_1,_2進数8桁の文字列_2,_2進数8桁の文字列_3) :- atom_chars(_2進数8桁の文字列_1,L1), atom_chars(_2進数8桁の文字列_2,L2), ビット論理積(L1,L2,L), atom_chars(_2進数8桁の文字列_3,L). '1バイトの仮想レジスタ'(論理和,_2進数8桁の文字列_1,_2進数8桁の文字列_2,_2進数8桁の文字列_3) :- atom_chars(_2進数8桁の文字列_1,L1), atom_chars(_2進数8桁の文字列_2,L2), ビット論理和(L1,L2,L), atom_chars(_2進数8桁の文字列_3,L). '1バイトの仮想レジスタ'(排他的論理積,_2進数8桁の文字列_1,_2進数8桁の文字列_2,_2進数8桁の文字列_3) :- atom_chars(_2進数8桁の文字列_1,L1), atom_chars(_2進数8桁の文字列_2,L2), ビット排他的論理和(L1,L2,L), atom_chars(_2進数8桁の文字列_3,L). '1バイトの仮想レジスタ'(否定,_2進数8桁の文字列_1,_2進数8桁の文字列_2) :- atom_chars(_2進数8桁の文字列_1,L1), ビット否定(L1,L2), atom_chars(_2進数8桁の文字列_2,L2). ビット加算(L1,L2,L) :- ビット加算(L1,L2,[],L). ビット加算([],[],L1,L) :- reverse(L1,L). ビット加算([A|R1],[B|R2],L1,L) :- ビット加算(A,B,C,D), 桁あがり処理(C,L1,L2), ビット加算(R1,R2,[D|L2],L). ビット加算('0','0','0','0'). ビット加算('0','1','0','1'). ビット加算('1','0','0','1'). ビット加算('1','1','1','0'). 桁あがり処理('0',L,L). 桁あがり処理('1',['0'|R],['1'|R]). 桁あがり処理('1',['1'|R1],['0'|R2]) :- 桁あがり処理('1',R1,R2). ビット減算(L1,L2,L) :- ビット減算(L1,L2,[],L). ビット減算([],[],L1,L) :- reverse(L1,L). ビット減算([A|R1],[B|R2],L1,L) :- ビット減算(A,B,C,D), 桁あふれ処理(C,L1,L2), ビット減算(R1,R2,[D|L2],L). ビット減算('0','0','0','0'). ビット減算('0','1','1','1'). ビット減算('1','0','0','1'). ビット減算('1','1','0','0'). 桁さがり処理('0',L,L). 桁さがり処理('1',['1'|R],['0'|R]). 桁さがり処理('1',['0'|R1],['1'|R2]) :- 桁さがり処理('1',R1,R2). ビット論理積([],[],[]). ビット論理積(['0'|R1],['0'|R2],['0'|R3]) :- ビット論理積(R1,R2,R3). ビット論理積(['0'|R1],['1'|R2],['0'|R3]) :- ビット論理積(R1,R2,R3). ビット論理積(['1'|R1],['0'|R2],['0'|R3]) :- ビット論理積(R1,R2,R3). ビット論理積(['1'|R1],['1'|R2],['1'|R3]) :- ビット論理積(R1,R2,R3). ビット論理和([],[],[]). ビット論理和(['0'|R1],['0'|R2],['0'|R3]) :- ビット論理和(R1,R2,R3). ビット論理和(['0'|R1],['1'|R2],['1'|R3]) :- ビット論理和(R1,R2,R3). ビット論理和(['1'|R1],['0'|R2],['1'|R3]) :- ビット論理和(R1,R2,R3). ビット論理和(['1'|R1],['1'|R2],['1'|R3]) :- ビット論理和(R1,R2,R3). ビット排他的論理和([],[],[]). ビット排他的論理和(['0'|R1],['0'|R2],['0'|R3]) :- ビット排他的論理和(R1,R2,R3). ビット排他的論理和(['0'|R1],['1'|R2],['1'|R3]) :- ビット排他的論理和(R1,R2,R3). ビット排他的論理和(['1'|R1],['0'|R2],['1'|R3]) :- ビット排他的論理和(R1,R2,R3). ビット排他的論理和(['1'|R1],['1'|R2],['0'|R3]) :- ビット排他的論理和(R1,R2,R3). ビット否定([],[]). ビット否定(['0'|R1],['1'|R3]) :- ビット否定(R1,R2,R3). ビット否定(['1'|R1],['0'|R3]) :- ビット否定(R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/253 # # [1] 授業単元:応用情報処理I # [2] 問題文: 正規分布を計算して結果をグラフとして出力するプログラムを作成しなさい # f(_x,_y) :- _x_1 is 2 * pi * (_x / 100.0) - pi, _y is truncate(1.0 / ( (2.0 * pi) ^ 2 * exp(-1 * (_x_1 * _x_1 / 2.0))) * 100.0). '正規分布を計算して結果をグラフとして出力するプログラムを作成しなさい' :- 表にグラフを描く(LL1), 転置(LL1,LL2), グラフ表示(LL2). 表にグラフを描く(LL1) :- findall(L,( for(0,_x,100), length(L,101), f(_x,_y), append(L0,[*|R],L), length(L0,_y)), LL1). グラフ表示([]). グラフ表示([L|R]) :- 変数要素を空白に変換(L), atom_chars(A,L), writef('%t\n',[A]), グラフ表示(R). 変数要素を空白に変換([]). 変数要素を空白に変換([' '|R]) :- 変数要素を空白に変換(R). 変数要素を空白に変換([_|R]) :- 変数要素を空白に変換(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/611 # # 問題 # 与えられた文字列の奇数番目を大文字に偶数番目を小文字にせよ。 # 例 # Hello => HeLlO # end => EnD # # '与えられた文字列の奇数番目を大文字に偶数番目を小文字にせよ。'(_与えられた文字列,_奇数番目を大文字に偶数番目を小文字にした文字列) :- findall(_変換した文字,( sub_atom(_文字列,_0起点位置,1,_,_文字), 奇数番目を大文字に偶数番目を小文字に(_0起点位置,_文字,_変換した文字)), _奇数番目を大文字に偶数番目を小文字にした文字ならび), atom_chars(_奇数番目を大文字に偶数番目を小文字にした文字列,_奇数番目を大文字に偶数番目を小文字にした文字ならび). 奇数番目を大文字に偶数番目を小文字に(_0起点位置,_文字,_小文字) :- 奇数番目を(_0起点位置), 小文字に(_文字,_小文字). 奇数番目を大文字に偶数番目を小文字に(_0起点位置,_文字,_大文字) :- 偶数番目を(_0起点位置), 大文字に(_文字,_大文字). 奇数番目を(_0起点位置) :- 1 is (_0起点位置 + 1) mod 2. 偶数番目を(_0起点位置) :- 0 is (_0起点位置 + 1) mod 2. 小文字に(_文字,_小文字) :- to_lower(_文字,_小文字). 大文字に(_文字,_大文字) :- to_upper(_文字,_大文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/996 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/30Mz7Pbj # このプログラムで何番目の値段をかえるではなく # 名前を聞かれてその名前の値段をかえるプログラムにする。 # # #include # #include # main() # { # struct goods{ # char name[20]; # char price[5]; # }record; # FILE *fp; # int max,size,num; # long top,end,locat,ftell(); # fp=fopen("file1","r+"); # if(fp==NULL){ # printf("open error"); # exit(1); # } # size=sizeof(record); # fseek(fp,0L,2); # end=ftell(fp); # fseek(fp,0L,0); # top=ftell(fp); # max=(end-top)/size; # do{ # printf("rec no?\n"); # scanf("%d",&num); # }while(num<1||num>max); # locat=size*(num-1); # fseek(fp,locat,0); # fread(&record,size,1,fp); # printf("name=%s price=%s\n" # ,record.name,record.price); # printf("Current price\t:%s\n",record.price); # printf("New price?\t:"); # scanf("%s",record.price); # fseek(fp,-size,1); # fwrite(&record,size,1,fp); # fclose(fp); # printf("update....ended\n"); # } 'ファイル内の名前を鍵に指定して値段をかえる'(_ファイル名,_更新対象氏名,_値段) :- 更新対象氏名の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた更新対象氏名), 値段の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた値段), open(_ファイル名,update,InOuttream), '名前を指定して値段をかえる'(InOutstream,_末尾に空白を埋めた対象氏名,_末尾に空白を埋めた値段), close(InOututstream). 更新対象氏名の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた更新対象氏名) :- length(L,20), atom_chars(_更新対象氏名,Chars), append(Chars,L2,L), all(L2,' '), atom_chars(_末尾に空白を埋めた更新対象氏名,L). 値段の末尾に空白を埋める(_値段,_末尾に空白を埋めた値段) :- length(L,5), number_chars(_値段,Chars), append(Chars,L2,L), all(L2,' '), atom_chars(_末尾に空白を埋めた値段,L). '名前を指定して値段をかえる'(InOutstream,_,_) :- at_end_of_stream(InOutstream),!. '名前を指定して値段をかえる'(InOutstream,_更新対象氏名,_値段) :- 氏名を読み更新する(InOutstream,_更新対象氏名,_値段), 価格を更新する(InOutstream), '名前を指定して値段をかえる'(InOutstream,_更新対象氏名,_値段). 氏名を読み更新する(InOutstream,_更新対象氏名,_値段) :- findall(_文字,( between(1,20,N), get_char(InOutstream,_文字)), L), 更新対象氏名の時は価格も更新する(InOutstream,_更新対象氏名,_値段). 更新対象氏名の時は価格も更新する(InOutstream,L,_更新対象氏名,_値段) :- atom_chars(_更新対象氏名,L), writef(InOutstream,'%t',[_更新対象氏名]), 価格を更新する(InOutstream,_値段). 更新対象氏名の時は価格も更新する(InOutstream,L,_更新対象氏名,_値段) :- \+(atom_chars(_更新対象氏名,L)), 価格をそのまま書く(InOutstream). 価格を更新する(InOutstream,_値段) :- writef(InOutstream,'%t',[_値段]). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/896 # # すみません # Objective-CのNSRegularExpressionで、ある文字列について、 # ・順番通りに # ・一部が欠けてもよく # ・途中に余計な文字が入ってもよく # ・一致する数を数える # ようなパターンを組みたいのですが、 # 例えばABCDEという文字列があったとして # ABCDE→5(全件一致) # AABBCCDDEE→5(全件一致) # ADCBE→3(A,C,Eが一致) # AFGHBCDE→5(全件一致) # EDCBA→1(Eのみ一致) # というように数えたいのですが、上手くいきません。 # .*?(A)?.*?(B)?.*?(C)?.*?(D)?.*?(E)?.*? # ではダメみたいなのですがどうするのが正しいでしょうか # # '・順番通りに ・一部が欠けてもよく ・途中に余計な文字が入ってもよく ・一致する数を数えるようなパターンを評価する'(_文字列,_パターン,_評価) :- atom_chars(_文字列,Chars), 指定検索パターンの昇順要素のみ評価する('A',Chars,['A','B','C','D','E'],_重複可能なパターン), パターン評価(_重複可能なパターン,_パターン,_評価). 指定検索パターンの昇順要素のみ評価する(_,[],[]). 指定検索パターンの昇順要素のみ評価する(U,[A|R1],_検索文字ならび,[A|R2]) :- member(A,_検索文字ならび), U @=< A, 指定検索パターンの昇順要素のみ評価する(A,R1,_検索文字ならび,R2). 指定検索パターンの昇順要素のみ評価する(U,[A|R1],_検索文字ならび,R2) :- member(A,_検索文字ならび)), U @> A, 指定検索パターンの昇順要素のみ評価する(U,R1,_検索文字ならび,R2). 指定検索パターンの昇順要素のみ評価する(U,[A|R1],_検索文字ならび,R2) :- \+(member(A,_検索文字ならび)), 指定検索パターンの昇順要素のみ評価する(U,R1,_検索文字ならび,R2). パターン評価(_重複可能なパターン,_検索文字ならび,_パターン,_評価) :- 重複する文字を取り除く(_重複可能なパターン,_パターン), length(_パターン,_パターンの文字数), length(_検索文字ならび,_全件数), 評価(_パターンの文字数,_全件数,_評価). 重複する文字を取り除く(_重複可能なパターン,_パターン) :- setof(A,member(A,_重複可能なパターン),_パターン). 評価(_全件数,_全件数,全件一致). 評価(_パターンの文字数,_,_評価) :- atomic_list_concat([_パターンの文字数,件一致],_評価). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/978 # # [1] 授業単元:2次元配列 # [2] 問題文(含コード&リンク): # 新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。 # 出発駅と到着駅をそれぞれ駅番号で入力し,料金を表示するプログラムを作成しなさい。 # なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする。 # 但し、料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了するものとする。 #       新大阪  京都 名古屋 新横浜  # 東京 14,920 14,390 11,540 3,180 # 新横浜 14,600 13,660 10,910 # 名古屋 6,840 6,100 # 京都 3,240 # # 'のぞみ料金表を"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/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',[_水の量,_分子の総数,_酸素原子の数,_水素原子の数]). 行入力と終了状態(_行,_終了状態) :- get_char(_先読み文字), 文字ならび行入力と終了状態(_先読み文字,_文字ならび,_終了状態), atom_chars(_行,_文字ならび). 文字ならび行入力と終了状態('\n',[],正常終了) :- !. 文字ならび行入力と終了状態(end_of_file,[],end_of_file) :- !. 文字ならび行入力と終了状態(_先読み文字,[_先読み文字|R],_状態) :- get_char(_文字), 文字ならび行入力と終了状態(_文字,R,_状態). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力する。'(_文字列). '文字列を入力し'(_文字列) :- get_line(_文字列). 'その文字列に含まれる英字、数字、その他の文字の数を出力する'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力する(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- atom_chars(_文字列,Chars), 'ならび要素の英字、数字、その他の文字の数を'(Chars,0,0,0,_英字の数,_数字の数,_その他の文字の数). 'ならび要素の英字、数字、その他の文字の数を'([],_英字の数,_数字の数,_その他の文字の数,_英字の数,_数字の数,_その他の文字の数). 'ならび要素の英字、数字、その他の文字の数を'([_文字|R],_英字の数_1,_数字の数_1,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数) :- 英字(_文字), _英字の数_2 is _英字の数_1 + 1, 'ならび要素の英字、数字、その他の文字の数を'(R,_英字の数_2,_数字の数_1,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数). 'ならび要素の英字、数字、その他の文字の数を'([_文字|R],_英字の数_1,_数字の数_1,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数) :- 数字(_文字), _数字の数_2 is _数字の数_1 + 1, 'ならび要素の英字、数字、その他の文字の数を'(R,_英字の数_1,_数字の数_2,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数). 'ならび要素の英字、数字、その他の文字の数を'([_文字|R],_英字の数_1,_数字の数_1,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数) :- \+(英字(_文字)), \+(数字(_文字)), _その他の文字の数_2 is _その他の文字の数_1 + 1, 'ならび要素の英字、数字、その他の文字の数を'(R,_英字の数_1,_数字の数_1,_その他の文字の数_2,_英字の数,_数字の数,_その他の文字の数). 出力する(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). 英字(_英字) :- _英字 @>= 'a', _英字 @=< 'z',!. 英字(_英字) :- _英字 @>= 'A', _英字 @=< 'Z'. 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力する。'(_文字列). '文字列を入力し'(_文字列) :- get_line(_文字列). 'その文字列に含まれる英字、数字、その他の文字の数を出力する'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力する(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- atom_chars(_文字列,Chars), 'ならび要素の英字、数字、その他の文字の数を'(Chars,_英字の数,_数字の数,_その他の文字の数). 'ならび要素の英字、数字、その他の文字の数を'([],0,0,0). 'ならび要素の英字、数字、その他の文字の数を'([_文字|R],_英字の数,_数字の数,_その他の文字の数) :- 英字(_文字), 'ならび要素の英字、数字、その他の文字の数を'(R,_英字の数_1,_数字の数,_その他の文字の数), _英字の数 is _英字の数_1 + 1. 'ならび要素の英字、数字、その他の文字の数を'([_文字|R],_英字の数,_数字の数,_その他の文字の数) :- 数字(_文字), 'ならび要素の英字、数字、その他の文字の数を'(R,_英字の数,_数字の数_1,_その他の文字の数), _数字の数 is _数字の数_1 + 1. 'ならび要素の英字、数字、その他の文字の数を'([_文字|R],_英字の数,_数字の数,_その他の文字の数) :- \+(英字(_文字)), \+(数字(_文字)), 'ならび要素の英字、数字、その他の文字の数を'(R,_英字の数,_数字の数,_その他の文字の数_1), _その他の文字の数 is _その他の文字の数_1 + 1. 出力する(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). 英字(_英字) :- _英字 @>= 'a', _英字 @=< 'z',!. 英字(_英字) :- _英字 @>= 'A', _英字 @=< 'Z'. 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/555 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # 文字型配列moji[3][10]={"coffee","black tea","green tea"};で初期化し、 # 整数型変数aが入力された場合には「coffee」、1が入力された場合には「black tea」、 # 2が入力された場合には「green tea」が出力されるプログラムを作成しなさい。 # <入力例>0 : coffee 1 : black tea 2 : green tea? 0 # <出力例>coffee # '文字型配列moji[3][10]={"coffee","black tea","green tea"};で初期化し'(LL) :- length(LL,3), findall(L,( member(_文字列,[coffee,'black tea','green tea']), atom_chars(_文字列,Chars), length(L,10), append(Chars,_,L)), LL). '整数型変数aに0が入力された場合には「coffee」、1が入力された場合には「black tea」、2が入力された場合には「green tea」が出力される'(_a) :- '文字型配列moji[3][10]={"coffee","black tea","green tea"};で初期化し'(LL), '整数型変数aに0が入力された場合には「coffee」、1が入力された場合には「black tea」、2が入力された場合には「green tea」が出力される'(_a,LL). '整数型変数aに0が入力された場合には「coffee」、1が入力された場合には「black tea」、2が入力された場合には「green tea」が出力される'(_a,LL) :- length(Ln,_a), append(Ln,[L|_],LL), 実データ部を切り取る(L,Chars), atom_chars(_文字列,Chars), writef('%t\n',[_文字列]). 実データ部を切り取る([],[]). 実データ部を切り取る([V|_],[]) :- var(V),!. 実データ部を切り取る([A|R1],[A|R2]) :- 実データ部を切り取る(R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/488 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/8gKIcGy2 # 上記のプログラムを参考にし、文字型配列moji[15]を宣言し、初期値として"one-two-three"を代入すると # "one,two,three"と出力されるプログラムを作成しなさい。 # '文字列中の-を,に変換する'(_文字列,_変換された文字列) :- findall(_文字_1,( sub_atom(_文字列,_,1,_,_文字), '-を,に変換する'(_文字,_文字_1)), Chars), atom_chars(_変換された文字列,Chars). '-を,に変換する'('-',',') :- !. '-を,に変換する'(_文字,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/501 # # ../test/read.cgi/tech/1335517816/496 ../test/read.cgi/tech/1335517816/498 # ありがとうございます。 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、 # リターンキーを押すと数字のみ#に置き換えられた文字列が出力されるプログラムを作成しなさい。 # 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、リターンキーを押すと数字のみ#に置き換えられた文字列が出力される' :- 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列), '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列), 出力される(_置き換えられた文字列). 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列) :- length(Ln,48), get_char(_文字), 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(Ln,_文字,_文字ならび), atom_chars(_文字列,_文字ならび). 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_,'\n',[]) :- !. 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'([_],_文字,[_文字]) :- !. 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'([_|Ln],_文字,[_文字|R]) :- 'アルファベット、数字、空白が混在した文字'(_文字_2), 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(Ln,_文字_2,R). 'アルファベット、数字、空白が混在した文字'(_文字) :- get_char(_文字), 'アルファベット、数字、空白が混在した文字診断'(_文字),!. 'アルファベット、数字、空白が混在した文字'(_文字) :- 'アルファベット、数字、空白が混在した文字'(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- アルファベット(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 数字(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 空白(_文字). アルファベット(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. アルファベット(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 数字(_文字) :- member(_文字,['0','1','2','3','4','5','6','7','8','9']). 空白(' '). '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列) :- findall(_数字のみ置き換えられた文字,( sub_atom(_文字列,_,1,_,_文字), '数字のみ#の置き換える'(_文字,_数字のみ置き換えられた文字)), L), atomic_list_concat(L,_置き換えられた文字列). '数字のみ#の置き換える'(_文字,'#') :- 数字(_文字),!. '数字のみ#の置き換える'(_文字,_文字). 出力される(_置き換えられた文字列) :- writef('置き換えられた文字列 = "%t"\n',[_置き換えられた文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/501 # # ../test/read.cgi/tech/1335517816/496 ../test/read.cgi/tech/1335517816/498 # ありがとうございます。 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、 # リターンキーを押すと数字のみ#に置き換えられた文字列が出力されるプログラムを作成しなさい。 # 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、リターンキーを押すと数字のみ#に置き換えられた文字列が出力される' :- 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列), '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列), 出力される(_置き換えられた文字列). 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列) :- length(L,48), findall(_文字,( append(L0,[_|_],L), 'アルファベット、数字、空白が混在した文字'(_文字), ( _文字='\n',!,fail; true)), _文字ならび), atom_chars(_文字列,_文字ならび). 'アルファベット、数字、空白が混在した文字'(_文字) :- get_char(_文字), 'アルファベット、数字、空白が混在した文字診断'(_文字),!. 'アルファベット、数字、空白が混在した文字'(_文字) :- 'アルファベット、数字、空白が混在した文字'(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- アルファベット(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 数字(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 空白(_文字). アルファベット(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. アルファベット(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 数字(_文字) :- member(_文字,['0','1','2','3','4','5','6','7','8','9']). 空白(' '). '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列) :- findall(_数字のみ置き換えられた文字,( sub_atom(_文字列,_,1,_,_文字), '数字のみ#の置き換える'(_文字,_数字のみ置き換えられた文字)), L), atomic_list_concat(L,_置き換えられた文字列). '数字のみ#の置き換える'(_文字,'#') :- 数字(_文字),!. '数字のみ#の置き換える'(_文字,_文字). 出力される(_置き換えられた文字列) :- writef('置き換えられた文字列 = "%t"\n',[_置き換えられた文字列]). % 以下のサイトは search(_文字列,_選択範囲起点,_選択範囲中央,_選択範囲終点,S1,S2,S3,L1,L2,L3) :- sub_atom_search(_文字列,_選択範囲起点,_選択範囲中央,_選択範囲終点,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- list(_選択範囲起点ならび), list(_選択範囲終点ならび), atom_chars(_選択範囲起点,_選択範囲起点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- atom(_選択範囲起点), list(_選択範囲終点ならび), atom_chars(_選択範囲起点,_選択範囲起点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点,S1,S2,S3,L1,L2,L3) :- list(_選択範囲起点ならび), atom(_選択範囲終点), atom_chars(_選択範囲終点,_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点,_選択範囲中央,_選択範囲終点,S1,S2,S3,L1,L2,L3) :- atom(_選択範囲起点), atom(_選択範囲終点), atom_chars(_選択範囲起点,_選択範囲起点ならび), atom_chars(_選択範囲終点,_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- var(_選択範囲起点ならび), list(_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- list(_選択範囲起点ならび), var(_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点,S1,S2,S3,L1,L2,L3) :- var(_選択範囲起点ならび), atom(_選択範囲終点ならび), atom_chars(_選択範囲終点,_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- atom(_選択範囲起点), var(_選択範囲終点ならび), atom_chars(_選択範囲起点,_選択範囲起点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- var(_選択範囲起点ならび), var(_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(_選択範囲起点ならび,_選択範囲中央ならび,_選択範囲終点ならび,L2), \+(append(_,_選択範囲起点ならび,_,_選択範囲中央ならび)), \+(append(_,_選択範囲終点ならび,_,_選択範囲中央ならび)), atom_chars(_選択範囲中央,_選択範囲中央ならび). % sub_atom/10 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- atom_chars(_文字列,Chars), 'キャリッジ・リターンが30回登場したら30回目より後ろを削除したい'(0,Chars,Chars_2), atom_list_concat(Chars_2,_末尾を削除された文字列). 'キャリッジ・リターンが30回登場したら30回目より後ろを削除したい'(30,L,[]) :- !. 'キャリッジ・リターンが30回登場したら30回目より後ろを削除したい'(_,[],[]) :- !. 'キャリッジ・リターンが30回登場したら30回目より後ろを削除したい'(_n,['\r'|R1],R2) :- _n_2 is _n + 1, 'キャリッジ・リターンが30回登場したら30回目より後ろを削除したい'(_n_2,R1,R2),!. 'キャリッジ・リターンが30回登場したら30回目より後ろを削除したい'(_n,[A|R1],[A|R2]) :- 'キャリッジ・リターンが30回登場したら30回目より後ろを削除したい'(_n,R1,R2),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/775 # # ●正規表現の使用環境 # PCRE # # ●検索か置換か? # 置換 # # ●説明 # <tag>から</tag>内の文字列abcをABCへ置換したい # # ●対象データ # xabcxxx<tag>abcxxxxxxxxxxxabcxxxxxxxabcxx</tag>xxxxabcxxxabcxx # xabcxxx<tag>abc</tag>xxxxaxxxxxxxabcxxcxxxxx<tag>abcxx</tag>xxx # # ●希望する結果 # xabcxxx<tag>ABCxxxxxxxxxxxABCxxxxxxxABCxx</tag>xxxxabcxxxabcxx # xabcxxx<tag>ABC</tag>xxxxaxxxxxxxabcxxcxxxxx<tag>ABCxx</tag>xxx # # # '<tag>から</tag>内の文字列abcをABCへ置換したい'(_文字列,_タグ,_置換された文字列) :- タグと終了タグ文字ならび(_タグ,_タグ文字ならび,_終了タグ文字ならび), sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(L1_1,_タグ文字ならび,L1), append(_終了タグ文字ならび,R3,L3), タグまたは終了タグを含まない(L2,_タグ文字ならび,_終了タグ文字ならび), abcをABCへ置換(S2,S2_2), '<tag>から</tag>内の文字列abcをABCへ置換したい'(S3,_置換された文字列_2), atomic_list_concat([S1,S2_2,_置換された文字列_2],_置換された文字列),!. '<tag>から</tag>内の文字列abcをABCへ置換したい'(_文字列,_文字列). タグと終了タグ文字ならび(_タグ,_タグ文字ならび,_終了タグ文字ならび) :- atom_chars(_タグ,Chars), append([<],Chars,[>],_タグ文字ならび), append([<,/],Chars,[>],_終了タグ文字ならび),!. タグまたは終了タグを含まない(L,L1,L2) :- \+(append(_,L1,_,L)), \+(append(_,L2,_,L)). abcをABCへ置換(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,abc,S3,_,_,_), abcをABCへ置換(S3,_置換された文字列_2), atomic_list_concat([S1,'ABC',_置換された文字列_2],_置換された文字列),!. abcをABCへ置換(_文字列,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/956 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):次のプログラムをstrcpy(a,b)を使わずに # whileを使って同じことを行うプログラムを作れ。 # int main(void){ # char a[64],*b; # b="INFORMATION"; # strcpy(a,b); # printf("%s\n",a); # return 0; # } # b("INFORMATION"). '次のプログラムをstrcpy(a,b)を使わずに同じことを行うプログラムを作れ。' :- b(_b), strcpyもどき(_a,_b), writef('%t\n',[_a]). strcpyもどき([],[]). strcpyもどき([A|R1],[A|R2]) :- strcpyもどき(R1,R2). % ここではINFORMATIONがstringつまり文字コードのリストとして定義されている。 % % 今日的にはstringはあまり使われないが、atom_charsなどを介さずリスト処理に % 入れる魅力はある。アトムテーブルが無闇に増えない点も利点だが、 % その代わりリストとしてスタックに負荷がかかる。 % % 今日、あまり使われなくなった理由は、 % 1) ダブルクォーツが情報として邪魔。この理由が一番大きいと思う。 % 2) 効率が悪い。どんなに工夫しても、リストのユニフィケーションは高負担。 % 3) 少なくとも、関数名はストリングではなく、アトムであり、functorや % =.. を使用するときに不整合な部分が現れる。 % 4) 表示文字に変換する記法が何通りもあり、それをoptionのprolog_flagで % 指定することになっている。この指定方法を知らなかったり、習熟して % いないことがプログラムエラーの原因となる。 % 5) sub_atom/5のようなatom操作の強力な組込述語が開発された。 % 以上のような理由からだと思われる。 % % % 一般にProlog述語を定義する時は、引数の前半に入力引数、後半に % 出力引数を集めるものだが、ここはstrcpyとstrcpyもどきの対応を % くっきりとさせるため、敢えて引数をひっくり返した。 % ひっくり返してもまったく機能的には削がれることがないことを確認して下さい。 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/646 # # 質問です # # phpのpreg_replaceで文字列を入れ替えたいのですが # # <a href="mailto:example@example.com">問い合せ</a> # # のexample@example.comのみを入れ替えるにはどのような正規表現を使えば出来るでしょうか? # # よろしくお願いします # 'example@example.comのみを入れ替える'(_文字列,_入れ替える文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), メールアドレス部分(S2,L2), 'example@example.comのみを入れ替える'(S3,_入れ替える文字列,_置換されたS3), concat_atom([S1,'"mailto:',_入れ替える文字列,'"',_置換されたS3],_置換された文字列),!. 'example@example.comのみを入れ替える'(_文字列,_,_文字列). メールアドレス部分(S2,L2) :- L2 = ['"',m,a,i,l,t,o,:|R2], append(L2_1,['"'],R2), \+(member('"',L2_1)), atom_chars(S2_2,R2), メールアドレスとして可能な文字文字列(S2_2),!. メールアドレスとして可能な文字列(_文字列) :- split(_文字列,['@'],[A,B]), メールに使用できるアルファベット(A), メールに使用できるアルファベット(B). メールに使用できるアルファベット(_文字) :- char_code(_文字,_文字コード), メールに使用できる文字コード(_文字コード),!. メールに使用できるアルファベット(_文字) :- member(_文字,['_','-','~']). メールに使用できる文字コード(_文字コード) :- _文字コード >= 65, _文字コード =< 90,!. メールに使用できる文字コード(_文字コード) :- _文字コード >= 97, _文字コード =< 122,!. メールに使用できる文字コード(_文字コード) :- _文字コード >= 48, _文字コード =< 57,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328439334/333 # # # Prologに於ける文字置換のパターンを示す # # 置換対象文字列に出会う度に非決定性で置換される事を基本として # 併せて、置換回数が最大になるような置換述語を定義する # '置換回数が最大になるような文字列置換'(_文字列,_置換された文字列) :- findall([_置換回数,_置換された文字列],( '置換回数を数えながら文字列置換'(_文字列,_置換回数,_置換された文字列)), LL), findmax(N,( member([N,_],LL)), Max), member([Max,_置換された文字列],LL). '置換回数を数えながら文字列置換'(_文字列,_置換回数,_置換された文字列) :- 置換文字列定義を差分リストに変換する, atom_chars(_文字列,Chars), '置換回数を数えながらならび置換'(Chars,_置換回数,_置換されたChars), _置換回数 > 0, atom_chars(_置換された文字列,_置換されたChars). '置換回数を数えながらならび置換'([],0,[]). '置換回数を数えながらならび置換'(L1,N,L2) :- 置換ならび定義(L1,R1,L2,R2), '置換回数を数えながらならび置換'(R1,N2,R2), N is N2 + 1. '置換回数を数えながらならび置換'([A|R1],N,[A|R2]) :- '置換回数を数えながらならび置換'(R1,N,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 置換文字列定義を差分リストに変換する :- abolish(置換ならび定義/4), clause(置換文字列定義(_文字列,_置換する文字列),_本体), 差分リストを構成する(_文字列,_置換する文字列,L1,R1,L2,R2), assertz((置換ならび定義(L1,R1,L2,R2) :- _本体)), fail. 置換文字列定義を差分リストに変換する. 差分リストを構成する(_文字列,_置換する文字列,L1,R1,L2,R2) :- atom_chars(_文字列,Chars_1), atom_chars(_置換する文字列,Chars_2), append(Chars_1,R1,L1), append(Chars_2,R2,L2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328439334/333 # # # Prologに於ける文字置換のパターンを示す # # 文字列を検索して、適合パターンを置換していく行全体を置換したら終了 # 文字列置換(_文字列,_置換された文字列) :- 置換文字列定義を差分リストに変換する, atom_chars(_文字列,Chars), ならび置換(Chars,_置換されたChars), atom_chars(_置換された文字列,_置換されたChars). ならび置換([],[]). ならび置換(L1,L2) :- 置換ならび定義(L1,R1,L2,R2), ならび置換(R1,R2),!. ならび置換([A|R1],[A|R2]) :- ならび置換(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 置換文字列定義を差分リストに変換する :- abolish(置換ならび定義/4), clause(置換文字列定義(_文字列,_置換する文字列),_本体), 差分リストを構成する(_文字列,_置換する文字列,L1,R1,L2,R2), assertz((置換ならび定義(L1,R1,L2,R2) :- _本体)), fail. 置換文字列定義を差分リストに変換する. 差分リストを構成する(_文字列,_置換する文字列,L1,R1,L2,R2) :- atom_chars(_文字列,Chars_1), atom_chars(_置換する文字列,Chars_2), append(Chars_1,R1,L1), append(Chars_2,R2,L2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/502 # # 正規表現で足し算はできないでしょうか? # # PHPのソースなんですが # array( 'start' => 10.000, 'end' => 10.166 ), # array( 'start' => 11.166, 'end' => 11.414 ), # array( 'start' => 12.414, 'end' => 14.559 ), # などと並んでる部分があり、これらの数値全部に1を足したいのですが # # 'これらの数値全部に1を足したい'([],[]). 'これらの数値全部に1を足したい'([_行|R1],[_変更された行|R2]) :- 数値に1を加える(_行,_変更された行), 'これらの数値全部に1を足したい'(R1,R2). 数値に1を加える(_行,_変更された行) :- sub_atom(_行,_,_,_,S1_1,S2_1,S3_1,L1_1,L2_1,L3_1), 数値に1を加える(S1_1,S2_1,S3_1,L1_1,L2_1,L3_1,_変更部分,S3_1), 数値に1を加える(S3_1,_残りの変更部分), concat_atom([_変更部分,_残りの変更部分],_変更された行),!. 数値に1を加える(_行,_行). 数値に1を加える(S1_1,S2_1,S3_1,L1_1,L2_1,L3_1,_変更された部分,S3_1) :- 数値部分を取り出す(L1_1,L2_1,L3_1), 数値に1を加えた文字列(L2_1,_数値文字列), concat_([S1_1,_数値文字列],_変更された部分). 数値部分を取り出す(L1_1,L2_1,L3_1) :- 数値に還元できるならび(L2_1), \+((last(L1_1,A),数値(A))), \+((L3_1 = [B|_],数値(B))). 数値に1を加えた文字列(L2_1,_数値文字列) :- number_chars(_数値,L2_1), _数値_2 is _数値 + 1.0, number_chars(_数値_2,L2_2), atom_chars(_数値文字列,L2_2). 数値に還元できるならび([A|R]) :- 数字(A), last([A|R],B), \+(B='.'), 全てが数字かピリオド(R). 全てが数字かピリオド([]). 全てが数字かピリオド([A|R]) :- member(A,['.','0','1','2','3','4','5','6','7','8','9']), 全てが数字かピリオド(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/458 # # ●正規表現の使用環境 # wxWidets (wxRegEx) # # ●検索か置換か? # 検索 # # ●説明 # 一行の中に丸括弧で閉じられた文字列を検索したい。 # 丸括弧が出てくる位置や数は不定です # # ●対象データ # (2012年2月)北海道で撮影。(raw)で保存。猫と一緒(雄) # # ●希望する結果 # (2012年2月) (raw) (雄) # # (\\(.*?\\))で検索すると、"(2012年2月)"だけ検索されます。 # (\\(.*?\\))(?:.*)(\\(.*?\\))(?:.*)(\\(.*?\\))で検索すると(2012年2月)(raw)(雄)が検索されます。 # ただ括弧の位置が変わった場合には、この正規表現では検索にかからなくなります。 # # サクラテキストエディタ等の正規表現で検索すると、(\\(.*?\\)) 文章内にいくつ括弧文字列があっても # すべて検索されています。 # # 正規表現でどのように書けばいいのか、それとも、プログラム上で検索しているのかわかりません。 # どのように実現しているかまったくわかりません。 # # 考え方などをおしえてくださいませ。 # # '一行の中に丸括弧で閉じられた文字列を検索したい。丸括弧が出てくる位置や数は不定です'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 丸括弧に挟まれた文字列(L2,_適合文字列), concat_atom([S1,'('],_前文字列), concat_atom([')',S3],_後文字列). 丸括弧に挟まれた文字列(L2,_適合文字列) :- append(['('],L2_1,[')'],L2), \+(member('(',L2_1)), \+(member(')',L2_1)), atom_chars(_適合文字列,L2_1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/168 # # [1] プログラミング # [2][A1,A2,A3,B1,B2,B3]の6つの要素から、2つを合わせたペアを全通り出力せよ # ただし、同じ記号と数字を含む要素はペアにはできない # (例:A1A2やA1B1は×、A1B2やA1B3は○) # '[A1,A2,A3,B1,B2,B3]の6つの要素から、2つを合わせたペアを全通り出力せよ。ただし、同じ記号と数字を含む要素はペアにはできない'(_要素1,_要素2) :- member(_要素1,['A1','A2',A3','B1','B2','B3']), member(_要素2,['A1','A2',A3','B1','B2','B3']), 同一文字要素を含まない(_要素1,_要素2). 同一文字要素を含まない(_要素1,_要素2) :- atom_chars(_要素1,L1), atom_chars(_要素2,L2), \+((member(_共通要素,L1),member(_共通要素,L2))),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/368 # # お願いします # # ●正規表現の使用環境 # PHP5 # # ●検索か置換か? # 置換 # # ●説明 # 0123456789アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンABCDEFGHIJKLMNOPQRSTUVWXYZ゙ ゚\「」,.()-/ # # preg_replace関数を使い上記文字以外を全て削除したい # # ●対象データ # 0ガ9ギAグアaイbウcエdオ # # ●希望する結果 # 09Aアイウエオ # '0123456789アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンABCDEFGHIJKLMNOPQRSTUVWXYZ゙ ゚\\「」,.()-/ preg_replace関数を使い上記文字以外を全て削除したい'(_文字列,_置換された文字列) :- atom_chars('0123456789アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンABCDEFGHIJKLMNOPQRSTUVWXYZ゙ ゚\\「」,.()-/',_削除しない文字ならび), findall(_文字,( sub_atom(_文字列,_,1,_,_文字), member(_文字,_削除しない文字ならび)), _選択された文字ならび), concat_atom(_選択された文字ならび,_置換された文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/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/1323566370/239 # # 質問させてください。 # 半角文字列にスペースが含まれています。 # # 例 # 727 751 798 625 791 460 645 850 656 697....... # このスペースをカウントして,3つめのスペースだけを改行に置換する場合(下) # 727 751 798 # 625 791 460 # 645 850 656 # 697....... # # どう表現すればいいのでしょうか? # # 数値が全て3桁ならば分かるのですが,2桁や4桁が含まれており文字数ではマッチできません。 # よろしくお願いします # 'スペースをカウントして,3つめのスペースだけを改行に置換する'(_文字列,_置換された文字列) :- atom_chars(_文字列,Chars1), 'スペースをカウントして,3つめのスペースだけを改行に置換する'(0,Char,Char1), concat_atom(_置換された文字列,Char2). 'スペースをカウントして,3つめのスペースだけを改行に置換する'(_,[],[]) :- !. 'スペースをカウントして,3つめのスペースだけを改行に置換する'(2,[' '|R1],['\n'|R2]) :- 'スペースをカウントして,3つめのスペースだけを改行に置換する'(0,R1,R2). 'スペースをカウントして,3つめのスペースだけを改行に置換する'(N,[' '|R1],[' '|R2]) :- N2 is N + 1, 'スペースをカウントして,3つめのスペースだけを改行に置換する'(N2,R1,R2). 'スペースをカウントして,3つめのスペースだけを改行に置換する'(N,[A|R1],[A|R2]) :- \+(A=' '), 'スペースをカウントして,3つめのスペースだけを改行に置換する'(N,R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/129 # # [1] 授業単元:計算機アルゴリズム(ファイルへの追加書込み) # [2] 問題文(含コード&リンク):一言日記をファイルに書き込むプログラムを作成した # い.以下の要件を満たすプログラムを作成せよ. # 実行例 # 一言日記ファイル名:test.txt # ファイルがありません。新規作成しますか(Yes…1 / # No…0):0 # プログラムを終了します。 # (以下,diary.txt に既に日記が書かれているとする) # % cat diary.txt # 2011 年12 月6 日12 時23 分来週中間テスト # 2011 年12 月13 日10 時35 分これからテスト! # 2011 年12 月16 日9 時40 分風邪ひいた # # 一言日記ファイル名:diary.txt # ファイルが見つかりました。追記しますか(Yes…1 / # No…0):1 # 日記の文字列を入力:プログラミング演習中 # % cat diary.txt # 2011 年12 月6 日12 時23 分来週中間テスト # 2011 年12 月13 日10 時35 分これからテスト! # 2011 年12 月16 日9 時40 分風邪ひいた # 2011 年12 月22 日14 時28 分プログラミング演習中 # # # '一言日記をファイルに書き込む'(_一言日記ファイル) :- exists_file(_一言日記ファイル), write('ファイルが見つかりました。追記しますか(Yes…1\nNo…0):'), get_line(Line), '一言日記をファイルに追記'(Line,_一言日記ファイル),!. '一言日記をファイルに書き込む'(_一言日記ファイル) :- write('ファイルがありません。新規作成しますか(Yes…1\nNo…0):'), get_line(Line), 新規作成書き込み(Line,_一言日記ファイル),!. 新規作成書き込み('0',_) :- !. 新規作成書き込み('1',_一言日記ファイル) :- write('日記の文字列を入力:'), open(_一言日記ファイル,write,Outstream), 'eofになるまで書き込み'(Outstream), close(Outstream). '一言日記をファイルに追記'('0',_) :- !. '一言日記をファイルに追記'('1',_一言日記ファイル) :- write('日記の文字列を入力:'), open(_一言日記ファイル,append,Outstream), 'eofになるまで書き込み'(Outstream), close(Outstream). 'eofになるまで書き込み'(Outstream) :- at_end_of_stream(current_input),!. 'eofになるまで書き込み'(Outstream) :- get_line(Line), writef(Outstream,'%t\n',[Line]), 'eofになるまで書き込み'(Outstream). get_line(Line) :- get_char(Char), get_line(Char,Chars), atom_chars(Line,Chars). get_line('\n',[]) :- !. get_line(Char,[Char|R]) :- get_char(Char2), get_line(Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/26 # # 問題:4桁の数字が与えられたとき、その4個の数字で組み合わせって、作れる? # 1001 ならば 0011,0101,0110,1001,1010,1100 が出来るなど。 # 言語・コンパイラ:C gcc # '4桁の数字が与えられたとき、その4個の数字の組み合わせ'(_4桁の数字,_4個の数字の組み合わせ) :- atom_chars(_4桁の数字,Chars), setof(X,順列(Chars,4,X),_4個の数字の組合せ). % 以下のサイトは # 出典::正規表現 Part9 #101 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 置換 # # ●説明 # 文字列の先頭の部分のカッコを消したい # # ●対象データ # (hoge)あいうえお # # ●希望する結果 # hogeあいうえお # # よろしくお願いします # # 文字列の先頭の部分のカッコを消したい(_文字列,_置換した文字列) :- atom_chars(_文字列,_文字ならび), 文字ならびの先頭の部分のカッコを消す(_文字ならび,_置換した文字ならび), atom_chars(_置換した文字列,_置換した文字ならび). 文字ならびの先頭の部分のカッコを消す(_文字ならび,_置換した文字ならび) :- 先頭部分のカッコ内の文字ならびと残り文字ならびを得る(_文字ならび,_カッコ内の文字ならび,_残り文字ならび), カッコ内の文字ならびと残り文字ならびを結合する(_カッコ内の文字ならび,_残り文字ならび,_置換した文字ならび). 先頭部分のカッコ内の文字ならびと残り文字ならびを得る(_文字ならび,_カッコ内の文字ならび,_残り文字ならび) :- append(['('|_カッコ内の文字ならび],[')'|_残り文字ならび],_文字ならび), カッコ内の文字ならびはカッコを含まない(_カッコ内の文字ならび),!. カッコ内の文字ならびはカッコを含まない(_カッコ内の文字ならび) :- \+(member('(',_カッコ内の文字ならび)), \+(member(')',_カッコ内の文字ならび)). カッコ内の文字ならびと残り文字ならびを結合する(_カッコ内の文字ならび,_残り文字ならび,_置換した文字ならび) :- append(_カッコ内の文字ならび,_残り文字ならび,_置換した文字ならび). % 以下のサイトは # http://www.ioi-jp.org/joi/2011/2012-yo/2012-yo-t1/2012-yo-t1.html # 問題 # 1    ランチ (Lunch) # 問題 # # JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが # 好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと # 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を # 引いた金額が代金となる. # # ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの # 代金の最小値を求めるプログラムを作成せよ. # # 入力 # # 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. # 1 行目の整数は 1 つ目のパスタの値段である. # 2 行目の整数は 2 つ目のパスタの値段である. # 3 行目の整数は 3 つ目のパスタの値段である. # 4 行目の整数は 1 つ目のジュースの値段である. # 5 行目の整数は 2 つ目のジュースの値段である. # ただし,与えられる入力データにおいては全てのパスタとジュースの値段は # 100 円以上 2000 円以下であることが保証されている. # # 出力 # # その日のセットメニューの代金の最小値を 1 行で出力せよ. # # 入出力例 # # 入力例 1 入力例 2 # 800 1999 # 700 1999 # 900 100 # 198 189 # 330 100 # # 出力例 1 出力例 2 # 848 150 # # # 入出力例 1 では,2 つ目のパスタと 1 つ目のジュースを組み合わせた場合の 700 + 198 - 50 = 848 がその日のセットメニューの代金の最小値である. # # 入出力例 2 では,3 つ目のパスタと 2 つ目のジュースを組み合わせた場合の 100 + 100 - 50 = 150 がその日のセットメニューの代金の最小値である. # # ※各入出力例のデータは,右クリック等によりファイルに保存して利用可能です. # program :- 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める'. 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める' :- '3書類のパスタと2種類のジュースの価格を得る'(_3種類のパスタの価格,_2種類のジュースの価格), 最小値を探しだす(_セットメニューの代金,( セットメニューを代金を得る(_3種類のパスタの価格,_2種類のジュースの価格,_セットメニューの代金)), _その日のセットメニューの代金の最小値), writef('%t\n',[_その日のセットメニューの代金の最小値]). '3書類のパスタと2種類のジュースの価格を得る'(_3種類のパスタの価格,_2種類のジュースの価格) :- '3種類のパスタの価格を得る'(_3種類のパスタの価格), '2種類のジュースの価格を得る'(_2種類のジュースの価格). '3種類のパスタの価格を得る'(_3種類のパスタの価格) :- length(_3種類のパスタの価格,3), findall(_パスタの価格,( append(_,[_パスタの価格|_],_3種類のパスタの価格), 整数入力(_パスタの価格)), _3種類のパスタの価格). '2種類のジュースの価格を得る'(_2種類のジュースの価格) :- length(_2種類のジュースの価格,2), findall(_ジュースの価格,( % _パスタの価格となっていた 12/23訂正 append(_,[_ジュースの価格|_],_2種類のジュースの価格), 整数入力(_ジュースの価格)), _2種類のジュースの価格). 最小値を探しだす(_対象となる値,_副目標,_最小値) :- findall(_対象となる値,_副目標,L), 最小値(L,_最小値). 最小値(L,_最小値) :- append(L1,[_最小値|L2],L), \+((append(_,[A|_],L1),A @< _最小値)), \+((append(_,[B|_],L2),B @< _最小値)),!. セットメニューを代金を得る(_3種類のパスタの価格,_2種類のジュースの価格,_セットメニューの代金) :- append(_,[_パスタの価格|_],_3種類のパスタの価格), append(_,[_ジュースの価格|_],_2種類のジュースの価格), _セットメニューの代金 is _パスタの価格 + _ジュースの価格 - 50. 整数入力(N) :- get_line(Line), 整数入力診断(Line,N),!. 整数入力(N) :- 整数入力(N). 整数入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数入力診断(Line,N) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. get_line(Line) :- get_char(Char), get_line_2(Char,Chars), atom_chars(Line,Chars). get_line_2(end_of_file,[]) :- !. get_line_2('\n',[]) :- !. get_line_2(Char,[Char|R]) :- get_char(Char2), get_line_2(Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/669 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): 文字列HeLLo中の文字について、大文字は小文字に #                小文字は大文字に変換せよ。 # '文字列HeLLo中の文字について、大文字は小文字に小文字は大文字に変換する' :- findall(_文字,( sub_atom('HeLLo',_,1,_,_文字1), 大文字小文字相互変換(_文字1,_文字2)), _変換された文字ならび), atom_chars(_変換された文字列,_変換された文字ならび), writef('%t',[_変換された文字列]). 大文字小文字相互変換('A',a) :- !. 大文字小文字相互変換(a,'A') :- !. 大文字小文字相互変換('B',b) :- !. 大文字小文字相互変換(b,'B') :- !. 大文字小文字相互変換('C',c) :- !. 大文字小文字相互変換(c,'C') :- !. 大文字小文字相互変換('D',d) :- !. 大文字小文字相互変換(d,'D') :- !. 大文字小文字相互変換('E',e) :- !. 大文字小文字相互変換(e,'E') :- !. 大文字小文字相互変換('F',f) :- !. 大文字小文字相互変換(f,'F') :- !. 大文字小文字相互変換('G',g) :- !. 大文字小文字相互変換(g,'G') :- !. 大文字小文字相互変換('H',h) :- !. 大文字小文字相互変換(h,'H') :- !. 大文字小文字相互変換('I',i) :- !. 大文字小文字相互変換(i,'I') :- !. 大文字小文字相互変換('J',j) :- !. 大文字小文字相互変換(j,'J') :- !. 大文字小文字相互変換('K',k) :- !. 大文字小文字相互変換(k,'K') :- !. 大文字小文字相互変換('L',l) :- !. 大文字小文字相互変換(l,'L') :- !. 大文字小文字相互変換('M',m) :- !. 大文字小文字相互変換(m,'M') :- !. 大文字小文字相互変換('N',n) :- !. 大文字小文字相互変換(n,'N') :- !. 大文字小文字相互変換('O',o) :- !. 大文字小文字相互変換(o,'O') :- !. 大文字小文字相互変換('P',p) :- !. 大文字小文字相互変換(p,'P') :- !. 大文字小文字相互変換('Q',q) :- !. 大文字小文字相互変換(q,'Q') :- !. 大文字小文字相互変換('R',r) :- !. 大文字小文字相互変換(r,'R') :- !. 大文字小文字相互変換('S',s) :- !. 大文字小文字相互変換(s,'S') :- !. 大文字小文字相互変換('T',t) :- !. 大文字小文字相互変換(t,'T') :- !. 大文字小文字相互変換('U',u) :- !. 大文字小文字相互変換(u,'U') :- !. 大文字小文字相互変換('V',v) :- !. 大文字小文字相互変換(v,'V') :- !. 大文字小文字相互変換('W',w) :- !. 大文字小文字相互変換(w,'W') :- !. 大文字小文字相互変換('X',x) :- !. 大文字小文字相互変換(x,'X') :- !. 大文字小文字相互変換('Y',y) :- !. 大文字小文字相互変換(y,'Y') :- !. 大文字小文字相互変換('Z',z) :- !. 大文字小文字相互変換(z,'Z') :- !. 大文字小文字相互変換(_対象外の文字,_対象外の文字). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/962 # # 対象 # ABCこの間に文字列があったりなかったりDEF # # 結果 # DEF # # "ABC"よりも後続にある(最初の)"DEF"だけを対象としたいです # 戻り読み条件が、長さ一定でなくてもOKならばできるのですが・・・ # # '"ABC"よりも後続にある(最初の)"DEF"だけを対象としたいです。戻り読み条件が、長さ一定でなくてもOKならばできるのですが・・・ '(_文字列,_前文字列,'DEF',_後文字列) :- atom_chars(_文字列,Chars), append(L1,['A','B','C'|R1],Chars), append(L2,['D','E','F'|R2],R1), append(L1,['A','B','C'|L2],Chars1), atom_chars(_前文字列,Chars1), atom_chars(_後文字列,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/361 # # [1] 授業単元: プログラミングC (ポインタ、文字列) # [2] 文字列を後ろから逆に表示する(例えば"ABC"を受け # 取ったら"CBA"と表示する)関数 # void put_rstring(const char *st) # を,添字演算子[] を使わずに作成せよ # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を後ろから逆に表示する(_文字列) :- atom_chars(_文字列,Chars), ならびを後ろから逆に表示する(Chars). ならびを後ろから逆に表示する([]). ならびを後ろから逆に表示する([A|R]) :- ならびを後ろから逆に表示する(R), put_char(A). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を後ろから逆に表示する(_文字列) :- sub_atom(_文字列,0,_文字列の長さ_1,1,_), for(0,N,_文字列の長さ_1), sub_atom(_文字列,_,1,N,_文字), put_char(_文字), N = _文字列の長さ_1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を後ろから逆に表示する(_文字列) :- atom_chars(_文字列,Chars), reverse(Chars,Chars2), atom_chars(_反転した文字列,Chars2), writef('%t',[_反転した文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を後ろから逆に表示する(_文字列) :- sub_atom(_文字列,0,_文字列の長さ_1,1,_), findall(_文字,( for(0,N,_文字列の長さ_1), sub_atom(_文字列,_,1,N,_文字)), Chars), atom_chars(_反転した文字列,Chars), writef('%t',[_反転した文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を後ろから逆に表示する(_文字列) :- atom_chars(_文字列,Chars), rappend(L0,[_文字|_],Chars), writef('%t',[_文字]), L0 = []. rappend(L0,[X|R],L) :- rappend_1(L,L0,X,[],R). rappend_1(L,L0,X,R1,R) :- append(L1,[A],L), rappend_2(L1,L0,A,X,R1,R). rappend_2(L1,L1,A,A,R,R). rappend_2(L1,L0,B,X,R1,R) :- rappend_1(L1,L0,X,[B|R1],R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/17 # # 前スレの未解決問題。(ほかにあったら転記してね) # 979 :デフォルトの名無しさん:2011/11/29(火) 21:17:42.06 # [1] 授業単元:コマンドライン引数 # [2] 問題文(含コード&リンク): # コマンドライン引数を用いて,以下の計算ができる簡易電卓プログラムを作成せよ. # 1. 2 〜5項式までの四則演算(計算順もちゃんと考慮すること) # (出力例)C :¥Programming>dentaku 2 + 5 / 5 + 4 * 2 + 1 # 答えは 12 # # C :¥Programming>dentaku 2 * 3 + 1 # 答えは 7 # # 2.()を用いた演算(かっこの中の計算を最優先する) # (出力例)C :¥Programming>dentaku ( 2 + 3 ) * 7 * ( 3 - 1 ) # 答えは 70 # # 3. (sin, cos, tan)の演算 # (出力例)C :¥Programming>dentaku sin(90) * 2 + 1 - 2 # 答えは 1 # # 4.logの演算 # (出力例)C :¥Programming>dentaku log(3) * 2 + 1 # 答えは 1.9542425094 # # 5. 半角スペースを入れ忘れても演算可能 # (出力例)C :¥Programming>dentaku 1-2*(3+1)-2 # 答えは 9 # 電卓 :- 式の入力(Line), 項に分解(Line,_項ならび), '2. () を用いた演算'(_項ならび,X), writef('%12r\n',[X]). 式の入力(Line) :- writef('%12r\n',[0]), get_line(Line),!. 項に分解(Line,_項ならび) :- atom_chars(Line,Chars), 一旦空白要素を削除する(Chars,Chars1), '先頭の符号に注意して、演算子の前後に空白を入れる'(Chars1,Chars2), atom_chars(Line2,Chars2), split(Line2,[' '],_項ならび). 一旦空白要素を削除する([],[]). 一旦空白要素を削除する([' '|R1],R2) :- 一旦空白要素を削除する(R1,R2),!. 一旦空白要素を削除する([A|R1],[A|R2]) :- 一旦空白要素を削除する(R1,R2),!. '先頭の符号に注意して、演算子の前後に空白を入れる'(['-'|R1],['-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '先頭の符号に注意して、演算子の前後に空白を入れる'(L1,L2) :- 演算子の前後に空白を入れる(L1,L2),!. 演算子の前後に空白を入れる([],[]),!. 演算子の前後に空白を入れる(['(','-'|R1],[' ','(',' '|R2]) :- 演算子の前後に空白を入れる(['-'|R1],R2),!. 演算子の前後に空白を入れる([')','-'|R1],[' ',')',' ','-',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['+','-'|R1],[' ','+',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-','-'|R1],[' ','-',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*','-'|R1],[' ','*',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/','-'|R1],[' ','/',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['('|R1],[' ','(',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる([')'|R1],[' ',')',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['+'|R1],[' ','+',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-'|R1],[' ','-',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*'|R1],[' ','*',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/'|R1],[' ','/',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる([A|R1],[A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '2. () を用いた演算'(_項ならび,X) :- '先に()グループを演算する'(_項ならび,_項ならびの一), '+,-でグループ化する'(_項ならびの一,_項ならびの二), '要素の四則演算'(_項ならびの二,X). '先に()グループを演算する'([],[]). '先に()グループを演算する'(['('|R1],[X|R2]) :- '()グループを演算して置換'(R1,X), '先に()グループを演算する'(R1,R2),!. '先に()グループを演算する'([A|R1],[A|R2]) :- '先に()グループを演算する'(R1,R2),!. '()グループを演算して置換'([],LX,X,[]) :- '+,-でグループ化する'(_項ならびの一,_項ならびの二), '要素の四則演算'(_項ならびの二,X),!. '()グループを演算して置換'([')'|R],LX,X,R) :- '+,-でグループ化する'(LX,_項ならびの二), '要素の四則演算'(_項ならびの二,X),!. '()グループを演算して置換'(['('|R],LX,X,R) :- '()グループを演算して置換'(['('|R],[],Y,R1), append(LX,[Y],LY), '()グループを演算して置換'(R1,LY,X,R),!. '()グループを演算して置換'([A|R1],LX,X,R) :- append(LX,[A],LY), '()グループを演算して置換'(R1,LY,X,R). '+,-でグループ化する'(L,[L0,A|R2]) :- append(L0,[A|R],L), '+か-'(A), '+,-でグループ化する'(R,R2),!. '+,-でグループ化する'(L,[L]). '+か-'(+). '+か-'(-). '要素の四則演算'([L],X) :- ならび評価(L,X),!. '要素の四則演算'([L1,'+'|R1],X) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A + Y. '要素の四則演算'([L1,'-',L2|R1],[C|R2]) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A - Y. ならび評価([A],A) :- !. ならび評価([A,'*'|R1],X) :- ならび評価(R1,Y), X is A * Y. ならび評価([A,'/'|R1],X) :- ならび評価(R1,Y), X is A // Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/17 # # 前スレの未解決問題。(ほかにあったら転記してね) # 979 :デフォルトの名無しさん:2011/11/29(火) 21:17:42.06 # [1] 授業単元:コマンドライン引数 # [2] 問題文(含コード&リンク): # コマンドライン引数を用いて,以下の計算ができる簡易電卓プログラムを作成せよ. # 1. 2 〜5項式までの四則演算(計算順もちゃんと考慮すること) # (出力例)C :¥Programming>dentaku 2 + 5 / 5 + 4 * 2 + 1 # 答えは 12 # # C :¥Programming>dentaku 2 * 3 + 1 # 答えは 7 # # 2.()を用いた演算(かっこの中の計算を最優先する) # (出力例)C :¥Programming>dentaku ( 2 + 3 ) * 7 * ( 3 - 1 ) # 答えは 70 # # 3. (sin, cos, tan)の演算 # (出力例)C :¥Programming>dentaku sin(90) * 2 + 1 - 2 # 答えは 1 # # 4.logの演算 # (出力例)C :¥Programming>dentaku log(3) * 2 + 1 # 答えは 1.9542425094 # # 5. 半角スペースを入れ忘れても演算可能 # (出力例)C :¥Programming>dentaku 1-2*(3+1)-2 # 答えは 9 # 電卓 :- 式の入力(Line), 項に分解(Line,_項ならび), '1. 2 〜5項式までの四則演算'(_項ならび,X), writef('%12r\n',[X]). 式の入力(Line) :- writef('%12r\n',[0]), get_line(Line),!. 項に分解(Line,_項ならび) :- atom_chars(Line,Chars), 一旦空白要素を除去する(Chars,Chars2), '先頭の符号に注意して、演算子の前後に空白を入れる'(Chars2,Chars3), atom_chars(Line2,Chars3), split(Line2,[' '],_項ならび). 一旦空白要素を除去する([],[]) :- !. 一旦空白要素を除去する([' '|R1],R2) :- 一旦空白要素を除去する(R1,R2),!. 一旦空白要素を除去する([A|R1],[A|R2]) :- 一旦空白要素を除去する(R1,R2). '先頭の符号に注意して、演算子の前後に空白を入れる'([-,A|R1],[-,A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '先頭の符号に注意して、演算子の前後に空白を入れる'(L1,L2) :- 演算子の前後に空白を入れる(L1,L2),!. 演算子の前後に空白を入れる([],[]),!. 演算子の前後に空白を入れる(['+','-'|R1],[' ','+',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-','-'|R1],[' ','-',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*','-'|R1],[' ','*',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/','-'|R1],[' ','/',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['+'|R1],[' ','+',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-'|R1],[' ','-',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*'|R1],[' ','*',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/'|R1],[' ','/',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる([A|R1],[A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '1. 2 〜5項式までの四則演算'(_項ならび,X) :- '+,-でグループ化する'(_項ならび,_項ならびの一), '要素の四則演算'(_項ならびの一,X). '+,-でグループ化する'(L,[L0,A|R2]) :- append(L0,[A|R],L), '+か-'(A), '+,-でグループ化する'(R,R2),!. '+,-でグループ化する'(L,[L]). '+か-'(+). '+か-'(-). '要素の四則演算'([L],X) :- ならび評価(L,X),!. '要素の四則演算'([L1,'+'|R1],X) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A + Y. '要素の四則演算'([L1,'-',L2|R1],[C|R2]) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A - Y. ならび評価([A],A) :- !. ならび評価([A,'*'|R1],X) :- ならび評価(R1,Y), X is A * Y. ならび評価([A,'/'|R1],X) :- ならび評価(R1,Y), X is A // Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/828 # # PHP Version 5.2.9 # preg_matchです。 # # 電話番号の認証として、 # /^\d[\d\-]+\d$/D # を使用していますが、 # 「1--3」のようなハイフン記号が続く場合の入力を許可してしまっています。 # # 要件として、厳密な電話番号ルールは必要ではありません。 # データとして「1-2-3」などを許可しています。 # # よろしくお願いいたします。 # # '電話番号の認証'(_文字列) :- atom_chars(_文字列,Chars), '電話番号の認証'(Chars). '電話番号の認証'(Chars) :- append(L1,[-|R2],[-|R3],Chars), 全て数字(L1),\+(L1=[]), 全て数字(R2),\+(R2=[]), 全て数字(R3),\+(R3=[]),!. '電話番号の認証'(Chars) :- append(L1,[-|R2],Chars), 全て数字(L1),\+(L1=[]), 全て数字(R2),\+(R2=[]),!. '電話番号の認証'(Chars) :- append(L1,['('|R2],[')'|R3],Chars), 全て数字(L1),\+(L1=[]), 全て数字(R2),\+(R2=[]), 全て数字(R3),\+(R3=[]),!. '電話番号の認証'(Chars) :- append([('|R1],[')'|R2],['-'|R3],Chars), 全て数字(R1),\+(R1=[]), 全て数字(R2),\+(R2=[]), 全て数字(R3),\+(R3=[]),!. '電話番号の認証'(Chars) :- append([('|R1],[')'|R2], 全て数字(R1),\+(R1=[]), 全て数字(R2),|+(R2=[]), 全て数字(R3),\+(R3=[]),!. '電話番号の認証'(Chars) :- append(L1,[-|R2],Chars), 全て数字(L1),\+(L1=[]), 全て数字(R2),\+(R2=[]),!. '電話番号の認証'(Chars) :- 全て数字(Chars). 全て数字([]) :- !. 全て数字([A|R]) :- member(A,['0','1','2','3','4','5','6','7','8','9']), 全て数字(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/17 # # 前スレの未解決問題。(ほかにあったら転記してね) # 979 :デフォルトの名無しさん:2011/11/29(火) 21:17:42.06 # [1] 授業単元:コマンドライン引数 # [2] 問題文(含コード&リンク): # コマンドライン引数を用いて,以下の計算ができる簡易電卓プログラムを作成せよ. # 1. 2 〜5項式までの四則演算(計算順もちゃんと考慮すること) # (出力例)C :¥Programming>dentaku 2 + 5 / 5 + 4 * 2 + 1 # 答えは 12 # # C :¥Programming>dentaku 2 * 3 + 1 # 答えは 7 # # 2.()を用いた演算(かっこの中の計算を最優先する) # (出力例)C :¥Programming>dentaku ( 2 + 3 ) * 7 * ( 3 - 1 ) # 答えは 70 # # 3. (sin, cos, tan)の演算 # (出力例)C :¥Programming>dentaku sin(90) * 2 + 1 - 2 # 答えは 1 # # 4.logの演算 # (出力例)C :¥Programming>dentaku log(3) * 2 + 1 # 答えは 1.9542425094 # # 5. 半角スペースを入れ忘れても演算可能 # (出力例)C :¥Programming>dentaku 1-2*(3+1)-2 # 答えは 9 # 電卓 :- 式の入力(Line), 項に分解(Line,_項ならび), '1. 2 〜5項式までの四則演算'(_項ならび,X), writef('%12r\n',[X]). 式の入力(Line) :- writef('%12r\n',[0]), get_line(Line),!. 項に分解(Line,_項ならび) :- atom_chars(Line,Chars), 一旦空白要素を除去する(Chars,Chars2), '先頭の符号に注意して、演算子の前後に空白を入れる'(Chars2,Chars3), atom_chars(Line2,Chars3), split(Line2,[' '],_項ならび). 一旦空白要素を除去する([],[]) :- !. 一旦空白要素を除去する([' '|R1],R2) :- 一旦空白要素を除去する(R1,R2),!. 一旦空白要素を除去する([A|R1],[A|R2]) :- 一旦空白要素を除去する(R1,R2). '先頭の符号に注意して、演算子の前後に空白を入れる'([-,A|R1],[-,A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '先頭の符号に注意して、演算子の前後に空白を入れる'(L1,L2) :- 演算子の前後に空白を入れる(L1,L2),!. 演算子の前後に空白を入れる([],[]),!. 演算子の前後に空白を入れる(['+','-'|R1],[' ','+',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-','-'|R1],[' ','-',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*','-'|R1],[' ','*',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/','-'|R1],[' ','/',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['+'|R1],[' ','+',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-'|R1],[' ','-',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*'|R1],[' ','*',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/'|R1],[' ','/',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる([A|R1],[A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '1. 2 〜5項式までの四則演算'(_項ならび,X) :- '+,-でグループ化する'(_項ならび,_項ならびの一), '要素の四則演算'(_項ならびの一,X). '+,-でグループ化する'(L,[L0,A|R2]) :- append(L0,[A|R],L), '+か-'(A), '+,-でグループ化する'(R,R2),!. '+,-でグループ化する'(L,[L]). '+か-'(+). '+か-'(-). '要素の四則演算'([L],X) :- ならび評価(L,X),!. '要素の四則演算'([L1,'+'|R1],X) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A + Y. '要素の四則演算'([L1,'-',L2|R1],[C|R2]) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A - Y. ならび評価([A],A) :- !. ならび評価([A,'*'|R1],X) :- ならび評価(R1,Y), X is A * Y. ならび評価([A,'/'|R1],X) :- ならび評価(R1,Y), X is A // Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/860 # # [1] 授業単元: C言語とアルゴリズム # [2] 問題文(含コード&リンク): # 文字列st が回文(前から読んでも後ろから読んでも # 同じ)であれば1 を,そうでなければ0 を返す関数 # int isPalindrome(const char st[]) # を作成せよ.以下の実行例のように,関数の動作を確認 # できるmain 関数も作成すること. # <実行例> # ./5-4 # 文字列を入力してください:AKASAKA # その文字列は回文です。 # # % ./5-4 # 文字列を入力してください:tomato # その文字列は回文ではありません。 # 回文述語の動作確認 :- write('文字列を入力して下さい : '), get_line(_文字列), 回文(_文字列,_診断), 回文診断(_診断). 回文(_文字列,1) :- atom_chars(Chars), reverse(Chars,Chars),!. 回文(_文字列,0). 回文診断(1) :- write('文字列は回文です。\n'). 回文診断(0) :- write('文字列は回文ではありません。\n'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- 回文(_文字列,1). 回文('',1). 回文(_文字列,_診断) :- 文字列の先頭と末尾から一文字取り出す(_文字列,A,_中間部分文字列,A), 回文(_中間部分文字列,_診断). 文字列の先頭と末尾から一文字取り出す(_文字列,_先頭,_中間部分文字列,_末尾) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_,1,0,_末尾文字). '文字列の先頭と末尾からN文字取り出した中間部分'(_文字列,1,_中間部分文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列の先頭と末尾から一文字取り出す(_文字列,_先頭,_末尾) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_,1,0,_末尾文字). '文字列の先頭と末尾からN文字取り出した中間部分'(_文字列,_N文字,_中間部分文字列) :- sub_atom(_文字列,_N文字,_,_N文字,_中間部分文字列). 文字列の先頭から一文字取り出す(_文字列,_先頭文字,_残り文字列) :- sub_atom(_文字列,0,1,R,_文字), sub_atom(_文字列,1,R,0,_残り文字列). 文字列の先頭からN文字取り出す(_文字列,_N文字,_先頭からの文字列,_残り文字列) :- sub_atom(_文字列,0,_N文字,R,_先頭からの文字列), sub_atom(_文字列,_N文字,R,0,_残り文字列). 文字列の末尾から一文字取り出す(_文字列,_末尾文字,_残り前方文字列) :- sub_atom(_文字列,R,1,0,_末尾文字), sub_atom(_文字列,0,R,1,_残り前方文字列). 文字列の末尾部分N文字取り出す(_文字列,_N文字,_末尾部分文字列,_残り前方文字列) :- sub_atom(_文字列,R,_N文字,0,_末尾部分文字列), sub_atom(_文字列,0,R,_N文字,_残り前方文字列). 文字列の末尾から逆順にN文字取り出す(_文字列,_N文字,_末尾からの逆順文字列,_残り前方文字列) :- 文字列の末尾部分を逆順にN文字取り出す(_文字列,_N文字,_末尾からの逆順文字列), sub_atom(_文字列,0,R,_N文字,_残り前方文字列). 文字列の末尾部分を逆順にN文字取り出す(_文字列,_N文字,_末尾からの逆順文字列) :- 文字列の末尾部分を逆順にN文字取り出す(_文字列,0,_N文字,_末尾からの逆順文字列). 文字列の末尾部分を逆順にN文字取り出す(_文字列,N,N,'') :- !. 文字列の末尾部分を逆順にN文字取り出す(_文字列,M,_N文字,_末尾からの逆順文字列) :- sub_atom(_文字列,_,1,M,_文字), M_2 is M + 1, 文字列の末尾部分を逆順にN文字取り出す(_文字列,M_2,_N文字,_末尾からの逆順文字列_2), atom_concat(_末尾からの逆順文字列_2,_文字,_末尾からの逆順文字列). % % sub_atom/5はPrologの中でも極めてスーパーな組込述語である。この述語を % 使っての文字列操作について、いくつか述語定義をしてみた。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/625 # # [1] 授業単元:C言語 # [2] 問題文:123, 1.23, 1.2.3という数字を入力したとき、 #        整数、小数、使用できない数字という分類に分けよ。 # '123, 1.23, 1.2.3という数字を入力したとき、整数、小数、使用できない数字という分類に分けよ。'(_整数分類ならび,_小数分類ならび,_使用できない数字分類ならび) :- split('123, 1.23, 1.2.3',[',',' '],L), '整数、小数、使用できない数字という分類'(L,_整数分類ならび,_小数分類ならび,_使用できない数字分類ならび). '整数、小数、使用できない数字という分類'([],[],[],[]). '整数、小数、使用できない数字という分類'([A|R1],[A|R2],R3,R4) :- 整数である(A), '整数、小数、使用できない数字という分類'(R1,R2,R3,R4),!. '整数、小数、使用できない数字という分類'([A|R1],R2,[A|R3],R4) :- 小数である(A), '整数、小数、使用できない数字という分類'(R1,R2,R3,R4). '整数、小数、使用できない数字という分類'([A|R1],R2,R3,[A|R4]) :- '整数、小数、使用できない数字という分類'(R1,R2,R3,R4),!. 整数である(A) :- 第一文字が符号で残りの文字列をA2とすると(A,A2), 文字列が符号を含まない数字だけから構成される(A2),!. 整数である(A) :- 文字列が符号を含まない数字だけから構成される(A2),!. 小数である(A) :- 第一文字が符号で残りの文字列をA2とすると(A,A2), 数字から始まる小数点表現文字列(A2),!. 小数である(A) :- 数字から始まる小数点表現文字列(A2),!. 数字から始まる小数点表現文字列(A) :- 間にピリオドがひとつだけあり他は数字である文字列(A),!. 数字から始まる小数点表現文字列(A) :- atom_chars(A,Chars), 指数部表現が適切(Chars). 指数部表現が適切(Chars) :- append(L0,[e,+|R],Chars), 'L0部の診断'(L0), 空ではなくかつ全て数字(R). 指数部表現が適切(Chars) :- append(L0,[e,-|R],Chars), 'L0部の診断'(L0), 空ではなくかつ全て数字(R). 'L0部の診断'(L0) :- 空ではなくかつ全て数字(L0),!. 'L0部の診断'(L0) :- append(L01,['.'|R],L0), 空ではなくかつ全て数字(L0), 空ではなくかつ全て数字(R),!. 間にピリオドがひとつだけあり他は数字である文字列(A) :- atom_chars(A,Chars), append(L0,['.'|R],Chars), 空ではなくかつ全て数字(L0), 空ではなくかつ全て数字(R),!. 第一文字が符号で残りの文字列をA2とすると(A,A2) :- sub_atom(A,0,1,R,_符号), member(_符号,[+,-]), sub_atom(A,1,R,0,A2). 文字列が符号を含まない数字だけから構成される(_文字列) :- atom_chars(_文字列,Chars), 空ではなくかつ全て数字(Chars). 空ではなくかつ全て数字([]) :- !,fail. 空ではなくかつ全て数字(L) :- 全て数字(L). 全て数字([]). 全て数字([A|R]) :- member(A,['0','1','2','3','4','5','6','7','8','9']), 全て数字([R]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/470 # # [2]つぎの関数をつくる # void zeroSuppress(char *src, char *dst, char pos, char flg) # posは小数点を挿入する位置で1なら1桁目と2桁目の間に # 小数点があるものとしてゼロサプレスします。 # 文字数<=posの場合処理しない。 # 動きの例 # src = "0123456"、 pos = 1 →dst = "123456" # src = "0012500" pos = 2 →dst ="12500" # src = "0000001" pos = 3 →dst ="0001" # src = "000B12" pos = 2 →dst ="000"(Bとそれ以降は無視) # flg = 1だと\0でうめる # src = "0000001" pos = 3 →dst = "\0\0\00001" # # 頭部ゼロサプレス(_数字文字列,_小数点位置文字,_フラグ,_表示文字列) :- atom_chars(_数字文字列,_ならび), 文字数値変換(_小数点位置文字,_小数点位置), ならび変換後の頭部ゼロサプレス(_ならび,_小数点位置,_フラグ,_表示ならび), atom_chars(_表示文字列,_表示ならび),!. ならび変換後の頭部ゼロサプレス(_ならび,_小数点位置,_フラグ,_表示文字列) :- 'B文字以下の除去'(_ならび,_ならび_1), 整数部と小数点部を分離(_ならび_1,_小数点位置,_整数部ならび,_小数部ならび), '整数部頭部の変換'(_整数部ならび,_フラグ,_変換された整数部ならび), append(_変換された整数部ならび,['.'|_小数部ならび],_表示ならび),!. 文字数値変換(_小数点位置文字,_小数点位置) :- atom_to_term(_小数点位置文字,_小数点位置,_). 'B文字以下の除去'(_ならび_1,_ならび_2) :- append(_ならび_2,['B'|R],_ならび_1),!. 'B文字以下の除去'(_ならび,_ならび). 整数部と小数点部を分離(_ならび,_小数点位置,_整数部ならび,_小数部ならび) :- length(_小数部ならび,_少数点位置), append(_整数部ならび,_小数部ならび,_ならび),!. 整数部と小数点部を分離(_ならび,_小数点位置,_整数部ならび,_小数部ならび) :- 'が7桁に満たない時は頭部にゼロを詰めておく'(_ならび,_頭部にゼロを詰めたならび), 整数部と小数点部を分離(_頭部にゼロを詰めたならび,_小数点位置,_整数部ならび,_小数部ならび). 'が7桁に満たない時は頭部にゼロを詰めておく'(_ならび,_頭部にゼロを詰めたならび) :- length(_頭部にゼロを詰めたならび,7), append(L1,_ならび,_頭部にゼロを詰めたならび), all(L1,'0'). 整数部頭部の変換([],_,[]). 整数部頭部の変換([A|R],_,[A|R]) :- \+(A = '0'),!. 整数部頭部の変換(['0'|R1],'1',['\000\'|R2]) :- 整数部頭部の変換(R1,R2),!. 整数部頭部のコード変換(['0'|R1],_フラグ,[' '|R2]) :- \+(_フラグ = '1'), 整数部頭部の変換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/799 # # ●正規表現の使用環境 # 秀丸 # # ●検索か置換か? # 置換 # # ●説明 # 文字列の中に同じ文字が2つ以上含まれる行を削除したい # # ●対象データ # aaaaaaaa # abcabcab # abcdefgh # agbchddf # cbfdaehg # dbcahebg # dffbdeha # echfbgad # fbadcaeh # habcdefg # # ●希望する結果 # abcdefgh # cbfdaehg # echfbgad # habcdefg # # # # 見づらいかと思いますが # どうかよろしくお願いします。 # # 文字列の中に同じ文字が2つ以上含まれる行を削除したい([],[]). 文字列の中に同じ文字が2つ以上含まれる行を削除したい([_|R1],R2) :- 同じ文字が2つ以上含まれる行は削除する(_行), 文字列の中に同じ文字が2つ以上含まれる行を削除したい(R1,R2). 文字列の中に同じ文字が2つ以上含まれる行を削除したい([A|R1],[A|R2]) :- 文字列の中に同じ文字が2つ以上含まれる行を削除したい(R1,R2). 同じ文字が2つ以上含まれる行は削除する(_行) :- atom_chars(_行,_文字ならび), 整列(_文字ならび,_整列された文字ならび), 整列した要素に重複がある(_整列された文字ならび). 整列した要素に重複がある([A,A|_]) :- !. 整列した要素に重複がある([_|R]) :- 整列した要素に重複がある(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/358 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): アルファベットと空白からなる文字列を処理する以下のような関数を作成せよ。なお各関数は処理が成功したときに1、失敗したときに0を返すものとする。 # # (3) 単語(空白で区切られた文字)の順序を反転する関数int reverse_word(char *s)を作成せよ。例: # char s[] = "abc de f ghi"; # reverse_word(s); # printf("%s¥n", s); // -> "ghi f de abc" # (ヒント: (1)や(2)で作った関数が応用できる?) # # 'アルファベットと空白からなる文字列の単語(空白で区切られた文字)の順序を反転するただし区切り形式は現在の順序通り維持する'(_文字列,_反転した文字列) :- atom_chars(_文字列,Chars), '単語(空白で区切られた文字)の順序を反転する'(Chars,[],[],L4), concat_atom(L6,_反転した文字列). '単語(空白で区切られた文字)の順序を反転する'([],L2,L2,[]) :- !. '単語(空白で区切られた文字)の順序を反転する'(L1,L2,L3,[A|R4]) :- 先頭から区切り文字を切り取る(L1,LX,R1), concat_atom(LX,A), '単語(空白で区切られた文字)の順序を反転する'(R1,L2,L3,R4). '単語(空白で区切られた文字)の順序を反転する'(L1,L2,L3,[V|R4]) :- 先頭から区切り文字までを切り取る(L1,LX,R1), concat_atom(LX,A), '単語(空白で区切られた文字)の順序を反転する'(R1,[A|L2],[V|L3],R4). 先頭から区切り文字を切り取る(L1,LX,R) :- append(L0,R,L1), \+(R = [' '|_]), \+(L0 = []), all(L0,' '),!. 先頭から区切り文字を切り取る(L1,L1,[]) :- all(L1,' '),!. 先頭から区切り文字までを切り取る(L1,LX,R) :- append(L0,R,L1), R = [' '|_], \+(member(' ',L0)),!. 先頭から区切り文字までを切り取る(L1,L1,[]) :- \+(member(' ',L1)),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/358 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): アルファベットと空白からなる文字列を処理する以下のような関数を作成せよ。なお各関数は処理が成功したときに1、失敗したときに0を返すものとする。 # # (1) 先頭からインデックスpで指定される文字までを反転させる関数int reverse(char *s, int p)を作成せよ。例: # char s[] = "abc defg"; # reverse(s, 3); # printf("%s¥n", s); // -> " cbadefg" # # (2) インデックスpとqで指定される範囲の文字を反転させる関数int reverse2(char *s, int p, int q)を作成せよ。例: # char s[] = "ab cdefg"; # reverse2(s, 4, 7); # printf("%s¥n", s); // -> "ab cgfed" # (ヒント: (1)で作った関数が応用できる?) # # (3) 単語(空白で区切られた文字)の順序を反転する関数int reverse_word(char *s)を作成せよ。例: # char s[] = "abc de f ghi"; # reverse_word(s); # printf("%s¥n", s); // -> "ghi f de abc" # (ヒント: (1)や(2)で作った関数が応用できる?) # # 'アルファベットと空白からなる文字列のインデックスpで指定される文字からqで指定される文字までを反転させる。'(_アルファベットと空白からなる文字列,_p,_反転した文字列) :- atom_chars(_アルファベットと空白からなる文字列,Chars), インデックスpとqで指定される範囲の文字を反転させる(Chars,_p,_q,Chars2), atom_chars(_反転した文字列,Chars2). インデックスpとqで指定される範囲の文字を反転させる(Chars,_p,_q,Chars2) :- 'p~q区間を切り出す'(Chars,_p,_q,L01,Chars1,R), 'p~q区間を反転させる'(Chars1,Chars1_1), append(L0,Chars1_1,R,Chars2). 'p~q区間を切り出す'(Chars,_p,_q,L01,Chars1,R) :- length([_|L01],_p), length(L02,_q), append(L01,Chars1,L02), append(L02,R,Chars). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/358 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): アルファベットと空白からなる文字列を処理する以下のような関数を作成せよ。なお各関数は処理が成功したときに1、失敗したときに0を返すものとする。 # # (1) 先頭からインデックスpで指定される文字までを反転させる関数int reverse(char *s, int p)を作成せよ。例: # char s[] = "abc defg"; # reverse(s, 3); # printf("%s¥n", s); // -> " cbadefg" # # (2) インデックスpとqで指定される範囲の文字を反転させる関数int reverse2(char *s, int p, int q)を作成せよ。例: # char s[] = "ab cdefg"; # reverse2(s, 4, 7); # printf("%s¥n", s); // -> "ab cgfed" # (ヒント: (1)で作った関数が応用できる?) # # (3) 単語(空白で区切られた文字)の順序を反転する関数int reverse_word(char *s)を作成せよ。例: # char s[] = "abc de f ghi"; # reverse_word(s); # printf("%s¥n", s); // -> "ghi f de abc" # (ヒント: (1)や(2)で作った関数が応用できる?) # # 'アルファベットと空白からなる文字列の先頭からインデックスpで指定される文字までを反転させる。'(_アルファベットと空白からなる文字列,_p,_反転した文字列) :- atom_chars(_アルファベットと空白からなら文字列,Chars), 先頭からインデックスpで指定される文字までを反転させる(Chars,_p,Chars2), atom_chars(_反転した文字列,Chars2). 先頭からインデックスpで指定される文字までを反転させる(Chars,_p,Chars2) :- length(L0,_p), append(L0,R,Chars), reverse(L0,L0_2), append(L0_2,R,Chars2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/126 # # どなたかお願いします。 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): 与えられた任意の長さのアルファベットの文字列(ただし # 重複する文字は含まないとする)に対して、文字を任意の順番に入れ替えてできる # 文字列のパターンをすべて出力する関数permute()を作成せよ。 # # 例: # permute("ABC"); # ABC ACB BAC BCA CAB CBA # # '与えられた任意の長さのアルファベットの文字列(ただし重複する文字は含まないとする)に対して、文字を任意の順番に入れ替えてできる文字列のパターンをすべて空白区切りで横方向に出力する'(_文字列) :- fildall(_順番を入れ替えた文字列,( '与えられた任意の長さのアルファベットの文字列(ただし重複する文字は含まないとする)に対して、文字を任意の順番に入れ替えてできる文字列のパターンを'(_文字列,_順番を入れ替えた文字列)), _文字列パターンならび), 空白区切りで横方向に出力する(_文字列パターンならび,' ',_表示行). 空白区切りで横方向に出力する(_文字列パターンならび) :- concat_atom(_文字列パターン,' ',_表示行), writef('%t\n',[_表示行]). '与えられた任意の長さのアルファベットの文字列(ただし重複する文字は含まないとする)に対して、文字を任意の順番に入れ替えてできる文字列のパターンを'(_文字列,_順番を入れ替えた文字列) :- atom_chars(_文字列,Chars), length(Chars,Len), 順列(Chars,Len,Chars2), atom_chars(_順番を入れ替えた文字列,Chars2). % % 最初の課題述語名に「空白区切りで横方向に」を加えたのがポイント。 % このような実例付き課題では、多くの場合、仕様文の表現に実例の細部が % 反映されていないことが多い。 % この時は思い切って、課題文に手を入れて考える。 % 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(A,Y,Z), M is N - 1, 順列(Z,M,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/114 # # [1] 授業単元: c言語 # [2] 問題文 # main関数の中で char cs[] [6] = {"Turbo","NA","DOHC"}; # と配列cs が設定されている 文字列を逆順にし大文字の英字を小文字に変換させ表示させるプログラム # 例st[0] ==>" obrut のような感じで # cs(['Turbo','NA','DOHC']). 'csに設定されたならびの中の文字列を逆順にし大文字の英字を小文字に変換させ表示させる' :- cs(_文字列ならび), append(L0,[_文字列|R],_文字列ならび), 文字列を逆順にし大文字の英字を小文字に変換させる(_文字列,_変換された文字列), 表示させる(_文字列,_変換された文字列), R = []. 文字列を逆順にし大文字の英字を小文字に変換させる(_文字列,_変換された文字列) :- atom_chars(_文字列,_文字ならび), 文字ならびを逆順にし大文字の英字を小文字に変換させる(_文字ならび,[],_変換された文字ならび), atom_chars(_変換された文字列,_変換された文字ならび). 文字ならびを逆順にし大文字の英字を小文字に変換させる(_文字ならび,_変換された文字ならび,_変換された文字ならび) :- !. 文字ならびを逆順にし大文字の英字を小文字に変換させる([_文字|R],_変換された文字ならび_1,_変換された文字ならび) :- 大文字の英字を小文字に変換する(_文字,_変換された文字), to_lower(_文字,_変換された文字), 文字ならびを逆順にし大文字の英字を小文字に変換させる(R,[_変換された文字|_変換された文字ならび_1],_変換された文字ならび),!. 表示させる(L0,_変換された文字列) :- length(L0,_csでの位置), writef('cs[%t]==>%t\n',[_csでの位置,_変換された文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/6 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):文字列st が回文(前から読んでも後ろから読んでも # 同じ)であれば1 を,そうでなければ0 を返す関数 # int isPalindrome(const char st[]) # を作成せよ.以下の実行例のように,関数の動作を確認 # 例.文字列を入力してください:AKASAKA # その文字列は回文です。 # # # # # できるmain 関数も作成する. # 例 # '文字列st が回文(前から読んでも後ろから読んでも同じ)であれば1 を,そうでなければ0 を返す'(_st,1) :- 回文(_st),!. '文字列st が回文(前から読んでも後ろから読んでも同じ)であれば1 を,そうでなければ0 を返す'(_st,0). 回文(_文字列) :- atom_chars(_文字列,Chars), reverse(Chars,Chars). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- atom_chars(_文字列,Chars), 回文(Chars,[],Chars). 回文([],L,L). 回文([_],L,L). 回文([A|R1],L1,L) :- 回文(R1,[A|L1],L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- atom_chars(_文字列,Chars), reverse(Chars,Chars1), atom_chars(_文字列,Chars1). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- atom_chars(_文字列,Chars), 回文(Chars,[]). 回文(L,L) :- !. 回文([_|L],L) :- !. 回文([A|R],L1) :- 回文(R,[A|L1]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- atom_chars(_文字列,Chars), 回文_1(Chars). 回文_1([]). 回文_1([_]). 回文_1(L) :- append([A],L2,[A],L), 回文_1(L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- sub_atom(_文字列,0,_長さ,0,_文字列), _長さ_1 is _長さ // 2, 回文(文字列,0,_長さ_1,_長さ),!. 回文(_文字列,_長さ_1,_長さ_1,_長さ) :- !. 回文(_文字列,N,_長さ_1,_長さ) :- sub_atom(_文字列,N,1,_,_文字), sub_atom(_文字列,_長さ-N-1,1,_,_文字), N_2 is N + 1, 回文(_文字列,N_2,_長さ_1,_長さ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- sub_atom(_文字列,0,_長さ,0,_文字列), _長さ_1 is _長さ // 2, 回文(文字列,0,_長さ_1,_長さ),!. 回文(_文字列,_長さ_1,_長さ_1,_長さ) :- !. 回文(_文字列,N,_長さ_1,_長さ) :- sub_atom(_文字列,N,1,_,_文字), sub_atom(_文字列,_長さ-N-1,1,_,_文字), N_2 is N + 1, 回文(_文字列,N_2,_長さ_1,_長さ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文('') :- !. 回文(_文字列) :- 両端の文字(_文字列,A,_中間の文字列,A), 回文(_中間の文字列,1),!. 両端の文字('','','','') :- !. 両端の文字(_文字列,'',_文字列,'') :- sub_atom(_文字列,0,1,0,_文字列),!. 両端の文字(_文字列,_最前の文字,'',_最後の文字) :- sub_atom(_文字列,0,1,1,_最前の文字), sub_atom(_文字列,1,1,0,_最後の文字),!. 両端の文字(_文字列,_最前の文字,_中間の文字列,_最後の文字) :- sub_atom(_文字列,0,1,_,_最前の文字), sub_atom(_文字列,1,_,1,_中間の文字列), sub_atom(_文字列,_,1,0,_最後の文字),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1276873238/575 # # 学校で宿題が出ました、助けて下さい>< # 実行すると下記のような動作をするバッチファイルスクリプトを作成したいです。 # よろしくお願いいたします。 # # 実行するバッチファイルが現在存在するディレクトリにある全てのテキストファイルを書き換えるバッチを作成しなさい。 # テキストファイルの中に、pass = "C:\Users\users\Documents\workspace\test.txt"というような # パスを変数に代入する記述があった場合 # そのパスの部分を、pass = "現在のバッチファイルの存在するディレクトリ\test.txt" # という風にディレクトリ名だけを(ファイル名は書き換えない)書き換えるバッチを作成しなさい。 # '実行するバッチファイルが現在存在するディレクトリにある全てのテキストファイルを書き換えるバッチを作成しなさい。テキストファイルの中に、pass = /Users/users/Documents/workspace/test.txt"というようなパスを変数に代入する記述があった場合そのパスの部分を、pass = "現在のバッチファイルの存在するディレクトリ/test.txt"という風にディレクトリ名だけを(ファイル名は書き換えない)書き換えるバッチを作成しなさい。'(_テキストファイル) :- pwd(CWDIR), get_chars(_テキストファイル,Chars_1), 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars_1,Chars_2), put_chars(_テキストファイル,Chars_2). 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars_1,Chars_2) :- atom_chars(CWDIR,CWDIRL), search_part_list(Chars_1,[<,p,a,s,s,' ',=,' ','"'],['"'],L0,L1,L2), パス部分を現在のディレクトリに置換する(CWDIRL,L1,L11), 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,L2,Chars_2_2), append(L0,L11,Chars_2_2,Chars_2),!. 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars,Chars). パス部分を現在のディレクトリに置換する(CWDIRL,L1,L11) :- ファイル部分(L1,_ファイル部分), append(CWDIRL,[/|_ファイル部分],L11). ファイル部分(_実質パス部分,_ファイル部分) :- append(_,[/|_ファイル部分],_実質パス部分), \+(member(/,_ファイル部分)),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% search_part_list(L,SL0,SL2,L0,L1,L2) :- append(SL0,[R0],SL0_1), append(SL2,[R2],SL2_1), partition_list_1(L,SL0_1,L0,R1), partition_list_1(R1,SL2_1,L1,L2). partition_list(L1,_指定ならび,L,R) :- append(_指定ならび,[R1],_指定ならび_1), partition_list_1(L1,_指定ならび_1,LX,R). partition_list_1([],_,[],[]) :- !. partition_list_1(L1,L1,[],R) :- !. partition_list_1([A|R1],L1,[A|R2],R) :- partition_list_1(R1,L1,R2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1276873238/575 # # 学校で宿題が出ました、助けて下さい>< # 実行すると下記のような動作をするバッチファイルスクリプトを作成したいです。 # よろしくお願いいたします。 # # 実行するバッチファイルが現在存在するディレクトリにある全てのテキストファイルを書き換えるバッチを作成しなさい。 # テキストファイルの中に、pass = "C:\Users\users\Documents\workspace\test.txt"というような # パスを変数に代入する記述があった場合 # そのパスの部分を、pass = "現在のバッチファイルの存在するディレクトリ\test.txt" # という風にディレクトリ名だけを(ファイル名は書き換えない)書き換えるバッチを作成しなさい。 # '実行するバッチファイルが現在存在するディレクトリにある全てのテキストファイルを書き換えるバッチを作成しなさい。テキストファイルの中に、pass = /Users/users/Documents/workspace/test.txt"というようなパスを変数に代入する記述があった場合そのパスの部分を、pass = "現在のバッチファイルの存在するディレクトリ/test.txt"という風にディレクトリ名だけを(ファイル名は書き換えない)書き換えるバッチを作成しなさい。'(_テキストファイル) :- pwd(CWDIR), get_chars(_テキストファイル,Chars_1), 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars_1,Chars_2), put_chars(_テキストファイル,Chars_2). 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars_1,Chars_2) :- atom_chars(CWDIR,CWDIRL), パス部分を現在のディレクトリに置換する(CWDIRL,_chars_1,_前部分,_置換_後部分), 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,_後部分,Chars_2_2), append(_前部分,_置換された部分,Chars_2_2,_Chars_2). 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars,Chars). パス部分を現在のディレクトリに置換する(Chars_1,_前部分,_置換された部分,_後部分) :- パス部分(_パス部分,_実質パス部分), append(_前部分,_パス部分,_後部分,Chars_1), ファイル部分(_実質パス部分,_ファイル部分), append([p,a,s,s,' ',=,' ','"'|CWDIRL],[/|_ファイル部分],['"'],_置換された部分),!. パス部分([p,a,s,s,' ',=,' ','"'|R],_実質パス部分) :- append(_実質パス部分,['"'],R), \+(member('"',_実質パス部分)),!. ファイル部分(_実質パス部分,_ファイル部分) :- append(_,[/|_ファイル部分],_実質パス部分), \+(member(/,_ファイル部分)),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/790 # # [1] C言語演習 # [2] http://ime.nu/codepad.org/u4T8ly42 のプログラムを改良して、 # 1を入力すると右から左へ、2を入力すると左から右へスクロールするように # しなさい。 #  [3.1] Windows7 #  [3.3] C言語 # [4] 10/24 18時まで # [5] 特になし # わかる方どうかよろしくお願いします。 # # '1を入力すると右から左へ、2を入力すると左から右へスクロールする'(_文字列,_スクロールした文字列) :- 左スクロールか右スクロールかを選択する(_入力文字), '1を入力すると右から左へ、2を入力すると左から右へスクロールする'(_入力文字,_文字列,_スクロールした文字列). '1を入力すると右から左へ、2を入力すると左から右へスクロールする'('1',_文字列,_スクロールした文字列) :- atom_chars(_文字列,Chars), append([A],L2,Chars), append(L2,[A],Chars2), atom_chars(_スクロールした文字列). '1を入力すると右から左へ、2を入力すると左から右へスクロールする'('1',_文字列,_スクロールした文字列) :- atom_chars(_文字列,Chars), append([A],L2,Chars), append(L2,[A],Chars2), atom_chars(_スクロールした文字列_1), 左スクロールか右スクロールかを選択する(_入力文字), '1を入力すると右から左へ、2を入力すると左から右へスクロールする'(_入力文字,_スクロールした文字列_1,_スクロールした文字列). '1を入力すると右から左へ、2を入力すると左から右へスクロールする'('2',_文字列,_スクロールした文字列) :- atom_chars(_文字列,Chars), append(L1,[A],Chars), append([A],L1,Chars2), atom_chars(_スクロールした文字列). '1を入力すると右から左へ、2を入力すると左から右へスクロールする'('2',_文字列,_スクロールした文字列) :- atom_chars(_文字列,Chars), append(L1,[A],Chars), append([A],L1,Chars2), atom_chars(_スクロールした文字列_1), 左スクロールか右スクロールかを選択する(_入力文字), '1を入力すると右から左へ、2を入力すると左から右へスクロールする'(_入力文字,_スクロールした文字列_1,_スクロールした文字列). 左スクロールか右スクロールかを選択する(_入力文字) :- write('選択してください。\n左スクロール:0 右スクロール:1 : '), get_cahr(_入力文字). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/666 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク): 月の英語名を初期値とした文字列配列(大きさは12x10)を使って # キーボードから月の英語名を入力しそれが何月かを表示するプログラムを作成せよ. # 実行例↓ # $./kadai # Month? October # October is 10 gatsu # # $./kadai # Month? May # May is 5 gatsu # '月の英語名を初期値とした文字列配列(大きさは12x10)を作る' :- length(LL,12), findall(L,( append(L0,[L|R],LL), length(L,10), length([_|L0],_nth), write('%t月の英語名を入力してください : '), get_line(Line), atom_chars(Line,Chars), append(Chars,_,L)), LL), assertz('月の英語名を初期値とした文字列配列(大きさは12x10)'(LL)). '月の英語名を初期値とした文字列配列(大きさは12x10)を使ってキーボードから月の英語名を入力しそれが何月かを表示する' :- '月の英語名を初期値とした文字列配列(大きさは12x10)'(_文字列配列), キーボードから月の英語名を入力し(_月の英語名), それが何月かを(_月の英語名,_文字列配列,_月), 表示する(_月). キーボードから月の英語名を入力し(_月の英語名) :- write('月の英語名を入力してください : '), get_line(_月の英語名). それが何月かを(_月の英語名,_文字列配列,_月) :- atom_chars(月の英語名,Chars), append(Chars,R,L), nth1(_月,_文字列配列,_月の英語名), すべてが変数(R),!. それが何月かを(_月の英語名,_文字列配列,_月) :- writef('%tは英語の月名ではありません。\n',[_月の英語名]), fail. 表示する(_月) :- writef('%t月です\n',[_月]). すべてが変数([]). すべてが変数([V|R]) :- var(V), すべてが変数(R). % % C152_666.htmlとは違って、無理に文字列配列(大きさは12x10)に近い構造を % 作ってみた。これでも、結局は処理はリストの先頭からだから、ここでの努力は % ほとんど無駄である。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/620 # # ●正規表現の使用環境 # Windowsコマンドプロンプト、filestr # # ●検索か置換か? # 検索 # # ●説明 # 全角英の大文字または小文字または全角数字が含まれているか検索したい # # ●対象データ # 以下batで失礼します # set a="Ape" # set b="Bape" # set c="222" # ●希望する結果 # %a%、%b%、%c%から検索して、"Ape"、"Bape"、"222"、という結果を表示できるようする正規表現または、それを含めたコマンド # ●試したコマンド # echo %a%|findstr /r "[A-Z]" # echo %b%|findstr /r "a-z" # echo %c%|findstr /r \[0-9\] # echo %c%|findstr /r "\[0-9\]" # echo %a%|findstr "[A-Z]" # echo %b%|findstr "a-z" # echo %c%|findstr a-z # findstr /r [A-Z] %a% # findstr /r [a-z] %b% # findstr /r [0-9] %c% # 上記のコマンドは間違っていて結果が全て空欄になっています。正しい場合は # set d=" あああ" # echo %d%|findstr /r /c:"^. ." # こちらの画面を見て頂ければと思います。それではどうかよろしくお願いします。 # # '全角英の大文字または小文字または全角数字が含まれているか検索する'(_文字列,_前文字列,_適合全角文字,_後文字列) :- atom_chars(_文字列,Chars), append(L0,[_適合全角文字|R],Chars), '全角英の大文字または小文字または全角数字が含まれているか'(_適合全角文字), atom_chars(_前文字列,L0), atom_chars(_後文字列,R). '全角英の大文字または小文字または全角数字が含まれているか'(A) :- '全角英の大文字が含まれている'(A),!. '全角英の大文字または小文字または全角数字が含まれているか'(L,L0,A,R) :- '全角英の小文字が含まれている'(A),!. '全角英の大文字または小文字または全角数字が含まれているか'(L,L0,A,R) :- '全角数字が含まれている'(A),!. '全角英の大文字が含まれている'(A) :- A @>= A, A @=< Z,!. '全角英の大文字が含まれている'(A) :- A @>= a, A @=< z,!. '全角英の数字が含まれている'(A) :- A @>= 1, A @=< 9,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/594 # # 正規表現は、既出かどうかってのがわかりにくいね。 # # ●正規表現の使用環境 # Java1.6 # # ●検索か置換か? # 検索 # # ●説明 # 変数文字列とその添字の取得 # # ●対象データ # $AAA.BBB+$CCC.DDD.EEE(1234)-#FFF*#GGG.HHH(567) # # ●希望する結果 # 検索1回目 # group1 : $AAA.BBB # # 検索2回目 # group1 : $CCC.DDD.EEE # group2 : 1234 # # 検索3回目 # group1 : #FFF # # 検索4回目 # group1 : #GGG.HHH # group2 : 567 # # # ($.*)\\(([0-9]*)\\) # これで、$CCC.DDD.EEE(1234)をみつけれるのは出来たけど、添え字が無い場合を引っ掛けるのができない。 # # '変数文字列とその添字の取得'(_文字列,_前文字列,_適合文字列,_後文字列,Group1,Group2) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,['$'|R2],L3), \+((member(A,R),member(A,['+','-','*','/']))), '[]であるか先頭に+,-,*,/,が来る'(L3), group検査(R2,Group1,Group2). '[]であるか先頭に+,-,*,/,が来る'([]) :- !. '[]であるか先頭に+,-,*,/,が来る'([A|_]) :- member(A,[+,-,*,/]),!. group検査(R2,Group1,'') :- \+(append(_,['('|_],R2)), atom_chars(Group1,R2),!. group検査(R2,Group1,Group2) :- atom_chars(Group1,R2), append(_,['('|R3],R2), append(L0,[')'|_],R3), atom_chars(Group2,L0),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/566 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 番号と点数を配列に初期化して、それらを # 5段階にランク付けをして、受験番号・ランクを表示するプログラムを作成。 # ランク付けをする部分を関数Rankとして、番号と評価を表示する部分を関数Outputとすること。 # なお、ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 # 60〜79点をB、80〜100点をAとする。 # ただし、受験者の数は、50人以下とする。 # 番号と点数は、以下の配列を使用すること。 # 番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10}; # 点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100}; # '問題文の5段階にランク付け'('ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 60〜79点をB、80〜100点をAとする。 '). 番号の定義文('番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10};'). 点数の定義文('点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100};'). 'ランクならびの生成'(_ランクならび) :- '問題文の5段階にランク付け'(_ランク定義文), ランクの定義文解析(_ランク定義文,_ランクならび). 番号ならびの生成(_番号ならび) :- 番号の定義文(_番号の定義文), 番号の定義文解析(_番号の定義文,_番号ならび). 点数ならびの生成(_点数ならび) :- 点数の定義文(_点数の定義文), 点数の定義文解析(_点数の定義文,_点数ならび). '5段階にランク付けをして、受験番号・ランクを表示する' :- ランクならびの生成(_ランクならび), 番号ならびの生成(_番号ならび), 点数ならびの生成(_点数ならび), '5段階にランク付けをして、受験番号・ランクを表示する'(_番号ならび,_点数ならび,_ランクならび). '5段階にランク付けをして、受験番号・ランクを表示する'([],[],_). '5段階にランク付けをして、受験番号・ランクを表示する'([_番号|R1],[_点数|R2],_ランクならび) :- append(_,[[_点数下限,_点数上限,_ランク]|_],_ランクならび), _点数 >= _点数下限, _点数 =< _点数上限, writef('受験番号:%t ランク:%t\n',[_番号,_ランク]), '5段階にランク付けをして、受験番号・ランクを表示する'(R1,R2,_ランクならび). ランクの定義文解析(_ランク定義文,_ランクならび) :- 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文), split(_半角数字変換されたランク定義文,[' ','。','、','〜','点を','とする'],L), n個組(3,L,_ランクならび). 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文) :- atom_chars(_ランク定義文,Chars), findall(_文字_1, append(_,[_文字|_],Chars), 全角数字ならば半角数字に変換(_文字,_文字_1)), Chars2), atom_chars(_半角数字変換されたランク定義文,Chars2). 全角数字ならば半角数字に変換([_全角数字|R1],[_半角数字|R2]) :- 全角数字半角数字変換(_全角数字,_半角数字), 全角数字ならば半角数字に変換(R1,R2). 全角数字ならば半角数字に変換([_文字|R1],[_文字|R2]) :- \+(全角数字半角数字変換(_文字,_)), 全角数字ならば半角数字に変換(R1,R2). 全角数字半角数字変換(0,0). 全角数字半角数字変換(1,1). 全角数字半角数字変換(2,2). 全角数字半角数字変換(3,3). 全角数字半角数字変換(4,4). 全角数字半角数字変換(5,5). 全角数字半角数字変換(6,6). 全角数字半角数字変換(7,7). 全角数字半角数字変換(8,8). 全角数字半角数字変換(9,9). 番号の定義文解析(_番号の定義文,_番号ならび) :- split(_番号の定義文,['=',',',';'],[_|_番号ならび]). 点数の定義文解析(_点数の定義文,_点数ならび) :- split(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/563 # # ●正規表現の使用環境 # Perl5 or Javascript # # ●検索か置換か? # 検索 # # ●説明 # ダブルクオートに囲まれた文字列を取得したい # ただ、「\」の次の文字はエスケープされた文字として扱う # # ●対象データ # "hogefuga" # "hoge\"fuga" # "hoge\\"fuga" # # ●希望する結果 # hogefuga # hoge"fuga # hoge\ # # # 上記のようなありきたりな命題にトライしていたのですが、以下の正規表現のうち1ではうまくいくのに2ではうまくいきませんでした # 1. /"((?:(?:\\.)|[^"])*)"/ # 2. /"((?:[^"]|(?:\\.))*)"/ # # # ただ、僕にはこれが両方同じ意味に見えるのです # # なぜこの場合、2ではうまくいかないのでしょうか # 気になって眠れません # 詳しい方解説お願いします # # 'ダブルクオートに囲まれた文字列を取得したい。ただ、「\\」の次の文字はエスケープされた文字として扱う'(_対象文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_対象文字列,_,_,_,_前文字列,_,_後文字列,L1,L2,L3), sub_atom(_後文字列,0,1,_,'"'), sub_atom(_前文字列,_,1,0,'"'), '「\\」の次の文字はエスケープされた文字として扱う'(L2,Chars), atom_chars(_適合文字列,Chars). '「\\」の次の文字はエスケープされた文字として扱う'([],[]) :- !. '「\\」の次の文字はエスケープされた文字として扱う'(['"'|_],_) :- !,fail. '「\\」の次の文字はエスケープされた文字として扱う'(['\\',A|R1],[A|R2]) :- '「\\」の次の文字はエスケープされた文字として扱う'(R1,R2),!. '「\\」の次の文字はエスケープされた文字として扱う'([A|R1],[A|R2]) :- '「\\」の次の文字はエスケープされた文字として扱う'(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/538 # # ●正規表現の使用環境 Flexible Renamer # ●検索か置換か? 置換 # ●説明 # 日付の前の文字を入れ替える # ●対象データ # ABC11-12-31 \d{2}-[A-Z]{3}-\d{2} # ABC11-DEC-31 \d{2}-\d{2}-\d{2} # ABC2011-12-31 \d{4}-[A-Z]{3}-\d{2} # ABC2011-DEC-31 \d{4}-\d{2}-\d{2} # ●希望する結果 # XYZ11-12-31 # XYZ11-DEC-31 # XYZ2011-12-31 # XYZ2011-DEC-31 # ●コメント:こんな感じか書いて投稿してみた # 日付の前の文字を入れ替える(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(['A','B','C'|R21],[-|R22],[-|R23],L2), 年の文字ならび(R21), 月の文字ならび(R22), 日の文字ならび(R23), append(['X','Y','Z'|R1],[-|R22],[-|R23],L22), atom_chars(S22,L22), concat_atom([S1,S22,S3],_置換された文字列). 日付の前の文字を入れ替える(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(['A','B','C'|R21],[-|R22],[-|R23],L2), 年の文字ならび(R21), 月の文字ならび(R22), 日の文字ならび(R23), append(['X','Y','Z'|R1],[-|R22],[-|R23],L22), atom_chars(S22,L22), 日付の前の文字を入れ替える(S3,_置換された文字列のニ), concat_atom([S1,S22],_置換された文字列の一), concat_atom([_置換された文字列の一,_置換された文字列のニ],_置換された文字列). 日付の前の文字を入れ替える(_文字列,_文字列). 年の文字ならび(R21) :- length(R21,4), すべて数字(R21),!. 年の文字ならび(R21) :- length(R21,2), すべて数字(R21),!. 月の文字ならび(R22) :- length(R22,1), すべて数字(R22),!. 月の文字ならび(R22) :- member(A,['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC']), atom_chars(A,R22),!. 日の文字ならび(R21) :- length(R21,2), すべて数字(R21),!. 日の文字ならび(R21) :- length(R21,1), すべて数字(R21),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/503 # # ●正規表現の使用環境 # oracle(regexp_replace) # ●検索か置換か? # 置換 # ●説明 # ::でタグ名が記載されたデータを<>タグに変換したい # ●対象データ # :dog:I like dog # :cat:I like cat # ●希望する結果 # <dog>I like dog</dog> # <cat>I like cat</cat> # '::でタグ名が記載されたデータを<>タグに変換したい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [:|R2], last(R2,:), atom_chars(S21,R2), concat_atom([S1,<,S21,>],S22), '最初に現れたS21の後にを付加する'(S3,S21,S31,_), concat_atom([S22,S31],_置換された文字列). '::でタグ名が記載されたデータを<>タグに変換したい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [:|R2], last(R2,:), atom_chars(S21,R2), concat_atom([S1,<,S21,>],S22), '最初に現れたS21の後にを付加する'(S3,S21,S31,_残り文字列), concat_atom([S22,S31],_置換された文字列の一), '::でタグ名が記載されたデータを<>タグに変換したい'(_残り文字列,_置換された文字列のニ), concat_atom([_置換された文字列の一,_置換された文字列のニ],_置換された文字列). '::でタグ名が記載されたデータを<>タグに変換したい'(_文字列,_文字列). '最初に現れたS21の後にを付加する'(_文字列,S21,S31,S3) :- sub_atom(_文字列,_,_,_,S1,S21,S3,L1,L2,L3), concat_atom([S1,S21,'<',S21,'>'],S31),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/784 # # ttp://aaa.co.jp:8888 # http://bbb.com:9999/ # を除外しつつ # 他の # h?ttp://○○○.△△△.□□□:☆☆☆/? #      ↑ここから      ここまで↑ # をヒットさせたいのですが色々試したのですが出来ませんでした # 何か方法がありますでしょうか? # # 'ttp://aaa.co.jp:8888とhttp://bbb.com:9999/を以外のURLの内、第3ドメインからトップドメインまでの部分'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_S1,S2,_後文字列,L1,[h,t,t,p,:,/,/|R2],[/|R3]), 除外URLではない(_適合文字列), \+(member(/,R2)), concat_atom([S1,'http://'],_前文字列), atom_chars(_適合文字列,R2). '除外URLではない'(S) :- \+(sub_atom(S,0,20,_,'ttp://aaa.co.jp:8888')),!. '除外URLではない'(S) :- \+(sub_atom(S,0,20,_,'http://bbb.com:9999/')),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/743 # # http://ime.nu/から最初の空白までを抽出する正規表現はどうなりますか? # # 'http://ime.nu/から最初の空白までを抽出する'(_文字列,_前文字列,_抽出された文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,_後文字列,[h,t,t,p,:,/,/,i,m,e,'.',n,u,'/'|R2],L2,[' '|_]), \+(member(' ',R2)), atom_chars(_抽出された文字列,R2), concat_atom([S1,'http://ime.nu/'],_前文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/483 # # ●希望する結果 # ;AA    [ac][ad]・・・・・[zw][zx]  [zz];AB[aa][zy]AC[ab]   ←;AAから;ABまでの[aa][zy][ab]を削除 # ;AA  [ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[df]AC[aa][fb]   ←;AAから;ABまでの[df][aa][fb]を削除 # ;AA[aa][ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[bc][fh]AC[ge][eg] ←;AAから;ABまでの[bc][fh][ge][eg]を削除 # # この結果。。。ムリだ # # 削除文字列('[aa][zy][ab]'). 削除文字列('[df][aa][fb]'). 削除文字列('[bc][fh][ge][eg]'). ';AAから;ABまでの削除文字列を削除'(_対象文字列,_削除された文字列) :- findall(Chars,( 削除文字列(_削除文字列), atom_chars(_削除文字列,Chars)),LL), ';AAから;ABまでの削除文字列を削除'(_対象文字列,LL,_削除された文字列). ';AAから;ABまでの削除文字列を削除'(_対象文字列,LL,_削除された文字列) :- sub_atom(_対象文字列,_,_,_,S1,S2,S3,L1,[';','A','A'|R2],[';','A','B'|R3]), '削除文字列を削除'(R2,LL,R2_2), atom_chars(S2_2,[';','A','A'|R2_2]), concat_atom([S1,S2_2,S3],_削除された文字列). '削除文字列を削除'([],_,[]) :- !. '削除文字列を削除'(R2,LL,L) :- member(LX,LL), append(LX,LR,R2), '削除文字列を削除'(LR,LL,L),!. '削除文字列を削除'([A|R1],LL,[A|R2]) :- '削除文字列を削除'(R1,LL,R2),!. % 以下のサイトは #

Best Cow Line(POJ3617)

# # N文字の文字列Sが与えられ、N文字の文字列Tを作ります。 # はじめはTは長さ0の文字列で、次のいずれかの操作が行えます。 # ・Sの先頭を一文字削除し、Tの末尾に追加する # ・Sの末尾を一文字削除し、Tの末尾に追加する # 辞書順比較でできるだけ小さくなるようにTを作ってください。 # # 制約 # ・1 =< N =< 2000 # ・文字列Sに含まれるのはローマ字の大文字のみ # 'N文字の文字列Sが与えられ、N文字の文字列Tを作ります。はじめはTは長さ0の文字列で、次のいずれかの操作が行えます。・Sの先頭を一文字削除し、Tの末尾に追加する ・Sの末尾を一文字削除し、Tの末尾に追加する 辞書順比較でできるだけ小さくなるようにTを作る'(S,T) :- poj3617(S,T). poj3617(S,T) :- 'Sを文字リストL1に変換'(S,L1), 'リストL1を反転して後ろから見たリストL2を作る'(L1,L2), 'L1,L2から辞書順リストL3を生成'(L1,L2,L3), '文字リストL3からTを生成'(T,L3). 'Sを文字リストL1に変換'(S,L1) :- atom_chars(S,L1). 'リストL1を反転して後ろから見たリストL2を作る'(L1,L2) :- reverse(L1,L2). 'L1,L2から辞書順リストL3を生成'([],[],[]). 'L1,L2から辞書順リストL3を生成'([A|R1],[B|R2],[A|R3]) :- [A|R1] @=< [B|R2], リストの最終要素を削除([B|R2],R22), 'L1,L2から辞書順リストL3を生成'(R1,R22,R3). 'L1,L2から辞書順リストL3を生成'([A|R1],[B|R2],[B|R3]) :- [A|R1] @> [B|R2], リストの最終要素を削除([A|R1],R11), 'L1,L2から辞書順リストL3を生成'(R11,R2,R3). リストの最終要素を削除(A,B) :- append(B,[_],A). '文字リストL3からTを生成'(T,L3) :- atom_chars(T,L3). %

問題点 ・・・ Sから最初空のTに段々文字を移していく雰囲気が全くない。 % さらに言うと、長い問題文をそのまま順にPrologコードに落としていく % 雰囲気もない。最低のコードだ。

% 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/455 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 置換 # # ●説明 # <b></b>で挟まれた文章を抜き出す # # ●対象データ # <table width="100%" border="1" cellspacing="0" cellpadding="10"> # <tr><td><b>ERROR!!<br><br>多重書き込みです。 あと 17秒お待ちください。</b></td></tr> # </table> # # ●希望する結果 # ERROR!!<br><br>多重書き込みです。 あと 17秒お待ちください。 # # ==== # これを実行するのに、 # responseStr = System.Text.RegularExpressions.Regex.Replace( # responseStr, # @"(.|\n)*<b>(?<sentence>.*?)</b>(.|\n)*", # "${sentence}"); # # とやっているのですが、 # 「任意の一文字(改行文字も含む)」 # という表現は(.|\n)が最適なのでしょうか。 # もっとベターなやりかたがあったら教えて下さい。 # # 'で挟まれた文章を抜き出す'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append([<,b,>|R1],[<,/,b,>],R1), \+(append(_,[<,b,>|_],R1)), \+(append(_,[<,/,b,>|_],R1)), atom_chars(_適合文字列,R1), concat_atom([S1,''],_前文字列), concat_atom(['',S3],_後文字列). % 以下のサイトは # # 行読み込み述語 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/1301067486/444 # # よろしくお願いします # # ●正規表現の使用環境 # 秀丸 # # ●検索か置換か? # 置換 # # ●説明 # ダブルクォーテーションの中の文字を空白扱いにしたい # # ●対象データ # test="daikon" # test="daikon ninjin" # test="daikon ninjin tamanegi" # # ●希望する結果 # test="" # test="" # test="" # # 'ダブルクォーテーションの中の文字を空白扱いにしたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_置換対象文字列,_,L1,['"'|R2],['"'|R3]), \+(member('"',R2)), atom_chars(_残り文字列,R3), concat_atom([_前文字列,'""',_残り文字列],_置換された文字列). 'ダブルクォーテーションの中の文字を空白扱いにしたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_置換対象文字列,_,L1,['"'|R2],['"'|R3]), \+(member('"',R2)), atom_chars(_残り文字列,R3), 'ダブルクォーテーションの中の文字を空白扱いにしたい'(_残り文字列,_置換された文字列のニ), concat_atom([_前文字列,'""',_置換された文字列のニ],_置換された文字列). 'ダブルクォーテーションの中の文字を空白扱いにしたい'(_文字列,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/350 # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク):整数 mとnを入力して m+(m+1)+(m+2)+…+n # を出力するプログラムを作成しろ # % 馬鹿正直に、m+(m+1)+(m+2)+…+n をプログラムとして書こうとしたら % どのような困難があるかということを示す。 '整数 mとnを入力して m+(m+1)+(m+2)+…+nを出力するプログラムを作成しろ' :- '整数 mとnを入力して'(_m,_n), 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S), '_m,_n,の値と適用するための工夫をする'(S,S2), 文字列を項に変換する(S2,P,VL), '表示文字列Xの表すものは変数Xである'(VL,X), call(P), '_mをmに_nをnに変換すると'(S,S3), writef('%t = %t\n',[S3,X]). 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S) :- _n_1 is _n - _m - 1, findall(S1,( for(1,N,_n_1), concat_atom(['(_m+',N,')'],S1)), L), concat_atom(L,'+',S),!. '_m,_n,の値と適用するための工夫をする'(S1,S2) :- concat_atom(['_m=',_m,',_n=',_n,',',X is S1,'+_n'],S2),!. '表示文字列Xの表すものは変数Xである'(VL,X) :- member('X'=X,VL). 文字列を項に変換する(S,P,VL) :- atom_to_term(S,P,VL),!. '_mをmに_nをnに変換すると'(S1,S2) :- atom_chars(S1,Chars), 'ならびの_mをmに_nをnに変換すると'(L1,L2), atom_chars(S2,L2),!. 'ならびの_mをmに_nをnに変換すると'([],[]) :-!. 'ならびの_mをmに_nをnに変換すると'(['_',m|R1],[m|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'(['_'|n],[n|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'([A|R1],[A|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. '整数 mとnを入力して'(_m,_n) :- write('m + 1 < n となるように'), 整数を入力(_m), 整数を入力(_n), '整数 mとnを入力診断'(_m,_n),!. '整数 mとnを入力して'(_m,_n) :- '整数 mとnを入力して'(_m,_n). 整数を入力(_整数) :- write('整数を入力しなさい : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数を入力(_整数) :- 整数を入力(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '整数 mとnを入力診断'(_m,_n) :- _n > _m + 1,!. '整数 mとnを入力診断'(_m,_n) :- write('m + 1 < n でなくてはなりません。再入力をお願いします。'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/350 # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク):整数 mとnを入力して m+(m+1)+(m+2)+…+n # を出力するプログラムを作成しろ # % 馬鹿正直に、m+(m+1)+(m+2)+…+n をプログラムとして書こうとしたら % どのような困難があるかということを示す。 '整数 mとnを入力して m+(m+1)+(m+2)+…+nを出力するプログラムを作成しろ' :- '整数 mとnを入力して'(_m,_n), 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S), '_m,_n,の値と適用するための工夫をする'(S,S2), 文字列を項に変換する(S2,P,VL), '表示文字列Xの表すものは変数Xである'(VL,X), call(P), '_mをmに_nをnに変換すると'(S,S3), writef('%t = %t\n',[S3,X]). 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S) :- _n_1 is _n - _m - 1, findall(S1,( for(1,N,_n_1), concat_atom(['(_m+',N,')'],S1)), L), concat_atom(L,'+',S),!. '_m,_n,の値と適用するための工夫をする'(S1,S2) :- concat_atom(['_m=',_m,',_n=',_n,',',X is S1,'+_n'],S2),!. '表示文字列Xの表すものは変数Xである'(VL,X) :- member('X'=X,VL). 文字列を項に変換する(S,P,VL) :- atom_to_term(S,P,VL),!. '_mをmに_nをnに変換すると'(S1,S2) :- atom_chars(S1,Chars), 'ならびの_mをmに_nをnに変換すると'(L1,L2), atom_chars(S2,L2),!. 'ならびの_mをmに_nをnに変換すると'([],[]) :-!. 'ならびの_mをmに_nをnに変換すると'(['_',m|R1],[m|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'(['_'|n],[n|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'([A|R1],[A|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. '整数 mとnを入力して'(_m,_n) :- write('m + 1 < n となるように'), 整数を入力(_m), 整数を入力(_n), '整数 mとnを入力診断'(_m,_n),!. '整数 mとnを入力して'(_m,_n) :- '整数 mとnを入力して'(_m,_n). 整数を入力(_整数) :- write('整数を入力しなさい : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数を入力(_整数) :- 整数を入力(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '整数 mとnを入力診断'(_m,_n) :- _n > _m + 1,!. '整数 mとnを入力診断'(_m,_n) :- write('m + 1 < n でなくてはなりません。再入力をお願いします。'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/418 # # テキスト中の行頭 ; という記号を置き換えようしています # '^\;'とかいたらマッチしません # # 次に ^\;.* と書いたらマッチするものの # 行頭に;がある行の一列すべてがマッチしてしまいます # # 一体どう書けばよいのでしょうか? # # 'テキスト中の行頭 ; という記号を置き換えようしています'(_文字列,_置換文字列,_置換された文字列) :- atom_chars(_文字列,Chars), atom_chars(_置換文字列,Chars2), 'ならびの行頭位置にある ; という記号を置換'(Chars,Chars2,L), atom_chars(_置換された文字列,Chars3). 'ならびの行頭位置にある ; という記号を置換'([';'|R1],Chars2,L) :- append(Chars2,R1,L),!. 'ならびの行頭位置にある ; という記号を置換'(Chars1,Chars2,L) :- 'ならびの行頭位置にある ; という記号を置換のニ'(Chars1,Chars2,L). 'ならびの行頭位置にある ; という記号を置換のニ'([],_,[]) :- !. 'ならびの行頭位置にある ; という記号を置換のニ'(['\n',';'|R1],Chars2,L) :- 'ならびの行頭位置にある ; という記号を置換のニ'(R1,Chars,R2), append(Chars2,R2,L),!. 'ならびの行頭位置にある ; という記号を置換のニ'([A|R1],Chars2,[A|R2]) :- 'ならびの行頭位置にある ; という記号を置換のニ'(R1,Chars,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/403 # # ●正規表現の使用環境 # Excel VBA # # ●検索か置換か? # 置換 # # ●説明 # <>で囲まれた文字列を空白に置換したい。 # # ●対象データ # あいうえお<ほげほげ>かきくけこ # みかん<りんご<すいか>ぶどう>メロン # # ●希望する結果 # あいうえおかきくけこ # みかんメロン # # --- # 検索:<*> # 置換: # --- # というふうにすると、 # 一番目の例に対してはうまくいくのですが、入れ子になっている場合にうまくいきません。 # ↓のような結果になってしまいます。 # みかんぶどう>メロン # # # お願いします。 # # '<>で囲まれた文字列を空白に置換したい。'(_文字列,_置換された文字列) :- atom_chars(_文字列,Chars), 'ならびの<>で囲まれた部分を空白に置換したい。'(Chars,_置換された文字ならび), atom_chars(_置換された文字列,_置換された文字ならび). 'ならびの<>で囲まれた部分を空白に置換したい。'([],[]). 'ならびの<>で囲まれた部分を空白に置換したい。'([<|R1],L) :- '<>に囲まれた部分を置換する'(R1,L1,R2), 'ならびの<>で囲まれた部分を空白に置換したい。'(R2,L2), append(L1,L2,L),!. 'ならびの<>で囲まれた部分を空白に置換したい。'([A|R1],[A|R2]) :- 'ならびの<>で囲まれた部分を空白に置換したい。'(R1,R2). '<>に囲まれた部分を置換する'([>|R],[],R) :- !. '<>に囲まれた部分を置換する'([<|R1],L,R) :- '<>に囲まれた部分を置換する'(R,L1,R1), '<>に囲まれた部分を置換する'(R1,L2,R), append(L1,L2,L),!. '<>に囲まれた部分を置換する'([A|R1],[A|R2],R) :- '<>に囲まれた部分を置換する'(R1,R2,R),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/381 # # ●正規表現の使用環境 # C# 4.0 # # ●検索か置換か? # 置き換え # # ●説明 # html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換えたい # ためしに<dd>とだけやってみましたが、<dd>タグは置き換えされませんでした # # ●対象データ # <dd>文章1</dd> # <dd>文章2</dd> # # ●希望する結果 # 文章1 # 文章2 # 'html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換える'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[<,d,d,>|R1],L3), append(_[/,<,d,d,>|_],L1), append(L11,[/,<,d,d,>],R1), \+(append(L11,[/,<,d,d,>],L11)), atom_chars(_ddタグを削除された文字列,L11), concat_atom([L1,L11,L2],_置換された文字列). 'html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換える'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[<,d,d,>|R1],L3), append(_[/,<,d,d,>|_],L1), append(L11,[/,<,d,d,>],R1), \+(append(L11,[/,<,d,d,>],L11)), 'html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換える'(L3,_置換された文字列のニ), concat_atom([L1,L11,_置換された文字列のニ],_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/768 # # isnumericについて教えてください # ある項目(文字列型)の値が # 数値のものだけ抽出したいと考えています # isnumericで行おうとしているのですが、 # Access上のリンクテーブルに対してクエリを実行するとOKなのですが # SQLServer上でクエリを実行すと全角スペースのものも数値として抽出してしまいます # # ■環境 # SQLServer2008 R2 # # ■テーブル # W_チェックテーブル # # ■データ # No Aコード # 1 100 # 2 200 # 3 ABC # 4    (全角スペース) # 5 500 # # ■ほしい結果 # 1 100 # 2 200 # 5 500 # # ■SQL # SELECT No,Aコード # FROM W_チェックテーブル # WHERE isnumeric(Aコード) <> 0 # ORDER BY No # # 上のSQLを実行すると # 1 100 # 2 200 # 4    (全角スペース) # 5 500 # # となり全角スペースのレコードが出力されてしまいます # 全角スペースのレコードを除外するにはどうすればよいでしょうか?? # # 'ある項目(文字列型)の値が数値のものだけ抽出したい'(_Aコード) :- W_チェックテーブル(_,_Aコード), 文字列はすべて数字からなる(_Aコード). 文字列はすべて数字からなる(_Aコード) :- atom_chars(_Aコード,Chars), ならびはすべて数字(Chars). ならびはすべて数字からなる([]). ならびはすべて数字からなる([A|R]) :- A @>= '0', A @=< '9', ならびはすべて数字からなる(R). % 以下のサイトは # 出典:: 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/1301067486/293 # # ●正規表現の使用環境 # LINUX grepコマンド # # ●検索か置換か? # 検索 # # ●説明 # ドットで行に一文字追加されたもののみ検索したい # # ●対象データ # ABC # ABCD # ABCDE # # ●希望する結果 # ABCD # # grep ABC. sample.txtとしても # 結果 2文字追加されているABCDEまで出てきてしまいます。。。 # ドットは一文字と習ったのですが、 # なぜなのかわかりません・・。 # # ドットで行に一文字追加されたもののみ検索したい(_検索文字,_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,L2,['\n'|_]), atom_chars(_検索文字,L), append(L,[_],L2), \+(member('\n',L)). ドットで行に一文字追加されたもののみ検索したい(_検索文字,_文字列,_前文字列,_適合文字列,_後文字列). sub_atom(_文字列,_,_,_,_,_,_後文字列のニ,_,L2,['\n'|_]), atom_chars(_検索文字,L), append(L,[_],L2), \+(member('\n',L)), ドットで行に一文字追加されたもののみ検索したい(_検索文字,_後文字列のニ,_前文字列,_適合文字列,_後文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/290 # # ●正規表現の使用環境 # Emacs Lisp # # ●検索か置換か? # 検索 # # ●説明 # C++などでよく使われる構文にマッチさせたい。 # 具体的にはクラスインスタンスへのアクセスアローやドットにマッチさせたい。 # # ●対象データ # # class A; # A a; # A* a_ref = &a; # # a.m_hoge; # a->m_hoge; # # ●希望する結果 # これにマッチさせる場合 # "\\(?:\\.\\|->\\)\\(\\(?:[a-zA-Z0-9][_a-zA-Z0-9]*\\)?\\)\\=" # が正解らしいですが # なぜ正解かわからない部分があるので教えてください。 # まず"?"演算子の使い方ですが・・・直前の文字列(空文字込み)にマッチさせるために置いてあるとして # 直後の ":"が理解不能です。 # 後半でも、":"が出てきますがこれも不可解。名前空間の"::"などにマッチさせたいのであれば # ::や:?:とかならわかるのですが・・ # 'クラスインスタンスへのアクセスアローやドットにマッチさせる'(_クラス,_文字列,_前文字列,_適合文字列,_後文字列) :- atom_chars(_クラス,CharsL), sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), \+((last(L1,C),アルファベット(C))), last(L2,';'), アローやドットにマッチさせる(ClassL,R2,L2). 'クラスインスタンスへのアクセスアローやドットにマッチさせる'(_クラス,_文字列,_前文字列,_適合文字列,_後文字列) :- atom_chars(_クラス,CharsL), sub_atom(_文字列,_,_,_,_,_,_後文字列2,L1,L2,L3), \+((last(L1,C),アルファベット(C))), last(L2,';'), アローやドットにマッチさせる(ClassL,R2,L2), 'クラスインスタンスへのアクセスアローやドットにマッチさせる'(_クラス,_後文字列2,_前文字列,_適合文字列,_後文字列). アローやドットにマッチさせる(ClassL,R2,L2) :- append(ClassL,[-,>|R2],L2), 全てアルファベット(R2). アローやドットにマッチさせる(ClassL,R2,L2) :- append(ClassL,['.'|R2],L2), 全てアルファベット(R2). アルファベット(C) :- C @>= a, C @=< z,!. アルファベット(C) :- C @>= 'A', C @=< 'Z',!. アルファベット(C) :- C @>= '0', C @=< '9',!. 全てアルファベット([]). 全てアルファベット([C|R]) :- アルファベット(C), 全てアルファベット(R). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 150代目 #662 # [1] 課題 # [2] .tsv形式のファイルをネット上から呼び出して、一番最後の行を引用して表示するプログラムを教えてください # [3] Mac OS X C++ # [4] 7/16 19時まで # [5] 関数呼び出しまで # 宜しくお願いします。 # '.tsv形式のファイルをネット上から呼び出して、一番最後の行を引用して表示する'(_URL) :- w3c(URL,Lines), 最終行を捜す(Lines,_最終行), writef('%w\n',[_最終行]). 最終行を捜す(Chars,_最終行) :- last(Lines,_最終行). w3c(URL,Lines) :- atomic_list_concat(['w3m -dump ',URL],S), shs(S,Lines). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/627 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力した文字列を逆順に出力するプログラムを作成したい。 # 次の2通りの方法でそれぞれプログラム中の空欄を埋め完成させよ。 # (1) 配列を使う (ポインタは使ってはならない) # (2) ポインタを使う (配列を使ってはならない) # # #include<stdio.h> # int main( void ) { # char str[256], *p ; # int i ; # scanf("%s", str) ; # p = str ; # [この部分を記述せよ] # return 0 ; # 'キーボードから入力した文字列を逆順に出力する' :- get_line(Line), atom_chars(Line,Chars), reverse(Chars,_逆順の文字ならび), atom_chars(_逆順文字列,_逆順の文字ならび), writef('%t\n',[_逆順文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'キーボードから入力した文字列を逆順に出力する' :- 文字を改行まで読み込む('',_逆順文字列), writef('%t\n',[_逆順文字列]). 文字を改行まで読み込む(_文字列1,_文字列) :- get_char(_文字), \+(_文字='\n'), atom_concat(_文字,_文字列1,_文字列2), 文字を改行まで読み込む(_文字列2,_文字列),!. 文字を改行まで読み込む(_文字列,_文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'キーボードから入力した文字列を逆順に出力する' :- 文字を改行まで読み込む([],_逆順文字ならび), atom_chars(_逆順文字列,_逆順文字ならび), writef('%t\n',[_逆順文字列]). 文字を改行まで読み込む(_文字列ならび1,_文字ならび) :- get_char(_文字), \+(_文字='\n'), 文字を改行まで読み込む([_文字|_文字列ならび1],_文字ならび),!. 文字を改行まで読み込む(_文字ならび,_文字ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/143 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # 8 桁までの整数を表わす文字列(例: "-3246") を整数値(例: ?3246) に変換する関数を作りたい。各問いに答えよ。 # # 1. 整数を表わす文字列はつぎの条件を全て同時に満たすと考えられる。 # # (1) 文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である # (2) 文字列の2 文字目以降は’0’〜’9’ である # (3) 符号を除いた文字列の長さは1 以上8 以下である # # 文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時(整数と # して文字列にエラーがある場合) には0 を戻り値として返す関数check() を作れ。 # # 2. 変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、負の時には?1 # を、整数として文字列にエラーがある場合には0 を返す関数sign() を作れ。 # # 3. 問1, 2 を利用して、8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す関数 # myatoi() を作成せよ。 # # myatoi(_文字列,_整数値) :- '8 桁までの整数を表わす文字列を引数とし、整数値に変換する'(_文字列,_整数値),!. '8 桁までの整数を表わす文字列を引数とし、整数値に変換する'(_文字列,_整数値) :- check(_文字列,1), sign(_文字列,_符号), atom_chars(_文字列,Chars), 数値部を得る(Chars,_数値部), _整数値 is _数値部 * _符号,!. check(_文字列,1) :- '文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である'(_文字列), '文字列の2 文字目以降は’0’〜’9’ である '(_文字列), '符号を除いた文字列の長さは1 以上8 以下である'(_文字列),!. check(_,0). '文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である'(_文字列) :- append(_,[A|_],['+','-']), subatom(_文字列,0,1,_,A),!. '文字列の2 文字目以降は’0’〜’9’ である '(_文字列) :- sub_atom(_文字列,1,_,0,_副文字列), count(sub_atom(_副文字列,_,1,_,_文字), _文字 @>= '0', _文字 @=< '9'),Count), sub_atom(_副文字列,0,Count,0,_副文字列),!. '符号を除いた文字列の長さは1 以上8 以下である'(_文字列) :- sub_atom(_文字列,1,Len,0,_文字列), Len >= 1, Len =< 8,!. sign(_文字列,1) :- '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1'(_文字列),!. sign(_文字列,-1) :- '変換したい文字列を引数とし、正負を判断して値が負の時には-1'(_文字列),!. '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1'(_文字列) :- sub_atom(_文字列,0,1,_,_文字), append(_,[_文字|_],['+','-','0','1','2','3','4','5','6','7','8','9']),!. '変換したい文字列を引数とし、正負を判断して値が負の時には-1'(_文字列) :- sub_atom(_文字列,0,1,_,'-'),!. 数値部を得る([],1,0) :- !. 数値部を得る(['+'|R],M,N) :- 数値部を得る(R,M,N),!. 数値部を得る(['-'|R],M,N) :- 数値部を得る(R,M,N),!. 数値部を得る([_文字|R],M,N) :- 数値部を得る(R,M1,N1), 文字数値変換(_文字,N2), M is M1 * 10, N is N2 * M + N1. 文字数値変換('0',0). 文字数値変換('1',1). 文字数値変換('2',2). 文字数値変換('3',3). 文字数値変換('4',4). 文字数値変換('5',5). 文字数値変換('6',6). 文字数値変換('7',7). 文字数値変換('8',8). 文字数値変換('9',9). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/379 # # どなたか入力された英大文字、英小文字、数字、改行の数を数えるプログラム書いてください。 自分ではなぜかうまくいかないので、参考にしたいのでお願い # # '英大文字、英小文字、数字、改行の数を数える'(_文字列,_英大文字の数,_英小文字の数,_数字の数,_改行の数) :- atom_chars(文字列,Chars), '文字ならびの英大文字、英小文字、数字、改行の数を数える'(Chars,_英大文字の数,_英小文字の数,_数字の数,_改行の数). '文字ならびの英大文字、英小文字、数字、改行の数を数える'([],0,0,0,0). '文字ならびの英大文字、英小文字、数字、改行の数を数える'([_文字|R1],_英大文字の数,_英小文字の数,_数字の数,_改行の数) :- '文字ならびの英大文字、英小文字、数字、改行の数を数える'(R1,_英大文字の数_1,_英小文字の数_1,_数字の数_1,_改行の数_1), 文字数加算(_文字,_英大文字の数_1,_英小文字の数_1,_数字の数_1,_改行の数_1,_英大文字の数,_英小文字の数,_数字の数,_改行の数). 文字数加算('\n',_英大文字の数,_英小文字の数,_数字の数,_改行の数_1,_英大文字の数,_英小文字の数,_数字の数,_改行の数) :- _改行の数 is _改行の数_1 + 1,!. 文字数加算(_文字,_英大文字の数_1,_英小文字の数,_数字の数,_改行の数,_英大文字の数,_英小文字の数,_数字の数,_改行の数) :- _文字 @>= 'A', _文字 @=< 'Z', _英大文字の数 is _英大文字の数_1 + 1,!. 文字数加算(_文字,_英大文字の数,_英小文字の数_1,_数字の数,_改行の数,_英大文字の数,_英小文字の数,_数字の数,_改行の数) :- _文字 @>= 'a', _文字 @=< 'z', _英小文字の数 is _英小文字の数_1 + 1,!. 文字数加算(_文字,_英大文字の数,_英小文字の数,_数字の数_1,_改行の数,_英大文字の数,_英小文字の数,_数字の数,_改行の数) :- _文字 @>= '0', _文字 @=< '9', _数字の数 is _数字の数_1 + 1,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/741 # # 全てのdivを削除したい訳でなく、<td....></td>間にある<div></div>を削除したいのです。 # <td....></td>間にあるものは削除して、それ以外は改行したいのです。 # 'tdタグの中のdivタグを取り除く'(_文字列,_取り除かれた文字列) :- atom_chars(_文字列,Chars), append(L0,[<,t,d,>|L],[<,/,t,d>|R1],Chars), \+(append(_,[<,t,d,>|R2],L)), \+(append(_,[|R3],R2)), append(L01,[<,d,i,v,>|L2],[<,/,d,i,v>|R3],L), append(L0,[<,t,d,>|L01],R3,L1), append(L1,[<,/,t,d|R1],Chars2), atom_chars(_取り除かれた文字列,Chars2). % 以下のサイトは # ・以下の実行結果になるようプログラムを作成せよ。 # # 実行結果 # 人数 > 5 # 0人目: # 名前 > Taro # 電話番号 > 090-111-1111 # 1人目: # 名前 > Hanako # 電話番号 > 090-222-2222 # 2人目: # 名前 > Ichiro # 電話番号 > 090-333-3333 # 3人目: # 名前 > Jiro # 電話番号 > 090-444-4444 # 4人目: # 名前 > Hanayo # 電話番号 > 090-555-5555 # # 電話帳: # Taro, 090-111-1111 # Hanako, 090-222-2222 # Ichiro, 090-333-3333 # Jiro, 090-444-4444 # Hanayo, 090-555-5555 # # 名前 > Hanayo # Hanayo, 090-555-5555 # # 実行結果 # 人数 > 2 # 0人目: # 名前 > Taro # 電話番号 > 090-111-1111 # 1人目: # 名前 > Taro # 電話番号 > 090-222-2222 # # 電話帳: # Taro, 090-111-1111 # Taro, 090-222-2222 # # 名前 > Taro # Taro, 090-111-1111 # Taro, 090-222-2222 # # 実行結果 # 人数 > 0 # # 電話帳: # # 名前 > Taro # 該当者なし '電話番号を登録し、それを表示し、さらに検索する' :- 電話番号登録, 電話番号表示, 電話番号検索. 電話番号登録 :- abolish(電話帳/2), 処理人数を入力する(_人数), length(Ln,_人数), append(L0,[_|R],Ln), length(L0,_人目), writef('%t人目:\n',[_人目]), 名前を入力する(_名前), 電話番号を入力する(_電話番号), assertz(電話帳(_名前,_電話番号)), R = [],!. 電話番号登録. 処理人数を入力する(_人数) :- write('\n人数 > '), get_line(Line), 処理人数入力診断(Line,_人数),!. 処理人数を入力する(_人数) :- 処理人数を入力する(_人数). 処理人数入力診断(Line,_人数) :- atom_to_term(line,_人数,_), integer(_人数), _人数 > 0,!. 処理人数入力診断(Line,_人数) :- writef('入力された %t から適切な人数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 名前を入力する(_名前) :- write('名前 > '), get_line(_名前). 電話番号を入力する(_電話番号) :- write('電話番号 > '), get_line(Line), 電話番号入力診断(Line,_電話番号),!. 電話番号を入力(_電話番号) :- 電話番号を入力する(_電話番号). 電話番号入力診断(Line,Line) :- split(Line,['(',')','-',' '],L), concat_atom(L,S), atom_chars(S,Chars), 全てが数字(Chars),!. 電話番号入力診断(Line,_電話番号) :- writef('入力された%tは電話番号として不適切です。再入力をお願いします。\n',[Line]), fail. 電話番号表示 :- writef('\n電話帳 >\n'), 電話帳(_名前,_電話番号), writef('%t, %t\n',[_名前,_電話番号]), fail. 電話番号表示. 電話番号検索 :- 名前を鍵に電話番号を得る. 名前を鍵に電話番号を得る :- 名前を入力(_名前), 電話番号の検索と出力(_名前),!. 電話番号の検索と出力(_名前,_電話番号) :- 電話帳(_名前,_電話番号), 名前と電話番号を出力する(_名前,_電話番号), fail. 電話番号の検索と出力(_名前,_電話番号) :- \+(電話帳(_名前,_電話番号)), write('該当者なし\n'),!. 電話番号の検索と出力(_,_). 名前と電話番号を出力する(_名前,_電話番号) :- writef('%t, %t\n',[_名前,_電話番号]). 全てが数字([]) :- !. 全てが数字([A|R]) :- member(A,['0','1','2','3','5','5','6','7','8','9']), 全てが数字(R). % 以下のサイトは # [1] 授業単元: プログラミング 〜構造体〜 # [2] 問題文(含コード&リンク): 3名の名前と性別、10桁の会員番号を入力し表示せよ # *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ # 入力(1234567890)→出力(12-3456-7890) # *入力された会員番号が10桁に満たない場合、 # または大きい場合は再度入力する指示を入れること '3名の名前と性別、10桁の会員番号を入力し表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示する' :- '3名のならびを確保'(_名前・性別・会員番号ならび), '3名の名前と性別、10桁の会員番号を入力し'(_名前・性別・会員番号ならび), 表示する(_名前・性別・会員番号ならび). '3名のならびを確保'(_名前・性別・会員番号ならび) :- length(_名前・性別・会員番号ならび,3). '3名の名前と性別、10桁の会員番号を入力し'([]). '3名の名前と性別、10桁の会員番号を入力し'([[_名前,_性別,_会員番号]|R]) :- 名前入力(_名前), 性別入力(_性別), 会員番号入力(_会員番号), '3名の名前と性別、10桁の会員番号を入力し'(R). 名前入力(_名前) :- write('名前を入力してください : '), get_line(Line), 名前入力診断(Line,_名前),!. 性別入力(_性別), write('性別(男/女)を入力してください : '), get_line(_性別),!. 会員番号入力(_会員番号) :- write('会員番号を入力してください(数字10桁) : '), get_line(Line), 会員番号入力診断(Line,_会員番号),!. 会員番号入力(_会員番号) :- 会員番号入力(_会員番号). 会員番号入力診断(Line,Line) :- atom_chars(Line,Chars), length(Chars,10), 全て数字(Chars),!. 会員番号入力診断(Line,_) :- writef('入力された%tからは会員番号(10桁)を得られません。再入力をお願いします。\n',[Line]), fail. 全て数字([]) :- !. 全て数字([A|R]) :- member(A,['0','1','2','3','4','5','6','7','8','9']), 全て数字(R). 表示する(_名前・性別・会員番号ならび) :- append(_,[[_名前,_性別,_会員番号]|R],_名前・性別・会員番号ならび), atom_chars(_会員番号,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), concat_atom([_1,_2,'-',_3,_4,_5,_6,'-',_7,_8,_9,_10],_会員番号表示), writef('名前=%t,性別=%t,会員番号=%t\n',[_名前,_性別,_会員番号表示]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/858 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # 1行の入力は、すべて英字とし、最大80文字とする。 # 初めに入力した1行の文字列に対して、2行目に入力した文字を3行目に入力した文字列に置換した文字列を作成し、結果を表示するプログラムを作成しなさい。 # '1行の入力は、すべて英字とし、最大80文字とする。初めに入力した1行の文字列に対して、2行目に入力した文字を3行目に入力した文字列に置換した文字列を作成し、結果を表示する' :- '1行の入力は、すべて英字とし、最大80文字とする。初めに入力した1行の文字列に対して'(_初めに入力した1行の文字列), '2行目に入力した文字を'(_2行目に入力した文字), '3行目に入力した文字列に'(_3行目に入力した文字列), '置換した文字列を作成し'(_初めに入力した1行の文字列,_2行目に入力した文字,_3行目に入力した文字列,_置換した文字列), '結果を表示する'(_置換した文字列). '1行の入力は、すべて英字とし、最大80文字とする。初めに入力した1行の文字列に対して'(_初めに入力した1行の文字列) :- length(L1,80), '英字か改行文字の入力'(_英字か改行文字), '1行の入力は、すべて英字とし、最大80文字'(L1,_英字か改行文字,Chars), atom_chars(_初めに入力した1行の文字列,Chars). '1行の入力は、すべて英字とし、最大80文字'([],_,[]) :- !. '1行の入力は、すべて英字とし、最大80文字'(_,'\n',[]) :- !. '1行の入力は、すべて英字とし、最大80文字'([_|R1],_英字,[_英字|R2]) :- 英字の入力(_英字か改行文字2), '1行の入力は、すべて英字とし、最大80文字'(R1,_英字か改行文字2,R2). 英字か改行文字の入力(_英字か改行文字) :- get_char(Char), 英字か改行文字の入力診断(Char,_英字か改行文字),!. 英字か改行文字の入力(_英字か改行文字) :- 英字か改行文字の入力(_英字か改行文字). 英字か改行文字の入力診断('\n','\n') :- !. 英字か改行文字の入力診断(Char,Char) :- Char @>= 'a', char @=< 'z',!. 英字か改行文字の入力診断(Char,Char) :- Char @>= 'A', char @=< 'Z',!. 英字か改行文字の入力診断(Char,_) :- writef('%tは英字ではありません。この入力を無視します\n',[Char]), fail. '2行目に入力した文字を'(_2行目に入力した文字) :- get_char(_2行目に入力した文字). '3行目に入力した文字列に'(_3行目に入力した文字列) :- get_line(_3行目に入力した文字列). '置換した文字列を作成し'(_初めに入力した1行の文字列,_2行目に入力した文字,_3行目に入力した文字列,_置換した文字列) :- atom_chars(_初めに入力した1行の文字列,Chars), '置換した文字ならびを作成し'(_初めに入力した1行の文字ならび,_2行目に入力した文字,_3行目に入力した文字列,_置換した文字ならび), concat_atom(_置換した文字ならび,_置換した文字列). '置換した文字ならびを作成し'([],_,_,[]) :- !. '置換した文字ならびを作成し'([_2行目に入力した文字|R1],_2行目に入力した文字,_3行目に入力した文字列,[_3行目に入力した文字列|R4]) :- '置換した文字ならびを作成し'(R1,_2行目に入力した文字,_3行目に入力した文字列,R4). '置換した文字ならびを作成し'([_文字|R1],_2行目に入力した文字,_3行目に入力した文字列,[_文字|R4]) :- '置換した文字ならびを作成し'(R1,_2行目に入力した文字,_3行目に入力した文字列,R4). '結果を表示する'(_初めに入力した1行の文字列,_2行目に入力した文字,_3行目に入力した文字列,_置換した文字列) :- writef('初めに入力した1行の文字列 %t\n',[_初めに入力した1行の文字列]), writef('2行目に入力した文字 %t\n',[_2行目に入力した文字]), writef('3行目に入力した文字列 %t\n',[_3行目に入力した文字列]), writef('置換した文字列 %t\n',[_置換した文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/156 # # ●正規表現の使用環境 # PHP 5.1 # # ●検索か置換か? # 検索 # # ●説明 # 角括弧が対応する始点から終点までをすべて抽出したいです。 # # ●対象データ # ほげ[[hoge:f1=piyo,f2=fuga]ふが[[hogera:]]ぴよ]ほげら[[foo:]ぴよぴよ][[qux:a=xyzzy]] # # ●希望する結果 # ほげ[[hoge:f1=piyo,f2=fuga]ふが[[hogera:]]ぴよ]ほげら[[foo:]ぴよぴよ][[qux:a=xyzzy]] #   1^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   2^^^^^^^^^^^^^^^3^^^^^^^^^^^^^^ # # ご教授よろしくお願いします。 # 角括弧が対応する始点から終点までをすべて抽出したい(_文字列,_抽出文字列ならび) :- atom_chars(_文字列,Chars), 文字ならびから角括弧抽出(Chars,_抽出文字列ならび). 文字ならびから角括弧抽出([],[]) :- !. 文字ならびから角括弧抽出(['['|R1],[_副文字列|R2]) :- 対応する閉じ括弧まで抽出(R1,L1,R), atom_chars(_副文字列,['['|L1]), 文字ならびから角括弧抽出(R,R2). 文字ならびから角括弧抽出([_|R1],L) :- 文字ならびから角括弧抽出(R1,L). 対応する閉じ括弧まで抽出([],[],[]) :- !. 対応する閉じ括弧まで抽出([']'|R1],[']'],R1) :- !. 対応する閉じ括弧まで抽出(['['|R1],L,R) :- 対応する閉じ括弧まで抽出(R1,L2,R2), 対応する閉じ括弧まで抽出(R2,L3,R), append(['['|L2],L3,L),!. 対応する閉じ括弧まで抽出([A|R1],[A|R2],R) :- 対応する閉じ括弧まで抽出(R1,R2,R). % 以下のサイトは # 出題場所 http://hibari.2ch.net/test/read.cgi/tech/1301067486/144 # (本文が長すぎるというメッセージが出るので2つに分けています) # # ●正規表現の使用環境 # ActionScript 3.0 # # ●検索か置換か? # 検索 # # ●説明 # 文字列の先頭が「プラス符号かマイナス符号か数字か」と # 末尾が「数字か」でBoolean判定を行いたい。 # # ●対象データ # 1.2345  +123.45  -3.1245  青3.1245  3.1245赤 # # ●希望する結果 # 1.2345→true  +123.45→true  -3.1245 → true  青3.1245→false  3.1245赤→false # # # 試したコードは下記です。 # var patt0 = new RegExp("^(\d|[-]|[+])");//先頭部分の判定 # var patt1 = new RegExp("\d$");//末尾 # if (patt0.test(str0) == true && patt1.test(str0) == true) { # //trueと出力 # } else { # //falseと出力 # } # # 最初と最後の文字のみに注目しているのでフラグ("g"など)は無しにして # いますが、上の記述だと 1.2345 でもfalseが出力されます。 # # どう変えれば良いでしょうか? # 因みに、ActionScriptはJavaScriptと同じECMAスクリプトを起源にしています。 # (正規表現も共通点が多いようです) # 数値文字(['0','1','2','3','4','5','6','7','8','9']). 文字列の先頭が「プラス符号かマイナス符号か数字か」と末尾が「数字か」でBoolean判定を行う(_文字列) :- 数値文字(L), sub_atom(_文字列,0,1,_,_先頭), sub_atom(_文字列,_,1,0,_末尾), append(_,[_先頭|_],['+','-'|L]), append(_,[_末尾|_],L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 数値文字(['0','1','2','3','4','5','6','7','8','9']). 文字列の先頭が「プラス符号かマイナス符号か数字か」と末尾が「数字か」でBoolean判定を行う(_文字列) :- atom_chars(_文字列,Chars), append([_先頭|_],[_末尾],Chars), 数値文字(L), append(_,[_先頭|_],['+','-'|L]), append(_,[_末尾|_],L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/481 # # [1] 授業単元:ソフトウェア演習C # [2] 問題文: # 文書ないのすべての単語とその単語の頻度をメンバとして持つ構造体を定義し、 # この構造体へのポインタをノードの値として持つ二分木のノードを定義せよ # # 次に、任意のノードはその左の部分木にはそのノードの単語より辞書順で # 小さい単語のみがあり、その右の部分木にはより大きい単語のみがあるように # 保持される。 # 新たに単語がすでに木にあるかどうかを探すには、ルート(根元)から出発して # そのノードに格納されている単語と新しい単語を比較する。 # 二つが一致したら、それで良い。 # 新しい単語が木の単語より小さいときは、探索は左の子供に対して続けられ、 # そうでなければ右の子供が調べられる。 # 求める方向に子供がないときは、新しい単語は木の中にはないと言うことであり、 # また実際にはその子供のないところがそれを置く場所である。 # このプロセスは再帰的である必要があり、単語の挿入を行うadd_word()関数を # 定義せよ。 # この関数は再帰的に呼ばれて、左または右の部分木に振り分けられる。 # 単語は木の中の単語と一致する(その場合カウント(頻度)がインクリメントされる)か、 # あるいはノードを作成し、木に加えなければならないことを示すヌル・ポインタと # 出会う。 # 新たにノードが生成されると、この関数ではそのノードへのポインタが返され、 # 親ノードに埋め込まれる。 # この関数を利用し、以下のテキストをコマンド実行時の引数として与えられた # ファイルを入力して二分探索木を生成し、単語と頻度のリストを表示する # プログラムを作成せよ。 # # 文章: ファイル名:test.txt # University was founded in April 1998 at Iwate, # which is situated in the northeastern part of Japan. # University consists of four faculties Software and Information Science, # Nursing, Social Welfare, # and policy Studies, and additionally other educational supporut centers. 'Idによって管理された二分木に情報と頻度を保持する' :- get_chars('test.txt',Chars), split(Chars,[' ',',','.'],WordList), 木作成(WordList). 'Idによって管理された二分木に保持された情報と頻度を昇順表示' :- 二分木から値と頻度を取り出す(1,_頻度付きの値ならび), append(_[[_語,_頻度]|R],_頻度付きの値ならび), write_formatted('語彙=%t,頻度=%t\n',[_語,_頻度]), R = []. 木作成(_ならび) :- abolish(節/5), 節作成(_ならび,1,1,_). 木作成([],_,_,_). 木作成([_値|R],_節,_開始節番号,_次の節番号) :- 節作成(_値,_節,_開始節番号,_受取節番号), 木作成(R,_節,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- not(節(_節,_,_,_,_)), _左 is _受取節番号+1, _右 is _受取節番号+2, _次の節番号 is _受取節番号+3, assertz(節(_節,_左,_右,_値,1)),!. 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_), 辞書順語彙比較(<,_値,_値2), 節作成(_値,_左,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_), 辞書順語彙比較(>,_値,_値2), 節作成(_値,_右,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_頻度), 辞書順語彙比較(=,_値,_値2), _頻度2 is _頻度 + 1, retract(節(_節,_左,_右,_値2,_頻度)), assertz(節(_節,_左,_右,_値2,_頻度2)). 辞書順語彙比較(Functor,_語彙1,_語彙2) :- atom_codes(_語彙1,Codes1), atom_codes(_語彙2,Codes2), 辞書順codes比較(Fuctor,Code1,Codes2),!. 辞書順codes比較((=),[],[]) :- !. 辞書順codes比較((<),[],L) :- !. 辞書順codes比較((>),L,[]) :- !. 辞書順codes比較((<),[A|R1],[B|R2]) :- A >= 65,A =< 90, B >= 97,B =< 122, B >= A + 32,!. 辞書順codes比較((>),[A|R1],[B|R2]) :- A >= 65,A =< 90, B >= 97,B =< 122, B < A + 32,!. 辞書順codes比較((>),[A|R1],[B|R2]) :- A >= 97,A =< 122, B >= 65,B =< 90, A >= B + 32,!. 辞書順codes比較((<),[A|R1],[B|R2]) :- A >= 97,A =< 122, B >= 65,B =< 90, A < B + 32,!. 辞書順codes比較(<,[B|R1],[A|R2]) :- B =< A,!. 辞書順codes比較(>,[B|R1],[A|R2]) :- B > A,!. 辞書順codes比較(P,[A|R1],[A|R2]) :- 辞書順codes比較(P,R1,R2). 二分木から値と頻度を取り出す(_節,_頻度付きの値ならび) :- findall([_値,頻度],二分木から値と頻度を取り出す(_節,_,_値,_,_頻度),_頻度付きの値ならび). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- 節(_節,_左,_,_値2,_,_頻度2), 二分木から値と頻度を取り出す(_左,_値2,_値,_頻度2,_頻度). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- 節(_節,_,_右,_値2,_頻度2), 二分木から値と頻度を取り出す(_右,_,_値,_,_頻度). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- not(var(_値1)), not(var(_頻度1)), _値1=_値, _頻度1=_頻度. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/165 # # 【質問テンプレ】 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力した長さ10の文字列の任意の2つの文字を # 入れ換える関数void swap(char *address1, char *address2)を定義し、 # その動作を確認するkadai6-2.cを作りなさい。 # この関数は引数で与えられたアドレスのメモリにアクセスして中身を # 入れ換える作業を行う。 # ただし、文字列と入れ換える2つの文字の位置は次のように入力されるものとする。 # scanf("%s %d %d", str, &position1, &position2);//それぞれ文字列、位置1, 位置2を表している。 # 答えは以下で出力されるものとする。 # printf("answer = %s\n", str); # キーボードから入力した長さ10の文字列の任意の2つの文字を入れ換える(_文字列,_2つの文字を入れ換えた文字列) :- キーボードから入力した長さ10の文字列(_文字列), 組合せ([0,2,3,4,5,6,7,8,9],2,[Nth1,Nth2]), atom_chars(_文字列,Chars), ならびの任意の2つの文字を入れ換える(Chars,Nth1,Nth2,[],_2つの文字を入れ換えた文字列). ならびの任意の2つの文字を入れ換える(Chars,Nth1,Nth2,L,_2つの文字を入れ換えた文字列) :- length(L,45),!, fail. ならびの任意の2つの文字を入れ換える(Chars,Nth1,Nth2,L,_2つの文字を入れ換えた文字列) :- \+(append(_,[[Nth1,Nth2]|_],L)), length(L0,Nth1), append(L0,[A|R1],Chars), Nth3 is Nth2 - Nth1 - 1, length(L03,Nth3), length(L03,[B|R3],R1), append(L0,[B|L03],[A|R3],Chars2), atom_chars(_2つの文字を入れ換えた文字列,Chars2). ならびの任意の2つの文字を入れ換える(Chars,Nth1,Nth2,L,_2つの文字を入れ換えた文字列) :- \+(append(_,[[Nth1,Nth2]|_],L)), 組合せ([0,2,3,4,5,6,7,8,9],2,[Nth1_2,Nth2_2]), ならびの任意の2つの文字を入れ換える(Chars,Nth1_2,Nth2_2,[[Nth1,Nth2]|L],_2つの文字を入れ換えた文字列). ならびの任意の2つの文字を入れ換える(Chars,Nth1,Nth2,L,_2つの文字を入れ換えた文字列) :- append(_,[[Nth1,Nth2]|_],L), 組合せ([0,2,3,4,5,6,7,8,9],2,[Nth1_2,Nth2_2]), ならびの任意の2つの文字を入れ換える(Chars,Nth1_2,Nth2_2,L,_2つの文字を入れ換えた文字列). キーボードから入力した長さ10の文字列(_文字列) :- write('10の文字列の文字列を入力してください : '), findall(_文字,( for(1,N,10), get_char(_文字)), L), atom_chars(_文字列,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/436 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 今回は、単方向リストを用いて電話帳のプログラムを作ってもらいます。 # 実装するのは、入力、削除、表示、終了、load、saveです # 1.入力は、名前、電話番号を入力する。(可能ならばソートを行う) # 2.saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する) # 3.loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする # 4.ヒント(mallocの意味を調べること) # 単方向リストを用いた電話帳(入力,_更新前電話帳,_更新後電話帳) :- '入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳). 単方向リストを用いた電話帳(save,_ファイル名,_電話帳) :- 'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳). 単方向リストを用いた電話帳(load,_ファイル名,_電話帳) :- 'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳). '入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳) :- 名前を入力する(_名前), 電話番号を入力する(_電話番号), ソートされた状態を保って入力する(_名前,_電話番号,_更新前電話帳,_更新後電話帳). 名前を入力する(_名前) :- get_line(_名前). 電話番号を入力する(_電話番号) :- get_line(Line), 電話番号入力診断(Line,_電話番号),!. 電話番号を入力する(_電話番号) :- 電話番号を入力する(_電話番号). 電話番号入力診断(Line,_電話番号) :- 構成文字は数字かハイフンだけ(Line),!. 電話番号入力診断(Line,_電話番号) :- 数字かハイフン以外の構成文字を選別する(Line,_電話番号にふさわしくない文字ならび), writef('入力された %t には電話番号としてふさわしくない文字 %t が含まれています。再入力をお願いします。\n',[Line,_電話番号に相応しくない文字ならび]). 数字かハイフン以外の構成文字を選別する(Line,_電話番号にふさわしくない文字ならび) :- atom_chars(Line,Chars), 数字かハイフン以外の構成文字を選別する(Chars,[],_電話番号にふさわしくない文字ならび). 数字かハイフン以外の構成文字を選別する([],L,L) :- !. 数字かハイフン以外の構成文字を選別する([_文字|R1],L1,_電話番号にふさわしくない文字ならび) :- \+(数字かハイフン(_文字)), \+(append(_,[_文字|_],L1)), 数字かハイフン以外の構成文字を選別する(R1,[_文字|L1],_電話番号にふさわしくない文字ならび). 数字かハイフン以外の構成文字を選別する([_文字|R1],L1,_電話番号にふさわしくない文字ならび) :- (数字かハイフン(_文字);append(_,[_文字|_],L1)), 数字かハイフン以外の構成文字を選別する(R1,L1,_電話番号にふさわしくない文字ならび). 数字かハイフン('-') :- !. 数字かハイフン(_文字) :- append(_,[_文字|_],['0','1','2','3','4','5','6','7','8','9']),!. ソートされた状態を保って入力する(_名前,_電話番号,[],[[_名前,_電話番号]]) :- !. ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R],[[_名前,_電話番号],[_名前1,_電話番号1]|R]) :- _名前 @=< _名前1,!. ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R1],[[_名前1,_電話番号1]|R2]) :- _名前 @> _名前1, ソートされた状態を保って入力する(_名前,_電話番号,R1,R2). 'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳) :- tell(_ファイル名), writef('%q.\n',[_電話帳]), told. 'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳) :- see(_ファイル名), read(_電話帳), seen. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/436 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 今回は、単方向リストを用いて電話帳のプログラムを作ってもらいます。 # 実装するのは、入力、削除、表示、終了、load、saveです # 1.入力は、名前、電話番号を入力する。(可能ならばソートを行う) # 2.saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する) # 3.loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする # 4.ヒント(mallocの意味を調べること) # 単方向リストを用いた電話帳(入力,_更新前電話帳,_更新後電話帳) :- '入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳). 単方向リストを用いた電話帳(save,_ファイル名,_電話帳) :- 'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳). 単方向リストを用いた電話帳(load,_ファイル名,_電話帳) :- 'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳). '入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳) :- 名前を入力する(_名前), 電話番号を入力する(_電話番号), ソートされた状態を保って入力する(_名前,_電話番号,_更新前電話帳,_更新後電話帳). 名前を入力する(_名前) :- get_line(_名前). 電話番号を入力する(_電話番号) :- get_line(Line), 電話番号入力診断(Line,_電話番号),!. 電話番号を入力する(_電話番号) :- 電話番号を入力する(_電話番号). 電話番号入力診断(Line,_電話番号) :- 構成文字は数字かハイフンだけ(Line),!. 電話番号入力診断(Line,_電話番号) :- 数字かハイフン以外の構成文字を選別する(Line,_電話番号にふさわしくない文字ならび), writef('入力された %t には電話番号としてふさわしくない文字 %t が含まれています。再入力をお願いします。\n',[Line,_電話番号に相応しくない文字ならび]). 数字かハイフン以外の構成文字を選別する(Line,_電話番号にふさわしくない文字ならび) :- atom_chars(Line,Chars), 数字かハイフン以外の構成文字を選別する(Chars,[],_電話番号にふさわしくない文字ならび). 数字かハイフン以外の構成文字を選別する([],L,L) :- !. 数字かハイフン以外の構成文字を選別する([_文字|R1],L1,_電話番号にふさわしくない文字ならび) :- \+(数字かハイフン(_文字)), \+(append(_,[_文字|_],L1)), 数字かハイフン以外の構成文字を選別する(R1,[_文字|L1],_電話番号にふさわしくない文字ならび). 数字かハイフン以外の構成文字を選別する([_文字|R1],L1,_電話番号にふさわしくない文字ならび) :- (数字かハイフン(_文字);append(_,[_文字|_],L1)), 数字かハイフン以外の構成文字を選別する(R1,L1,_電話番号にふさわしくない文字ならび). 数字かハイフン('-') :- !. 数字かハイフン(_文字) :- append(_,[_文字|_],['0','1','2','3','4','5','6','7','8','9']),!. ソートされた状態を保って入力する(_名前,_電話番号,[],[[_名前,_電話番号]]) :- !. ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R],[[_名前,_電話番号],[_名前1,_電話番号1]|R]) :- _名前 @=< _名前1,!. ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R1],[[_名前1,_電話番号1]|R2]) :- _名前 @> _名前1, ソートされた状態を保って入力する(_名前,_電話番号,R1,R2). 'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳) :- tell(_ファイル名), writef('%q.\n',[_電話帳]), told. 'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳) :- see(_ファイル名), read(_電話帳), seen. % 以下のサイトは # 正規表現だと、「当てはまる一部分を交換」ってのはやれるけど、 # 「当てはまる部分を含む一行を丸ごと交換」だと難しい。\ # っつーか思いつかんかった。やり方を。 当てはまる部分を含む一行を丸ごと交換(_文字列,_検索部分文字列,_置換行,_置換された文字列) :- atom_chars(_文字列,Chars), atom_chars(_検索部分文字列,_検索部分文字ならび), atom_chars(_置換行,_置換文字ならび), 当てはまる行を丸ごと交換(Chars,_検索部分文字ならび,_置換文字ならび,Chars2), concat_atom(Chars2,_置換された文字列),!. 当てはまる行を丸ごと交換([],[],_検索部分文字ならび,_置換文字ならび,[]) :- !. 当てはまる行を丸ごと交換([],L1,_検索部分文字ならび,_置換文字ならび,L1) :- \+(append(_,_検索部分文字ならび,_,L1)),!. 当てはまる行を丸ごと交換([],L1,_検索部分文字ならび,_置換文字ならび,_置換文字ならび) :- append(_,_検索部分文字ならび,_,L1),!. 当てはまる行を丸ごと交換(['\n'|R1],[],_検索部分文字ならび,_置換文字ならび,['\n'|R2]) :- 当てはまる行を丸ごと交換(R1,[],_検索部分文字ならび,_置換文字ならび,R2). 当てはまる行を丸ごと交換(['\n'|R1],L1,_検索部分文字ならび,_置換文字ならび,Chars2) :- append(_,_検索部分文字ならび,_,L1), 当てはまる行を丸ごと交換(R1,[],_検索部分文字ならび,_置換文字ならび,R2), append(_置換文字ならび,['\n'|R2],Chars2),!. 当てはまる行を丸ごと交換(['\n'|R1],L1,_検索部分文字ならび,_置換文字ならび,Chars2) :- \+(append(_,_検索部分文字ならび,_,L1)), 当てはまる行を丸ごと交換(R1,[],_検索部分文字ならび,_置換文字ならび,R2), append(L1,['\n'|R2],Chars2),!. 当てはまる行を丸ごと交換([A|R1],L1,_検索部分文字ならび,_置換文字ならび,Chars2) :- \+(A='\n'), append(L1,[A],L2), 当てはまる行を丸ごと交換(R1,L2,_検索部分文字ならび,_置換文字ならび,Chars2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/16 # # [1]授業単元:課題 # [2]問題文:文字列を読み込み,各文字をアルファベットの辞書順にn文字循環シフトして出力するプログラム. # ただし'b'が'a'+1であると仮定してはならない. # 整数 > 5 # 変換前の文字列 > ayzfvwhbpqrcegiklmnjostdux # 変換後の文字列: fdekabmguvwhjlnpqrsotxyizc # # 文字列を読み込み,各文字をアルファベットの辞書順にn文字循環シフトして出力する :- 文字列を読み込み(_文字列), 各文字をアルファベットの辞書順にn文字循環シフトして(_文字列,_変換された文字列), 出力する(_変換された文字列). 文字列を読み込み(_文字列) :- write('英小文字文字列を入力してください : '), get_line(_文字列), 文字列診断(_文字列),!. 文字列を読み込み(_文字列) :- 文字列を読み込み(_文字列). 文字列診断(_文字列) :- atom_chars(_文字列,Chars), すべてが英小文字(Chars),!. 文字列診断(_文字列) :- write('入力された %t には英小文字以外の文字が存在します。再入力をお願いします。\n'), fail. すべてが英小文字([]). すべてが英小文字([_文字|R]) :- member(_文字,[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]), すべてが英小文字(R). 各文字をアルファベットの辞書順にn文字循環シフトして(_文字列,_変換された文字列) :- atom_chars(_文字列,Chars), 文字ならびの各文字をアルファベットの辞書順にn文字循環シフトして(Chars,Chars2), concat_atom(Chars2,_変換された文字列). 文字ならびの各文字をアルファベットの辞書順にn文字循環シフトして([],[]). 文字ならびの各文字をアルファベットの辞書順にn文字循環シフトして([_文字|R1],[_変換された文字|R2]) :- 英小文字循環シフト(_文字,_変換後文字), 文字ならびの各文字をアルファベットの辞書順にn文字循環シフトして(R1,R2). 英小文字循環シフト(_変換前文字,_変換後文字) :- ならびの回転(左方向,1,[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],[_変換前文字|R]), ならびの回転(左方向,5,[_変換前文字|R],[_変換後の文字|_]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/12 # # [1]c言語 # [2]英文字を読み込み、その一つ一つの文字の個数を求めるプログラム。 # # 実行結果 # 英文字 BBACC # 変換後 B2A1C2 英文字を読み込み、その一つ一つの文字の個数を求める :- 英文字を読み込み(_英文字列), その一つ一つの文字の個数を求める(_英文字列,_その一つ一つの文字の個数), 表示する(その一つ一つの文字の個数). 英文字を読み込み(_英文字列) :- write('英文字列を入力してください : '), get_line(_英文字列), 英文字読み込み診断(_英文字列),!. 英文字を読み込み(_英文字列) :- 英文字を読み込み(_英文字列). 英文字読み込み診断(_英文字列) :- atom_chars(_英文字列,Chars), 全て英文字(Chars),!. 英文字読み込み診断(_文字列) :- writef('読み込まれた文字列 %t に英文字以外の文字が含まれています。\n再入力をお願いします\n',[_文字列]),fail. 全て英文字([]). 全て英文字([A|R]) :- member(A,['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]), 全て英文字(R). その一つ一つの文字の個数を求める(_英文字列,_その一つ一つの文字の個数) :- atom_chars(_英文字列,Chars), setof(_文字,member(_文字,Chars),L1), findall(_文字の個数,( member(_文字,L1), count(member(_文字,Chars),Count), concat_atom([_文字,Count],_文字の個数)), L2), concat_atom(L2,_その一つ一つの文字の個数). 表示する(_その一つ一つの文字の個数) :- writef('%t\n',[_その一つ一つの文字の個数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/60 # # よろしくお願いします。 # # ●正規表現の使用環境 # PHP 5.2.9 (XAMPP 1.7.1) # # ●検索か置換か? # 検索 # # ●説明 # 入力文字が+、-、数字以外ならエラーを返す # # ●コード # preg_match("/^[+|-]*\d+$/g", $string) # (1行ごとに処理するので、/mは不要です) # # ●希望する結果 # +100→○ # -488→○ # 1024→○ # *300→× # /200→× # Aaaa→× # ああ→× # '入力文字が+、-、数字以外ならエラーを返す'(_入力文字列,エラー) :- atom_chars(_入力文字列,Chars), append(_,[_文字|_],Chars), '入力文字が+、-、数字以外'(_文字),!. '入力文字が+、-、数字以外ならエラーを返す'(_入力文字列,正常終了). '+、-、数字以外'('+') :- !,fail. '+、-、数字以外'('-') :- !,fail. '+、-、数字以外'(_入力文字) :- 数字(_入力文字),!,fail. '+、-、数字以外'(_). 数字('0'). 数字('1'). 数字('2'). 数字('3'). 数字('4'). 数字('5'). 数字('6'). 数字('7'). 数字('8'). 数字('9'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/697 # # [1] 授業単元:プログラミング言語 # [2] 問題文: ../test/read.cgi/tech/1301553333/693 # # strSrcの文字列を逆にして,strDstに書き込むプログラムを作成してください. #  ただし,文字列の操作にはポインタ変数strDst, strSrc, pC, pDを用いることとし,strSrc[i] のような配列操作は用いないこととします. #  また,配列strSrc[]の1つ前の番地に0が入っていることを前提としないプログラムにしてください. # # http://ime.nu/codepad.org/V7e6qsPC % 文字列をアトムと解釈する 'strSrcの文字列を逆にして,strDstに書き込む'(_strSrc,_strDst) :- atom_chars(_strSrc,Chars), 'strSrcの文字列を逆にして,strDstに書き込む'(Chars1,[],Chars2), atom_chars(_strDst). 'strSrcの文字列を逆にして,strDstに書き込む'([],Chars,Chars). 'strSrcの文字列を逆にして,strDstに書き込む'([_文字|R1],Chars2,Chars) :- !. 'strSrcの文字列を逆にして,strDstに書き込む'(R1,[_文字|Chars2],Chars). % 以下のサイトは # 出典:: 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/69 # # 文字列を最初と最後から交互に入れ替える暗号プログラムを作ろうとしていますが上手く行きません # 例「hello」→「holel」 # # #include<stdio.h> # #include<string.h> # # int main(void){ # char str[80];char str2[80]; # int i,j,k=0; # printf("文字列を入力してください"); # gets(str); # j=strlen(str); # for(i=0;i<strlen(str);i++){ # if(!i%2) # str2[i]=str[k++]; # else # str2[i]=str[j--]; # } # printf(str2); # # return 0; # } # # 文字列を最初と最後から交互に入れ替える :- get_line(_文字列), atom_chars(_文字列,Chars), ならびの最初と最後から交互に取り出す(Chars,L), atom_chars(_暗号文字列,L), writef('%t\n',[_暗号文字列]). ならびの最初と最後から交互に取り出す([],[]) :- !. ならびの最初と最後から交互に取り出す([A],[A]) :- !. ならびの最初と最後から交互に取り出す(L,[A,B|R2]) :- append([A|R],[B],L), ならびの最初と最後から交互に取り出す(R,R2). % 以下のサイトは # モジュラス10ウェイト3 モジュラス10ウェイト3(_数字列,_冗長符号) :- atom_chars(_数字列,_数字ならび), モジュラス10ウェイト3重み付けならびの生成(_数字ならび,[],_重み付けならび), モジュラス10ウェイト3(_数字ならび,_重み付けならび,0,_冗長符号). モジュラス10ウェイト3([],[],S,_冗長符号) :- _冗長符号整数 is 10 - (S mod 10), number_chars(_冗長符号整数,[_冗長符号]),!. モジュラス10ウェイト3([A|R1],[M|R2],S1,_冗長符号) :- atom_number(A,N), S2 is S1 + N * M, モジュラス10ウェイト3(R1,R2,S2,_冗長符号),!. モジュラス10ウェイト3重み付けならびの生成([],L,L) :- !. モジュラス10ウェイト3重み付けならびの生成([_],L,[3|L]) :- !. モジュラス10ウェイト3重み付けならびの生成([_,_|R1],L1,L) :- モジュラス10ウェイト3重み付けならびの生成(R1,[1,3|L1],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/9 # # どなたかご教授ください・・・ # ●正規表現の使用環境 # EmEditor # # ●検索か置換か? # 置換 # # ●説明 # 鍵カッコ内の文字列と前方の文字列を入れ替えたい。 # # ●対象データ # AAA「BBB」/CCC「DDD」/EEE「FFF」…YYY「ZZZ」 # # ●希望する結果 # BBB「AAA」/DDD「CCC」/FFF「EEE」…ZZZ「YYY」 # # 鍵カッコ内の文字列と前方の文字列を入れ替えたい。(_文字列,_置換された文字列) :- 置換部分の確定(_文字列,S1,S2,S3,R1,R2,R3,_前文字列,_後文字列), 鍵カッコ内の文字列と前方の文字列を入れ替えたい。(_後文字列,_置換された文字列の二), concat_atom([_前文字列,_置換された文字列の二],_置換された文字列),!. 鍵カッコ内の文字列と前方の文字列を入れ替えたい。(_文字列,_文字列) :- !. 置換部分の確定(_文字列,S1,S2,S3,R1,R2,R3,_前文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,[/|R1],[「|R2],[」|R3]), \+(append(_,[」|_],R1), append([/|R2],[「|R1],[」],L0), atom_chars(_前文字列,L0), atom_chars(_後文字列,R3),!. 置換部分の確定(_文字列,S1,S2,S3,R1,R2,R3,_前文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[「|R2],[」|R3]), \+(append(_,[」|_],R1), append(R2,[「|L1],[」],L0), atom_chars(_前文字列,L0), atom_chars(_後文字列,R3),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1276873238/534 # # テキストボックスに # A222BあああA555BえええAおおおB55A454B # と入っていたとします。 # この文字列の # AとBとその間の文字を1セットにして、AとBの間の文字に5が入っていたときだけ、AとBを削除する # # このようなロジックをつくっていただけないでしょうか? # 'AとBとその間の文字を1セットにして、AとBの間の文字に5が入っていたときだけ、AとBを削除する'(_文字列,_削除された文字列) :- atom_chars(_文字列,Chars), '間に5を含むAとBを削除する'(Chars,Chars2), atom_chars(_削除された文字列,Chars2). '間に5を含むAとBを削除する'([],[]) :- !. '間に5を含むAとBを削除する'(['A'|R1],L) :- 最初に現れるBの間に5が存在する(R1,L0,R2), '間に5を含むAとBを削除する'(R2,L2), append(L0,L2,L),!. '間に5を含むAとBを削除する'([_文字|R1],[_文字|R2]) :- '間に5を含むAとBを削除する'(R1,R2). 最初に現れるBの間に5が存在する(R1,L0,L2) :- append(L0,['B'|L2],R1),!, \+(append(_,['A'|_],L0)), append(_,['5'|_],L0),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/921 # # <p>text</p> を <h3>text</h3> に変換したいんです。 # # ただし text がない<p></p>はそのままで。 # # '/<p>(.+?)<\/p>/is', '<h3>$1</h3>' # # ここから進まない… 助けて # % % 最初から順に変換していく非決定性の述語とすべてを一気に変換してしまう決定性の述語の両例を示す。 %%%%%% 最初から順に変換していく。以前に変換された部分が変換前の状態に戻ることがないように注意する %%%%% '

text

text

に変換したい'(_文字列,_変換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['<',p,'>'|R2],L3), append(L22,['<','/',p'>'],R2), \+(append(_,['<',p,'>'|_],L22)), \+(append(_,['<',/,p,'>'|_],L22)), \+(L22=[]), append(L1,['<',h,3,'>'|L22],['<','/',h,3,'>'|L3],L4), atom_chars(_変換された文字列,L4). '

text

text

に変換したい'(_文字列,_変換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['<',p,'>'|R2],L3), append(L22,['<','/',p'>'],R2), \+(append(_,['<',p,'>'|_],L22)), \+(append(_,['<',/,p,'>'|_],L22)), \+(L22=[]), append(L1,['<',h,3,'>'|L22],['<','/',h,3,'>'],L4), atom_chars(_変換された文字列1,L4). '

text

text

に変換したい'(S3,_変換された文字列2), concat_atom([_変換された文字列1,_変換された文字列2],_変換された文字列),!. '

text

text

に変換したい'(_文字列,_文字列). %%%%%%%%%%%%%%%%%%%% 全体を一気に変換してしまう決定性の述語 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '

text

text

に変換したい(全置換)'(_文字列,_変換された文字列) :- '文字列の中の

text

text

に変換し、変換部分までのならびとする'(_文字列,L), concat_atom(L,_変換された文字列). '

text

text

に変換し、変換部分までのならびとする'(_文字列,[_変換された文字列|R]) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['<',p,'>'|R2],L3), append(L22,['<','/',p'>'],R2), \+(append(_,['<',p,'>'|_],L22)), \+(append(_,['<',/,p,'>'|_],L22)), \+(L22=[]), append(L1,['<',h,3,'>'|L22],['<','/',h,3,'>'],L4), atom_chars(_変換された文字列,L4), '

text

text

に変換部分までのならびとする'(S3,R),!. '

text

text

に変換し、変換部分までのならびとする'(_文字列,[_文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/889 # # 例えばダブルクォーテーションで括った部分が文字列とする場合は # 単に/"[^"]*"/でマッチできるけど、文字列以外の部分をマッチさせるには # どうすればいい # 例えばダブルクォーテーションで括った部分が文字列とする場合に、文字列以外の部分をマッチさせる('',[]) :- !. 例えばダブルクォーテーションで括った部分が文字列とする場合に、文字列以外の部分をマッチさせる(_文字列,[S1|R]) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['"'|R2],['"'|R3]), \+(append(_,['"'|_],R2)), atom_chars(S4,R3), 例えばダブルクォーテーションで括った部分が文字列とする場合に、文字列以外の部分をマッチさせる(S4,R),!. 例えばダブルクォーテーションで括った部分が文字列とする場合に、文字列以外の部分をマッチさせる(_文字列,[_文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/534 # # [1] 授業単元:プログラミング演習 # [2] 問題文:以下の関数を作成する。 # void zeroSuppres(char *src, char *dst, char flg) # src=元の文字列、dst=格納先 # flg = 0ならば # srcが"00000456"ならdstには"456" # srcが"00.0456"ならdstには"0.0456" # srcが"000000000"ならdstには"0" # srcが"000560.000"ならdstには"560.000" # srcが"000C560.000"ならdstには"0"←数字以外の文字出現 # srcが"000.0B560000"ならdstには"0.0"←数字以外の文字出現 # が格納される。 # flg = 1ならば # srcが"00000456"ならdstには"\0\0\0\0\0456" # srcが"00.0456"ならdstには"\00.0456" # srcが"000000000"ならdstには"\0\0\0\0\0\0\0\00" # srcが"000560.000"ならdstには"\0\0\0560.000" # srcが"000C560.000"ならdstには"\0\00"←数字以外の文字出現 # srcが"000.5C60000"ならdstには"\0\00.5"←数字以外の文字出現 # が格納される # '_flgの指示に従って第二引数_srcを_dstに変換する'(_flg,_src,_dst) :- atom_chars(_src,L1), 先頭からの0を取り除く(_flg,L1,L2), concat_atom(L2,_dst),!. 先頭からの0を取り除く(_,['0'],['0']) :- !. 先頭からの0を取り除く(_,[A|R1],[A|L0]) :- append(_,[A|_],['1','2','3','4','5','6','7','8','9']), append(L0,L1,R1), 数字以外要素の出現(L1),!. 先頭からの0を取り除く(_,[A|R1],[A|R1]) :- append(_,[A|_],['1','2','3','4','5','6','7','8','9']),!. 先頭からの0を取り除く(_,['.'|R1],['0','.'|L0]) :- append(L0,L1,R1), 数字以外文字の出現(L1),!. 先頭からの0を取り除く(_,['.'|R1],['0','.'|R1]) :- !. 先頭からの0を取り除く(0,L,['0']) :- 数字以外文字の出現(L),!. 先頭からの0を取り除く(1,[A|R],[A|R]) :- 数字以外文字の出現([A|R]),!. 先頭からの0を取り除く(0,['0'|R1],R2) :- 先頭からの0を取り除く(R1,R2). 先頭からの0を取り除く(1,['0'|R1],['\\','0'|R2]) :- 先頭からの0を取り除く(R1,R2). 数字以外文字の出現([A|_]) :- \+(append(_,[A|_],['0','1','2','3','4','5','6','7','8','9'])),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/702 # # 次の正規表現でhogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換しております。 # # RewriteRule ^/hoge(.*)/(.*).html$ http://ime.nu/example.com/hoge/$1/i/$2.html [L] # # # # 下記のような場合は問題ないのですが # # http://ime.nu/example.com/hoge → http://ime.nu/example.com/hoge/i/ # http://ime.nu/example.com/hoge/saitama/2011/01/index.html → http://ime.nu/example.com/hoge/saitama/2011/01/i/index.html # # # # ↓のようにhogeで始まるディレクトリまでも変換されてしまいます。 # http://ime.nu/example.com/hogehoge/kankeinai.html # # hogeフォルダ配下のみ変換されるようにするには、どうしたらいいでしょうか? # # 環境は # CentOS5 # Apache2 # # # 'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :- sud_atom(_文字列,_,_,_,S1,'/hoge',S3,L1,L2,L3), L3=[], concat_atom([S1,S2,'/i/'],_変換された文字列),!. 'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :- sud_atom(_文字列,_,_,_,S1,'/hoge',S3,L1,L2,[' '|R3]), concat_atom([S1,S2,'/i/',S3],_変換された文字列),!. 'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :- sud_atom(_文字列,_,_,_,S1,'/hoge/',S3,L1,L2,[' '|R3]), concat_atom([S1,S2,'i/',S3],_変換された文字列),!. 'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :- sud_atom(_文字列,_,_,_,S1,'/hoge/',S3,L1,L2,L3), '最後の「/」の後に「i/」が挟まるように'(S3,S4), concat_atom([S1,S2,S4],_変換された文字列). '最後の「/」の後に「i/」が挟まるように'(S1,S2) :- atom_chars(S1,L), append(L0,['/'|R],L), \+(append(_,[' '|_],L0)), \+(append(_,['/'|_],R)), append(L0,['/i/'|R],L2), atom_chars(S2,L2),!. '最後の「/」の後に「i/」が挟まるように'(S1,S2) :- concat_atom(['i/',S1],S2),). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/828 # # 質問です # <html><body>abcdefg</body></html>のように間に挟まれたabcdefgだけを取り出すには # やはり # <html><body>(?<label>(\\w+))</body></html> # のようにグループ化を行って後から # Groups["label"].Valueで取り出すのがスマートな方法ですか? # # C#です # # 実際はもっと長い文字列から抽出します # 何かもっといいアイディアがありましたらご教授願います # # 'ある文字パターンに挟まれた副文字列'(_文字列,_直前にある副文字列,_直後にある文字列,_前文字列,_検索語,_後文字列) :- atom_chars(_直前にある副文字列,Chars1), atom_chars(_直後にある副文字列,Chars2), sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(Chars1,L11,Chars2,L1), concat_atom(L11,_検索語), concat_atom([S1,_直前にある副文字列],_前文字列), concat_atom([_直後にある副文字列,S3],_後文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/802 # # Abc_def, Ghi_jkl ,Mno_pqr # という文章を、 # AbcDef, GhiJkl ,MnoPqr # に変えたいのですが、どのような正規表現を書けばいいでしょうか? # # 'Abc_def, Ghi_jkl ,Mno_pqr という文章を、AbcDef, GhiJkl ,MnoPqr に変える'(_文字列,_変換された文字列) :- atom_chars(_文字列,Chars), 変換(Chars,Chars2), atom_chars(_変換された文字列,Chars2). 変換([],[]) :- !. 変換(['_',A|R1],[B|R2]) :- to_upper(A,B), 変換(R1,R2),!. 変換([A|R1],[A|R2]) :- 変換(R1,R2). % 以下のサイトは # C#,C#の宿題片付けます。#699 # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク): # 1.acをabbに置き換える最小のレーヴェンシュタイン距離を求めよ # 2.1をもとにdiffツールを作成せよ。なお、出力時の形式は以下のとおりとする # ac # ^ # # abb # || # レーベンシュタイン距離(_文字列1,_文字列2,_レーベンシュタイン距離) :- 編集距離(_文字列1,_文字列2,_レーベンシュタイン距離). 編集距離(S1,S2,_編集距離) :- atom_chars(S1,LX), atom_chars(S2,LY), ならびの編集距離(LX,LY,Len), length(Len,_編集距離),!. ならびの編集距離([],LY,LY). ならびの編集距離(LX,[],LX). ならびの編集距離(LX,LY,Len) :- append(L0,L1,L2,LX), \+(L1 = []), append(L01,L1,L21,LY), append(L01,L21,LYR), append(L0,Len1,Len), ならびの編集距離(L2,LYR,Len1). ならびの編集距離(LX,LY,LZ) :- append(LX,LY,LZ). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 145代目 #910 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):"a,B,C,d,E"という文字列がある。文字列中の大文字を小文字に、 #                 小文字を大文字に変換させた文字列を表示するプログラムを作りなさい。 # '"a,B,C,d,E"という文字列がある。文字列中の大文字を小文字に、小文字を大文字に変換させた文字列を表示する' :- '"a,B,C,d,E"という文字列がある。文字列中の大文字を小文字に、小文字を大文字に変換させた文字列を'(_変換させた文字列), 表示する(_変換させた文字列). '"a,B,C,d,E"という文字列がある。文字列中の大文字を小文字に、小文字を大文字に変換させた文字列を'(_変換させた文字列) :- findall(_変換させた文字,( '"a,B,C,d,E"という文字列がある。文字列中の大文字を小文字に、小文字を大文字に変換させた文字'(_変換させた文字)),_変換させた文字ならび), atom_chars(_変換させた文字列,_変換させた文字ならび). '"a,B,C,d,E"という文字列がある。文字列中の大文字を小文字に、小文字を大文字に変換させた文字'(_変換させた文字) :- sub_atom(aBCdE,_,1,_,_文字), '大文字を小文字に、小文字を大文字に変換'(_文字,_変換させた文字). '大文字を小文字に、小文字を大文字に変換'(A,B) :- '大文字・小文字'(A,B),\+(A==B),!. '大文字を小文字に、小文字を大文字に変換'(A,B) :- '大文字・小文字'(B,A). '大文字・小文字'('A',a) :- !. '大文字・小文字'('B',b) :- !. '大文字・小文字'('C',c) :- !. '大文字・小文字'('D',d) :- !. '大文字・小文字'('E',e) :- !. '大文字・小文字'('F',f) :- !. '大文字・小文字'('G',g) :- !. '大文字・小文字'('H',h) :- !. '大文字・小文字'('I',i) :- !. '大文字・小文字'('J',j) :- !. '大文字・小文字'('K',k) :- !. '大文字・小文字'('L',l) :- !. '大文字・小文字'('M',m) :- !. '大文字・小文字'('N',n) :- !. '大文字・小文字'('O',o) :- !. '大文字・小文字'('P',p) :- !. '大文字・小文字'('Q',q) :- !. '大文字・小文字'('R',r) :- !. '大文字・小文字'('S',s) :- !. '大文字・小文字'('T',t) :- !. '大文字・小文字'('U',u) :- !. '大文字・小文字'('V',v) :- !. '大文字・小文字'('W',w) :- !. '大文字・小文字'('X',x) :- !. '大文字・小文字'('Y',y) :- !. '大文字・小文字'('Z',z) :- !. '大文字・小文字'(X,X). 表示する(_変換させた文字列) :- writef('%t\n',[_変換させた文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/890 # # [1] 授業単元:プログラミングB # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1384922.txt.html # # 問.構造体を使ったアドレス帳プログラムを以下の条件で作成せよ。 # ・名前(全角10文字以内)読み(半角アルファベット・ローマ字・半角30文字以内) # メールアドレス(半角30文字以内)電話番号(半角13文字以内) # ・10人以上の登録が可能 # ・データの一覧表示が可能 # # (本当に初心者で申し訳ありませんがどうぞよろしくお願いいたしますorz) アドレス帳(登録) :- 名前を得る(_名前), 読みを得る(_名前,_読み), メールアドレスを得る(_メールアドレス), 電話番号を得る(_電話番号), assertz(アドレス帳(_名前,_読み,_アドレス,_電話番号)). アドレス帳(一覧表示) :- write('%30sアドレス一覧表\n'), write_formatted('%20s %30s %30s %13s\n',[名前,読み,メールアドレス,電話番号]), アドレス帳(_名前,_読み,_アドレス), write_formatted('%20s %30s %30s %13s\n',[_名前,_読み,_メールアドレス,_電話番号]), fail. アドレス帳(一覧表示). 名前を得る(_名前) :- write('名前を 全角10文字以内 で入力してください : '), get_line(Line), 名前を得る診断(Line,_名前),!. 名前を得る(_名前) :- 名前を得る(_名前). 名前を得る診断(_名前,_名前) :- atom_length(_名前,_文字列の長さ), _文字列の長さ =< 10,!. 名前を得る診断(Line,_) :- write_formatted('%t は文字数が大きすぎます。再入力をお願いします。\n',[Line]), fail. 読みを得る(_読み) :- write('読みを 半角アルファベット・ローマ字・半角30文字以内 で入力してください : '), get_line(Line), 読みを得る診断(Line,_読み),!. 読みを得る(_読み) :- 読みを得る(_読み). 読みを得る診断(Line,_読み) :- すべてが半角アルファベット・ローマ字・半角文字(Line), 文字列の長さがn文字以内(Line,30),!. すべてが半角アルファベット・ローマ字・半角文字(Line) :- atom_chars(Line,Codes), すべてのコードが127以下(Codes). すべてが半角アルファベット・ローマ字・半角文字(Line) :- write_formatted('入力された %t には半角文字以外の文字があります\n',[Line]), fail. すべてのコードが127以下([]) :- !. すべてのコードが127以下([Code|R]) :- Code >= 32, Code =< 127, すべてのコードが127以下(R). 文字列の長さがn文字以内(Line,_n) :- atom_length(Line,_長さ), _長さ =< _n,!. 文字列の長さがn文字以内(Line) :- write_formatted('入力された %t は文字数が%tを越えています\n',[Line,_n]), fail. メールアドレスを得る(_読み) :- write('メールアドレスを 半角アルファベット・ローマ字・30文字以内 で入力してください : '), get_line(Line), メールアドレス診断(Line,_読み),!. メールアドレスを得る(_読み) :- メールアドレスを得る(_読み). メールアドレス診断(Line,_読み) :- すべてが半角アルファベット・ローマ字・半角文字(Line), 文字列の長さがn文字以内(Line,30),!. 電話番号を得る(_読み) :- write('電話番号を 半角13文字以内 で入力してください : '), get_line(Line), 電話番号診断(Line,_読み),!. 電話番号を得る(_読み) :- 電話番号を得る(_読み). 電話番号診断(Line,_読み) :- すべてが半角数字かハイフン(Line), 文字列の長さがn文字以内(Line,13),!. すべてが半角数字かハイフン(Line) :- atom_chars(Line,Chars), 半角数字・ハイフン(Chars),!. すべてが半角数字かハイフン(Line) :- write_formatted('%t に半角数字とハイフン以外の文字が混入しています\n',[Line]), fail. 半角数字・ハイフン([]) :- !. 半角数字・ハイフン(['-'|R]) :- 半角数字・ハイフン(R),!. 半角数字・ハイフン([A|R]) :- A @>= '0', A @=< '9', 半角数字・ハイフン(R),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/775 # # 『プリンターがあります。これはプリンタです。プリンタを使います。プリンターの変更です。』 # という文がある時、文中のプリンタをプリンターになおすにはどのような正規表現を # 用いればよいでしょうか? # '『プリンターがあります。これはプリンタです。プリンタを使います。プリンターの変更です。』という文がある時、文中のプリンタをプリンターになおす' :- atom_chars('プリンターがあります。これはプリンタです。プリンタを使います。プリンターの変更です。',Chars1), 'プリンタをプリンターに変換'(Chars1,Chars2), atom_chars(_変換した文字列,Chars2). 'プリンタをプリンターに変換'([],[]) :- !. 'プリンタをプリンターに変換'([プ,リ,ン,タ,ー|R1],[プ,リ,ン,タ,ー|R2]) :- 'プリンタをプリンターに変換'(R1,R2),!. 'プリンタをプリンターに変換'([プ,リ,ン,タ|R1],[プ,リ,ン,タ,ー|R2]) :- 'プリンタをプリンターに変換'(R1,R2),!. 'プリンタをプリンターに変換'([A|R1],[A|R2]) :- 'プリンタをプリンターに変換'(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/277 # # [1] 授業単元:プログラミング言語(C) # [2] 問題文(含コード&リンク): # Cプログラミングの基礎[新訂版]発行:サイエンス社 著:蓑原隆より # P48 3.1 3.2 3.3 3.4 P55 4.1 P88 5.1 P104 6.1 6.2 # http://ime.nu/upload.jpn.ph/upload/img/u72273.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72276.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72274.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72275.jpg # # 6.2 2つの文字列を読み込み、アルファベットの部分については、 # 大文字小文字を区別しないで比較したときに同じ文字列かどうか # 判定するプログラムを作成せよ。 # 例 "js1rnc" "JS1RNC" ならば同じ。 '2つの文字列を読み込み、アルファベットの部分については、大文字小文字を区別しないで比較したときに同じ文字列かどうか判定する' :- '2つの文字列を読み込み'(_文字列1,_文字列2), atom_codes(_文字列1,Codes1), atom_chars(_文字列2,Codes2), 小文字コードを大文字コードに変換(Codes1,Codes), 小文字コードを大文字コードに変換(Codes2,Codes). 小文字コードを大文字コードに変換([],[]) :- !. 小文字コードを大文字コードに変換([Code1|R1],[Code2|R1]) :- !. Code1 >= 97, Code1 =< 122, Code2 is Code1 - 32, 小文字コードを大文字コードに変換(R1,R2),!. 小文字コードを大文字コードに変換([Code|R1],[Code|R1]) :- 小文字コードを大文字コードに変換(R1,R2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/277 # # [1] 授業単元:プログラミング言語(C) # [2] 問題文(含コード&リンク): # Cプログラミングの基礎[新訂版]発行:サイエンス社 著:蓑原隆より # P48 3.1 3.2 3.3 3.4 P55 4.1 P88 5.1 P104 6.1 6.2 # http://ime.nu/upload.jpn.ph/upload/img/u72273.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72276.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72274.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72275.jpg # # 6.1 文字列を読み込みその長さを表示するプログラムをstrlen関数を # 使わずに作成せよ。 文字列を読み込みその長さをsub_atomを使わずに表示する :- write('文字列を入力ししてください : '), get_line(_文字列), atom_chars(_文字列,Chars), length(Chars,_長さ), write_formatted('入力された文字列の長さは %t です\n',[_長さ]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/721 # # 【課題】Studentというクラスを宣言するプログラムを作成せよ。インスタンス変数には、氏名、生年月日、学籍番号を記録せよ。 # ただし、学籍番号は入学年度を表す二桁の整数、学部を表す一桁の整数、残り四桁の整数を組み合わせた七桁の整数で表現されるものとする。 # インスタンスメソッドとしては、以下のものは必須とする。 # 名字を返すメソッド、名前を返すメソッド、誕生年を和暦で返すメソッド、誕生年を西暦で返すメソッド、入学年度を返すメソッド # 【形態】1. Javaアプリケーション # 【期限】1月11日 # 【ver】linux # 【補足】あまり難しくしないでください。 # データベース構造(学生,1,氏名). データベース構造(学生,2,誕生日). データベース構造(学生,3,学籍番号). 名字を返す(_学籍番号,_名字) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), split(_氏名,[' ',',','-','_'],[_名字,_]). 名前を返す(_学籍番号,_名前) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), split(_氏名,[' ',',','-','_'],[_,_名前]). 誕生年を和暦で返す(_学籍番号,_誕生日の和暦) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), 和暦西暦変換(_誕生日の和暦,_誕生日). 誕生年を西暦で返す(_学籍番号,_誕生日の西暦) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日の西暦,_整数学籍番号). 入学年度を返す(_学籍番号,_入学年度) :- 学籍番号変換(_学籍番号,_整数学籍番号), _入学年度 is _整数学籍番号 // 10000. 学籍番号変換(_学籍番号,_学籍番号) :- integer(_学籍番号),!. 学籍番号変換(_学籍番号,_整数学籍番号) :- \+(integer(_学籍番号)), atom_chars(_学籍番号,Chars), すべてが数字(Chars), atom_to_term(_学籍番号,_整数学籍番号,_),!. 学籍番号変換(_学籍番号ではなくて氏名,_整数学籍番号) :- atom(_学籍番号ではなくて氏名), 学生(_学籍番号ではなくて氏名,_,_整数学籍番号),!. すべてが数字([]) :- !. すべてが数字([A|R]) :- append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']), すべてが数字(R). % 以下のサイトは # 出典:: 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/php/1168450843/555 # #  /身長:(\d+)\n体重:(\d+)/ # という正規表現に対し、例えば #  "身長:175\n体重:67" # という文字列がきたら #  "身長:<font color="red">175</font>\n体重:<font color="blue">67</font>" # のようにHTMLタグを追加したい。 # # ただし #  "身長:100\n体重:100" # のように身長と体重が同じ場合も身長は赤、体重は青にしたい。 # # もっと欲をいえば正規表現は身長・体重だけでなく #  /年齢:(\d+)\n好きな食べ物:(\S+)/ # のように可変にしたい。 # # # 'A:Va\nB:Vb 形式のデータから A: VaB: color="青">Vb
のようにHTMLタグを追加したい。ただし、Va=Vbのときはカラーを赤、青としたい'(_属性1,_属性2,Lines1,Lines2) :- atom_chars(_属性1,_属性文字ならび1), atom_chars(_属性2,_属性文字ならび2), findall(Line2,( append(_,[Line1|_],Lines1), sub_atom(Line1,_,_,_,S1,S2,S3,L1,L2,L3), append(_属性文字ならび1,[':',' '|R22],L2), append(_属性文字ならび2,[':',' '|R33],L3), concat_atom(R22,Va), append(L0,[A|R4],R33), concat_atom(L0,Vb), \+(append(_,[A|_],['0','1','2','3','4','5','6','7','8','9'])), concat_atom([S1,_属性1,': ',Va,'',_属性2,': ',Vb,''],Line2)), Lines2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/547 # # PHP5で、$txtに格納された # # <a href="javascript:userid('123456');">テキスト</a> # ※「123456」と「テキスト」は変化します # # といった並びの文字列からタグをぬいて # # 123456,テキスト, # # とカンマ区切りにしたいのですが、何か良い方法はないでしょうか # # '<a href="javascript:userid(''123456'');">テキスト</a>といった並びの文字列からタグをぬいて123456,テキストとカンマ区切りにしたい'(_文字列,_置換された文字列) :- atom_chars('a href="javascript:userid(''',L0), sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(L0,L11,['''',')',';','"',>],L2), すべて数字(L11), atom_chars(S11,L11), append(L03,[<,/,a,>|_],L3), concat_atom(L03,S03), concat_atom([S11,S03],',',_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/525 # # Perlの正規表現で質問させて下さい。 # yyyy/mm/entry-basename/index.php # ↑はどのように記述すればいいのか、お手数ですがご教授願います<(_ _)> # 'yyyy/mm/entry-basename/index.php を検索する'(_文字列,_前文字列,_適合文字列,_後文字列) :- atom_chars('/entry-basename/index.php',Chars1), sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[Y1,Y2,Y3,Y4,/,M1,M2|Chars1],L3), すべて数字([Y1,Y2,Y3,Y4,M1,M2]), append(_,[M1|_],['0','1']), \+((last(L1,A),数字(A))). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/506 # # 下記の2文にあるfontタグを消したいです。 # 正規表現を用いた1度の置換で消せますか? # # <dd><font style="font-size:;color:;"> テスト <br> テスト </font><br><br></dd> # <dd><font style="font-size:;color:;"> テスト2 <br> テスト2 </font><br><br></dd> # # # 考え方として # <dd><font style="font-size:;color:;">がある行のうち</font>を削除し、そのあと<font style="font-size:;color:;">を削除 # これで行けそうかと思ったのですが、●●がある行のうち○○を削除、という正規表現がわかりませんでした・・・ # # 'fontタグのみ削除する'(_文字列,_fontタグが削除された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append([<,f,o,n,t|R1],[>],L2), \+(append(_,[>|_],R2)), append(L3_0,[<,/,f,o,n,t,>|R3],L3), \+(append(_,[<,/,f,o,n,t,>|_],L3_0)), append(L1,L3_0,R3,L4), atom_chars(_fontタグが削除された文字列,L4). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/480 # # phpのクラスファイルの特定の関数を正規表現で抜き出したいのですが可能でしょうか? # # 例 class.test.php から public function test($a){ 本文 } # # スケルトンコードの場合簡単に抜き出せるのですが、 # 本文中にif,swichなどで } が存在した場合どうすれば良いのか悩んでいます。 # # 'function定義で{ } で括られた本文を取り出す。本文中にif,swichなどで } が存在した場合どうするか'(_文字列,_前文字列,_本文,_後文字列) :- atom_chars(_文字列,Chars), append(L0,[f,u,n,c,t,i,o,n,' '|R1],['{'|R2],Chars), \+(append(_,['{'|_],R1)), 括弧が閉じられるまで切り取る(R2,L,R3), append([_],L1,[_],L11), concat_atom(L11,_本文), concat_atom(['}'|R3],_後文字列), append(L0,[f,u,n,c,t,i,o,n,' '|R1],['{'],L01), concat_atom(L01,_前文字列). 括弧が閉じられるまで切り取る(['}'|R],[],['}'|R]) :- !. 括弧が閉じられるまで切り取る(['{'|R1],L,R) :- 括弧が閉じられるまで切り取る(R1,L1,['}'|R2]), 括弧が閉じられるまで切り取る(R2,L2,R), append(['{'|L1],['}'|L2],L),!. 括弧が閉じられるまで切り取る([A|R1],[A|R2],R) :- 括弧が閉じられるまで切り取る(R1,R2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/425 # # Jeditで # 【あいう】を【6あいう】 # 【かき】を【4かき】 # のように【 】でははさまれた文字列の頭に文字数×2の数値を追加したいのですが # どのように検索してどのように置換すればよいでしょうか? # 【 】ではさまれた文字数はまちまちです。 # よろしくお願いします。 # '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加したいのですがどのように検索してどのように置換すればよいか'(_文字列,_置換された文字列) :- atom_chars(_文字列,Chars), '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(Chars,L), concat_atom(L,_置換された文字列). '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(Chars,[S|R]) :- append(L0,['['|R1],[']'|R2],Chars), \+(append(_,['['|_],R1)), \+(append(_,[']'|_],R1)), length(R0,Len), Len2 is Len * 2, append(L0,['[',Len2|R0],[']'],L3), concat_atom(L3,S), '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(R2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/933 # # # * # ** # *** # **** # ***** # ****** # ******* # ******** # ********* # ********** # # こんな感じで表示したいんだけど、どうすればいいの? # '*\n**\n***\n****\n*****\n******\n*******\n********\n*********\n********** \n\nこんな感じで表示したいんだけど、どうすればいいの?' :- atom_chars(**********,L), append([*|R0],R,L), concat_atom([*|R0],S), write_formatted('%t\n',[S]), R = []. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '*\n**\n***\n****\n*****\n******\n*******\n********\n*********\n********** \n\nこんな感じで表示したいんだけど、どうすればいいの?' :- 'こんな感じで表示したいんだけど、どうすればいいの?'(''). 'こんな感じで表示したいんだけど、どうすればいいの?'('**********') :- !. 'こんな感じで表示したいんだけど、どうすればいいの?'(_星列) :- atom_concat(_星列,*,_星列の二), write_formatted('%t\n',[_星列の二]), 'こんな感じで表示したいんだけど、どうすればいいの?'(_星列の二). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/924 # # [1] 授業単元:C言語 関数 # [2] 問題文(含コード&リンク): http://ime.nu/www.dotup.org/uploda/www.dotup.org1330457.txt # # 8桁までの整数を表わす文字列(例: "-3246") を整数値(例:3246) に変換する関数を作りたい。 # # 1. 整数を表わす文字列はつぎの条件を全て同時に満たすと考えられる。 # (1) 文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である # (2) 文字列の2 文字目以降は’0’〜’9’ である # (3) 符号を除いた文字列の長さは1 以上8 以下である # # 文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時 # (整数として文字列にエラーがある場合)は0を戻り値として返す関数check() を作れ。 # # 2. 変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、 # 負の時には-1を、整数として文字列にエラーがある場合には0 を返す関数sign() を作れ。 # # 3. 問1, 2 を利用し8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す関数 # myatoi() を作成せよ '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(_文字列,_整数値) :- '文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時は0を戻り値として返す'(_文字列,_診断値), '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、負の時には-1を、整数として文字列にエラーがある場合には0 を返す'(_文字列,_返り値), atom_chars(_文字列,Chars), '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(Chars,_診断値,_返り値,0,_整数値の一), _整数値 is _整数値の一 * _返り値. '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'([A],_診断値,_返り値,Y,X) :- 文字数値変換(A,N), X is 10 * Y + N,!. '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(['+'|R],_診断値,_返り値,Y,X) :- '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(R,_診断値,_返り値,Y,X),!. '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(['-'|R],_診断値,_返り値,Y,X) :- '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(R,_診断値,_返り値,Y,X),!. '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'([A|R],_診断値,_返り値,Y,X) :- 文字数値変換(A,N), Y2 is 10 * Y + N, '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(R,_診断値,_返り値,Y2,X). '文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時は0を戻り値として返す'(_文字列,_診断値) :- sub_atom(_文字列,0,1,R,_符号), append(_,[_符号|_],['+','-']), \+(R = 0), count(( sub_atom(_文字列,St,1,_,A), St >= 1, \+(文字数値変換(A,_))),0), _診断値 = 1,!. '文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時は0を戻り値として返す'(_文字列,0). '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、負の時には-1を、整数として文字列にエラーがある場合には0 を返す'(_文字列,-1) :- sub_atom(_文字列,0,1,_,'-'),!. '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、負の時には-1を、整数として文字列にエラーがある場合には0 を返す'(_文字列,1). 文字数値変換('0',0). 文字数値変換('1',1). 文字数値変換('2',2). 文字数値変換('3',3). 文字数値変換('4',4). 文字数値変換('5',5). 文字数値変換('6',6). 文字数値変換('7',7). 文字数値変換('8',8). 文字数値変換('9',9). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/224 # # 「あいうえおABC+F481ABC+F485かきくけこABC+F7A5さしすせそABC+F3F0ABC+F39EたちつてとABC+F65AなにぬねのABC+F485ABC+F7A5はひふへほABC+F7A5ABC+F39Eまみむめも」 # # 上記の中に、「ABC+16進数x2回」がいくつ含まれているかをPHPの正規表現で表すにはどうかけばよろしいでしょうか? # ご鞭撻よろしくお願いいたします。 # '文字列の中に「ABC+16進数x2回」がいくつ含まれているか'(_文字列,_いくつ) :- atom_chars(_文字列,Chars), 'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'(Chars,[],Ln), length(Ln,_いくつ). 'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'([],Ln,Ln) :- !. 'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'(['A','B','C','+',X1,X2,X3,X4|R1],Ln1,Ln) :- すべて16進数文字([X1,X2,X3,X4]), 'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'(Ln,R1,[_|Ln1]). 'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'([_|R1],Ln1,Ln) :- 'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'(R1,Ln1,Ln). すべて16進数文字([]) :- !. すべて16進数文字([A|R]) :- member(A,['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']), すべて16進数文字(R). 先頭から16進数文字ならび([],[],[]) :- !. 先頭から16進数文字ならび([A|R1],[A|R2],R) :- member(A,['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']), 先頭から16進数文字ならび(R1,R2,R),!. 先頭から16進数文字ならび(L,[],L). '16進数表示文字ならび'(['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']). % 以下のサイトは # 検索したい字句が存在してもしなくても # マッチさせるにはどうしたらいいのでしょうか? # # おいしい料理1料理の解説1 # 料理の解説2 # # っというタグがあってこれから # # 1行目では、 #  \1 → オムレツ.jpg #  \2 → おいしい料理 #  \3 → 料理の解説1 # 2行目では #  \1 → カツ丼.jpg #  \2 → #  \3 → 料理の解説2 # # というようにしたいのです。 # src="(.*?)".*?alt="(.*?)".*?(.*?) # ↑のような正規表現を考えたのですが # これを2行目にも正しくマッチできるように # 修正していただけませんか? '検索したい字句が存在してもしなくてもマッチさせる'(_文字列,[Atom1,Atom2,Atom3]) :- atom_chars(_文字列,Chars), 'src='(Chars,Atom1,Chars1), 'alt='(Chars1,Atom2,Chars2), ''(Chars2,Atom3,Chars3). 'src='(Chars,Atom,R2) :- append(_,[s,r,c,=,"|R1],['"'|R2],Chars), concat_atom(R1,Atom),!. 'src='(Chars,'',Chars) :- !. 'alt='(Chars,Atom,R2) :- append(_,[a,l,t,=,"|R1],['"'|R2],Chars), concat_atom(R1,Atom),!. 'alt='(Chars,'',Chars) :- !. ''(Chars,Atom,R2) :- append(_,[<,b,>|R1],[<,/,b,>|R2],Chars), concat_atom(R5,Atom),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/437 # # 使用言語はjavascript。 # 独自のタグ(<A#...#A>)が設定されたテキスト行から、このタグを取り除きたい。 # テキスト行中にタグが複数出てくることもあり。 # # 置換前 : あいうえお <A#かきくけこ#A> さしすせそ <A#たちつてと#A> なにぬねの # # 置換後 : あいうえお さしすせそ なにぬねの # # # どうやったらいいですかあああああボスケテーーー!!! # '独自のタグ(<A#...#A>)が設定されたテキスト行から、このタグを取り除きたい。'(_文字列,_独自のタグを取り除いた文字列) :- atom_chars(_文字列,Chars), append(L0,['<','A','#'|R1],['#','A','>'|R2],Chars), append(L0,R2,L2), concat_atom(L2,_独自のタグを取り除いた文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/316 # # ●正規表現の使用環境 # PHP5 # # ●検索か置換か? # 検索 # # ●説明 # [[ と ]] に囲まれた文字列を配列で取得したい # # ●対象データ # [[hare]][[ame]][[kumori]][[yuki]][[]][[kaminari]][[taifuu]] # # ●希望する結果 # matches[0] = hare # matches[1] = ame # matches[2] = kumori # matches[3] = yuki # matches[4] = # matches[5] = kaminari # matches[6] = taifuu # # よろしくお願いします。 # '[[ と ]] に囲まれた文字列をならびとして取得したい'(_文字列,L) :- atom_chars(_文字列,Chars), '文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(Chars,L). '文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(Chars,[_文字列1|R]) :- append(L0,['[','['|R1],[']',']'|R2],Chars), concat_atom(R1,_文字列1), '文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(R2,R),!. '文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(_,[]) :- !. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/724 # # 2回以上続く改行だけ検索したいのですが、どうやっても1回のみの改行も検索してしまいます。 # \r\nを2回ってだけではだめなようで、解決策はありますか? # # '2回以上続く改行だけ検索したい'(_文字列,_検索語より前の文字列,_検索語,_検索語より後の文字列) :- atom_chars(_文字列,Chars), append(L0,['\n'|R],Chars), append(L1,R1,R), \+(R1=['\n'|_]), all(L1,'\n'), concat_atom(L0,_検索語より前の文字列), concat_atom(L1,_検索語), concat_atom(R1,_検索語より後の文字列). '2回以上続く改行だけ検索したい'(_文字列,_検索語より前の文字列,_検索語,_検索語より後の文字列) :- atom_chars(_文字列,Chars), append(L0,['\n'|R],Chars), append(L1,R1,R), \+(R1=['\n'|_]), all(L1,'\n'), concat_atom(L0,_), concat_atom(L1,_), concat_atom(R1,_検索語より後の文字列_1), '2回以上続く改行だけ検索したい'(_検索語より後の文字列_1,_検索語より前の文字列,_検索語,_検索語より後の文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2回以上続く改行だけ検索したい'(Lines,L0,[A|L1],R) :- append(L00,L1,R,Lines), all(L1,''), \+(R=[''|_]), append(L0,[A],L00). '2回以上続く改行だけ検索したい'(Lines,L0,L1,L2) :- append(L00_1,L1_1,R_1,Lines), all(L1_1,''), \+(R_1=[''|_]), append(L0_1,[Line],L00_1), '2回以上続く改行だけ検索したい'(R,L0,L1,L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2回以上続く改行だけ検索したい'(Chars,L0,['\n','\n'],R) :- append(L0,L1,L2,Chars), \+(last(L0,'\n')), \+(list_nth(1,L2,'\n')). '2回以上続く改行だけ検索したい'(Chars,L0,L1,L2) :- append(L00,L11,L22,Chars), all(L11,'\n'), \+(last(L00,'\n')), \+(list_nth(1,L22,'\n')), '2回以上続く改行だけ検索したい'(L22,L0,L1,L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1086272325/751 # # INT_MAXより小さいユニークIDの最も効率のよい生成器は? # 'INT_MAXより小さいユニークIDの最も効率のよい生成器は'(_INT_MAX,_ID) :- 'INT_MAXより小さいユニークIDの最も効率のよい非決定性の生成器は'(_INT_MAX,_ID),!. 'INT_MAXより小さいユニークIDの最も効率のよい非決定性の生成器は'(_INT_MAX,_ID) :- _ID is (random mod (_INT_MAX - 1)) + 1, number_chars(_ID,Chars), atom_chars(Atom,['$'|Chars]), \+(clause(Atom,true)), asserta(Atom). 'INT_MAXより小さいユニークIDの最も効率のよい非決定性の生成器は'(_INT_MAX,_ID) :- 'INT_MAXより小さいユニークIDの最も効率のよい非決定性の生成器は'(_INT_MAX,_ID). 生成器の初期化(_INT_MAX) :- M is _INT_MAX - 1, for(1,N,M), concat_atom['$',N],Atom), retract(Atom), N = M. % 以下のサイトは # 出典:: 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/1291471791/568 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): # 指定した数の文字列をキーボードから入力し、 # 動的に確保した配列に格納し、配列の内容を画面に出力するプログラムを作成しなさい。 # '指定した数の文字列をキーボードから入力し、動的に確保した配列に格納し、配列の内容を画面に出力する' :- 催促付き整数入力('文字列の長さを入力してください : ',_文字列の長さの指定), '指定した数の文字列をキーボードから入力し'(_文字列の長さの指定,_文字列), '動的に確保した配列に格納し、配列の内容を'(_HeapVector,_文字列の長さの指定,_文字列), '画面に出力する'(_HeapVector). '指定した数の文字列をキーボードから入力し'(_文字列の長さの指定,_文字列) :- length(Ln,_文字列の長さの指定), rawmode, 文字列をキーボードから入力し(Ln,L), norawmode, atom_chars(_文字列,L). '動的に確保した配列に格納し、配列の内容を'(_HeapVector,_文字列の長さの指定,_文字列) :- new_heap_vector(_HeapVector,_文字列の長さの指定), sub_atom(_文字列,S,1,R,_文字), char_code(_文字,Code), set_vector_element(_HeapVector,S,Code), R = 0,!. '画面に出力する'(_文字列の長さの指定,_HeapVector) :- M is _文字列の長さの指定 - 1, for(0,N,M), get_vector_element(_HeapVector,N,Code), put_code(Code), N = M,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/456 # # ../test/read.cgi/tech/1291471791/400 IEだと文字化けしてたのではりなおします…(´・ω・`) # # 問題3:キーボードから入力させた長さの同じ文字列2つを1文字ずつ交互に1つの文字配列に格納し表示する # # 'キーボードから入力させた長さの同じ文字列2つを1文字ずつ交互に1つの文字配列に格納し表示する' :- キーボードから入力させた長さの同じ文字列2つを(_文字列1,_文字列2), atom_chars(_文字列1,_文字ならび1), atom_chars(_文字列2,_文字ならび2), '1文字ずつ交互に1つの文字配列に格納し'(_文字ならび1,_文字ならび2,_交互に格納された文字ならび), 表示する(_交互に格納された文字ならび). キーボードから入力させた長さの同じ文字列2つを(_文字列1,_文字列2) :- write('文字列1を入力してください : '), get_line(_文字列1), 長さの同じ文字列を(_長さ,_文字列2),!. 長さの同じ文字列を(_長さ,_文字列2) :- write_formatted('長さ%t文字の文字列2を入力してください : ',[_長さ]), get_line(_文字列2), キーボードから入力させた文字列の長さ診断(_長さ,_文字列2),!. 長さの同じ文字列を(_長さ,_文字列2) :- 長さの同じ文字列を(_長さ,_文字列2). キーボードから入力させた文字列の長さ診断(_長さ,_文字列2) :- length(_文字列2,_長さ),!. キーボードから入力させた文字列の長さ診断(_長さ,_文字列2) :- length(_文字列2,_長さ2), write_formatted('入力された文字列は長さ %t ありました。要求された長さの文字列を再入力してください : '), fail. '1文字ずつ交互に1つの文字配列に格納し'([],[],[]) :- !. '1文字ずつ交互に1つの文字配列に格納し'([_文字1|R1],[_文字2|R2],[_文字1,_文字2|R3]) :- '1文字ずつ交互に1つの文字配列に格納し'(R1,R2,R3). 表示する(_交互に格納された文字ならび) :- atom_chars(_交互に格納された文字列,_交互に格納された文字ならび), write_formatted('%t\n',_交互に格納された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/617 # # 【 課題 】 http://ime.nu/ideone.com/fWVjI # 【 形態 】1. Javaアプリケーション # 【 期限 】本日 # 【 補足 】よろしくお願いします! # # # 1 課題 # 10 進数の自然数を与えて、その数を2 進数から16 進数まで全てについて基数変換するクラスKisu を作成 # する。クラスKisu には、属性、コンストラクタ、setter、getter、その他必要なメソッド、基数変換した結果 # を表示するメソッドを必ず入れること。ただし、getter で基数変換した結果を別の変数に代入し、その変数の # 内容を変更しても、クラスKisu 内の基数変換の内容は変わらないようにする。 #  クラスKisu の例 # class Kisu { # // 属性 # private static final int N = 15; # // 2 進数から16 進数までの数 # private int m; // 基数変換する数 # private String [] kisu1; # // 基数変換した結果を入れる1 次元配列 # private String [][] kisu2; # // 基数変換した結果を入れる2 次元配列 # // コンストラクター # public Kisu() {...} # public Kisu(int m) {...} # // setter # public void setM(int m) { # // 基数変換する数を代入する # } # public void setKisu() { # // 変数m を2 進数から16 進数に変換し、 # // その結果を変数kisu1、kisu2 に代入する # } # // 必要があれば他のメソッドを付け加える # // getter # 1 # public String[] getKisu1() { # // 変数kisu1 を外部の変数に代入する # } # public String[][] getKisu2() { # // 変数kisu2 を外部の変数に代入する # } # // 表示用のメソッド # public void show1() { # // 変数kisu1 の内容を画面に表示する # } # public void show2() { # // 変数kisu2 の内容を画面に表示する # } # } # 2 実行例 # main 関数を # class Rep3 { # public static void main(String[] args){ # Kisu a = new Kisu(); # // 基数変換する数をセットし、変換する # a.setM(12345678); # a.setKisu(); # // main プログラムの変数b に代入し、その変数b # // にでたらめなデータを代入する # String [] b = a.getKisu1(); # int k = b.length; # for(int i=0;i javac Rep3.java # > java Rep3 # 1 次元配列 # 101111000110000101001110 // 2 進数 # 212020020002100      // 3 進数 # 233012011032        // 4 進数 # 11130030203 // 5 進数 # 1120335530 // 6 進数 # 206636142 // 7 進数 # 57060516 // 8 進数 # 25206070 // 9 進数 # 12345678 //10 進数 # 6a72544 //11 進数 # 41745a6 //12 進数 # 2733447 //13 進数 # 18d5222 //14 進数 # 113cea3 //15 進数 # bc614e //16 進数 # 2 次元配列 # 101111000110000101001110 // 2 進数 # 212020020002100      // 3 進数 # 233012011032       // 4 進数 # 11130030203 // 5 進数 # 1120335530 // 6 進数 # 206636142 // 7 進数 # 57060516 // 8 進数 # 25206070 // 9 進数 # 12345678 //10 進数 # 6a72544 //11 進数 # 41745a6 //12 進数 # 2733447 //13 進数 # 18d5222 //14 進数 基数進数(_基数,_対象自然数,_基数進数表現) :- \+(var(_対象自然数)), length(_基数ならび,_基数), length(_対象自然数のおおいさ,_対象自然数), ならびによる基数進数(_基数ならび,_対象自然数のおおいさ,_基数進数表現ならび), 基数進数表現(_基数進数ならび,_基数進数表現ならび), concat_atom(_基数進数表現ならび,_基数進数表現),!. 基数進数(_基数,_対象自然数,_基数進数表現) :- var(_対象自然数), length(_基数ならび,_基数), atom(_基数進数表現), atom_chars(_基数進数表現,_基数進数表現ならび), 基数進数表現(_基数進数ならび,_基数進数表現ならび), ならびによる基数進数(_基数ならび,_対象自然数のおおいさ,_基数進数ならび), length(_対象自然数のおおいさ,_対象自然数),!. 基数進数(_基数,_対象自然数,_基数進数表現) :- length(_基数ならび,_基数), length(_対象自然数のおおいさ,_対象自然数), ならびによる基数進数(_基数ならび,_対象自然数のおおいさ,_基数進数ならび), 基数進数表現(_基数進数ならび,_基数進数表現ならび), concat_atom(_基数進数表現ならび,_基数進数表現). ならびによる基数進数(_基数ならび,_対象自然数のおおいさ,_基数進数ならび) :- 反転ならびによる基数進数(_基数ならび,_対象自然数のおおいさ,_反転した基数進数ならび), reverse(_反転した基数進数ならび,_基数進数ならび),!. 反転ならびによる基数進数(_,[],[]) :- !. 反転ならびによる基数進数(Ln,L1,[Mod|R]) :- ならび割り算(L1,Ln,L2,Mod), 反転ならびによる基数進数(Ln,L2,R). 基数進数表現([],[]) :- !. 基数進数表現([L|R1],[A|R2]) :- 基数進数の一桁の文字表現(L,A), 基数進数表現(R1,R2). 基数進数の一桁の文字表現([],'0') :- !. 基数進数の一桁の文字表現([_],'1') :- !. 基数進数の一桁の文字表現([_,_],'2') :- !. 基数進数の一桁の文字表現([_,_,_],'3') :- !. 基数進数の一桁の文字表現([_,_,_,_],'4') :- !. 基数進数の一桁の文字表現([_,_,_,_,_],'5') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_],'6') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_],'7') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_],'8') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_,_],'9') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_,_,_],'A') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_,_,_,_],'B') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_,_,_,_,_],'C') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_,_,_,_,_,_],'D') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_,_,_,_,_,_,_],'E') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_],'F') :- !. 基数進数の一桁の文字表現(L,A) :- append([_,_,_,_,_,_,_,_,_,_],L1,L), length(L1,N), N < 17, N2 is N + 65, char_code(A,N2),!. 基数進数の一桁の文字表現(L,A) :- append([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_],L1,L), length(L1,N), N < 27, N2 is N + 97, char_code(A,N2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/620 # # [1] 授業単元:プログラミング及び演習 # [2] 問題文(含コード&リンク):コマンド名 vhswitch に続く記号「-n」の後に「繰り返し数」を、「-s」の後に「文字列」 # を、さらに「-v」または「-h」を書きます。 # コマンドラインから次のように入力します。スイッチ「-v」が入力された場合は垂直方向に文字列を表示します。 # 例) $./vhswitch -n 3 -s "abcdef" -v <Enter> # abcdef # abcdef # abcdef # 一方。スイッチ「-h」が入力された場合は水平方向に文字列を表示します。 # 例)$./vhswitch -s "abcdef" -h -n 3 <Enter> # # このような実装をするプログラムを書け。 # 〜プログラムの一部分の骨子〜 #  http://ime.nu/codepad.org/pXaw5yU8 # # 'コマンド名 vhswitch に続く記号「-n」の後に「繰り返し数」を、「-s」の後に「文字列」を、さらに「-v」または「-h」を書きます。コマンドラインから次のように入力します。スイッチ「-v」が入力された場合は垂直方向に文字列を表示します。' :- user_parameters(L), パラメータで指定された繰り返し数(L,_繰り返し数), パラメータで指定された文字列(L,_文字列), 'パラメータで指定された-vまたは-hオプション'(L,_v_または_h), length(Ln,_繰り返し数), 文字列を表示する(Ln,_文字列,_v_または_h). パラメータで指定された文字列(L,_文字列) :- append(_,[['-s',S|_],_,L),!. パラメータで指定された繰り返し数(L,_繰り返し数) :- append(_,[['-n',_繰り返し数|_],_,L),!. 'パラメータで指定された-vまたは-hオプション'(L,v) :- append(_,[['-v'|_],L),!. 'パラメータで指定された-vまたは-hオプション'(L,h) :- append(_,[['-h'|_],L),!. 文字列を表示する([],_,_) :- !. 文字列を表示する([_|Ln],_文字列,v) :- atom_chars(_文字列,Chars), append(_,[_文字|_],Chars), write_formatted('%t\n',[_文字]), 文字列を表示する(Ln,_文字列,v). 文字列を表示する([_|Ln],_文字列,h) :- write_formatted('%t\n',[_文字列]), 文字列を表示する(Ln,_文字列,v). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/525 # # [1] 授業単元:情報検索処理 # [2] 問題文(含コード&リンク):以下の仕様を満たすプログラムを作成してください。 # ・文章の書かれたテキストファイルを読み込み、文字列を入力して検索する。 # ・検索した文字列がある箇所全てに対して、その文字列と前後10文字を、検索結果として別のテキストファイルに書き込む。 # '文章の書かれたテキストファイルを読み込み、文字列を入力して検索する。検索した文字列がある箇所全てに対して、その文字列と前後10文字を、検索結果として別のテキストファイルに書き込む。' :- '文章の書かれたテキストファイルを読み込み'(_テキストファイル,Chars), '文字列を入力して'(_検索文字列), atom_chars(_検索文字列,_検索文字ならび), '検索する。検索した文字列がある箇所全てに対して、その文字列と前後10文字を、検索結果として'(Chars,_検索文字ならび,_検索結果ならび), '別のテキストファイルに書き込む'(_出力ファイル,_検索結果ならび). '文章の書かれたテキストファイルを読み込み'(_テキストファイル,Chars) :- get_chars(_テキストファイル,Chars). '文字列を入力して'(_検索文字列) :- write('検索文字列を入力してください : '), get_line(_検索文字列). '検索する。検索した文字列がある箇所全てに対して、その文字列と前後10文字を、検索結果として'(Chars,_検索文字列,_検索した前10文字・後ろ10文字ならび) :- atom_chars(_検索文字列,_検索文字ならび), findall([_位置,_検索文字列,_前10文字,_後10文字],( 検索する(Chars,_検索文字ならび,L0,L1), 検索位置は(L0,_位置), 前10文字(L0,_前10文字), 後10文字(L1,_後10文字)), _検索した前10文字・後ろ10文字ならび). 検索する(Chars,_検索文字ならび,L0,L1) :- append(L0,_検索文字ならび,L1,Chars). 検索位置は(L0,_位置) :- length(L0,Len), _位置 is Len + 1,!. 前10文字(L0,_前10文字) :- length(_前10文字ならび,10), append(_,_前10文字ならび,L0), atom_chars(_前10文字,_前10文字ならび). 後10文字(L0,_後10文字) :- length(_後10文字ならび,10), append(_後10文字ならび,L1). atom_chars(_後10文字,_後10文字ならび),!. '別のテキストファイルに書き込む'(_出力ファイル,_検索結果ならび) :- open(_出力ファイル,write,Outstream), append(_,[[_位置,_検索文字列,_前10文字,_後10文字]|R],_検索結果ならび), write_formatted(Outstream,'%t:%t,%t,%t\n',[_位置,_検索文字列,_前10文字,_後10文字]), R = [], close(Outstream),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/280 # # 1] 授業単元: プログラミング # [2] 問題文 # #include <stdio.h> # #include <string.h> /*strlenのため */ # # void # main( void ) # { # char mojis[16]; /* 文字列を入れるための配列 */ # int i; # int n; /* 'e'の数 */ # # printf("文字列:"); # scanf("%15s", mojis ); # mojis[15] = '\0'; # # # for( i=0, n=0; mojis[i]; i++ ) /* ヌル字まで順に見ていく */ # { # if( mojis[i] == 'e' ) /* 文字と文字定数との比較 */ # { # n++; # } # } # printf( "文字数 %d のうち'e'は %d個", strlen(mojis ), n ); # return; } # このプログラミングを改造 # 1.strlenを使わずに文字数をカウントする。 # 特定文字が文字列の中に出現する度数を調べる(_特定文字,_文字列,_出現度数) :- atom_chars(_文字列,Chars), 特定文字が文字列の中に出現する度数を調べる([],_特定文字,Chars,_出現度数). 特定文字が文字列の中に出現する度数を調べる(Ln,_,[],_出現度数) :- length(Ln,_出現度数),!. 特定文字が文字列の中に出現する度数を調べる(Ln,_特定文字,[_特定文字|R],_出現度数) :- 特定文字が文字列の中に出現する度数を調べる([_|Ln],_特定文字,R,_出現度数),!. 特定文字が文字列の中に出現する度数を調べる(Ln,_特定文字,[_|R],_出現度数) :- 特定文字が文字列の中に出現する度数を調べる(Ln,_特定文字,R,_出現度数),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/642 # # test.abc.ne.jp # test.abcdef.ne.jp # test.ztv.ne.jp # # 「test.abc.ne.jpは除外」というルールを # ^test\.[^abc]+\.ne\.jp$ # と書いたのですが、test.abcdef.ne.jpも除外されてしまいます # # ^test\.(?!abc(?!def))\w+\.ne\.jp$ # と書けばいいのですが、(?!)は環境により使えません # (?!)を使わず、「test.abc.ne.jpを除外し、test.abcdef.ne.jpは除外しない」というルールを教えていただきたいです。よろしくお願いします # # 'test.abcと.ne.jpの間にdefだけは入ることができない'(_文字列) :- atom_chars(_文字列,Chars), append(_,[t,e,s,t,'.',a,b,c|L1],['.',n,e,'.',j,p|_],Chars), \+(L1 = [d,e,f]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'test.abcと.ne.jpの間には何も入ることができない'(_文字列) :- atom_chars(_文字列,Chars), append(_,[t,e,s,t,'.',a,b,c'.',n,e,'.',j,p|_],Chars). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'test.abcと.ne.jpの間には何も入ることができない'(_文字列) :- atom_chars(_文字列,Chars), append(_,[t,e,s,t,'.',a,b,c|L1],['.',n,e,'.',j,p|_],Chars), L1 = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/642 # # test.abc.ne.jp # test.abcdef.ne.jp # test.ztv.ne.jp # # 「test.abc.ne.jpは除外」というルールを # ^test\.[^abc]+\.ne\.jp$ # と書いたのですが、test.abcdef.ne.jpも除外されてしまいます # # ^test\.(?!abc(?!def))\w+\.ne\.jp$ # と書けばいいのですが、(?!)は環境により使えません # (?!)を使わず、「test.abc.ne.jpを除外し、test.abcdef.ne.jpは除外しない」というルールを教えていただきたいです。よろしくお願いします # # % abcとneの間にdefだけは入ることができない場合 除外文字列(_文字列) :- atom_chars(_文字列,Chars), append(_,[t,e,s,t,'.',a,b,c|L1],['.',n,e,'.',j,p|_],Chars), \+(L1 = [d,e,f]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % abcとneの間には何も入ることができない 除外文字列(_文字列) :- atom_chars(_文字列,Chars), append(_,[t,e,s,t,'.',a,b,c'.',n,e,'.',j,p|_],Chars). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/6 # # [1] 授業単元:C言語基礎 # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1254228.txt.html # # [3]小文字のアルファベットから成る英単語に含まれる母音('a', 'i', 'u', 'e', 'o')の数 # を数える関数 count_boin を作成せよ.ただし,引数として英単語と母音の文字列を受け取り, # 戻り値として母音の数を返すものとする.また,ポインタを使って簡潔かつ高速に文字列を # 操作すること.この関数内で配列を使用しないこと,意味のないポインタの使い方をしないこと。 # # # 下のmain 関数を用いて,正常な動作結果が得られることを確認せよ '小文字のアルファベットから成る英単語に含まれる母音(a,i,u,e,o)の数を数える'(_小文字のアルファベットから成る英単語,_母音の数) :- atom_chars(_小文字のアルファベットから成る英単語,Chars), count((append(_,[Char|_],Chars),append(_,[Char|_],[a,i,u,e,o])),_母音の数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/6 # # [1] 授業単元:C言語基礎 # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1254228.txt.html # # [2]任意の文字列から大文字のアルファベットと小文字のアルファベットを抽出する関数 # extract_alphabet を作成せよ.ただし,第 1 引数で任意の文字列を受け取り,第 2 引数で # 大文字のアルファベット,第 3 引数で小文字のアルファベットを返すものとする. # 関数extract_alphabet内ではポインタを使って簡潔かつ高速に文字列を操作すること. # この関数内で配列を使用しないこと、意味のないポインタの使い方をしないこと。 # #   下の main 関数から関数 extract_alphabet を呼び出し, # 正常な結果が得られることを確認せよ. # '任意の文字列から大文字のアルファベットと小文字のアルファベットを抽出する関数 extract_alphabet を作成せよ.ただし,第 1 引数で任意の文字列を受け取り,第 2 引数で大文字のアルファベット,第 3 引数で小文字のアルファベットを返すものとする'(_文字列,_大文字アルファベット,_小文字アルファベット) :- atom_chars(_文字列,Chars), アルファベットを抽出する(Chars,[],[],_大文字アルファベット,_小文字アルファベット). アルファベットを抽出する([],L1,L2,L1,L2) :- !. アルファベットを抽出する([Char|R],L1,L2,X,Y) :- 大文字(Char), \+(append(_,[Char|_],L1)), アルファベットを抽出する(R,[Char|L1],L2,X,Y),!. アルファベットを抽出する([Char|R],L1,L2,X,Y) :- 小文字(Char), \+(append(_,[Char|_],L2)), アルファベットを抽出する(R,L1,[Char|L2],X,Y),!. アルファベットを抽出する([_|R],L1,L2,X,Y) :- アルファベットを抽出する(R,L1,L2,X,Y). 大文字(Char) :- Char @>= 'A',Char @=< 'Z'. 小文字(Char) :- Char @>= 'a',Char @=< 'z'. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/218 # # [1] 授業単元:コンピュータプログラミング # [2] 問題文(含コード&リンク): # 以下のアルゴリズムを使用しプログラムを作成せよ # <プログラム概要> # ・256文字以内で文字列を入力させる # ※半角文字のみで可。入力制御不要 # ・画面に入力された文字列を表示 # 文字列を前・後(中央折り返し)で反転 # ※シーゲンゴゴーゲンシ # ※ジュギョウウョギュジ # ・入力文字列と反転後の文字列を表示 # # <アルゴリズム> # .如璽親力用と文字配列を宣言 # 入力用と出力用の文字列を宣言 # J源列は文字列操作関数を使用 # そ侘詫冓源配列の先頭アドレスをポインタに設定 # ズ能文字一の中身を出力用文字配列の現在位置に代入 # Π聞漾入力用は前方向、出力用は後方へポインタをずらす # Ы侘詫冉枸鵑虜能位置へ文字列終端子を代入 # '256文字以内で文字列(半角文字のみで可。入力制御不要)を入力させた上で、その文字列を中央から二分割し、それぞれの部分を反転して結合した文字列を表示する' :- '256文字以内で文字列を入力させる(半角文字のみで可。入力制御不要)'(_入力された文字列), '画面に入力された文字列を表示'(_入力された文字列), '文字列を前・後(中央折り返し)で反転'(_入力された文字列,_反転後の文字列), 入力文字列と反転後の文字列を表示(_入力された文字列,_反転後の文字列). '256文字以内で文字列を入力させる(半角文字のみで可。入力制御不要)'(_文字列) :- get_line(_文字列), 半角のみで可(_文字列), atom_length(_文字列,_文字列の長さ), _文字列の長さ =< 256. '256文字以内で文字列を入力させる(半角文字のみで可。入力制御不要)'(_文字列) :- write('文字列長が256文字を越えました。再入力をお願いします。\n'), '256文字以内で文字列を入力させる(半角文字のみで可。入力制御不要)'(_文字列). 半角のみで可(_文字列) :- 全角文字を含む(_文字列),!. 半角のみで可(_文字列) :- 全角文字を含まない(_文字列),!. '画面に入力された文字列を表示'(_入力された文字列) :- write_formatted('%t\n',[_入力された文字列]). '文字列を前・後(中央折り返し)で反転'(_文字列,_反転された文字列) :- 文字列から文字ならびを得る(_文字列,_文字ならび), 中央で分割する(_文字ならび,_前半部,_中央部,_後半部), 前半・後半部分をそれぞれ反転する(_前半部,_後半部,_反転した前半部,_反転した後半部), 反転した二つの部分と中央部を結合する(_反転した前半部,_中央部,_反転した後半部,_反転した文字ならび), 文字ならびから文字列を得る(_反転した文字ならび,_反転された文字列). 文字列から文字ならびを得る(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 文字列ならびから文字列を得る(_文字ならび,_文字列) :- atom_chars(_文字列,_文字ならび). 中央で分割する(_文字ならび,_前半部,[],_後半部) :- append(_前半部,_後半部,_文字ならび), length(_前半部,_長さ), length(_後半部,_長さ),!. 中央で分割する(_文字ならび,_前半部,[_文字],_後半部) :- append(_前半部,[_文字|_後半部],_文字ならび), length(_前半部,_長さ), length(_後半部,_長さ),!. 前半・後半部分をそれぞれ反転する(_前半部,_後半部,_反転された前半部,_反転された後半部) :- reverse(_前半部,_反転された前半部), reverse(_後半部,_反転された後半部). 反転した二つの部分と中央部を結合する(_反転された前半部,_中央部,_反転された後半部,_反転された文字ならび) :- append(_反転された前半部,_中央部,_反転された後半部,_反転された文字ならび). 入力文字列と反転後の文字列を表示(_入力された文字列,_反転後の文字列) :- write_formatted('入力文字列は   %t\n反転後の文字列は %t\n',[_入力された文字列,_反転後の文字列]). 全角文字を含む(_文字列) :- atom_codes(_文字列,_文字コードならび), member(_文字コード,_文字コードならび), _文字コード >= 256,!. 全角文字を含まない(_文字列) :- \+(全角文字を含む(_文字列)),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/596 # # 【】で囲まれた任意の同一文字列(文字数可変)が2回続いた場合にマッチする正規表現をお願いします # # 【AAA】【AAA】はマッチ # 【AAA】【BBB】はマッチしない # # という感じです # # '【】で囲まれた任意の同一文字列(文字数可変)が2回続いた場合にマッチする'(_対象文字列,_照合部分より前の文字列,_照合部分文字列,_残り文字列) :- atom_chars(_対象文字列,Chars), 照合基本部分(L,L0,L1,L2), '【】で囲まれた任意の同一文字列(文字数可変)が2回続いた'(L1,L2,_2回続いた文字ならび,R), 文字ならびを文字列に変換(L0,_2回続いた文字ならび,R,_照合部分より前の文字列,_照合部分文字列,_残り文字列). 照合基本部分(L,L0,L1,L2) :- append(L0,['【'|L10],['】'|L2],L), all(L10,A), append(['【'|L10],['】'],L1). '【】で囲まれた任意の同一文字列(文字数可変)が2回続いた'(L1,L2,_2回続いた文字ならび,R) :- append(L1,R,L2), append(L1,L1,_2回続いた文字ならび). 文字ならびを文字列に変換(L0,_2回続いた文字ならび,R,_照合部分より前の文字列,_照合部分文字列,_残り文字列) :- atom_chars(_照合部分より前の文字列,L0), atom_chars(_照合部分文字列,_2回続いた文字ならび), atom_chars(_残り文字列,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/863 # # [1] 授業単元:自然言語処理 # [2] 問題文(含コード&リンク): # ttp://nlp.dse.ibaraki.ac.jp/~shinnou/lecture/nl/rep1.pdf # 課題2のみです。 # # 「自然言語処理」第1 回レポート課題 # 〆切: 11 月19 日(金) # 以下の2つの課題のプログラムをC あるいはJava を用いて作成せよ。プログラムの解説もつ # けること。提出は、以下の宛先にメールでソースファイルと解説の文書を添付ファイルにして送っ # て下さい。ただし解説の文書はメール本文に書いても良いです。 # shinnou@mx.ibaraki.ac.jp # 課題1 日本語の文節は「平仮名以外の文字列+平仮名文字列」から構成されるというヒューリスティ # クスがある。このヒューリスティクスに基づいて、テキスト内の文章を文節に分割するプロ # グラムをC あるいはJava で作成せよ。ただしテキストは全角文字と改行だけで記述されて # いるとする。またテキストはファイルに書かれており、プログラムへの入力はそのファイル # を与える形にすること。プログラムの解説も書くこと。 # (実行例) # > type jdata.txt # 私は茨城県に住んでいる茨城大学の工学部に通う学生です。 # > kadai1.exe jdata.txt (Java では>java Kadai1 jdata.txt ) # 私は # 茨城県に # 住んでいる # 茨城大学の # 工学部に # 通う # 学生です # 。 # '日本語の文節は「平仮名以外の文字列+平仮名文字列」から構成されるというヒューリスティクスがある。このヒューリスティクスに基づいて、テキスト内の文章を文節に分割する'(_文章,_文節ならび) :- atom_chars(_文章,Chars), テキスト内の文章を文節に分割する(Chars,_文節ならび). テキスト内の文章を文節に分割する([],[]) :- !. テキスト内の文章を文節に分割する(L,[S]) :- 平仮名以外の文字ならび(L), atom_chars(S,L),!. テキスト内の文章を文節に分割する(_文字ならび,[_文節|R]) :- append(L0,L1,L2,_文字ならび), 平仮名以外の文字ならび(L0), 平仮名の文字ならぴ(L1), 平仮名文字から始まらない(L2), append(L0,L1,L), atom_chars(_文節,L), テキスト内の文章を文節に分割する(L2,R). 平仮名以外の文字ならび([]) :- !. 平仮名以外の文字ならび([A|R]) :- \+(平仮名(A)), 平仮名以外の文字ならび(R). 平仮名の文字ならび([]) :- !. 平仮名の文字ならび([A|R]) :- 平仮名(A), 平仮名以外の文字ならび(R). 平仮名文字から始まらない([]) :- !. 平仮名文字から始まらない([A|_]) :- \+(平仮名(A)). 平仮名(A) :- A @>= あ, A @=< ん,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/592 # # 特定の文字だけで構成される行 にマッチする正規表現をお願いします。 # # あああああああ # wwwwwwwwwww # HHHHHHHHHHHHH # # のような行です。 # # '特定の文字だけで構成される行にマッチする'([_行|_],_行) :- atom_chars(_行,Chars), all(Chars,_). '特定の文字だけで構成される行にマッチする'([_|R],_行) :- '特定の文字だけで構成される行にマッチする'(R,_行). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '特定の文字だけで構成される行にマッチする'(_文字列,_行) :- atom(_文字列), atom_chars(_文字列,_文字ならび), '特定の文字だけで構成される行にマッチする'(_文字ならび,_行). '特定の文字だけで構成される行にマッチする'(_文字ならび,_行) :- append(L0,['\n'|R],_文字ならび), all(L0,A), \+(A='\n'), concat_atom(L0,_行). '特定の文字だけで構成される行にマッチする'(_文字ならび,_行) :- append(L0,['\n'|R],_文字ならび), all(L0,A), \+(A='\n'), '特定の文字だけで構成される行にマッチする'(R,_行). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/589 # # "A"にはマッチするけど"ABC"にはマッチしない正規表現お願いします # # '"A"にはマッチするけど"ABC"にはマッチしない'(_文字列,S0,'A',S1) :- sub_atom(_文字列,St,Len,R1,'A'), \+(sub_atom(_文字列,St,3,R2,'ABC')), sub_atom(_文字列,0,St,_,S0), St2 is St + Len, sub_atom(_文字列,St2,R2,0,S1). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '"A"にはマッチするけど"ABC"にはマッチしない'(_文字列,S0,S,S1) :- atom_chars(_文字列,Chars), '"A"にはマッチするけど"A","B","C"にはマッチしない'(Chars,L0,L,L1), concat_atom(L,S), concat_atom(L0,S0), concat_atom(L1,S1). '"A"にはマッチするけど"A","B","C"にはマッチしない'(Chars,L0,['A'],L1) :- append(L0,['A'],L1,Chars), \+(append(L0,['A','B','C'],_,Chars)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/628 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク) # 問題4 風林火山を、2つのputs関数を使用して表示するプログラムを作成しなさい '風林火山を、2つのputs関数を使用して表示する'(_風林火山前半表示,_風林火山後半表示) :- write('\n'), atom_chars(風林火山,L), findall(S,( append(_,[A|_],L), atom_concat(' ',A,S)), L2), append(L0,L1,L2), \+(L1=[]), \+(L2=[]), concat_atom(L0,'\n',_風林火山前半表示), concat_atom(L1,'\n',_風林火山後半表示), puts(_風林火山前半表示), puts(_風林火山後半表示), write('\n'). puts(S) :- write_formatted('%t\n',[S]). % 以下のサイトは # 左横書き文書を右縦書き文書に変換してください # 左横書き文書を右縦書き文書に変換(_横書きの行ならび,_縦書きに置換された行ならび) :- 行の最大長まで空白を付加した文字ならびのならびを作る(_横書きの行ならび,_文字ならびのならび), 転置(_文字ならびのならび,_縦書き用に転置された文字ならびのならび), 右書き用に反転して文字列に戻す(_縦書き用に転置された文字ならびのならび,_縦書きに置換された行ならび),!. 行の最大長まで空白を付加した文字ならびのならびを作る(_横書きの行ならび,_文字ならびのならび) :- 行の最大長を得る(_行の最大長), findall(Chars_2,( append(_,[_行|_],_横書きの行ならび), atom_chars(_行,Chars_1), 空白を付加して文字数を揃える(_行の最大長,Chars_1,Chars_2)), _文字ならびのならび). 行の最大長を得る(_行の最大長) :- findmax(_長さ,( append(_,[_行|_],_横書きの行ならび), sub_atom(_行,0,_長さ,0,_行)), _行の最大長). 空白文字を付加して文字数を揃える(_文字の最大長,_文字ならび,_空白を付加された文字ならび) :- length(_空白を付加された文字ならび,_文字の最大長), append(_文字ならび,_付加するならび,_空白を付加された文字ならび), all(_付加するならび,' '). 右書き用に反転して文字列に戻す([],[]) :- !. 右書き用に反転して文字列に戻す([L1|R1],[S|R2]) :- reverse(L1,L2), atomic_list_concat(L2,S), 右書き用に反転して文字列に戻す(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/407 # # [1] 授業単元:プログラミング設計演習 # [2] 問題文(含コード&リンク): # 32ビットの2進数から、.で区切られた10進数のIPアドレスに変換してください # 入力例 # 00000011100000001111111111111111 # 出力 # 3.128.255.255 # '32ビットの2進数から、.で区切られた10進数のIPアドレスに変換する' :- write('32ビットの2進数を連続した 0または1 32個で表現してください : '), get_line(Line), atom_chars(Line,Codes), findall(I,(member(Code,Codes),I is Code-48),_32ビットの0または1ならび), findall(X,( 先頭の8ビット(_32ビットの0または1ならび,[B1,B2,B3,B4,B5,B6,B7,B8]), X is B1 * 128 + B2 * 64 + B3 * 32 + B4 * 16 + B5 * 8 + B6 * 4 + B7 * 2 + B8), L), write_formatted('%t.%t.%t.%t\n',L). 先頭の8ビット([B1,B2,B3,B4,B5,B6,B7,B8|R],[B1,B2,B3,B4,B5,B6,B7,B8]). 先頭の8ビット([_,_,_,_,_,_,_,_|R],L) :- 先頭の8ビット(R,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/555 # # シェルの中で入力ファイル名から出力ファイル名を生成しています。 # 特定の文字列・記号を正規表現でリネームしたいのですが思いつきません。 # # ファイル名前半部が異なるファイルが50以上あるのですが、思い通りにrenameしてくれません。 # ご教示お願いいたします。 # # 対象ファイル: # iko_foobar_hogehoge_20101008.tsv # # リネーム後ファイル: # iko_foobar_hogehoge-20101008.tsv # # コマンドの実行イメージ # rename iko*_[\d,8].tsv iko*-[\d,8].tsv # # IN_FILE = ma_sina_syo_20100101 # OUT_FILE="${DIR_PATH_RCV}/${PREFIX}$(basename ${IN_FILE})${MARK}${YMD}.tsv" # OUT_FILE=iko_ma_sina_syo-20100101.tsv # # # ファイル名前半部が異なるファイルをrenameする(_ディレクトリ名) :- concat_atom(['ls -N ',_ディレクトリパス名',S), shs(S,_行ならび), append(_,[_行|R],_行ならび), atom_chars(_行,Chars), length(L2,9), append(L1,L2,Chars), append([_],L3,L2), 全部数字(L3), concat_atom(L1,S1), concat_atom(L3,S3), concat_atom(['mv ',_行,' ','iko_',S1,'-',S3,'.tsv']),Mv), system(Mv), R = [],!. 全部数字([]) :- !. 全部数字([A|R]) :- append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']),全部数字(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/525 # # http://ime.nu/test.com/test1/test2/test3/pic.jpg から # test.com/test1/test2/test3 を取るにはどう書いたらいいでしょうか # # test1やtest2の階層は増えたり減ったりします。 # 要するにhttp://ime.nu/から最後の/の間の値がほしいです # # '要するにhttp://ime.nu/から最後の/の間の値がほしいです'(_行,_欲しい部分文字列) :- atom_chars(_行,Chars), append(_,[h,t,t,p,:,/,/,i,m,e,'.',n,u,/|L],[/|R],Chars), \+(append(_,[/|_],R)), atom_chars(_欲しい部分文字列,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/529 # # A3AACD9ABD377E716127E010FEAC9EBE のような半角英数字32文字の取得はどう書けばいいんでしょうか? 'A3AACD9ABD377E716127E010FEAC9EBE のような半角英数字32文字の取得'(_文字列,_前文字列,_検索文字列,_後文字列) :- atom_chars(_文字列,Chars), 半角英数N文字の連続を検索(Chars,32,L0,[],L0,L,R), atom_chars(_前文字列,L0), atom_chars(_検索文字列,L), atom_chars(_後文字列,R). 半角英数N文字の連続を検索([],N,[],L1,[],L) :- length(L1,N), reverse(L1,L),!. 半角英数N文字の連続を検索(R,N,L1,[],L,R) :- length(L1,N), reverse(L1,L),!. 半角英数N文字の連続を検索([A|R1],N,L1,[A|R0],L,R) :- \+(半角英数字(A)), 半角英数N文字の連続を検索(R1,N,[],R0,L,R),!. 半角英数N文字の連続を検索([A|R1],N,L1,[A|R0],L,R) :- 半角英数N文字の連続を検索(R1,N,[A|L1],R0,L,R). 半角英数字(C) :- member([U1,U2],[['A','Z'],[a,z],['0','9']]), C @>= U1, C @=< U2,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/642 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク):以下の式が成り立つように英字に数字をあてはめよ。 # ただし同じ英字には同じ数字が当てはまる。 # send # +)more # ------ # money # '以下の式(send+more=money)が成り立つように英字に数字をあてはめよ。ただし同じ英字には同じ数字が当てはまる。'(_数1,_数2,_数3) :- abolish(アルファベット数値対応/2), アルファベットを得る([send,more,money],_アルファベット), アルファベット対応数値候補表の定義(_アルファベット), 語彙に対応する数を得る(send,_数1), 語彙に対応する数を得る(more,_数2), 語彙に対応する数を得る(money,_数3), _数3 is _数1 + _数2. アルファベット対応数値候補表の定義(_アルファベット) :- append(_,[_文字|R],_アルファベット), for(0,N,9), assertz(アルファベット数値対応(_文字,N)), R = [],!. 語彙に対応する数を得る(_語彙,_数) :- atom_chars(_語彙,_文字ならび), アルファベットを基礎に数のならびを得る(_文字列ならび,_数ならび), 数字ならびから10進数を得る(_数ならび,_,_数). アルファベットを基礎に数のならびを得る([],[]) :- !. アルファベットを基礎に数のならびを得る([A|R1],[N|R2]) :- アルファベット数値対応(A,N), アルファベットを基礎に数のならびを得る(R1,R2). 数字ならびから10進数を得る([N],0,N) :- !. 数字ならびから10進数を得る([M|R],J,N) :- 数字ならびから10進数を得る(R,J1,N1), J is J1 + 1, N is M * truncate(10 ^ J1) + N1. アルファベットを得る(_語彙ならび,_アルファベット) :- concat_atom(_語彙ならび,S), atom_hcars(S,Chars), setof(_文字,member(_文字,Chars),_アルファベット). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1280653311/570 # # [1] 授業単元:応用C言語 # [2] 問題文(含コード&リンク): # 標準入力を読み込み、指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換 # して標準出力するプログラムを作成せよ。 # ただし最後の引数の文字列が現れた場合は最初に指定された文字列に # 置換するものとする。 # また複数の指定文字列に一致する箇所の場合、もっとも長い文字列が # 現れたものと解釈する。 # # *入力文字に非ASCII文字が含まれないとして良い # '標準入力を読み込み、指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して標準出力する。ただし最後の引数の文字列が現れた場合は最初に最初に指定された文字列に置換するものとする。また複数の指定文字列に一致する箇所の場合、もっとも長い文字列が現れたものと解釈する。' :- user_parameters(_指定文字列ならび), _指定文字列ならび = [A|R1], append(_指定文字列ならび,[A],_指定文字列ならびの二), 置換述語の生成(_指定文字列ならびの二), '標準入力を読み込み'(Chars), '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(Chars,Chars2), put_chars(Chars2). 置換述語の生成([_]) :- !. 置換述語の生成([_文字列1,_文字列2|R]) :- atom_chars(_文字列1,Chars1), atom_chars(_文字列2,Chars2), atom_length(_文字列1,Len), append(_文字列1,R1,L1), append(_文字列2,R2,L2), assertz((置換述語(L1,R1,Len,L2,R2))), 置換述語の生成([_文字列2|R]). 標準入力を読み込み(Chars) :- get_chars(Chars). '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(Chars1,Chars2x) :- findmax([Len,R1,Char2,R2],置換述語(Chars1,R1,Len,Char2,R2),[Lenx,R1x,Char2x,R2x]), '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(R1x,R2x). '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'([A|R1],[A|R2]) :- '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(R1,R2). 標準出力する(Chars) :- concat_atom(Chars,Atom), write(Atom). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1197620454/580 # # 下記のプログラムを関数を用いて実行したいのですが、どのようにすれば良いでしょうか? # 回答(できたら簡単な解説)の明記をお願いします。 # # 問題1:入力したプログラムから以下のように出力するプログラムを作成する。 # (実行結果例) # 文字列を入力: 今日は、晴れです。 # # 今日は、晴れです。 # 日 す # は で # 、 れ # 晴 晴 # れ 、 # で は # す 日 # 。すでれ晴、は日今 # 最初と最後に特別なことをするリスト処理 :- write('文字列を入力: '), get_line(Line), atom_chars(Line,Chars), reverse(Chars,Chars2), 転置([[Chars,Chars2]],_転置されたChars), 最初と最後だけ特別のことをする([Chars,Chars2],_転置されたChars,L), put_lines(L). 最初と最後だけ特別のことをする(L,L1,L) :- 最初は特別のことをする(L,L1,R1,L2), 残りの処理(L,R1,L2). 残りの処理(L,L1,X) :- 最後は特別のことをする(L,L1,X),!. 残りの処理(L,[[A,B]|R1],[S|R2]) :- write_formatted_atom(S,'%t %t',[A,B]), 残りの処理(L,R1,R2). 最初は特別のことをする([Head,_],[_|R1],R1,[S|R2]) :- concat_atom(Head,S),!. 最後は特別のことをする([_,Last],[_],[S]) :- concat_atom(Last,S),!. %%%%%%%%%%%%%%% こちらが一般形 %%%%%%%%%%%%%%%%%%%%%%%%%% 最初と最後だけ特別のことをする([A|R1],[B|R2]) :- 最初は特別のことをする(A,B), 残りの処理(R1,R2). 残りの処理(L1,X) :- 最後は特別のことをする(L1,X),!. 残りの処理([A|R1],[B|R2]) :- 通常の処理(A,B), 残りの処理(R1,R2). 最初は特別のことをする(A,B) :- 最初は特別(A,B). 最後は特別のことをする([A],[B]) :- 最後は特別(A,B). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1197620454/580 # # 下記のプログラムを関数を用いて実行したいのですが、どのようにすれば良いでしょうか? # 回答(できたら簡単な解説)の明記をお願いします。 # # 問題1:入力したプログラムから以下のように出力するプログラムを作成する。 # (実行結果例) # 文字列を入力: 今日は、晴れです。 # # 今日は、晴れです。 # 日 す # は で # 、 れ # 晴 晴 # れ 、 # で は # す 日 # 。すでれ晴、は日今 # 最初と最後に特別なことをするリスト処理 :- write('文字列を入力: '), get_line(Line), atom_chars(Line,Chars), reverse(Chars,Chars2), 転置([[Chars,Chars2]],_転置されたChars), 最初と最後だけ特別のことをする([Chars,Chars2],_転置されたChars,L), put_lines(L). 最初と最後だけ特別のことをする(L,L1,L) :- 最初は特別のことをする(L,L1,R1,L2), 残りの処理(L,R1,L2). 残りの処理(L,L1,X) :- 最後は特別のことをする(L,L1,X),!. 残りの処理(L,[[A,B]|R1],[S|R2]) :- write_formatted_atom(S,'%t %t',[A,B]), 残りの処理(L,R1,R2). 最初は特別のことをする([Head,_],[_|R1],R1,[S|R2]) :- concat_atom(Head,S),!. 最後は特別のことをする([_,Last],[_],[S]) :- concat_atom(Last,S),!. %%%%%%%%%%%%%%% こちらが一般形 %%%%%%%%%%%%%%%%%%%%%%%%%% 最初と最後だけ特別のことをする([A|R1],[B|R2]) :- 最初は特別のことをする(A,B), 残りの処理(R1,R2). 残りの処理(L1,X) :- 最後は特別のことをする(L1,X),!. 残りの処理([A|R1],[B|R2]) :- 通常の処理(A,B), 残りの処理(R1,R2). 最初は特別のことをする(A,B) :- 最初は特別(A,B). 最後は特別のことをする([A],[B]) :- 最後は特別(A,B). % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(L1,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1) :- shs('ls -N *.txt',L1). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([],_,_). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_テキストファイル名|R1],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_|R1],_指定した科目,_指定した点数) :- 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(R1,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号) :- get_split_lines(_テキストファイル名,[' ',':'],L), member([_指定した科目,_指定した点数],L), 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276873238/295 # # 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10839.txt # コピーさせていただきました # ホームページ上からデータを追加、検索したりする問題です。 # OS:Linux # # [1]学籍番号(stnum char(14))、名前(name char(30))、国語(kokugo int)、数学(math int)、理科(science int) # からなるテーブルseisekiをデータベース上に作る。 # # [2]ホームページからデータを追加、検索できるようにする。 # 表示結果には、学籍番号、名前、国語、数学、理科、合計を表示させる # # 学籍番号による検索(_学籍番号) :- seiseki(_学籍番号,_名前,_国語,_数学,_理科), write_formatted('%t,%t,%t,%t,%t\n',[_学籍番号,_名前,_国語,_数学,_理科]). 名前による検索(_名前) :- seiseki(_学籍番号,_名前,_国語,_数学,_理科), write_formatted('%t,%t,%t,%t,%t\n',[_学籍番号,_名前,_国語,_数学,_理科]). 国語の成績による検索(_国語,_国語成績) :- seiseki(_学籍番号,_名前,_国語,_数学,_理科), _国語成績. 数学の成績による検索(_数学,_数学成績) :- seiseki(_学籍番号,_名前,_数学,_数学,_理科), _数学成績. 理科の成績による検索(_理科,_理科成績) :- seiseki(_学籍番号,_名前,_理科,_数学,_理科), _理科成績. 成績の追加(_学籍番号,_名前,_国語,_数学,_理科) :- 学籍番号(_学籍番号), 名前(_名前), 国語(_国語), 数学(_数学), 理科(_理科), assertz(seiseki(_学籍番号,_名前,_国語,_数学,_理科)). 成績の変更(_学籍番号,_名前,_国語,_数学,_理科) :- 学籍番号(_学籍番号), 名前(_名前), 国語(_国語), 数学(_数学), 理科(_理科), retract(seiseki(_学籍番号,_,_,_,_)), assertz(seiseki(_学籍番号,_名前,_国語,_数学,_理科)). 成績の削除(_学籍番号) :- retract(seiseki(_学籍番号,_,_,_,_)). 学籍番号(_学籍番号) :- atom_length(_学籍番号,Len), Len =< 14, atom_chars(_学籍番号,Chars), すべてが数字(Chars),!. すべてが数字([]) :- !. すべてが数字([A|R]) :- member(A,['0','1','2','3','4','5','6','7','8','9']), すべてが数字(R). 名前(_名前) :- atom(_名前), atom_length(_名前,Len), Len =< 30,!. 国語(_国語) :- integer(_国語). 数学(_数学) :- integer(_数学). 理科(_理科) :- integer(_理科). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/919 # # [1] C言語プログラミング演習 # [2] 問題文(含コード&リンク # char型配列xに格納された英単語からなる文字列が回文(逆から読んでも同じ)であるかをチェックする関数anagram(char [])を作成せよ.ただし,チェック対象の文字列はソースコードのmain()関数内で記述するものとする(キーボードから入力しない). # # # % ./checkAnagaram # 文字列 "spainyuusyou" は回文ではありません. # # % ./checkAnagaram # 文字列 "Was it a cat I saw?" は回文です. # # ヒント: 回文のルールは以下の通り. # # (i) # 前から読んでも後ろから読んでも同じアルファベットの並びとな る, # (ii) # 記号「?」,「.」,「,」,「-」,「 」(空白)は無視する, # (iii) # 大文字と小文字は区別をしない. # 回文(A) :- atom_chars(A,Chars),回文(Chars,[],X,X). 回文([],X,X,[]) :- !. 回文([A|R1],L1,X,R2) :- member(A,['?','.',',','-',' ']),回文(R1,L1,X,R2),!. 回文([A|R1],L1,X,[B|R2]) :- to_upper(A,B),回文(R1,[B|L1],X,R2),!. % 以下のサイトは ?- 'a##'. # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/918 # # [1] C言語プログラミング演習 # [2] 問題文(含コード&リンク # char型配列xに格納された文字列を1文字ごとに空白を空けて逆順に出力する関数reverse_array(char [])を作成せよ.変換後の文字列の長さがもとの文字列よりも長くなっているので、長さの検査が必要であることに注意せよ。 # この関数を用いて、入力された文字列を並び替え、その結果を印字するプログラムを作成せよ。 # # # % ./reverse # 処理前の文字列 (64字まで)? kimatutest # 関数reverse_array()を呼び出しました # 処理後の文字列 "t s e t u t a m i k" # 文字列を1文字ごとに空白を空けて逆順に出力する(_文字列) :- 文字列を1文字ごとに空白を空けて逆順に出力する(_文字列,_1文字ごとに空白を空けた逆順文字列), write_formatted('%t',[_1文字ごとに空白を空けた逆順文字列]). 文字列を1文字ごとに空白を空けて逆順に出力する(_文字列,_1文字ごとに空白を空けた逆順文字列) :- atom_chars(_文字列,Chars), concat_atom(Chars,' ',_1文字ごとに空白を空けた逆順文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を1文字ごとに空白を空けて逆順に出力する(_文字列,_1文字ごとに空白を空けた逆順文字列) :- atom_chars(_文字列,Chars), 文字列を1文字ごとに空白を空けて逆順に出力する(Chars,Chars2), atom_chars(_1文字ごとに空白を空けた逆順文字列,Chars2). 文字列を1文字ごとに空白を空けて逆順に出力する([],[]). 文字列を1文字ごとに空白を空けて逆順に出力する([A],[A]). 文字列を1文字ごとに空白を空けて逆順に出力する([A|R1],[A,' '|R2]) :- 文字列を1文字ごとに空白を空けて逆順に出力する(R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/535 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):data.txtに書かれている氏名と成績を読み込み、氏名を2次元配列、成績を1次元配列に格納せよ。 # 'data.txtに書かれている氏名と成績を読み込み、氏名を2次元配列、成績を1次元配列に格納する' :- get_split_lines('data.txt',[' '],LL),   '氏名を2次元配列、成績を1次元配列に格納する'(LL,_氏名ならび,_成績ならび), 氏名ならび・成績ならびを格納する(_氏名ならび,_成績ならび). '氏名を2次元配列、成績を1次元配列に格納する'([],[],[]). '氏名を2次元配列、成績を1次元配列に格納する'([[_氏名,_成績]|R1],[_氏名文字ならび|R2],[_成績|R3]) :- atom_chars(_氏名,_氏名文字ならび), '氏名を2次元配列、成績を1次元配列に格納する'(R1,R2,R3). 氏名ならび・成績ならびを格納する(_氏名ならび,_成績ならび) :- assertz(氏名ならび(_氏名ならび)), assertz(成績ならび(_成績ならび)). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1266565626/675 # # ../test/read.cgi/tech/1266565626/673 # ・とあるディレクトリd0以下に存在する全てのディレクトリをなぞる。 # # ・このとき、今位置するディレクトリdnの相対的な深さをdとして、 #  d個のピリオドをディレクトリdnの名前の前に足した文字列> をファイルFに出力する。 # # ・また、このとき、今位置するディレクトリdnにテキストファイルがあれば、 #  d+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列 をファイルFに出力する。 # ・さらに、そのテキストファイルtnの内容をそのままファイルFに出力する。 #  テキストファイルtnの内容の各行頭には、ピリオドはつけない。 #  テキストファイルtnの内容のとある行頭にピリオドがある場合は、ピリオドの前に半角空白を入れる。 # # このような仕様です # # # ../test/read.cgi/tech/1266565626/674 # ありがとうございます # # まったくの期待通りですが、 # ピリオドの数が合わない部分がありました # # 下のようなディレクトリで試しました # ttp://www1.axfc.net/uploader/Sc/so/128829.zip # ウイルスチェックはしましたが、念のためもう一度お願いします # 'とあるディレクトリd0以下に存在する全てのディレクトリをなぞる'(_出力ファイル,_階層_1,_とあるディレクトリ) :- ディレクトリ配下の情報を得る(_とあるディレクトリ,_ファイルディレクトリ情報ならび), このディレクトリ配下のファイルを順に表示する(_出力ファイル,_階層_1,_とあるディレクトリ,_ファイルディレクトリ情報ならび), 配下のディレクトリを取り出す(_とあるディレクトリ,_フィルディレクトリ情報ならび,_階層_1,_階層_2,_デレクトリ_2), 'とあるディレクトリd0以下に存在する全てのディレクトリをなぞる'(_出力ファイル,_階層_2,_ディレクトリ_2). 'とあるディレクトリd0以下に存在する全てのディレクトリをなぞる'(_,_,_). ディレクトリ配下の情報を得る(_とあるディレクトリ,_ファイルディレクトリ情報ならび) :- atomic_list_concat(['ls -l ',_とあるディレクトリ],S), sh(S,_ファイルディレクトリ情報ならび). このディレクトリ配下のファイルを順に表示する(_出力ファイル,_階層_1,_ディレクトリ,_ファイルディレクトリ情報ならび) :- 配下のファイルを取り出す(_ファイルディレクトリ情報ならび,_テキストファイル,_入力ファイル), テキストファイルtnの内容をそのままファイルFに出力する(_階層_1,_入力ファイル,_テキストファイル,_出力ファイル), fail. このディレクトリ配下のファイルを順に表示する(_,_,_,_). 配下のファイルを取り出す(_ファイルディレクトリ情報ならび,_テキストファイル,_入力ファイル) :- append(_,[[A|R1]|R],_ファイルディレクトリ情報ならび), sub_atom(A,0,1,_,'-'), last(R1,_テキストファイル), atomic_list_concat([_ディレクトリ,'/',_テキストファイル],__入力ファイル). 配下のディレクトリを取り出す(_とあるディレクトリ,_フィルディレクトリ情報ならび,_階層_1,_階層_2,_デレクトリ_2) :- append(_,[[A|R1]|R],L), sub_atom(A,0,1,_,d), last(R1,_ディレクトリ), atomic_list_concat([_とあるディレクトリ,'/',_ディレクトリ],_ディレクトリ_2), _階層_2 is _階層_1 + 1. '今位置するディレクトリdnの相対的な深さをdとして、d個のピリオドをディレクトリdnの名前の前に足した文字列'(_相対位置,_今位置するディレクトリ,_ピリオドを名前の前に足した文字列) :- n個の同じ文字で構成される文字列(_相対位置,'.',S), atomic_list_concat([S,_今位置するディレクトリ],_ピリオドを名前の前に足した文字列). テキストファイルtnの内容をそのままファイルFに出力する(_階層,_入力ファイル,_テキストファイル,_出力ファイル) :- 'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列を出力ファイルの先頭に書く'(_階層,_テキストファイル,_出力ファイル,Output), open(_入力ファイル,read,Input), get_char(Input,C), テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C). 'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列を出力ファイルの先頭に書く'(_階層,_テキストファイル,_出力ファイル,Output) :- open(_出力ファイル,write,Output), 'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列'(_階層,_テキストファイル,_文字列), write_formatted(Output,'%t\n',[_文字列]). 'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列'(_d,_テキストファイル,_文字列) :- _d_1 is _d + 1, n個の同じ文字で構成される文字列(_d_1,'.',_ピリオド文字列), atomic_list_concat([_ピリオド文字列,_テキストファイル],_ファイル_1), sub_atom(_ファイル_1,_開始点_1,4,0,'.txt'), sub_atom(_ファイル_1,0,_開始点_1,_,_文字列),!. テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,end_of_file) :- 'Input,Outputの終了'(Input,Output). テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,'\n') :- 改行処理(Input,Output,C2), テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C2). テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C) :- 改行以外の処理(Input,Output,C,C2), テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C2). 'Input,Outputの終了'(Input,Output) :- close(Input), close(Output). 改行処理(Input,Output,C2) :- put_char(Output,'\n'), get_char(Input,C2), 行頭の特殊事情(Output,C2). 行頭の特殊事情(Output,'.') :- put_char(Output,' '),!. 行頭の特殊事情(_,_) :- !. 改行以外の処理(Input,Output,C,C2) :- put_char(Output,C), get_char(Input,C2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 全て同じ文字で構成される文字列(_文字列) :- atom_chars(_文字列,Chars), all(Chars,_). n個の同じ文字で構成される文字列(N,_文字,_文字列) :- 'Nが変数ではない時'(N,_文字,_文字列). n個の同じ文字で構成される文字列(N,_文字,_文字列) :- 'Nが変数の時'(N,_文字,_文字列). 'Nが変数ではない時'(N,_文字,_文字列) :- \+(var(N)), length(Chars,N), all(Chars,_文字), atom_chars(_文字列,Chars),!. 'Nが変数の時'(N,_文字,_文字列) :- var(N), atom_chars(_文字列,Chars), length(Chars,N), all(Chars,_文字). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/200 # # JDK1.4とオラクル9iです # # TESTのテーブルから下の結果を得たいのですが可能でしょうか? # # 1カラム目はIDで # 2カラム目は開始日で # 3カラム目は終了日です # # # テーブルTEST # a,20110403,20110611 # b,20110505,20110721 # # 結果 # a,201104 # a,201105 # a,201106 # b,201105 # b,201106 # b,201107 # # 連続した日付の生成(_ID,_年月) :- 'TEST'(_ID,_開始日,_終了日), sub_atom(_開始日,0,6,_,_開始年月), sub_atom(_終了日,0,6,_,_終了年月), 年月の生成(_開始年月,_年月,_終了年月). 年月の生成(_開始年月,_,_終了年月) :- _開始年月 @> _終了年月,!. 年月の生成(_開始年月,_開始年月,_終了年月). 年月の生成(_開始年月,_年月,_終了年月) :- 次の年月(_開始年月,_次の年月), 年月の生成(_次の年月,_年月,_終了年月). 次の年月(_年月,_次の年月) :- sub_atom(_年月,4,2,_,'12'), sub_atom(_年月,0,4,_,_年), atom_to_term(_年,_年整数,_), _年整数2 is _年整数 + 1, number_chars(_年整数2,Chars), atom_chars(_次の年,Chars), concat_atom([_次の年,'01],_次の年月),!. 次の年月(_年月,_次の年月) :- atom_to_term(_年月,_年月整数,_), _年月整数2 is _年月整数 + 1, number_chars(_年月整数2 is Chars), atom_chars(_次の年月,Chars). % 以下のサイトは # 出典:: 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/1267796762/170 # # 【 課題 】入力したテキストに含まれる文字を種類別に使用回数を表示し、降順にソートし出力するプログラムを作れ。 # 【 形態 】Javaアプリケーション(main()で開始) # 【 期限 】6月22日 # 【 Ver  】1.6.0_20 # 【 補足 】../test/read.cgi/tech/1267796762/83と同様の問題ですが漢字や記号など全ての種類によらずに統計したい場合です。よろしくお願いします。 # # '入力したテキストに含まれる文字別に使用回数を表示し、使用回数で降順にソートし出力する' :- get_line(_入力したテキスト), テキストを文字のならびに変換する(_入力したテキスト,_文字ならび), 文字頻度ならびの生成(_文字ならび,[],_文字頻度ならび), 降順整列(_文字頻度ならび,_降順に整列した文字頻度ならび), append(_,[[_頻度,_文字]|R],_降順整列した文字頻度ならび), write_formatted('%t %t回\n',[_文字,_頻度]), R = [],!. テキストを文字のならびに変換する(_入力したテキスト,_文字ならび) :- atom_chars(_入力したテキスト,_文字ならび). 文字頻度ならびの生成([],L,L) :- !. 文字頻度ならびの生成([A|R1],L1,L) :- 文字頻度ならびの生成(A,L1,L2,M), 文字頻度ならびの生成_2(M,A,R1,L2,L),!. 文字頻度ならびの生成_2(1,A,R1,L2,L) :- 文字頻度ならびの生成(R1,L2,L),!. 文字頻度ならびの生成_2(M,A,R1,L2,L) :- 文字頻度ならびの生成(R1,[[M,A]|L2],L),!. 文字頻度ならびの生成(A,[],[[1,A]],1) :- !. 文字頻度ならびの生成(A,[[N,A]|R1],R1,N2) :- N2 is N + 1,!. 文字頻度ならびの生成(A,[L1|R1],[L1|R2],N) :- 文字頻度ならびの生成(A,R1,R2,N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字種(数字,_文字) :- _文字 @>= '0',_文字 @=< '9'. 文字種(英大文字,_文字) :- _文字 @>= 'A',_文字 @=< 'Z'. 文字種(英小文字,_文字) :- _文字 @>= 'a',_文字 @=< 'z'. 文字種(英記号,_文字) :- _文字 @>= ' ',_文字 @=< '}',\+(文字種(英小文字,文字)),\+(文字種(英大文字,_文字)). 文字種(全角漢字,_文字) :- _文字 @>= '亜',_文字 @=< '龠'. 文字種(全角平仮名,_文字) :- _文字 @>= 'ぁ',_文字 @=< 'ん'. 文字種(全角片仮名,_文字) :- _文字 @>= 'ァ',_文字 @=< 'ン'. 文字種(全角数字,_文字) :- _文字 @>= '0',_文字 @=< '9'. 文字種(全角英大文字,_文字) :- _文字 @>= 'A',_文字 @=< 'Z'. 文字種(全角英小文字,_文字) :- _文字 @>= 'a',_文字 @=< 'z'. 文字種(全角記号,_文字) :- char_code(_文字,_文字コード), _文字コード >= 0xa1a1,_文字コード =< 0xa3fe. '入力したテキストに含まれる文字を種類別に使用回数を表示し、降順にソートし出力する' :- get_chars(L1), '入力したテキストに含まれる文字を種類別に使用回数を計測する'(L1,[],L2), rsort(L2,L3), append(_,[[_頻度,_文字種]|R],L3), write_formatted('%t %t回\n',[_文字種,_頻度]), R = []. '入力したテキストに含まれる文字を種類別に使用回数を計測する'([],L,L) :- !. '入力したテキストに含まれる文字を種類別に使用回数を計測する'([_文字|R],L1,L) :- 文字種(_種類,_文字), 種類別に使用回数を更新(_種類,L1,L2), '入力したテキストに含まれる文字を種類別に使用回数をを計測する'(R,L2,L),!. '入力したテキストに含まれる文字を種類別に使用回数を計測する'([_文字|R],L1,L) :- \+(文字種(_種類,_文字)) '入力したテキストに含まれる文字を種類別に使用回数を計測する'(R,L1,L). 種類別に使用回数を更新(_種類,[],[[1,_種類]]) :- !. 種類別に使用回数を更新(_種類,[[_頻度1,_種類]|R],[[_頻度2,_種類]|R]) :- _頻度2 is _頻度1 + 1,!. 種類別に使用回数を更新(_種類,[A|R1],[A|R2]) :- 種類別に使用回数を更新(_種類,R1,R2). rsort(L1,L2) :- sort(L1,L3), reverse(L3,L2). % 以下のサイトは # 出典:: 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/1274827528/892 # # [1] 授業単元:オブジェクトプログラミング # [2] 問題文(含コード&リンク):入力した文字列を文字型配列に代入し、アルファベットの大文字、 # # 小文字、四則演算を回数分表示できるようにしなさい。尚、改行記号を\nとし、四則演算、アルファベット、 # # 改行記号以外の文字を含む場合と、アルファベットまたは記号の後に数字が来ない場合、各々、エラーを表示するようにしなさい。 # 入力した文字列を文字型配列に代入し、アルファベットの大文字、小文字、四則演算を回数分表示 :- get_line(_文字列), atom_chars(_文字列,Chars), 入力した文字列を文字型配列に代入し、アルファベットの大文字、小文字、四則演算を回数分表示(Chars). 入力した文字列を文字型配列に代入し、アルファベットの大文字、小文字、四則演算を回数分表示([]) :- !. 入力した文字列を文字型配列に代入し、アルファベットの大文字、小文字、四則演算を回数分表示([A|R]) :- アルファベットの大文字、小文字、四則演算記号、改行記号のどれか(A), 数値を切り取る(R,L,R2), number_chars(M,L), for(1,N,M),write(A),M = N, 入力した文字列を文字型配列に代入し、アルファベットの大文字、小文字、四則演算を回数分表示(R). 入力した文字列を文字型配列に代入し、アルファベットの大文字、小文字、四則演算を回数分表示(L1) :- 入力エラーを切り取る(L1,L,R2), concat_atom(L,S), write_formatted('入力文字列エラー %t\n',[S]), 入力した文字列を文字型配列に代入し、アルファベットの大文字、小文字、四則演算を回数分表示(R2). 数値を切り取る([],[],[]) :- !. 数値を切り取る([A|R1],[],[A|R1]) :- \+(member(A,['0','1','2','3','4','5','6','7','8','9'])), write('文字の繰返し数が得られませんでした\n'),!. 数値を切り取る([A|R1],[],[A|R1]) :- \+(member(A,['0','1','2','3','4','5','6','7','8','9'])),!. 数値を切り取る([A|R1],[A|R2],R) :- member(A,['0','1','2','3','4','5','6','7','8','9']), 数値を切り取る(R1,R2,R),!. 入力エラーを切り取る([],[],[]) :- !. 入力エラーを切り取る([_文字|R1],[_文字],R1) :- アルファベットの大文字、小文字、四則演算記号、改行記号のどれか(_文字),!. 入力エラーを切り取る([A|R1],[A],R1) :- \+(アルファベットの大文字、小文字、四則演算記号、改行記号のどれか(_文字)),!. アルファベットの大文字、小文字、四則演算記号、改行記号のどれか(_文字) :- _文字 @>= 'A',_文字 @< 'Z',!. アルファベットの大文字、小文字、四則演算記号、改行記号のどれか(_文字) :- _文字 @>= 'a',_文字 @< 'z',!. アルファベットの大文字、小文字、四則演算記号、改行記号のどれか(_文字) :- member(_文字,[+,-,*,/,'\n']),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/210 # # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10290.txt # # 名前と点数のデータを持っているリスト構造をソートさせたいのです。 # # (名前) (点数) # 骨川スネ夫 50 # 野比のび太 0 # 出木杉英才 100 # 剛田たけし 20 # 源静香    80 # # のようなデータを予め持っているとして、名前でソートしたい時はあいうえお順に、 # 点数でソートしたい時は0から順に並び替え、画面に出力させたいのですが、 # そもそもあいうえお順でソートさせる方法が分からず、 # 名前と点数を同時に動かす方法も思いつかず、提出期限間近になってしまいました。 # どうかお願いします。 # # //漢字でソートは無理だから漢字名とは別に表示させずにひらがなで名前のデータを入れておくのでしょうか? 漢字整列(_漢字ならび,_整列された漢字ならび) :- かな読みに変換しながらデータ番号を付加(1,_漢字ならび,L2), sort(L2,L3), 付加されたデータ番号により整列された漢字ならびを得る(L3,_漢字ならび,_整列された漢字ならび). かな読みに変換しながらデータ番号を付加(_,[],[]) :- !. かな読みに変換しながらデータ番号を付加(N,[[_漢字文字列,_点数]|R1],[[_かなに変換された文字列,_点数,N]|R2]) :- atom_chars(_漢字文字列,Chars), かな読み変換(Chars,_かなならび), N2 is N + 1, かな読みに変換しながらデータ番号を付加(N2,R1,R2).). かな変換([],[]) :- !. かな変換(L1,L2) :- かな読み(L1,R1,L2,R2), かな変換(R1,R2). 付加されたデータ番号により整列された漢字ならびを得る([],_,[]) :- !. 付加されたデータ番号により整列された漢字ならびを得る([[_,_,N]|R1],_漢字ならび,[L|R2]) :- list_nth(N,_漢字ならび,L), 付加されたデータ番号により整列された漢字ならびを得る(R1,_漢字ならび,R2). かな読み([骨,川|R1],R1,[ほ,ね,か,わ|R2],R2). かな読み([ス,ネ,夫|R],R1,[す,ね,お|R2],R2). かな読み([野,比|R1],R1,[の,び|R2],R2). かな読み([の,び,太|R1],R1,[の,び,た|R2],R2). かな読み([出,木,杉|R1],R1,[で,き,す,ぎ|R2],R2). かな読み([英,才|R1],R1,[ひ,で,た,け|R2],R2). かな読み([剛,田|R1],R1,[ご,う,だ|R2],R2). かな読み([た,け,し|R1],R1,[た,け,し|R2],R2). かな読み([源|R1],R1,[み,な,も,と|R],R2). かな読み([静,香|R1],R1,[し,ず,か|R2],R2). % 以下のサイトは # 出典:: 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/1272006124/86 # # <問題> # 与えられた文字列に含まれる数値文字列で1.0-49.0(整数であってもよい)の # 範囲の数値文字列を取り出しなさい。 # # '与えられた文字列に含まれる数値文字列で1.0-49.0(整数であってもよい)の範囲の数値文字列を取り出す'(_文字列,_副文字列) :- atom_chars(_文字列,Chars), 数値ならびを切り出す(Chars,L,_), number_chars(V,L), V >= 1.0,V =< 49.0, concat_atom(L,_副文字列). '与えられた文字列に含まれる数値文字列で1.0-49.0(整数であってもよい)の範囲の数値文字列を取り出す'(_文字列,_副文字列) :- atom_chars(_文字列,Chars), 数値ならびを切り出す(Chars,L,_残りならび), concat_atom(_残りならび,L3), '与えられた文字列に含まれる数値文字列で1.0-49.0(整数であってもよい)の範囲の数値文字列を取り出す'(L3,_副文字列). 数値ならびを切り出す(Chars,L,_残りならび) :- 先頭が数値文字であるならびを切り出す(Chars,L1), ひとつだけピリオドを含む数値文字ならびを切り取る(L1,L,_残りならび),!. 先頭が数値文字であるならびを切り出す(Chars,[A|R]) :- append(L0,[A|R],Chars),A @>= '0',A @=< '9',!. 一つだけピリオドを含む数値文字ならびを切り取る([],[],[]) :- !. 一つだけピリオドを含む数値文字ならびを切り取る(['.'|R1],['.'|R2],R3) :- すべてが数値文字のならびを切り取る(R1,R2,R3),\+(R2=[]),!. 一つだけピリオドを含む数値文字ならびを切り取る(['.'|R1],[],['.'|R1]) :- !. 一つだけピリオドを含む数値文字ならびを切り取る([A|R1],[],[A|R1]) :- \+((A @>= '0',A @=< '9')),!. 一つだけピリオドを含む数値文字ならびを切り取る(['.'|R1],['.'|R2],R3) :- すべてが数値文字のならびを切り取る(R1,R2,R3),!. 一つだけピリオドを含む数値文字ならびを切り取る([A|R1],[A|R2],R3) :- A @>= '0',A @=< '9',一つだけピリオドを含む数値文字ならび(R1,R2,R3). すべてが数値文字のならびを切り取る([],[],[]) :- !. すべてが数値文字のならびを切り取る([A|R],[],[A|R]) :- \+((A @>= '0',A @=< '9')),!. すべてが数値文字のならびを切り取る([A|R1],[A|R2],R3) :- A @>= '0',A @=< '9',すべてが数値文字のならびを切り取る(R1,R2,R3). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1272006124/85 # # <問題> # 与えられた文字列に含まれる整数を表す副文字列の中で最長のものを取り出しなさい。 与えられた文字列に含まれる整数を表す副文字列の中で最長のものを取り出す(_文字列,_整数を表す副文字列の中で最長の文字列) :-     atom_chars(_文字列,Chars),     与えられた文字列に含まれる整数を表す副文字列ならび(Chars,_副文字列とその長さならび),     findmax(_文字列長,member([_,_文字列長],_副文字列とその長さならび),_最長文字列長),     member([_整数を表す副文字列の中で最長の文字列,_最長文字列長],_副文字列とその長さならび). 与えられた文字列に含まれる整数を表す副文字列ならび(Chars,[[_副文字列,_文字列長]|R2]) :-     append(_,[A|R],Chars),     A @>= '0',     A @=< '9',     先頭から整数を表す副文字列を切り出す([A|R],_副文字列,_残りならび),     文字列長(_副文字列,_文字列長),     与えられた文字列に含まれる整数を表す副文字列ならび(_残りならび,R2). 与えられた文字列に含まれる整数を表す副文字列ならび(_,[]). 先頭から整数を表す副文字列を切り出す(Chars,'',[B|R2]) :-     append(L1,['.'|R],Chars),     R=[A|R2],     A @>= '0',     A @=< '9',!,         append(_,[B|R2],R),     \+((B @>= '0',B @=< '9')). 先頭から整数を表す副文字列を切り出す(Chars,_副文字列,[A|R]) :-     append(L1,[A|R],Chars),     \+((A @>= '0',A @=< '9')),     concat_atom(Chars,_副文字列),!. 先頭から整数を表す副文字列を切り出す(Chars,_副文字列,[]) :- concat_atom(Chars,_副文字列). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/75 # # [1] 授業単元:C言語プログラミング # [2] 問題文:コマンドライン引数に指定された文字列それぞれが # 16進数表記で表された0以上100万以下の整数であ # るをことをチェックした後、それを12進数に # 変換したものを表示するプログラムをつくれ # 16進数表記の先頭の0xはなくても良いがあってもエラーに # してはならない。16進数表記になっていない、あるいは # 指定された範囲に無い場合はその旨表示する。 # program :- user_parameters(L), append(_,[A|R],L), to_upper(A,A1), '100万以下の16進文字表現'(A1), '16進文字列表現を10進整数に変換'(A1,A1,_10進整数), 'N進数'(12,_10進整数,X), write_formatted('%t\n',[X]), fail. program. '16進文字列表現を10進整数に変換'(_16進文字列表現,_10進整数) :- atom_chars(_16進文字列表現,L), '16進文字列表現を整数に変換'(L,0,_整数),!. '16進文字列表現を10進整数に変換'(_16進文字列表現,_10進整数) :- write_formatted('%tは適切な16進文字列表記ではありません\n',[_16進文字列表現]),!. '16進文字列表現を10進整数に変換'([],X,X) :-!. '16進文字列表現を10進整数に変換'([A|R],Y,X) :- N進数利用文字(M,A), Y2 is 16 * Y + M, '16進文字列表現を10進整数に変換'(R,Y2,X). '100万以下の16進文字表現'(A) :- '16進文字列表現'(A,B), sub_atom(B,_,Len,_,B), Len < 5,!. '100万以下の16進文字表現'(A) :- '16進文字列表現'(A,B), sub_atom(B,_,5,_,B), B @=< 'F4240'. '16進文字列表現'(A,A) :- \+(sub_atom(A,0,2,R,'0X')),!. '16進文字列表現'(A,B) :- sub_atom(A,0,2,R,'0X'), sub_atom(A,2,R,_,B). N進数(N,_10進数,_N進数文字列) :- N進数(N,_10進数,[],X), concat_atom(X,_N進数文字列). N進数(N,J,Y,[M|Y]) :- J < N,N進数利用文字(J,M),!. N進数(N,J,Y,X) :- J >= N, J2 is J // N, M is J mod N, N進数利用文字(M,M2), N進数(N,J2,[M2|Y],X). N進数利用文字ならび(N,_利用文字ならび) :- length(L1,N), findall(A,N進数利用文字(_,A),L), append(L1,_,L). N進数利用文字(0,'0'). N進数利用文字(1,'1'). N進数利用文字(2,'2'). N進数利用文字(3,'3'). N進数利用文字(4,'4'). N進数利用文字(5,'5'). N進数利用文字(6,'6'). N進数利用文字(7,'7'). N進数利用文字(8,'8'). N進数利用文字(9,'9'). N進数利用文字(10,'A'). N進数利用文字(11,'B'). N進数利用文字(12,'C'). N進数利用文字(13,'D'). N進数利用文字(14,'E'). N進数利用文字(15,'F'). % 以下のサイトは # # 文字列処理に於いて、atom_chars/2の使用を極力減らしたい。 # # ?- a_append(X,Y,abcd,L1,[b|R],L3). # # X = a, # Y = bcd, # L1 = [a], # R = [c,d], # L3 = [a,b,c,d]. # yes. # ?- # # a_append(Atom1,Atom2,Atom3,L1,L2,L3) :- var(Atom1), var(Atom2), atomic(Atom3), atom_chars(Atom3,L3), append(L1,L2,L3), atom_chars(Atom1,L1), atom_chars(Atom2,L2). a_append(Atom1,Atom2,Atom3,L1,L2,L3) :- atomic(Atom1), var(Atom2), atomic(Atom3), atom_chars(Atom1,L1), atom_chars(Atom3,L3), append(L1,L2,L3), atom_chars(Atom2,L2). a_append(Atom1,Atom2,Atom3,L1,L2,L3) :- var(Atom1), atomic(Atom2), atomic(Atom3), atom_chars(Atom3,L3), atom_chars(Atom2,L2), append(L1,L2,L3), atom_chars(Atom1,L1). a_append(Atom1,Atom2,Atom3,L1,L2,L3) :- atomic(Atom1), var(Atom2), var(Atom3), atom_chars(Atom1,L1), append(L1,L2,L3), atom_chars(Atom3,L3), atom_chars(Atom2,L2). a_append(Atom1,Atom2,Atom3,L1,L2,L3) :- var(Atom1), var(Atom2), var(Atom3), append(L1,L2,L3), atom_chars(Atom1,L1), atom_chars(Atom3,L3), atom_chars(Atom2,L2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1272685619/326 # # 文字列を10文字幅にして、足りない部分は先頭に'0'を付けるにはどうすればいいですか? # 例えば "deadbeef"を入力すると"00deadbeef"と返還する処理を書きたいです。 # String.format("%010s", "deadbeef"); # とやってもダメでした # # '文字列を10文字幅にして、足りない部分は先頭に''0''を付ける'(_文字列,_先頭に0を付加した文字列) :- sub_atom(_文字列,_,Len,_,_文字列), _不足数 is 10 - Len, length(L,_不足数), all(L,'0'), concat_atom(L,S), concat_atom([S,_文字列],_先頭に0を付加した文字列),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '文字列を10文字幅にして、足りない部分は先頭に''0''を付ける'(_文字列,_先頭に0を付加した文字列) :- atom_chars(_文字列,Chars), length(L,10), append(L0,Chars,L), all(L0,'0') atom_chars(_先頭に0を付加した文字列,L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/543 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # コンソール上でキーボードから次のような標準入力を与えるとする。 # 10+2 # すると、演算結果が出力するようなプログラムを記述せよ。 # 四則演算( +, -, *, / )に対応させること # # 言語に備わった解析・計算機能を利用するのではなく、 # 文字列を解析して式を生成する部分もプログラムとして書くこと。 # C言語の以下の関数に相当する関数等は使用して構わない。 # 文字列をコピーする関数( strcpy, strncpy ) # 文字列を連結する関数( strcat, strncat ) # 文字列の比較を行う関数( strcmp, strncmp ) # 文字列の長さを調べる関数( strlen ) # 文字を検索する関数( strchr ) # 文字列を整数値に変換する関数( atoi ) コンソール上でキーボードから標準入力として得られた文字列を解析して式を生成して評価する(_式,_値) :- コンソール上でキーボードから次のような標準入力を得る(_行), atom_chars(_行,Chars), 式(Chars,_式), _値 is _式. コンソール上でキーボードから次のような標準入力を得る(_行) :- get_line(_行). 式(Chars,_項) :- append(L0,[_演算子|R],Chars), append(_,[_演算子|_],['+','-']), _項=..[_演算子,_項1,_項2], 式(L0,_項1), 式(R,_項2),!. 式(Chars,_項) :- append(L0,[_演算子|R],Chars), append(_,[_演算子|_],['*','/']), _項=..[_演算子,_項1,_項2], 式(L0,_項1), 式(R,_項2),!. 式(Chars,_項) :- concat_atom(Chars,_項). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/274 # # [1]授業単元: プログラミング # [2] 問題文: # unixのソケット通信を使ったTCP/IPの通信型プログラムで、まず認証の方法として # ユーザー名とパスワードを打ち込みサーバー側が認証され、その後サーバー側からは # クイズを出題する状態になっていて5問正解した場合(正解数はサーバー、クライアント # 両方保持した状態)、暗証のメッセージを送信するということになっていて、 # その場合のクライアント側のプログラムを作成せよ(書き方がおかしかったら # すいません) # 'unixのソケット通信を使ったTCP/IP通信に於けるサーバー認証のクライアント側動作'(Server,Port,Socket,Input,Output) :- サーバーとの通信を確立し(Server,Port,Socket,Input,Output), 最初にユーザー名とパスワードを打ち込み(Input,Output), 後にサーバーからの五問の質問に答える(1,Input,Output), サーバーからの認証通知を得る(Input),!. サーバーとの通信を確立し(Socket,Input,Output) :- socket(internet, stream, Socket), socket_connect(Socket, Host : Port). open(Socket, read, Input), open(Socket, write, Output),!. ユーザー名とパスワードを打ち込み(Input,Output) :- get_line(Input,'Username: '), ユーザ名の取得(_ユーザ名), ユーザ名の送信(Output,_ユーザ名), get_line(Input,'Password: '), パスワードの取得(_パスワード), パスワードの送信(Output,_パスワード),!. 後にサーバーからの五問の質問に答える(N,Input,Output) :- N > 5,!. 後にサーバーからの五問の質問に答える(N,Input,Output) :- サーバーからの質問を取得(Input,_質問), 質問文の表示(_質問), 回答を得る(_回答), 回答の送信(Output,_回答), N2 is N + 1, 後にサーバーからの五問の質問に答える(N2,Input,Output),!. ユーザ名の取得(_ユーザ名) :- get_char(C), ユーザ名文字ならびの取得(C,L), atom_chars(_ユーザ名,L),!. ユーザ名文字ならびの取得('\n',[]) :- !. ユーザ名文字ならびの取得(A,[A|R]) :- get_char(B), ユーザ名文字ならびの取得(B,R). ユーザ名の送信(Output,_ユーザ名) :- write(Output,_ユーザ名),!. パスワードの取得(_ユーザ名) :- rawmode, get_char(C), パスワード文字ならびの取得(C,L), atom_chars(パスワード,L),norawmode,!. パスワード文字ならびの取得('\n',[]) :- !. パスワード文字ならびの取得(A,[A|R]) :- get_char(B), put_char('*'), パスワード文字ならびの取得(B,R). パスワードの送信(Output,_パスワード) :- write(Output,_パスワード),!. サーバーからの認証通知を得る(Input) :- get_line(Input,X), 認証完了(X). 認証完了(X) :- サーバー接続完了通知文字(X),!. 認証完了(X) :- write_formatted('認証を拒否されました:%t\n',[X]). サーバー接続完了通知文字('OK'). 質問文の表示(_質問) :- write_formatted('%t',[_質問]),!. 回答を得る(_回答) :- get_line(_回答),!. 回答の送信(Output,_回答) :- write_formatted(Output,'%t\n',[_回答]),!. % 以下のサイトは # 出典:: # 文字列をひっくり返す関数下さい # # in→あいうえお # out→おえうあい # # こんな感じのです # # # 文字列をひっくり返す関数下さい(_in,_out) :- 勘違い(おえうあい,おえういあ), atom_chars(_in,_文字ならび), reverse(_文字ならび,_反転した文字ならび), atom_chars(_out,_反転した文字ならび). 文字列をひっくり返す関数下さい(_in,_out) :- 深淵なるルール(_in,_out). 勘違い(おえうあい,おえういあ). 深淵なるルール(_in,_out) :- 深遠なるルール(_in,_out). 深遠なるルール(_in,_out) :- atom_chars(_in,Chars), 第三要素から残り最後までを反転し最初の二要素を付加する(Chars,Chars2), atom_chars(_out,Chars2). 深遠なるルール(_in,_out) :- atom_chars(_in,_文字ならび), 一旦反転して最終二要素を置換する(_文字ならび,_一旦反転して最終二要素を置換した文字ならび), atom_chars(_out,_一旦反転して最終二要素を置換した文字ならび). 深遠なるルール(_in,_out) :- atom_chars(_in,_文字ならび), 文字置換ルールに従って文字を置換する(_文字ならび,_置換された文字ならび), atom_chars(_out,_置換された文字ならび). 第三要素から残り最後までを反転し最初の二要素を付加する(Chars,Chars2) :- length(L,2), append(L,R,Chars), reverse(R,R2), append(R2,L,Chars2). 一旦反転して最終二要素を置換する(_文字ならび,_一旦反転して最終二要素を置換した文字ならび) :- reverse(_文字ならび,_反転した文字ならび), append(L,[A,B],_反転した文字ならび), append(L,[B,A],_一旦反転して最終二要素を置換した文字ならび). 文字置換ルールに従って文字を置換する([],[]) :- !. 文字置換ルールに従って文字を置換する([A|R1],[B|R2]) :- 文字置換ルール(A,B), 文字置換ルールに従って文字を置換する(R1,R2). 文字置換ルール(あ,お). 文字置換ルール(い,え). 文字置換ルール(う,う). 文字置換ルール(え,あ). 文字置換ルール(お,い). % 以下のサイトは % *** user: '西暦和暦変換' / 2 *** '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_和暦年), \+(atomic(_西暦年)), atom_chars(_和暦年,L), '年漢字表現'(N,L2), append(L3,L2,L), concat_atom(L3,_元号), concat_atom(L2,_年), '西暦和暦表'(_西暦年,_元号,N,_). '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_西暦年), \+(atomic(_和暦年)), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- var(_西暦年), var(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- var(_西暦年), var(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_西暦年), atom(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). 西暦和暦表(645,大化,1,[]). 西暦和暦表(646,大化,2,[]). 西暦和暦表(647,大化,3,[]). 西暦和暦表(648,大化,4,[]). 西暦和暦表(649,大化,5,[]). 西暦和暦表(650,大化,6,[]). 西暦和暦表(650,白雉,1,[]). 西暦和暦表(651,白雉,2,[]). 西暦和暦表(652,白雉,3,[]). 西暦和暦表(653,白雉,4,[]). 西暦和暦表(654,白雉,5,[]). 西暦和暦表(686,朱鳥,1,[]). 西暦和暦表(687,朱鳥,2,[]). 西暦和暦表(701,大宝,1,[]). 西暦和暦表(702,大宝,2,[]). 西暦和暦表(703,大宝,3,[]). 西暦和暦表(704,大宝,4,[]). 西暦和暦表(704,慶雲,1,[]). 西暦和暦表(705,慶雲,2,[]). 西暦和暦表(706,慶雲,3,[]). 西暦和暦表(707,慶雲,4,[]). 西暦和暦表(708,慶雲,5,[]). 西暦和暦表(708,和銅,1,[]). 西暦和暦表(709,和銅,2,[]). 西暦和暦表(710,和銅,3,[]). 西暦和暦表(711,和銅,4,[]). 西暦和暦表(712,和銅,5,[]). 西暦和暦表(713,和銅,6,[]). 西暦和暦表(714,和銅,7,[]). 西暦和暦表(715,和銅,8,[]). 西暦和暦表(715,霊亀,1,[]). 西暦和暦表(716,霊亀,2,[]). 西暦和暦表(717,霊亀,3,[]). 西暦和暦表(717,養老,1,[]). 西暦和暦表(718,養老,2,[]). 西暦和暦表(719,養老,3,[]). 西暦和暦表(720,養老,4,[]). 西暦和暦表(721,養老,5,[]). 西暦和暦表(722,養老,6,[]). 西暦和暦表(723,養老,7,[]). 西暦和暦表(724,養老,8,[]). 西暦和暦表(724,神亀,1,[]). 西暦和暦表(725,神亀,2,[]). 西暦和暦表(726,神亀,3,[]). 西暦和暦表(727,神亀,4,[]). 西暦和暦表(728,神亀,5,[]). 西暦和暦表(729,神亀,6,[]). 西暦和暦表(729,天平,1,[]). 西暦和暦表(730,天平,2,[]). 西暦和暦表(731,天平,3,[]). 西暦和暦表(732,天平,4,[]). 西暦和暦表(733,天平,5,[]). 西暦和暦表(734,天平,6,[]). 西暦和暦表(735,天平,7,[]). 西暦和暦表(736,天平,8,[]). 西暦和暦表(737,天平,9,[]). 西暦和暦表(738,天平,10,[]). 西暦和暦表(739,天平,11,[]). 西暦和暦表(740,天平,12,[]). 西暦和暦表(741,天平,13,[]). 西暦和暦表(742,天平,14,[]). 西暦和暦表(743,天平,15,[]). 西暦和暦表(744,天平,16,[]). 西暦和暦表(745,天平,17,[]). 西暦和暦表(746,天平,18,[]). 西暦和暦表(747,天平,19,[]). 西暦和暦表(748,天平,20,[]). 西暦和暦表(749,天平,21,[]). 西暦和暦表(749,天平感宝,1,[]). 西暦和暦表(749,天平勝宝,1,[]). 西暦和暦表(750,天平勝宝,2,[]). 西暦和暦表(751,天平勝宝,3,[]). 西暦和暦表(752,天平勝宝,4,[]). 西暦和暦表(753,天平勝宝,5,[]). 西暦和暦表(754,天平勝宝,6,[]). 西暦和暦表(755,天平勝宝,7,[]). 西暦和暦表(756,天平勝宝,8,[]). 西暦和暦表(757,天平勝宝,9,[]). 西暦和暦表(757,天平宝字,1,[]). 西暦和暦表(758,天平宝字,2,[]). 西暦和暦表(759,天平宝字,3,[]). 西暦和暦表(760,天平宝字,4,[]). 西暦和暦表(761,天平宝字,5,[]). 西暦和暦表(762,天平宝字,6,[]). 西暦和暦表(763,天平宝字,7,[]). 西暦和暦表(764,天平宝字,8,[]). 西暦和暦表(765,天平宝字,9,[]). 西暦和暦表(765,天平神護,1,[]). 西暦和暦表(766,天平神護,2,[]). 西暦和暦表(767,天平神護,3,[]). 西暦和暦表(767,神護景雲,1,[]). 西暦和暦表(768,神護景雲,2,[]). 西暦和暦表(769,神護景雲,3,[]). 西暦和暦表(770,神護景雲,4,[]). 西暦和暦表(770,宝亀,1,[]). 西暦和暦表(771,宝亀,2,[]). 西暦和暦表(772,宝亀,3,[]). 西暦和暦表(773,宝亀,4,[]). 西暦和暦表(774,宝亀,5,[]). 西暦和暦表(775,宝亀,6,[]). 西暦和暦表(776,宝亀,7,[]). 西暦和暦表(777,宝亀,8,[]). 西暦和暦表(778,宝亀,9,[]). 西暦和暦表(779,宝亀,10,[]). 西暦和暦表(780,宝亀,11,[]). 西暦和暦表(781,天応,1,[]). 西暦和暦表(782,天応,2,[]). 西暦和暦表(782,延暦,1,[]). 西暦和暦表(783,延暦,2,[]). 西暦和暦表(784,延暦,3,[]). 西暦和暦表(785,延暦,4,[]). 西暦和暦表(786,延暦,5,[]). 西暦和暦表(787,延暦,6,[]). 西暦和暦表(788,延暦,7,[]). 西暦和暦表(789,延暦,8,[]). 西暦和暦表(790,延暦,9,[]). 西暦和暦表(791,延暦,10,[]). 西暦和暦表(792,延暦,11,[]). 西暦和暦表(793,延暦,12,[]). 西暦和暦表(794,延暦,13,[]). 西暦和暦表(795,延暦,14,[]). 西暦和暦表(796,延暦,15,[]). 西暦和暦表(797,延暦,16,[]). 西暦和暦表(798,延暦,17,[]). 西暦和暦表(799,延暦,18,[]). 西暦和暦表(800,延暦,19,[]). 西暦和暦表(801,延暦,20,[]). 西暦和暦表(802,延暦,21,[]). 西暦和暦表(803,延暦,22,[]). 西暦和暦表(804,延暦,23,[]). 西暦和暦表(805,延暦,24,[]). 西暦和暦表(806,延暦,25,[]). 西暦和暦表(806,大同,1,[]). 西暦和暦表(807,大同,2,[]). 西暦和暦表(808,大同,3,[]). 西暦和暦表(809,大同,4,[]). 西暦和暦表(810,大同,5,[]). 西暦和暦表(810,弘仁,1,[]). 西暦和暦表(811,弘仁,2,[]). 西暦和暦表(812,弘仁,3,[]). 西暦和暦表(813,弘仁,4,[]). 西暦和暦表(814,弘仁,5,[]). 西暦和暦表(815,弘仁,6,[]). 西暦和暦表(816,弘仁,7,[]). 西暦和暦表(817,弘仁,8,[]). 西暦和暦表(818,弘仁,9,[]). 西暦和暦表(819,弘仁,10,[]). 西暦和暦表(820,弘仁,11,[]). 西暦和暦表(821,弘仁,12,[]). 西暦和暦表(822,弘仁,13,[]). 西暦和暦表(823,弘仁,14,[]). 西暦和暦表(824,弘仁,15,[]). 西暦和暦表(824,天長,1,[]). 西暦和暦表(825,天長,2,[]). 西暦和暦表(826,天長,3,[]). 西暦和暦表(827,天長,4,[]). 西暦和暦表(828,天長,5,[]). 西暦和暦表(829,天長,6,[]). 西暦和暦表(830,天長,7,[]). 西暦和暦表(831,天長,8,[]). 西暦和暦表(832,天長,9,[]). 西暦和暦表(833,天長,10,[]). 西暦和暦表(834,天長,11,[]). 西暦和暦表(834,承和,1,[]). 西暦和暦表(835,承和,2,[]). 西暦和暦表(836,承和,3,[]). 西暦和暦表(837,承和,4,[]). 西暦和暦表(838,承和,5,[]). 西暦和暦表(839,承和,6,[]). 西暦和暦表(840,承和,7,[]). 西暦和暦表(841,承和,8,[]). 西暦和暦表(842,承和,9,[]). 西暦和暦表(843,承和,10,[]). 西暦和暦表(844,承和,11,[]). 西暦和暦表(845,承和,12,[]). 西暦和暦表(846,承和,13,[]). 西暦和暦表(847,承和,14,[]). 西暦和暦表(848,承和,15,[]). 西暦和暦表(848,嘉祥,1,[]). 西暦和暦表(849,嘉祥,2,[]). 西暦和暦表(850,嘉祥,3,[]). 西暦和暦表(851,嘉祥,4,[]). 西暦和暦表(851,仁寿,1,[]). 西暦和暦表(852,仁寿,2,[]). 西暦和暦表(853,仁寿,3,[]). 西暦和暦表(854,仁寿,4,[]). 西暦和暦表(854,斉衡,1,[]). 西暦和暦表(855,斉衡,2,[]). 西暦和暦表(856,斉衡,3,[]). 西暦和暦表(857,斉衡,4,[]). 西暦和暦表(857,天安,1,[]). 西暦和暦表(858,天安,2,[]). 西暦和暦表(859,天安,3,[]). 西暦和暦表(859,貞観,1,[]). 西暦和暦表(860,貞観,2,[]). 西暦和暦表(861,貞観,3,[]). 西暦和暦表(862,貞観,4,[]). 西暦和暦表(863,貞観,5,[]). 西暦和暦表(864,貞観,6,[]). 西暦和暦表(865,貞観,7,[]). 西暦和暦表(866,貞観,8,[]). 西暦和暦表(867,貞観,9,[]). 西暦和暦表(868,貞観,10,[]). 西暦和暦表(869,貞観,11,[]). 西暦和暦表(870,貞観,12,[]). 西暦和暦表(871,貞観,13,[]). 西暦和暦表(872,貞観,14,[]). 西暦和暦表(873,貞観,15,[]). 西暦和暦表(874,貞観,16,[]). 西暦和暦表(875,貞観,17,[]). 西暦和暦表(876,貞観,18,[]). 西暦和暦表(877,貞観,19,[]). 西暦和暦表(877,元慶,1,[]). 西暦和暦表(878,元慶,2,[]). 西暦和暦表(879,元慶,3,[]). 西暦和暦表(880,元慶,4,[]). 西暦和暦表(881,元慶,5,[]). 西暦和暦表(882,元慶,6,[]). 西暦和暦表(883,元慶,7,[]). 西暦和暦表(884,元慶,8,[]). 西暦和暦表(885,元慶,9,[]). 西暦和暦表(885,仁和,1,[]). 西暦和暦表(886,仁和,2,[]). 西暦和暦表(887,仁和,3,[]). 西暦和暦表(888,仁和,4,[]). 西暦和暦表(889,仁和,5,[]). 西暦和暦表(889,寛平,1,[]). 西暦和暦表(890,寛平,2,[]). 西暦和暦表(891,寛平,3,[]). 西暦和暦表(892,寛平,4,[]). 西暦和暦表(893,寛平,5,[]). 西暦和暦表(894,寛平,6,[]). 西暦和暦表(895,寛平,7,[]). 西暦和暦表(896,寛平,8,[]). 西暦和暦表(897,寛平,9,[]). 西暦和暦表(898,寛平,10,[]). 西暦和暦表(898,昌泰,1,[]). 西暦和暦表(899,昌泰,2,[]). 西暦和暦表(900,昌泰,3,[]). 西暦和暦表(901,昌泰,4,[]). 西暦和暦表(901,延喜,1,[]). 西暦和暦表(902,延喜,2,[]). 西暦和暦表(903,延喜,3,[]). 西暦和暦表(904,延喜,4,[]). 西暦和暦表(905,延喜,5,[]). 西暦和暦表(906,延喜,6,[]). 西暦和暦表(907,延喜,7,[]). 西暦和暦表(908,延喜,8,[]). 西暦和暦表(909,延喜,9,[]). 西暦和暦表(910,延喜,10,[]). 西暦和暦表(911,延喜,11,[]). 西暦和暦表(912,延喜,12,[]). 西暦和暦表(913,延喜,13,[]). 西暦和暦表(914,延喜,14,[]). 西暦和暦表(915,延喜,15,[]). 西暦和暦表(916,延喜,16,[]). 西暦和暦表(917,延喜,17,[]). 西暦和暦表(918,延喜,18,[]). 西暦和暦表(919,延喜,19,[]). 西暦和暦表(920,延喜,20,[]). 西暦和暦表(921,延喜,21,[]). 西暦和暦表(922,延喜,22,[]). 西暦和暦表(923,延喜,23,[]). 西暦和暦表(923,延長,1,[]). 西暦和暦表(924,延長,2,[]). 西暦和暦表(925,延長,3,[]). 西暦和暦表(926,延長,4,[]). 西暦和暦表(927,延長,5,[]). 西暦和暦表(928,延長,6,[]). 西暦和暦表(929,延長,7,[]). 西暦和暦表(930,延長,8,[]). 西暦和暦表(931,延長,9,[]). 西暦和暦表(931,承平,1,[]). 西暦和暦表(932,承平,2,[]). 西暦和暦表(933,承平,3,[]). 西暦和暦表(934,承平,4,[]). 西暦和暦表(935,承平,5,[]). 西暦和暦表(936,承平,6,[]). 西暦和暦表(937,承平,7,[]). 西暦和暦表(938,承平,8,[]). 西暦和暦表(938,天慶,1,[]). 西暦和暦表(939,天慶,2,[]). 西暦和暦表(940,天慶,3,[]). 西暦和暦表(941,天慶,4,[]). 西暦和暦表(942,天慶,5,[]). 西暦和暦表(943,天慶,6,[]). 西暦和暦表(944,天慶,7,[]). 西暦和暦表(945,天慶,8,[]). 西暦和暦表(946,天慶,9,[]). 西暦和暦表(947,天慶,10,[]). 西暦和暦表(947,天暦,1,[]). 西暦和暦表(948,天暦,2,[]). 西暦和暦表(949,天暦,3,[]). 西暦和暦表(950,天暦,4,[]). 西暦和暦表(951,天暦,5,[]). 西暦和暦表(952,天暦,6,[]). 西暦和暦表(953,天暦,7,[]). 西暦和暦表(954,天暦,8,[]). 西暦和暦表(955,天暦,9,[]). 西暦和暦表(956,天暦,10,[]). 西暦和暦表(957,天暦,11,[]). 西暦和暦表(957,天徳,1,[]). 西暦和暦表(958,天徳,2,[]). 西暦和暦表(959,天徳,3,[]). 西暦和暦表(960,天徳,4,[]). 西暦和暦表(961,天徳,5,[]). 西暦和暦表(961,応和,1,[]). 西暦和暦表(962,応和,2,[]). 西暦和暦表(963,応和,3,[]). 西暦和暦表(964,応和,4,[]). 西暦和暦表(964,康保,1,[]). 西暦和暦表(965,康保,2,[]). 西暦和暦表(966,康保,3,[]). 西暦和暦表(967,康保,4,[]). 西暦和暦表(968,康保,5,[]). 西暦和暦表(968,安和,1,[]). 西暦和暦表(969,安和,2,[]). 西暦和暦表(970,安和,3,[]). 西暦和暦表(970,天禄,1,[]). 西暦和暦表(971,天禄,2,[]). 西暦和暦表(972,天禄,3,[]). 西暦和暦表(973,天禄,4,[]). 西暦和暦表(973,天延,1,[]). 西暦和暦表(974,天延,2,[]). 西暦和暦表(975,天延,3,[]). 西暦和暦表(976,天延,4,[]). 西暦和暦表(976,貞元,1,[]). 西暦和暦表(977,貞元,2,[]). 西暦和暦表(978,貞元,3,[]). 西暦和暦表(978,天元,1,[]). 西暦和暦表(979,天元,2,[]). 西暦和暦表(980,天元,3,[]). 西暦和暦表(981,天元,4,[]). 西暦和暦表(982,天元,5,[]). 西暦和暦表(983,天元,6,[]). 西暦和暦表(983,永観,1,[]). 西暦和暦表(984,永観,2,[]). 西暦和暦表(985,永観,3,[]). 西暦和暦表(985,寛和,1,[]). 西暦和暦表(986,寛和,2,[]). 西暦和暦表(987,寛和,3,[]). 西暦和暦表(987,永延,1,[]). 西暦和暦表(988,永延,2,[]). 西暦和暦表(989,永延,3,[]). 西暦和暦表(989,永祚,1,[]). 西暦和暦表(990,永祚,2,[]). 西暦和暦表(990,正暦,1,[]). 西暦和暦表(991,正暦,2,[]). 西暦和暦表(992,正暦,3,[]). 西暦和暦表(993,正暦,4,[]). 西暦和暦表(994,正暦,5,[]). 西暦和暦表(995,正暦,6,[]). 西暦和暦表(995,長徳,1,[]). 西暦和暦表(996,長徳,2,[]). 西暦和暦表(997,長徳,3,[]). 西暦和暦表(998,長徳,4,[]). 西暦和暦表(999,長徳,5,[]). 西暦和暦表(999,長保,1,[]). 西暦和暦表(1000,長保,2,[]). 西暦和暦表(1001,長保,3,[]). 西暦和暦表(1002,長保,4,[]). 西暦和暦表(1003,長保,5,[]). 西暦和暦表(1004,長保,6,[]). 西暦和暦表(1004,寛弘,1,[]). 西暦和暦表(1005,寛弘,2,[]). 西暦和暦表(1006,寛弘,3,[]). 西暦和暦表(1007,寛弘,4,[]). 西暦和暦表(1008,寛弘,5,[]). 西暦和暦表(1009,寛弘,6,[]). 西暦和暦表(1010,寛弘,7,[]). 西暦和暦表(1011,寛弘,8,[]). 西暦和暦表(1012,寛弘,9,[]). 西暦和暦表(1012,長和,1,[]). 西暦和暦表(1013,長和,2,[]). 西暦和暦表(1014,長和,3,[]). 西暦和暦表(1015,長和,4,[]). 西暦和暦表(1016,長和,5,[]). 西暦和暦表(1017,長和,6,[]). 西暦和暦表(1017,寛仁,1,[]). 西暦和暦表(1018,寛仁,2,[]). 西暦和暦表(1019,寛仁,3,[]). 西暦和暦表(1020,寛仁,4,[]). 西暦和暦表(1021,寛仁,5,[]). 西暦和暦表(1021,治安,1,[]). 西暦和暦表(1022,治安,2,[]). 西暦和暦表(1023,治安,3,[]). 西暦和暦表(1024,治安,4,[]). 西暦和暦表(1024,万寿,1,[]). 西暦和暦表(1025,万寿,2,[]). 西暦和暦表(1026,万寿,3,[]). 西暦和暦表(1027,万寿,4,[]). 西暦和暦表(1028,万寿,5,[]). 西暦和暦表(1028,長元,1,[]). 西暦和暦表(1029,長元,2,[]). 西暦和暦表(1030,長元,3,[]). 西暦和暦表(1031,長元,4,[]). 西暦和暦表(1032,長元,5,[]). 西暦和暦表(1033,長元,6,[]). 西暦和暦表(1034,長元,7,[]). 西暦和暦表(1035,長元,8,[]). 西暦和暦表(1036,長元,9,[]). 西暦和暦表(1037,長元,10,[]). 西暦和暦表(1037,長暦,1,[]). 西暦和暦表(1038,長暦,2,[]). 西暦和暦表(1039,長暦,3,[]). 西暦和暦表(1040,長暦,4,[]). 西暦和暦表(1040,長久,1,[]). 西暦和暦表(1041,長久,2,[]). 西暦和暦表(1042,長久,3,[]). 西暦和暦表(1043,長久,4,[]). 西暦和暦表(1044,長久,5,[]). 西暦和暦表(1044,寛徳,1,[]). 西暦和暦表(1045,寛徳,2,[]). 西暦和暦表(1046,寛徳,3,[]). 西暦和暦表(1046,永承,1,[]). 西暦和暦表(1047,永承,2,[]). 西暦和暦表(1048,永承,3,[]). 西暦和暦表(1049,永承,4,[]). 西暦和暦表(1050,永承,5,[]). 西暦和暦表(1051,永承,6,[]). 西暦和暦表(1052,永承,7,[]). 西暦和暦表(1053,永承,8,[]). 西暦和暦表(1053,天喜,1,[]). 西暦和暦表(1054,天喜,2,[]). 西暦和暦表(1055,天喜,3,[]). 西暦和暦表(1056,天喜,4,[]). 西暦和暦表(1057,天喜,5,[]). 西暦和暦表(1058,天喜,6,[]). 西暦和暦表(1058,康平,1,[]). 西暦和暦表(1059,康平,2,[]). 西暦和暦表(1060,康平,3,[]). 西暦和暦表(1061,康平,4,[]). 西暦和暦表(1062,康平,5,[]). 西暦和暦表(1063,康平,6,[]). 西暦和暦表(1064,康平,7,[]). 西暦和暦表(1065,康平,8,[]). 西暦和暦表(1065,治暦,1,[]). 西暦和暦表(1066,治暦,2,[]). 西暦和暦表(1067,治暦,3,[]). 西暦和暦表(1068,治暦,4,[]). 西暦和暦表(1069,治暦,5,[]). 西暦和暦表(1069,延久,1,[]). 西暦和暦表(1070,延久,2,[]). 西暦和暦表(1071,延久,3,[]). 西暦和暦表(1072,延久,4,[]). 西暦和暦表(1073,延久,5,[]). 西暦和暦表(1074,延久,6,[]). 西暦和暦表(1074,承保,1,[]). 西暦和暦表(1075,承保,2,[]). 西暦和暦表(1076,承保,3,[]). 西暦和暦表(1077,承保,4,[]). 西暦和暦表(1077,承暦,1,[]). 西暦和暦表(1078,承暦,2,[]). 西暦和暦表(1079,承暦,3,[]). 西暦和暦表(1080,承暦,4,[]). 西暦和暦表(1081,承暦,5,[]). 西暦和暦表(1081,永保,1,[]). 西暦和暦表(1082,永保,2,[]). 西暦和暦表(1083,永保,3,[]). 西暦和暦表(1084,永保,4,[]). 西暦和暦表(1084,応徳,1,[]). 西暦和暦表(1085,応徳,2,[]). 西暦和暦表(1086,応徳,3,[]). 西暦和暦表(1087,応徳,4,[]). 西暦和暦表(1087,寛治,1,[]). 西暦和暦表(1088,寛治,2,[]). 西暦和暦表(1089,寛治,3,[]). 西暦和暦表(1090,寛治,4,[]). 西暦和暦表(1091,寛治,5,[]). 西暦和暦表(1092,寛治,6,[]). 西暦和暦表(1093,寛治,7,[]). 西暦和暦表(1094,寛治,8,[]). 西暦和暦表(1094,嘉保,1,[]). 西暦和暦表(1095,嘉保,2,[]). 西暦和暦表(1096,嘉保,3,[]). 西暦和暦表(1096,永長,1,[]). 西暦和暦表(1097,永長,2,[]). 西暦和暦表(1097,承徳,1,[]). 西暦和暦表(1098,承徳,2,[]). 西暦和暦表(1099,承徳,3,[]). 西暦和暦表(1099,康和,1,[]). 西暦和暦表(1100,康和,2,[]). 西暦和暦表(1101,康和,3,[]). 西暦和暦表(1102,康和,4,[]). 西暦和暦表(1103,康和,5,[]). 西暦和暦表(1104,康和,6,[]). 西暦和暦表(1104,長治,1,[]). 西暦和暦表(1105,長治,2,[]). 西暦和暦表(1106,長治,3,[]). 西暦和暦表(1106,嘉承,1,[]). 西暦和暦表(1107,嘉承,2,[]). 西暦和暦表(1108,嘉承,3,[]). 西暦和暦表(1108,天仁,1,[]). 西暦和暦表(1109,天仁,2,[]). 西暦和暦表(1110,天仁,3,[]). 西暦和暦表(1110,天永,1,[]). 西暦和暦表(1111,天永,2,[]). 西暦和暦表(1112,天永,3,[]). 西暦和暦表(1113,天永,4,[]). 西暦和暦表(1113,永久,1,[]). 西暦和暦表(1114,永久,2,[]). 西暦和暦表(1115,永久,3,[]). 西暦和暦表(1116,永久,4,[]). 西暦和暦表(1117,永久,5,[]). 西暦和暦表(1118,永久,6,[]). 西暦和暦表(1118,元永,1,[]). 西暦和暦表(1119,元永,2,[]). 西暦和暦表(1120,元永,3,[]). 西暦和暦表(1120,保安,1,[]). 西暦和暦表(1121,保安,2,[]). 西暦和暦表(1122,保安,3,[]). 西暦和暦表(1123,保安,4,[]). 西暦和暦表(1124,保安,5,[]). 西暦和暦表(1124,天治,1,[]). 西暦和暦表(1125,天治,2,[]). 西暦和暦表(1126,天治,3,[]). 西暦和暦表(1126,大治,1,[]). 西暦和暦表(1127,大治,2,[]). 西暦和暦表(1128,大治,3,[]). 西暦和暦表(1129,大治,4,[]). 西暦和暦表(1130,大治,5,[]). 西暦和暦表(1131,大治,6,[]). 西暦和暦表(1131,天承,1,[]). 西暦和暦表(1132,天承,2,[]). 西暦和暦表(1132,長承,1,[]). 西暦和暦表(1133,長承,2,[]). 西暦和暦表(1134,長承,3,[]). 西暦和暦表(1135,長承,4,[]). 西暦和暦表(1135,保延,1,[]). 西暦和暦表(1136,保延,2,[]). 西暦和暦表(1137,保延,3,[]). 西暦和暦表(1138,保延,4,[]). 西暦和暦表(1139,保延,5,[]). 西暦和暦表(1140,保延,6,[]). 西暦和暦表(1141,保延,7,[]). 西暦和暦表(1141,永治,1,[]). 西暦和暦表(1142,永治,2,[]). 西暦和暦表(1142,康治,1,[]). 西暦和暦表(1143,康治,2,[]). 西暦和暦表(1144,康治,3,[]). 西暦和暦表(1144,天養,1,2 / 23). 西暦和暦表(1145,天養,2,[]). 西暦和暦表(1145,久安,1,7 / 22). 西暦和暦表(1146,久安,2,[]). 西暦和暦表(1147,久安,3,[]). 西暦和暦表(1148,久安,4,[]). 西暦和暦表(1149,久安,5,[]). 西暦和暦表(1150,久安,6,[]). 西暦和暦表(1151,久安,7,[]). 西暦和暦表(1151,仁平,1,1 / 26). 西暦和暦表(1152,仁平,2,[]). 西暦和暦表(1153,仁平,3,[]). 西暦和暦表(1154,仁平,4,[]). 西暦和暦表(1154,久寿,1,10 / 28). 西暦和暦表(1155,久寿,2,[]). 西暦和暦表(1156,久寿,3,[]). 西暦和暦表(1156,保元,1,4 / 27). 西暦和暦表(1157,保元,2,[]). 西暦和暦表(1158,保元,3,[]). 西暦和暦表(1159,保元,4,[]). 西暦和暦表(1159,平治,1,4 / 20). 西暦和暦表(1160,平治,2,[]). 西暦和暦表(1160,永暦,1,1 / 10). 西暦和暦表(1161,永暦,2,[]). 西暦和暦表(1161,応保,1,9 / 4). 西暦和暦表(1162,応保,2,[]). 西暦和暦表(1163,応保,3,[]). 西暦和暦表(1163,長寛,1,3 / 29). 西暦和暦表(1164,長寛,2,[]). 西暦和暦表(1165,長寛,3,[]). 西暦和暦表(1165,永万,1,6 / 5). 西暦和暦表(1166,永万,2,[]). 西暦和暦表(1166,仁安,1,8 / 27). 西暦和暦表(1167,仁安,2,[]). 西暦和暦表(1168,仁安,3,[]). 西暦和暦表(1169,仁安,4,[]). 西暦和暦表(1169,嘉応,1,4 / 8). 西暦和暦表(1170,嘉応,2,[]). 西暦和暦表(1171,嘉応,3,[]). 西暦和暦表(1171,承安,1,4 / 21). 西暦和暦表(1172,承安,2,[]). 西暦和暦表(1173,承安,3,[]). 西暦和暦表(1174,承安,4,[]). 西暦和暦表(1175,承安,5,[]). 西暦和暦表(1175,安元,1,7 / 28). 西暦和暦表(1176,安元,2,[]). 西暦和暦表(1177,安元,3,[]). 西暦和暦表(1177,治承,1,8 / 4). 西暦和暦表(1178,治承,2,[]). 西暦和暦表(1179,治承,3,[]). 西暦和暦表(1180,治承,4,[]). 西暦和暦表(1181,治承,5,[]). 西暦和暦表(1181,養和,1,7 / 14). 西暦和暦表(1182,養和,2,[]). 西暦和暦表(1182,寿永,1,5 / 27). 西暦和暦表(1183,寿永,2,[]). 西暦和暦表(1184,寿永,3,[]). 西暦和暦表(1185,寿永,4,[]). 西暦和暦表(1185,文治,1,8 / 14). 西暦和暦表(1186,文治,2,[]). 西暦和暦表(1187,文治,3,[]). 西暦和暦表(1188,文治,4,[]). 西暦和暦表(1189,文治,5,[]). 西暦和暦表(1190,文治,6,[]). 西暦和暦表(1190,建久,1,4 / 11). 西暦和暦表(1191,建久,2,[]). 西暦和暦表(1192,建久,3,[]). 西暦和暦表(1193,建久,4,[]). 西暦和暦表(1194,建久,5,[]). 西暦和暦表(1195,建久,6,[]). 西暦和暦表(1196,建久,7,[]). 西暦和暦表(1197,建久,8,[]). 西暦和暦表(1198,建久,9,[]). 西暦和暦表(1199,建久,10,[]). 西暦和暦表(1199,正治,1,4 / 27). 西暦和暦表(1200,正治,2,[]). 西暦和暦表(1201,正治,3,[]). 西暦和暦表(1201,建仁,1,2 / 13). 西暦和暦表(1202,建仁,2,[]). 西暦和暦表(1203,建仁,3,[]). 西暦和暦表(1204,建仁,4,[]). 西暦和暦表(1204,元久,1,2 / 20). 西暦和暦表(1205,元久,2,[]). 西暦和暦表(1206,元久,3,[]). 西暦和暦表(1206,建永,1,4 / 27). 西暦和暦表(1207,建永,2,[]). 西暦和暦表(1207,承元,1,10 / 25). 西暦和暦表(1208,承元,2,[]). 西暦和暦表(1209,承元,3,[]). 西暦和暦表(1210,承元,4,[]). 西暦和暦表(1211,承元,5,[]). 西暦和暦表(1211,建暦,1,3 / 9). 西暦和暦表(1212,建暦,2,[]). 西暦和暦表(1213,建暦,3,[]). 西暦和暦表(1213,建保,1,12 / 6). 西暦和暦表(1214,建保,2,[]). 西暦和暦表(1215,建保,3,[]). 西暦和暦表(1216,建保,4,[]). 西暦和暦表(1217,建保,5,[]). 西暦和暦表(1218,建保,6,[]). 西暦和暦表(1219,建保,7,[]). 西暦和暦表(1219,承久,1,4 / 12). 西暦和暦表(1220,承久,2,[]). 西暦和暦表(1221,承久,3,[]). 西暦和暦表(1222,承久,4,[]). 西暦和暦表(1222,貞応,1,4 / 13). 西暦和暦表(1223,貞応,2,[]). 西暦和暦表(1224,貞応,3,[]). 西暦和暦表(1224,元仁,1,11 / 20). 西暦和暦表(1225,元仁,2,[]). 西暦和暦表(1225,嘉祿,1,4 / 20). 西暦和暦表(1226,嘉祿,2,[]). 西暦和暦表(1227,嘉祿,3,[]). 西暦和暦表(1227,安貞,1,12 / 10). 西暦和暦表(1228,安貞,2,[]). 西暦和暦表(1229,安貞,3,[]). 西暦和暦表(1229,寛喜,1,3 / 5). 西暦和暦表(1230,寛喜,2,[]). 西暦和暦表(1231,寛喜,3,[]). 西暦和暦表(1232,寛喜,4,[]). 西暦和暦表(1232,貞永,1,4 / 2). 西暦和暦表(1233,貞永,2,[]). 西暦和暦表(1233,天福,1,4 / 15). 西暦和暦表(1234,天福,2,[]). 西暦和暦表(1234,文暦,1,11 / 5). 西暦和暦表(1235,文暦,2,[]). 西暦和暦表(1235,嘉禎,1,9 / 19). 西暦和暦表(1236,嘉禎,2,[]). 西暦和暦表(1237,嘉禎,3,[]). 西暦和暦表(1238,嘉禎,4,[]). 西暦和暦表(1238,暦仁,1,11 / 23). 西暦和暦表(1239,暦仁,2,[]). 西暦和暦表(1239,延応,1,2 / 7). 西暦和暦表(1240,延応,2,[]). 西暦和暦表(1240,仁治,1,7 / 16). 西暦和暦表(1241,仁治,2,[]). 西暦和暦表(1242,仁治,3,[]). 西暦和暦表(1243,仁治,4,[]). 西暦和暦表(1243,寛元,1,2 / 26). 西暦和暦表(1244,寛元,2,[]). 西暦和暦表(1245,寛元,3,[]). 西暦和暦表(1246,寛元,4,[]). 西暦和暦表(1247,寛元,5,[]). 西暦和暦表(1247,宝治,1,2 / 28). 西暦和暦表(1248,宝治,2,[]). 西暦和暦表(1249,宝治,3,[]). 西暦和暦表(1249,建長,1,3 / 18). 西暦和暦表(1250,建長,2,[]). 西暦和暦表(1251,建長,3,[]). 西暦和暦表(1252,建長,4,[]). 西暦和暦表(1253,建長,5,[]). 西暦和暦表(1254,建長,6,[]). 西暦和暦表(1255,建長,7,[]). 西暦和暦表(1256,建長,8,[]). 西暦和暦表(1256,康元,1,10 / 5). 西暦和暦表(1257,康元,2,[]). 西暦和暦表(1257,正嘉,1,3 / 14). 西暦和暦表(1258,正嘉,2,[]). 西暦和暦表(1259,正嘉,3,[]). 西暦和暦表(1259,正元,1,3 / 26). 西暦和暦表(1260,正元,2,[]). 西暦和暦表(1260,文応,1,4 / 23). 西暦和暦表(1261,文応,2,[]). 西暦和暦表(1261,弘長,1,2 / 20). 西暦和暦表(1262,弘長,2,[]). 西暦和暦表(1263,弘長,3,[]). 西暦和暦表(1264,弘長,4,[]). 西暦和暦表(1264,文永,1,2 / 28). 西暦和暦表(1265,文永,2,[]). 西暦和暦表(1266,文永,3,[]). 西暦和暦表(1267,文永,4,[]). 西暦和暦表(1268,文永,5,[]). 西暦和暦表(1269,文永,6,[]). 西暦和暦表(1270,文永,7,[]). 西暦和暦表(1271,文永,8,[]). 西暦和暦表(1272,文永,9,[]). 西暦和暦表(1273,文永,10,[]). 西暦和暦表(1274,文永,11,[]). 西暦和暦表(1275,文永,12,[]). 西暦和暦表(1275,建治,1,4 / 25). 西暦和暦表(1276,建治,2,[]). 西暦和暦表(1277,建治,3,[]). 西暦和暦表(1278,建治,4,[]). 西暦和暦表(1278,弘安,1,2 / 29). 西暦和暦表(1279,弘安,2,[]). 西暦和暦表(1280,弘安,3,[]). 西暦和暦表(1281,弘安,4,[]). 西暦和暦表(1282,弘安,5,[]). 西暦和暦表(1283,弘安,6,[]). 西暦和暦表(1284,弘安,7,[]). 西暦和暦表(1285,弘安,8,[]). 西暦和暦表(1286,弘安,9,[]). 西暦和暦表(1287,弘安,10,[]). 西暦和暦表(1288,弘安,11,[]). 西暦和暦表(1288,正応,1,4 / 28). 西暦和暦表(1289,正応,2,[]). 西暦和暦表(1290,正応,3,[]). 西暦和暦表(1291,正応,4,[]). 西暦和暦表(1292,正応,5,[]). 西暦和暦表(1293,正応,6,[]). 西暦和暦表(1293,永仁,1,8 / 5). 西暦和暦表(1294,永仁,2,[]). 西暦和暦表(1295,永仁,3,[]). 西暦和暦表(1296,永仁,4,[]). 西暦和暦表(1297,永仁,5,[]). 西暦和暦表(1298,永仁,6,[]). 西暦和暦表(1299,永仁,7,[]). 西暦和暦表(1299,正安,1,4 / 25). 西暦和暦表(1300,正安,2,[]). 西暦和暦表(1301,正安,3,[]). 西暦和暦表(1302,正安,4,[]). 西暦和暦表(1302,乾元,1,11 / 21). 西暦和暦表(1303,乾元,2,[]). 西暦和暦表(1303,嘉元,1,8 / 5). 西暦和暦表(1304,嘉元,2,[]). 西暦和暦表(1305,嘉元,3,[]). 西暦和暦表(1306,嘉元,4,[]). 西暦和暦表(1306,徳治,1,12 / 14). 西暦和暦表(1307,徳治,2,[]). 西暦和暦表(1308,徳治,3,[]). 西暦和暦表(1308,延慶,1,10 / 9). 西暦和暦表(1309,延慶,2,[]). 西暦和暦表(1310,延慶,3,[]). 西暦和暦表(1311,延慶,4,[]). 西暦和暦表(1311,応長,1,4 / 28). 西暦和暦表(1312,応長,2,[]). 西暦和暦表(1312,正和,1,3 / 20). 西暦和暦表(1313,正和,2,[]). 西暦和暦表(1314,正和,3,[]). 西暦和暦表(1315,正和,4,[]). 西暦和暦表(1316,正和,5,[]). 西暦和暦表(1317,正和,6,[]). 西暦和暦表(1317,文保,1,2 / 3). 西暦和暦表(1318,文保,2,[]). 西暦和暦表(1319,文保,3,[]). 西暦和暦表(1319,元応,1,4 / 28). 西暦和暦表(1320,元応,2,[]). 西暦和暦表(1321,元応,3,[]). 西暦和暦表(1321,元亨,1,2 / 23). 西暦和暦表(1322,元亨,2,[]). 西暦和暦表(1323,元亨,3,[]). 西暦和暦表(1324,元亨,4,[]). 西暦和暦表(1324,正中,1,12 / 9). 西暦和暦表(1325,正中,2,[]). 西暦和暦表(1326,正中,3,[]). 西暦和暦表(1326,嘉暦,1,4 / 26). 西暦和暦表(1327,嘉暦,2,[]). 西暦和暦表(1328,嘉暦,3,[]). 西暦和暦表(1329,嘉暦,4,[]). 西暦和暦表(1329,元徳,1,8 / 29). 西暦和暦表(1330,元徳,2,[]). 西暦和暦表(1331,元徳,3,[]). 西暦和暦表(1331,元弘,1,8 / 9). 西暦和暦表(1332,元弘,2,[]). 西暦和暦表(1332,正慶,1,4 / 28). 西暦和暦表(1333,正慶,2,[]). 西暦和暦表(1334,正慶,3,[]). 西暦和暦表(1334,建武,1,1 / 29). 西暦和暦表(1335,建武,2,[]). 西暦和暦表(1336,建武,3,[]). 西暦和暦表(1337,建武,4,[]). 西暦和暦表(1338,建武,5,[]). 西暦和暦表(1338,暦応,1,8 / 28). 西暦和暦表(1339,暦応,2,[]). 西暦和暦表(1340,暦応,3,[]). 西暦和暦表(1341,暦応,4,[]). 西暦和暦表(1342,暦応,5,[]). 西暦和暦表(1342,康永,1,4 / 27). 西暦和暦表(1343,康永,2,[]). 西暦和暦表(1344,康永,3,[]). 西暦和暦表(1345,康永,4,[]). 西暦和暦表(1345,貞和,1,10 / 21). 西暦和暦表(1346,貞和,2,[]). 西暦和暦表(1347,貞和,3,[]). 西暦和暦表(1348,貞和,4,[]). 西暦和暦表(1349,貞和,5,[]). 西暦和暦表(1350,貞和,6,[]). 西暦和暦表(1350,観応,1,2 / 27). 西暦和暦表(1351,観応,2,[]). 西暦和暦表(1352,観応,3,[]). 西暦和暦表(1352,文和,1,9 / 27). 西暦和暦表(1353,文和,2,[]). 西暦和暦表(1354,文和,3,[]). 西暦和暦表(1355,文和,4,[]). 西暦和暦表(1356,文和,5,[]). 西暦和暦表(1356,延文,1,3 / 28). 西暦和暦表(1357,延文,2,[]). 西暦和暦表(1358,延文,3,[]). 西暦和暦表(1359,延文,4,[]). 西暦和暦表(1360,延文,5,[]). 西暦和暦表(1361,延文,6,[]). 西暦和暦表(1361,康安,1,3 / 29). 西暦和暦表(1362,康安,2,[]). 西暦和暦表(1362,貞治,1,9 / 23). 西暦和暦表(1363,貞治,2,[]). 西暦和暦表(1364,貞治,3,[]). 西暦和暦表(1365,貞治,4,[]). 西暦和暦表(1366,貞治,5,[]). 西暦和暦表(1367,貞治,6,[]). 西暦和暦表(1368,貞治,7,[]). 西暦和暦表(1368,応安,1,2 / 18). 西暦和暦表(1369,応安,2,[]). 西暦和暦表(1370,応安,3,[]). 西暦和暦表(1371,応安,4,[]). 西暦和暦表(1372,応安,5,[]). 西暦和暦表(1373,応安,6,[]). 西暦和暦表(1374,応安,7,[]). 西暦和暦表(1375,応安,8,[]). 西暦和暦表(1375,永和,1,5 / 27). 西暦和暦表(1376,永和,2,[]). 西暦和暦表(1377,永和,3,[]). 西暦和暦表(1378,永和,4,[]). 西暦和暦表(1379,永和,5,[]). 西暦和暦表(1379,康暦,1,3 / 22). 西暦和暦表(1380,康暦,2,[]). 西暦和暦表(1381,康暦,3,[]). 西暦和暦表(1381,永徳,1,2 / 10). 西暦和暦表(1382,永徳,2,[]). 西暦和暦表(1383,永徳,3,[]). 西暦和暦表(1384,永徳,4,[]). 西暦和暦表(1384,至徳,1,4 / 28). 西暦和暦表(1385,至徳,2,[]). 西暦和暦表(1386,至徳,3,[]). 西暦和暦表(1387,至徳,4,[]). 西暦和暦表(1387,嘉慶,1,8 / 23). 西暦和暦表(1388,嘉慶,2,[]). 西暦和暦表(1389,嘉慶,3,[]). 西暦和暦表(1389,康応,1,2 / 9). 西暦和暦表(1390,康応,2,[]). 西暦和暦表(1390,明徳,1,3 / 26). 西暦和暦表(1391,明徳,2,[]). 西暦和暦表(1392,明徳,3,[]). 西暦和暦表(1393,明徳,4,[]). 西暦和暦表(1394,明徳,5,[]). 西暦和暦表(1394,応永,1,7 / 5). 西暦和暦表(1395,応永,2,[]). 西暦和暦表(1396,応永,3,[]). 西暦和暦表(1397,応永,4,[]). 西暦和暦表(1398,応永,5,[]). 西暦和暦表(1399,応永,6,[]). 西暦和暦表(1400,応永,7,[]). 西暦和暦表(1401,応永,8,[]). 西暦和暦表(1402,応永,9,[]). 西暦和暦表(1403,応永,10,[]). 西暦和暦表(1404,応永,11,[]). 西暦和暦表(1405,応永,12,[]). 西暦和暦表(1406,応永,13,[]). 西暦和暦表(1407,応永,14,[]). 西暦和暦表(1408,応永,15,[]). 西暦和暦表(1409,応永,16,[]). 西暦和暦表(1410,応永,17,[]). 西暦和暦表(1411,応永,18,[]). 西暦和暦表(1412,応永,19,[]). 西暦和暦表(1413,応永,20,[]). 西暦和暦表(1414,応永,21,[]). 西暦和暦表(1415,応永,22,[]). 西暦和暦表(1416,応永,23,[]). 西暦和暦表(1417,応永,24,[]). 西暦和暦表(1418,応永,25,[]). 西暦和暦表(1419,応永,26,[]). 西暦和暦表(1420,応永,27,[]). 西暦和暦表(1421,応永,28,[]). 西暦和暦表(1422,応永,29,[]). 西暦和暦表(1423,応永,30,[]). 西暦和暦表(1424,応永,31,[]). 西暦和暦表(1425,応永,32,[]). 西暦和暦表(1426,応永,33,[]). 西暦和暦表(1427,応永,34,[]). 西暦和暦表(1428,応永,35,[]). 西暦和暦表(1428,正長,1,4 / 27). 西暦和暦表(1429,正長,2,[]). 西暦和暦表(1429,永享,1,9 / 5). 西暦和暦表(1430,永享,2,[]). 西暦和暦表(1431,永享,3,[]). 西暦和暦表(1432,永享,4,[]). 西暦和暦表(1433,永享,5,[]). 西暦和暦表(1434,永享,6,[]). 西暦和暦表(1435,永享,7,[]). 西暦和暦表(1436,永享,8,[]). 西暦和暦表(1437,永享,9,[]). 西暦和暦表(1438,永享,10,[]). 西暦和暦表(1439,永享,11,[]). 西暦和暦表(1440,永享,12,[]). 西暦和暦表(1441,永享,13,[]). 西暦和暦表(1441,嘉吉,1,2 / 17). 西暦和暦表(1442,嘉吉,2,[]). 西暦和暦表(1443,嘉吉,3,[]). 西暦和暦表(1444,嘉吉,4,[]). 西暦和暦表(1444,文安,1,2 / 5). 西暦和暦表(1445,文安,2,[]). 西暦和暦表(1446,文安,3,[]). 西暦和暦表(1447,文安,4,[]). 西暦和暦表(1448,文安,5,[]). 西暦和暦表(1449,文安,6,[]). 西暦和暦表(1449,宝徳,1,7 / 28). 西暦和暦表(1450,宝徳,2,[]). 西暦和暦表(1451,宝徳,3,[]). 西暦和暦表(1452,宝徳,4,[]). 西暦和暦表(1452,享徳,1,7 / 25). 西暦和暦表(1453,享徳,2,[]). 西暦和暦表(1454,享徳,3,[]). 西暦和暦表(1455,享徳,4,[]). 西暦和暦表(1455,康正,1,7 / 25). 西暦和暦表(1456,康正,2,[]). 西暦和暦表(1457,康正,3,[]). 西暦和暦表(1457,長祿,1,9 / 28). 西暦和暦表(1458,長祿,2,[]). 西暦和暦表(1459,長祿,3,[]). 西暦和暦表(1460,長祿,4,[]). 西暦和暦表(1460,寛正,1,12 / 21). 西暦和暦表(1461,寛正,2,[]). 西暦和暦表(1462,寛正,3,[]). 西暦和暦表(1463,寛正,4,[]). 西暦和暦表(1464,寛正,5,[]). 西暦和暦表(1465,寛正,6,[]). 西暦和暦表(1466,寛正,7,[]). 西暦和暦表(1466,文正,1,2 / 28). 西暦和暦表(1467,文正,2,[]). 西暦和暦表(1467,応仁,1,3 / 5). 西暦和暦表(1468,応仁,2,[]). 西暦和暦表(1469,応仁,3,[]). 西暦和暦表(1469,文明,1,4 / 28). 西暦和暦表(1470,文明,2,[]). 西暦和暦表(1471,文明,3,[]). 西暦和暦表(1472,文明,4,[]). 西暦和暦表(1473,文明,5,[]). 西暦和暦表(1474,文明,6,[]). 西暦和暦表(1475,文明,7,[]). 西暦和暦表(1476,文明,8,[]). 西暦和暦表(1477,文明,9,[]). 西暦和暦表(1478,文明,10,[]). 西暦和暦表(1479,文明,11,[]). 西暦和暦表(1480,文明,12,[]). 西暦和暦表(1481,文明,13,[]). 西暦和暦表(1482,文明,14,[]). 西暦和暦表(1483,文明,15,[]). 西暦和暦表(1484,文明,16,[]). 西暦和暦表(1485,文明,17,[]). 西暦和暦表(1486,文明,18,[]). 西暦和暦表(1487,文明,19,[]). 西暦和暦表(1487,長享,1,7 / 20). 西暦和暦表(1488,長享,2,[]). 西暦和暦表(1489,長享,3,[]). 西暦和暦表(1489,延徳,1,8 / 21). 西暦和暦表(1490,延徳,2,[]). 西暦和暦表(1491,延徳,3,[]). 西暦和暦表(1492,延徳,4,[]). 西暦和暦表(1492,明応,1,7 / 19). 西暦和暦表(1493,明応,2,[]). 西暦和暦表(1494,明応,3,[]). 西暦和暦表(1495,明応,4,[]). 西暦和暦表(1496,明応,5,[]). 西暦和暦表(1497,明応,6,[]). 西暦和暦表(1498,明応,7,[]). 西暦和暦表(1499,明応,8,[]). 西暦和暦表(1500,明応,9,[]). 西暦和暦表(1501,明応,10,[]). 西暦和暦表(1501,文龜,1,2 / 29). 西暦和暦表(1502,文龜,2,[]). 西暦和暦表(1503,文龜,3,[]). 西暦和暦表(1504,文龜,4,[]). 西暦和暦表(1504,永正,1,2 / 30). 西暦和暦表(1505,永正,2,[]). 西暦和暦表(1506,永正,3,[]). 西暦和暦表(1507,永正,4,[]). 西暦和暦表(1508,永正,5,[]). 西暦和暦表(1509,永正,6,[]). 西暦和暦表(1510,永正,7,[]). 西暦和暦表(1511,永正,8,[]). 西暦和暦表(1512,永正,9,[]). 西暦和暦表(1513,永正,10,[]). 西暦和暦表(1514,永正,11,[]). 西暦和暦表(1515,永正,12,[]). 西暦和暦表(1516,永正,13,[]). 西暦和暦表(1517,永正,14,[]). 西暦和暦表(1518,永正,15,[]). 西暦和暦表(1519,永正,16,[]). 西暦和暦表(1520,永正,17,[]). 西暦和暦表(1521,永正,18,[]). 西暦和暦表(1521,大永,1,8 / 23). 西暦和暦表(1522,大永,2,[]). 西暦和暦表(1523,大永,3,[]). 西暦和暦表(1524,大永,4,[]). 西暦和暦表(1525,大永,5,[]). 西暦和暦表(1526,大永,6,[]). 西暦和暦表(1527,大永,7,[]). 西暦和暦表(1528,大永,8,[]). 西暦和暦表(1528,享祿,1,8 / 20). 西暦和暦表(1529,享祿,2,[]). 西暦和暦表(1530,享祿,3,[]). 西暦和暦表(1531,享祿,4,[]). 西暦和暦表(1532,享祿,5,[]). 西暦和暦表(1532,天文,1,7 / 29). 西暦和暦表(1533,天文,2,[]). 西暦和暦表(1534,天文,3,[]). 西暦和暦表(1535,天文,4,[]). 西暦和暦表(1536,天文,5,[]). 西暦和暦表(1537,天文,6,[]). 西暦和暦表(1538,天文,7,[]). 西暦和暦表(1539,天文,8,[]). 西暦和暦表(1540,天文,9,[]). 西暦和暦表(1541,天文,10,[]). 西暦和暦表(1542,天文,11,[]). 西暦和暦表(1543,天文,12,[]). 西暦和暦表(1544,天文,13,[]). 西暦和暦表(1545,天文,14,[]). 西暦和暦表(1546,天文,15,[]). 西暦和暦表(1547,天文,16,[]). 西暦和暦表(1548,天文,17,[]). 西暦和暦表(1549,天文,18,[]). 西暦和暦表(1550,天文,19,[]). 西暦和暦表(1551,天文,20,[]). 西暦和暦表(1552,天文,21,[]). 西暦和暦表(1553,天文,22,[]). 西暦和暦表(1554,天文,23,[]). 西暦和暦表(1555,天文,24,[]). 西暦和暦表(1555,弘治,1,10 / 23). 西暦和暦表(1556,弘治,2,[]). 西暦和暦表(1557,弘治,3,[]). 西暦和暦表(1558,弘治,4,[]). 西暦和暦表(1558,永祿,1,2 / 28). 西暦和暦表(1559,永祿,2,[]). 西暦和暦表(1560,永祿,3,[]). 西暦和暦表(1561,永祿,4,[]). 西暦和暦表(1562,永祿,5,[]). 西暦和暦表(1563,永祿,6,[]). 西暦和暦表(1564,永禄,7,[]). 西暦和暦表(1565,永禄,8,[]). 西暦和暦表(1566,永禄,9,[]). 西暦和暦表(1567,永禄,10,[]). 西暦和暦表(1568,永禄,11,[]). 西暦和暦表(1569,永禄,12,[]). 西暦和暦表(1570,永禄,13,[]). 西暦和暦表(1570,元龜,1,4 / 23). 西暦和暦表(1571,元龜,2,[]). 西暦和暦表(1572,元龜,3,[]). 西暦和暦表(1573,元龜,4,[]). 西暦和暦表(1573,天正,1,7 / 28). 西暦和暦表(1574,天正,2,[]). 西暦和暦表(1575,天正,3,[]). 西暦和暦表(1576,天正,4,[]). 西暦和暦表(1577,天正,5,[]). 西暦和暦表(1578,天正,6,[]). 西暦和暦表(1579,天正,7,[]). 西暦和暦表(1580,天正,8,[]). 西暦和暦表(1581,天正,9,[]). 西暦和暦表(1582,天正,10,[]). 西暦和暦表(1583,天正,11,[]). 西暦和暦表(1584,天正,12,[]). 西暦和暦表(1585,天正,13,[]). 西暦和暦表(1586,天正,14,[]). 西暦和暦表(1587,天正,15,[]). 西暦和暦表(1588,天正,16,[]). 西暦和暦表(1589,天正,17,[]). 西暦和暦表(1590,天正,18,[]). 西暦和暦表(1591,天正,19,[]). 西暦和暦表(1592,天正,20,[]). 西暦和暦表(1592,文禄,1,12 / 8). 西暦和暦表(1593,文禄,2,[]). 西暦和暦表(1594,文禄,3,[]). 西暦和暦表(1595,文禄,4,[]). 西暦和暦表(1596,文禄,5,[]). 西暦和暦表(1596,慶長,1,10 / 27). 西暦和暦表(1597,慶長,2,[]). 西暦和暦表(1598,慶長,3,[]). 西暦和暦表(1599,慶長,4,[]). 西暦和暦表(1600,慶長,5,[]). 西暦和暦表(1601,慶長,6,[]). 西暦和暦表(1602,慶長,7,[]). 西暦和暦表(1603,慶長,8,[]). 西暦和暦表(1604,慶長,9,[]). 西暦和暦表(1605,慶長,10,[]). 西暦和暦表(1606,慶長,11,[]). 西暦和暦表(1607,慶長,12,[]). 西暦和暦表(1608,慶長,13,[]). 西暦和暦表(1609,慶長,14,[]). 西暦和暦表(1610,慶長,15,[]). 西暦和暦表(1611,慶長,16,[]). 西暦和暦表(1612,慶長,17,[]). 西暦和暦表(1613,慶長,18,[]). 西暦和暦表(1614,慶長,19,[]). 西暦和暦表(1615,慶長,20,[]). 西暦和暦表(1615,元和,1,7 / 13). 西暦和暦表(1616,元和,2,[]). 西暦和暦表(1617,元和,3,[]). 西暦和暦表(1618,元和,4,[]). 西暦和暦表(1619,元和,5,[]). 西暦和暦表(1620,元和,6,[]). 西暦和暦表(1621,元和,7,[]). 西暦和暦表(1622,元和,8,[]). 西暦和暦表(1623,元和,9,[]). 西暦和暦表(1624,元和,10,[]). 西暦和暦表(1624,寛永,1,2 / 30). 西暦和暦表(1625,寛永,2,[]). 西暦和暦表(1626,寛永,3,[]). 西暦和暦表(1627,寛永,4,[]). 西暦和暦表(1628,寛永,5,[]). 西暦和暦表(1629,寛永,6,[]). 西暦和暦表(1630,寛永,7,[]). 西暦和暦表(1631,寛永,8,[]). 西暦和暦表(1632,寛永,9,[]). 西暦和暦表(1633,寛永,10,[]). 西暦和暦表(1634,寛永,11,[]). 西暦和暦表(1635,寛永,12,[]). 西暦和暦表(1636,寛永,13,[]). 西暦和暦表(1637,寛永,14,[]). 西暦和暦表(1638,寛永,15,[]). 西暦和暦表(1639,寛永,16,[]). 西暦和暦表(1640,寛永,17,[]). 西暦和暦表(1641,寛永,18,[]). 西暦和暦表(1642,寛永,19,[]). 西暦和暦表(1643,寛永,20,[]). 西暦和暦表(1644,寛永,21,[]). 西暦和暦表(1644,正保,1,12 / 16). 西暦和暦表(1645,正保,2,[]). 西暦和暦表(1646,正保,3,[]). 西暦和暦表(1647,正保,4,[]). 西暦和暦表(1648,正保,5,[]). 西暦和暦表(1648,慶安,1,2 / 15). 西暦和暦表(1649,慶安,2,[]). 西暦和暦表(1650,慶安,3,[]). 西暦和暦表(1651,慶安,4,[]). 西暦和暦表(1652,慶安,5,[]). 西暦和暦表(1652,承応,1,9 / 18). 西暦和暦表(1653,承応,2,[]). 西暦和暦表(1654,承応,3,[]). 西暦和暦表(1655,承応,4,[]). 西暦和暦表(1655,明暦,1,4 / 13). 西暦和暦表(1656,明暦,2,[]). 西暦和暦表(1657,明暦,3,[]). 西暦和暦表(1658,明暦,4,[]). 西暦和暦表(1658,万治,1,7 / 23). 西暦和暦表(1659,万治,2,[]). 西暦和暦表(1660,万治,3,[]). 西暦和暦表(1661,万治,4,[]). 西暦和暦表(1661,寛文,1,4 / 25). 西暦和暦表(1662,寛文,2,[]). 西暦和暦表(1663,寛文,3,[]). 西暦和暦表(1664,寛文,4,[]). 西暦和暦表(1665,寛文,5,[]). 西暦和暦表(1666,寛文,6,[]). 西暦和暦表(1667,寛文,7,[]). 西暦和暦表(1668,寛文,8,[]). 西暦和暦表(1669,寛文,9,[]). 西暦和暦表(1670,寛文,10,[]). 西暦和暦表(1671,寛文,11,[]). 西暦和暦表(1672,寛文,12,[]). 西暦和暦表(1673,寛文,13,[]). 西暦和暦表(1673,延宝,1,9 / 21). 西暦和暦表(1674,延宝,2,[]). 西暦和暦表(1675,延宝,3,[]). 西暦和暦表(1676,延宝,4,[]). 西暦和暦表(1677,延宝,5,[]). 西暦和暦表(1678,延宝,6,[]). 西暦和暦表(1679,延宝,7,[]). 西暦和暦表(1680,延宝,8,[]). 西暦和暦表(1681,延宝,9,[]). 西暦和暦表(1681,天和,1,9 / 29). 西暦和暦表(1682,天和,2,[]). 西暦和暦表(1683,天和,3,[]). 西暦和暦表(1684,天和,4,[]). 西暦和暦表(1684,貞享,1,2 / 21). 西暦和暦表(1685,貞享,2,[]). 西暦和暦表(1686,貞享,3,[]). 西暦和暦表(1687,貞享,4,[]). 西暦和暦表(1688,貞享,5,[]). 西暦和暦表(1688,元禄,1,9 / 30). 西暦和暦表(1689,元禄,2,[]). 西暦和暦表(1690,元禄,3,[]). 西暦和暦表(1691,元禄,4,[]). 西暦和暦表(1692,元禄,5,[]). 西暦和暦表(1693,元禄,6,[]). 西暦和暦表(1694,元禄,7,[]). 西暦和暦表(1695,元禄,8,[]). 西暦和暦表(1696,元禄,9,[]). 西暦和暦表(1697,元禄,10,[]). 西暦和暦表(1698,元禄,11,[]). 西暦和暦表(1699,元禄,12,[]). 西暦和暦表(1700,元禄,13,[]). 西暦和暦表(1701,元禄,14,[]). 西暦和暦表(1702,元禄,15,[]). 西暦和暦表(1703,元禄,16,[]). 西暦和暦表(1704,元禄,17,[]). 西暦和暦表(1704,宝永,1,3 / 13). 西暦和暦表(1705,宝永,2,[]). 西暦和暦表(1706,宝永,3,[]). 西暦和暦表(1707,宝永,4,[]). 西暦和暦表(1708,宝永,5,[]). 西暦和暦表(1709,宝永,6,[]). 西暦和暦表(1710,宝永,7,[]). 西暦和暦表(1711,宝永,8,[]). 西暦和暦表(1711,正徳,1,4 / 25). 西暦和暦表(1712,正徳,2,[]). 西暦和暦表(1713,正徳,3,[]). 西暦和暦表(1714,正徳,4,[]). 西暦和暦表(1715,正徳,5,[]). 西暦和暦表(1716,正徳,6,[]). 西暦和暦表(1716,享保,1,6 / 22). 西暦和暦表(1717,享保,2,[]). 西暦和暦表(1718,享保,3,[]). 西暦和暦表(1719,享保,4,[]). 西暦和暦表(1720,享保,5,[]). 西暦和暦表(1721,享保,6,[]). 西暦和暦表(1722,享保,7,[]). 西暦和暦表(1723,享保,8,[]). 西暦和暦表(1724,享保,9,[]). 西暦和暦表(1725,享保,10,[]). 西暦和暦表(1726,享保,11,[]). 西暦和暦表(1727,享保,12,[]). 西暦和暦表(1728,享保,13,[]). 西暦和暦表(1729,享保,14,[]). 西暦和暦表(1730,享保,15,[]). 西暦和暦表(1731,享保,16,[]). 西暦和暦表(1732,享保,17,[]). 西暦和暦表(1733,享保,18,[]). 西暦和暦表(1734,享保,19,[]). 西暦和暦表(1735,享保,20,[]). 西暦和暦表(1736,享保,21,[]). 西暦和暦表(1736,元文,1,4 / 28). 西暦和暦表(1737,元文,2,[]). 西暦和暦表(1738,元文,3,[]). 西暦和暦表(1739,元文,4,[]). 西暦和暦表(1740,元文,5,[]). 西暦和暦表(1741,元文,6,[]). 西暦和暦表(1741,寛保,1,2 / 27). 西暦和暦表(1742,寛保,2,[]). 西暦和暦表(1743,寛保,3,[]). 西暦和暦表(1744,寛保,4,[]). 西暦和暦表(1744,延享,1,2 / 21). 西暦和暦表(1745,延享,2,[]). 西暦和暦表(1746,延享,3,[]). 西暦和暦表(1747,延享,4,[]). 西暦和暦表(1748,延享,5,[]). 西暦和暦表(1748,寛延,1,7 / 12). 西暦和暦表(1749,寛延,2,[]). 西暦和暦表(1750,寛延,3,[]). 西暦和暦表(1751,寛延,4,[]). 西暦和暦表(1751,宝暦,1,10 / 27). 西暦和暦表(1752,宝暦,2,[]). 西暦和暦表(1753,宝暦,3,[]). 西暦和暦表(1754,宝暦,4,[]). 西暦和暦表(1755,宝暦,5,[]). 西暦和暦表(1756,宝暦,6,[]). 西暦和暦表(1757,宝暦,7,[]). 西暦和暦表(1758,宝暦,8,[]). 西暦和暦表(1759,宝暦,9,[]). 西暦和暦表(1760,宝暦,10,[]). 西暦和暦表(1761,宝暦,11,[]). 西暦和暦表(1762,宝暦,12,[]). 西暦和暦表(1763,宝暦,13,[]). 西暦和暦表(1764,宝暦,14,[]). 西暦和暦表(1764,明和,1,6 / 2). 西暦和暦表(1765,明和,2,[]). 西暦和暦表(1766,明和,3,[]). 西暦和暦表(1767,明和,4,[]). 西暦和暦表(1768,明和,5,[]). 西暦和暦表(1769,明和,6,[]). 西暦和暦表(1770,明和,7,[]). 西暦和暦表(1771,明和,8,[]). 西暦和暦表(1772,明和,9,[]). 西暦和暦表(1772,安永,1,11 / 16). 西暦和暦表(1773,安永,2,[]). 西暦和暦表(1774,安永,3,[]). 西暦和暦表(1775,安永,4,[]). 西暦和暦表(1776,安永,5,[]). 西暦和暦表(1777,安永,6,[]). 西暦和暦表(1778,安永,7,[]). 西暦和暦表(1779,安永,8,[]). 西暦和暦表(1780,安永,9,[]). 西暦和暦表(1781,安永,10,[]). 西暦和暦表(1781,天明,1,4 / 2). 西暦和暦表(1782,天明,2,[]). 西暦和暦表(1783,天明,3,[]). 西暦和暦表(1784,天明,4,[]). 西暦和暦表(1785,天明,5,[]). 西暦和暦表(1786,天明,6,[]). 西暦和暦表(1787,天明,7,[]). 西暦和暦表(1788,天明,8,[]). 西暦和暦表(1789,天明,9,[]). 西暦和暦表(1789,寛政,1,1 / 25). 西暦和暦表(1790,寛政,2,[]). 西暦和暦表(1791,寛政,3,[]). 西暦和暦表(1792,寛政,4,[]). 西暦和暦表(1793,寛政,5,[]). 西暦和暦表(1794,寛政,6,[]). 西暦和暦表(1795,寛政,7,[]). 西暦和暦表(1796,寛政,8,[]). 西暦和暦表(1797,寛政,9,[]). 西暦和暦表(1798,寛政,10,[]). 西暦和暦表(1799,寛政,11,[]). 西暦和暦表(1800,寛政,12,[]). 西暦和暦表(1801,寛政,13,[]). 西暦和暦表(1801,享和,1,2 / 5). 西暦和暦表(1802,享和,2,[]). 西暦和暦表(1803,享和,3,[]). 西暦和暦表(1804,享和,4,[]). 西暦和暦表(1804,文化,1,2 / 11). 西暦和暦表(1805,文化,2,[]). 西暦和暦表(1806,文化,3,[]). 西暦和暦表(1807,文化,4,[]). 西暦和暦表(1808,文化,5,[]). 西暦和暦表(1809,文化,6,[]). 西暦和暦表(1810,文化,7,[]). 西暦和暦表(1811,文化,8,[]). 西暦和暦表(1812,文化,9,[]). 西暦和暦表(1813,文化,10,[]). 西暦和暦表(1814,文化,11,[]). 西暦和暦表(1815,文化,12,[]). 西暦和暦表(1816,文化,13,[]). 西暦和暦表(1817,文化,14,[]). 西暦和暦表(1818,文化,15,[]). 西暦和暦表(1818,文政,1,4 / 22). 西暦和暦表(1819,文政,2,[]). 西暦和暦表(1820,文政,3,[]). 西暦和暦表(1821,文政,4,[]). 西暦和暦表(1822,文政,5,[]). 西暦和暦表(1823,文政,6,[]). 西暦和暦表(1824,文政,7,[]). 西暦和暦表(1825,文政,8,[]). 西暦和暦表(1826,文政,9,[]). 西暦和暦表(1827,文政,10,[]). 西暦和暦表(1828,文政,11,[]). 西暦和暦表(1829,文政,12,[]). 西暦和暦表(1830,文政,13,[]). 西暦和暦表(1830,天保,1,12 / 1). 西暦和暦表(1831,天保,2,[]). 西暦和暦表(1832,天保,3,[]). 西暦和暦表(1833,天保,4,[]). 西暦和暦表(1834,天保,5,[]). 西暦和暦表(1835,天保,6,[]). 西暦和暦表(1836,天保,7,[]). 西暦和暦表(1837,天保,8,[]). 西暦和暦表(1838,天保,9,[]). 西暦和暦表(1839,天保,10,[]). 西暦和暦表(1840,天保,11,[]). 西暦和暦表(1841,天保,12,[]). 西暦和暦表(1842,天保,13,[]). 西暦和暦表(1843,天保,14,[]). 西暦和暦表(1844,天保,15,[]). 西暦和暦表(1844,弘化,1,12 / 2). 西暦和暦表(1845,弘化,2,[]). 西暦和暦表(1846,弘化,3,[]). 西暦和暦表(1847,弘化,4,[]). 西暦和暦表(1848,弘化,5,[]). 西暦和暦表(1848,嘉永,1,2 / 28). 西暦和暦表(1849,嘉永,2,[]). 西暦和暦表(1850,嘉永,3,[]). 西暦和暦表(1851,嘉永,4,[]). 西暦和暦表(1852,嘉永,5,[]). 西暦和暦表(1853,嘉永,6,[]). 西暦和暦表(1854,嘉永,7,[]). 西暦和暦表(1854,安政,1,11 / 27). 西暦和暦表(1855,安政,2,[]). 西暦和暦表(1856,安政,3,[]). 西暦和暦表(1857,安政,4,[]). 西暦和暦表(1858,安政,5,[]). 西暦和暦表(1859,安政,6,[]). 西暦和暦表(1860,安政,7,[]). 西暦和暦表(1860,万延,1,3 / 18). 西暦和暦表(1861,万延,2,[]). 西暦和暦表(1861,文久,1,2 / 19). 西暦和暦表(1862,文久,2,[]). 西暦和暦表(1863,文久,3,[]). 西暦和暦表(1864,文久,4,[]). 西暦和暦表(1864,元治,1,2 / 20). 西暦和暦表(1865,元治,2,[]). 西暦和暦表(1865,慶応,1,4 / 8). 西暦和暦表(1866,慶応,2,[]). 西暦和暦表(1867,慶応,3,[]). 西暦和暦表(1868,慶応,4,[]). 西暦和暦表(1868,明治,1,9 / 8). 西暦和暦表(1869,明治,2,[]). 西暦和暦表(1870,明治,3,[]). 西暦和暦表(1871,明治,4,[]). 西暦和暦表(1872,明治,5,[]). 西暦和暦表(1873,明治,6,[]). 西暦和暦表(1874,明治,7,[]). 西暦和暦表(1875,明治,8,[]). 西暦和暦表(1876,明治,9,[]). 西暦和暦表(1877,明治,10,[]). 西暦和暦表(1878,明治,11,[]). 西暦和暦表(1879,明治,12,[]). 西暦和暦表(1880,明治,13,[]). 西暦和暦表(1881,明治,14,[]). 西暦和暦表(1882,明治,15,[]). 西暦和暦表(1883,明治,16,[]). 西暦和暦表(1884,明治,17,[]). 西暦和暦表(1885,明治,18,[]). 西暦和暦表(1886,明治,19,[]). 西暦和暦表(1887,明治,20,[]). 西暦和暦表(1888,明治,21,[]). 西暦和暦表(1889,明治,22,[]). 西暦和暦表(1890,明治,23,[]). 西暦和暦表(1891,明治,24,[]). 西暦和暦表(1892,明治,25,[]). 西暦和暦表(1893,明治,26,[]). 西暦和暦表(1894,明治,27,[]). 西暦和暦表(1895,明治,28,[]). 西暦和暦表(1896,明治,29,[]). 西暦和暦表(1897,明治,30,[]). 西暦和暦表(1898,明治,31,[]). 西暦和暦表(1899,明治,32,[]). 西暦和暦表(1900,明治,33,[]). 西暦和暦表(1901,明治,34,[]). 西暦和暦表(1902,明治,35,[]). 西暦和暦表(1903,明治,36,[]). 西暦和暦表(1904,明治,37,[]). 西暦和暦表(1905,明治,38,[]). 西暦和暦表(1906,明治,39,[]). 西暦和暦表(1907,明治,40,[]). 西暦和暦表(1908,明治,41,[]). 西暦和暦表(1909,明治,42,[]). 西暦和暦表(1910,明治,43,[]). 西暦和暦表(1911,明治,44,[]). 西暦和暦表(1912,明治,45,[]). 西暦和暦表(1912,大正,1,7 / 30). 西暦和暦表(1913,大正,2,[]). 西暦和暦表(1914,大正,3,[]). 西暦和暦表(1915,大正,4,[]). 西暦和暦表(1916,大正,5,[]). 西暦和暦表(1917,大正,6,[]). 西暦和暦表(1918,大正,7,[]). 西暦和暦表(1919,大正,8,[]). 西暦和暦表(1920,大正,9,[]). 西暦和暦表(1921,大正,10,[]). 西暦和暦表(1922,大正,11,[]). 西暦和暦表(1923,大正,12,[]). 西暦和暦表(1924,大正,13,[]). 西暦和暦表(1925,大正,14,[]). 西暦和暦表(1926,大正,15,[]). 西暦和暦表(1926,昭和,1,12 / 25). 西暦和暦表(1927,昭和,2,[]). 西暦和暦表(1928,昭和,3,[]). 西暦和暦表(1929,昭和,4,[]). 西暦和暦表(1930,昭和,5,[]). 西暦和暦表(1931,昭和,6,[]). 西暦和暦表(1932,昭和,7,[]). 西暦和暦表(1933,昭和,8,[]). 西暦和暦表(1934,昭和,9,[]). 西暦和暦表(1935,昭和,10,[]). 西暦和暦表(1936,昭和,11,[]). 西暦和暦表(1937,昭和,12,[]). 西暦和暦表(1938,昭和,13,[]). 西暦和暦表(1939,昭和,14,[]). 西暦和暦表(1940,昭和,15,[]). 西暦和暦表(1941,昭和,16,[]). 西暦和暦表(1942,昭和,17,[]). 西暦和暦表(1943,昭和,18,[]). 西暦和暦表(1944,昭和,19,[]). 西暦和暦表(1945,昭和,20,[]). 西暦和暦表(1946,昭和,21,[]). 西暦和暦表(1947,昭和,22,[]). 西暦和暦表(1948,昭和,23,[]). 西暦和暦表(1949,昭和,24,[]). 西暦和暦表(1950,昭和,25,[]). 西暦和暦表(1951,昭和,26,[]). 西暦和暦表(1952,昭和,27,[]). 西暦和暦表(1953,昭和,28,[]). 西暦和暦表(1954,昭和,29,[]). 西暦和暦表(1955,昭和,30,[]). 西暦和暦表(1956,昭和,31,[]). 西暦和暦表(1957,昭和,32,[]). 西暦和暦表(1958,昭和,33,[]). 西暦和暦表(1959,昭和,34,[]). 西暦和暦表(1960,昭和,35,[]). 西暦和暦表(1961,昭和,36,[]). 西暦和暦表(1962,昭和,37,[]). 西暦和暦表(1963,昭和,38,[]). 西暦和暦表(1964,昭和,39,[]). 西暦和暦表(1965,昭和,40,[]). 西暦和暦表(1966,昭和,41,[]). 西暦和暦表(1967,昭和,42,[]). 西暦和暦表(1968,昭和,43,[]). 西暦和暦表(1969,昭和,44,[]). 西暦和暦表(1970,昭和,45,[]). 西暦和暦表(1971,昭和,46,[]). 西暦和暦表(1972,昭和,47,[]). 西暦和暦表(1973,昭和,48,[]). 西暦和暦表(1974,昭和,49,[]). 西暦和暦表(1975,昭和,50,[]). 西暦和暦表(1976,昭和,51,[]). 西暦和暦表(1977,昭和,52,[]). 西暦和暦表(1978,昭和,53,[]). 西暦和暦表(1979,昭和,54,[]). 西暦和暦表(1980,昭和,55,[]). 西暦和暦表(1981,昭和,56,[]). 西暦和暦表(1982,昭和,57,[]). 西暦和暦表(1983,昭和,58,[]). 西暦和暦表(1984,昭和,59,[]). 西暦和暦表(1985,昭和,60,[]). 西暦和暦表(1986,昭和,61,[]). 西暦和暦表(1987,昭和,62,[]). 西暦和暦表(1988,昭和,63,[]). 西暦和暦表(1989,昭和,64,[]). 西暦和暦表(1989,平成,1,1 / 7). 西暦和暦表(1990,平成,2,[]). 西暦和暦表(1991,平成,3,[]). 西暦和暦表(1992,平成,4,[]). 西暦和暦表(1993,平成,5,[]). 西暦和暦表(1994,平成,6,[]). 西暦和暦表(1995,平成,7,[]). 西暦和暦表(1996,平成,8,[]). 西暦和暦表(1997,平成,9,[]). 西暦和暦表(1998,平成,10,[]). 西暦和暦表(1999,平成,11,[]). 西暦和暦表(2000,平成,12,[]). 西暦和暦表(2001,平成,13,[]). 西暦和暦表(2002,平成,14,[]). 西暦和暦表(2003,平成,15,[]). 西暦和暦表(2004,平成,16,[]). 西暦和暦表(2005,平成,17,[]). 西暦和暦表(2006,平成,18,[]). 西暦和暦表(2007,平成,19,[]). 西暦和暦表(2008,平成,20,[]). 西暦和暦表(2009,平成,21,[]). 西暦和暦表(2010,平成,22,[]). 西暦和暦表(2011,平成,23,[]). 西暦和暦表(2012,平成,24,[]). 西暦和暦表(2013,平成,25,[]). 西暦和暦表(2014,平成,26,[]). '年漢字表現'(1,['元','年']). '年漢字表現'(2,['二','年']). '年漢字表現'(3,['三','年']). '年漢字表現'(4,['四','年']). '年漢字表現'(5,['五','年']). '年漢字表現'(6,['六','年']). '年漢字表現'(7,['七','年']). '年漢字表現'(8,['八','年']). '年漢字表現'(9,['九','年']). '年漢字表現'(10,['十','年']). '年漢字表現'(11,['十','一','年']). '年漢字表現'(12,['十','二','年']). '年漢字表現'(13,['十','三','年']). '年漢字表現'(14,['十','四','年']). '年漢字表現'(15,['十','五','年']). '年漢字表現'(16,['十','六','年']). '年漢字表現'(17,['十','七','年']). '年漢字表現'(18,['十','八','年']). '年漢字表現'(19,['十','九','年']). '年漢字表現'(20,['二','十','年']). '年漢字表現'(21,['二','十','一','年']). '年漢字表現'(22,['二','十','二','年']). '年漢字表現'(23,['二','十','三','年']). '年漢字表現'(24,['二','十','四','年']). '年漢字表現'(25,['二','十','五','年']). '年漢字表現'(26,['二','十','六','年']). '年漢字表現'(27,['二','十','七','年']). '年漢字表現'(28,['二','十','八','年']). '年漢字表現'(29,['二','十','九','年']). '年漢字表現'(30,['三','十','年']). '年漢字表現'(31,['三','十','一','年']). '年漢字表現'(32,['三','十','二','年']). '年漢字表現'(33,['三','十','三','年']). '年漢字表現'(34,['三','十','四','年']). '年漢字表現'(35,['三','十','五','年']). '年漢字表現'(36,['三','十','六','年']). '年漢字表現'(37,['三','十','七','年']). '年漢字表現'(38,['三','十','八','年']). '年漢字表現'(39,['三','十','九','年']). '年漢字表現'(40,['四','十','年']). '年漢字表現'(41,['四','十','一','年']). '年漢字表現'(42,['四','十','二','年']). '年漢字表現'(43,['四','十','三','年']). '年漢字表現'(44,['四','十','四','年']). '年漢字表現'(45,['四','十','五','年']). '年漢字表現'(46,['四','十','六','年']). '年漢字表現'(47,['四','十','七','年']). '年漢字表現'(48,['四','十','八','年']). '年漢字表現'(49,['四','十','九','年']). '年漢字表現'(50,['五','十','年']). '年漢字表現'(51,['五','十','一','年']). '年漢字表現'(52,['五','十','二','年']). '年漢字表現'(53,['五','十','三','年']). '年漢字表現'(54,['五','十','四','年']). '年漢字表現'(55,['五','十','五','年']). '年漢字表現'(56,['五','十','六','年']). '年漢字表現'(57,['五','十','七','年']). '年漢字表現'(58,['五','十','八','年']). '年漢字表現'(59,['五','十','九','年']). '年漢字表現'(60,['六','十','年']). '年漢字表現'(61,['六','十','一','年']). '年漢字表現'(62,['六','十','二','年']). '年漢字表現'(63,['六','十','三','年']). '年漢字表現'(64,['六','十','四','年']). '年漢字表現'(65,['六','十','五','年']). '年漢字表現'(66,['六','十','六','年']). '年漢字表現'(67,['六','十','七','年']). '年漢字表現'(68,['六','十','八','年']). '年漢字表現'(69,['六','十','九','年']). '元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日) :-   write('元号の頭文字,年,月,日 :'),   get_split_line([','],[_元号年の元号の頭文字,_年,_月,_日]). '元号年の元号の頭文字,年,月および日で表記された日付を入力させ,その年の元日からその日付までの日数を計算し,結果を表示する' :-   '元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日),   元号の頭文字をローマ字変換した時にの最初の文字(_元号,_元号年の元号の頭文字),   元年の西暦は(_元号,_元年の西暦年),   _西暦年 is _元年の西暦年 + _年 - 1,   その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数),   write_formatted('その年の元旦からの日数は%t日です。\n',[_日数]). その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数) :-   年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数),   _日数 is _前月末日までの日数 + _日. 年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数) :-   N is _月 - 1,   findsum(_日数,(for(1,M,N),月の日数(_西暦年,_月,_日数)),_前月末日までの日数). 元号の頭文字をローマ字変換した時にの最初の文字(明治,m). 元号の頭文字をローマ字変換した時にの最初の文字(大正,t). 元号の頭文字をローマ字変換した時にの最初の文字(昭和,s). 元号の頭文字をローマ字変換した時にの最初の文字(平成,h). 元年の西暦は(明治,1868). 元年の西暦は(大正,1912). 元年の西暦は(大正,1926). 元年の西暦は(昭和,1989). 月の日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). 月の日数(_,_月,30) :- member(_月,[4,6,8,10]). 月の日数(_年,2,29) :- うるう年(_年). 月の日数(_年,2,28) :- \+(うるう年(_年)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4),fail. 月別日数ならび(平年,[31,28,31,30,31,30,31,31,30,31,30,31]). 月別日数ならび(うるう年,[31,29,31,30,31,30,31,31,30,31,30,31]). うるう年回数(_起点西暦年,_終点西暦年,_うるう年回数) :- count((for(_起点西暦年,N,_終点西暦年),うるう年(N)),_うるう年回数). 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- うるう年(_年), 月別日数ならび(うるう年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- \+(うるう年(_年)), 月別日数ならび(平年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- うるう年(_年), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 366 - _元旦から何日 + 1. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- \+(うるう年(_年)), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 365 - _元旦から何日 + 1. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/309 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10297.txt # ●基本課題 2a(数式の読み込みと表示) # # 課題 2a と 2b では,算術式を読み,表示し,値を求めるプログラムを作る. # # 限られた時間内で数式処理の本質部分を効率よく学ぶために, # 入力できる算術式の構文を,次の BNF で定めるものに限る. # # 定数 ::= 0 | 1 | … | 9 # 変数 ::= a | b | … | z | A | B | … | Z # 算術式 ::= 定数 # | 変数 # | (算術式+算術式) # | (算術式*算術式) # # つまり,1桁の定数や1文字の変数の和や積からなる式が入力である. # # 入力された算術式を読み込み,2分木データとして格納し,そのデータをもとに # 入力と同じ算術式を表示する,という処理(下図)を繰り返すプログラムを作れ. # 算術式解析(_文,_残りの文,_初期節番号,_終了節番号,_式) :- atom_chars(_文,Chars), 算術式(_初期節番号,_終了節番号,Chars,R,_式), atom_chars(_残りの文,R),!. 定数(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']),!. 変数(A) :- member(A,[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) :- member(A,['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']),!. 算術式(N1,N2,[A|R],R,B) :- 定数(A), atom_to_term(A,B,_), assertz(算術式構文木(N1,[],[],B)), N2 is N1 + 1,!. 算術式(N1,N2,[A|R],R,A) :- 変数(A), assertz(算術式構文木(N1,[],[],A)), N2 is N1 + 1,!. 算術式(N1,N2,L,R,'+'(S1,S2)) :- append(['('|L1],[')'|R],L),append(L2,['+'|L3],L1), N3 is N1 + 1, 算術式(N3,N4,L2,_,S1),算術式(N4,N2,L3,_,S2), assertz(算術式構文木(N1,N3,N4,'+')),!. 算術式(N1,N2,L,R,'*'(S1,S2)) :- append(['('|L1],[')'|R],L),append(L2,['*'|L3],L1), N3 is N1 + 1, 算術式(N3,N4,L2,_,S1),算術式(N4,N2,L3,_,S2), assertz(算術式構文木(N1,N3,N4,'*')),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/159 # # [1] 授業単元: ものつくりの実習中に必要になりました # [2] 問題文(含コード&リンク): # 全角の日本語をJISコードに変換したいです。 # ”あいうえお終”と入力したときに # 2422 # 2424 # 2426 # 2428 # 242A # 3D2A # のように返してくれるとうれしいです。 # % Prolog 全角の日本語をJISコードに変換 :- get_line(Line), atom_chars(Line,Chars), 全角の日本語をJISコードに変換(Chars). 全角の日本語をJISコードに変換([]). 全角の日本語をJISコードに変換([A|R]) :- char_code(A,Code), Jis_code is Code # truncate(2^15+2^7), write_formatted('%x\n',[Jis_code]), 全角の日本語をJISコードに変換(R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/869 # # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク): # 文字列ABCDEFGHIJKLMNに対して入力した文字列の第1文字目と第2文字目の間にある文字列を表示するプログラムを作る。 ただし標準ライブラリは使用しないこと。 # 文字列ABCDEFGHIJKLMNに対して入力した文字列の第1文字目と第2文字目の間にある文字列を表示する :-   atom_chars('ABCDEFGHIJKLMN',Chars),   write('文字列を入力してください :'),   get_line(_文字列),   sub_atom(_文字列,0,1,_,_第1文字),   sub_atom(_文字列,1,1,_,_第2文字),   append(L1,[_第1文字|L2],Chars),   第1文字目と第2文字目の間にある文字列(_第2文字,L1,L2,L),   concat_atom(L,_第1文字目と第2文字目の間にある文字列),   write_formatted('第1文字目と第2文字目の間にある文字列は %t です\n',[_第1文字目と第2文字目の間にある文字列]). 第1文字目と第2文字目の間にある文字列(_第2文字,L1,_,L) :-   append(_,[_第2文字|L],L1),!. 第1文字目と第2文字目の間にある文字列(_第2文字,_,L2,L) :-   append(L,[_第2文字|_],L2),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/754 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 入力されたデータをもとに売上明細を作成して表示する。 # 入力データは商品名と金額で、最大20件とし、^zで終了する。 # 入力されたデータは構造体配列に記録し、 # 入力終了後金額を集計して合計を表示する。 # <構造体メンバ> # 商品名:char型10桁 # 金額:long型 # <実行結果> # ^z # 商品名    金額 # パソコン   248500 # ラジオ     3200 # テレビ    120500 # オーディオ  314000 # レイゾウコ   65800 # クーラー    79000 # 合計    831000 # 入力されたデータをもとに売上明細を作成して表示する :- 売上データの収集(_収集されたデータ), findsum(_金額,member([_,_金額],_収集されたデータ),_金額合計), write('商品名 金額\n'), 明細表の印刷(_収集されたデータ,_金額合計),!. 売上データの収集(_収集されたデータ) :- write('商品名と金額をカンマで区切って入力してください\n'). findall([A2,B], ( for(1,N,10),get_line(Line), ( Line=end_of_file,!,fail; split(Line,[','],[A,B]), '10桁の文字列'(A,A2))),_収集されたデータ),!. 明細表の印刷([],_金額合計) :- write_formatted('%10s %10d\n',[金額合計,_金額合計]). 明細表の印刷([[_商品名,_金額]|R],_金額合計) :- write_formatted('%10s %10d\n',[_商品名,_金額]), 明細表の印刷(R,_金額合計). '10桁の文字列'(_文字列,_10桁の文字列) :- atom_chars(_文字列,Chars), length(L,10), apend(Chars,L1,L), all(L1,' '), atom_chars(_10桁の文字列,L),!. '10桁の文字列'(_文字列,_10桁の文字列) :- sub_atom(_文字列,0,10,_,_10桁の文字列). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258320456/47 # # 【 課題 】四人一首問題。「かるた部」の練習の一環として、 # 百人一首の中から第一文字が「や」の四枚を選んで、徹底的に練習することに # しました。四枚とは、 # やすらはでねなましものをさよふけてかたぶくまでのつきをみしかな # やへむぐらしげれるやどのさびしきにひとをもみをみうらみざらまし # やまざとはふゆぞさびしさまさりけるひとめもくさもかれぬとおもへば # やまがはにかぜのかけたるしがらみはながれもあへぬもみぢなりけり # ルールは、 # 1) 二人ゲームである。 # 2) 四枚のなかから無作為に二枚を選び自分と相手の札とする。 # 3) 読み手は四枚全部読み上げる。いたがって空札(取る札がない)が二枚含まれる。 # 4) 一枚取った時点で勝負はつくが、残りの一枚も競うこととする。 # # [問題] 乱数を使ってそれぞれの持ち札を決め、それを表示します。 # つぎに、読み札の順番を決めます。これはこの段階では表示しません。 # 一首、読み、それを表示し、 # 1) 空札 : 何文字目まで読まれてそれがわかったか # 2) 相手札 : 同上 # 3) 自分札 : 同上 # を表示しなさい。これを繰り返し、取り札がなくなったらゲームオーバー。 # 4) 二つのモードで作りなさい #  1) 読まれた札を二人とも記憶している。 #  2) 読まれた札は忘れてしまう。 # 実際には取り札には下の句が書かれていますが、ここでは一首全体をお互い理解しているものとします。 # # 歌([や,す,ら,は,で,ね,な,ま,し,も,の,を,さ,よ,ふ,け,て,か,た,ぶ,く,ま,で,の,つ,き,を,み,し,か,な]). 歌([や,へ,む,ぐ,ら,し,げ,れ,る,や,ど,の,さ,び,し,き,に,ひ,と,を,も,み,を,み,う,ら,み,ざ,ら,ま,し]). 歌([や,ま,ざ,と,は,ふ,ゆ,ぞ,さ,び,し,さ,ま,さ,り,け,る,ひ,と,め,も,く,さ,も,か,れ,ぬ,と,お,も,へ,ば]). 歌([や,ま,が,は,に,か,ぜ,の,か,け,た,る,し,が,ら,み,は,な,が,れ,も,あ,へ,ぬ,も,み,ぢ,な,り,け,り]). 四人一首(_) :- findall(X,歌(X),_歌ならび), 一枚読む(_歌ならび, _歌ならび, _自分の手持ち札ならび, _相手の手持ち札ならび, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか), 四人一首表示(_自分の手持ち札ならび, _相手の手持ち札ならび), _読み札, _どちら, _何字目でそれがわかったか). 一枚読む([_読み札|_残り読み札], _まだ読まれていない札ならび, _自分の手持ち札, _相手の手持ち札, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか) :- 間を取る, 現在の決まり字(_まだ読ませていない札ならび,_自分の手持ち札ならび,_相手の手持ち札ならび,_決まり字ならび), 間を取る, 決まり字で空札または札を取る(_読み札,_決まり字ならび,_どんな札か,_何字目でそれがわかったか), 決まり字はどこにある(_どんな札か,_自分の手持ち札ならび,_相手の手持ち札ならび,_どちら). 一枚読む([_読み札|_残り読み札], _まだ読まれていない札ならび1, _自分の手持ち札1, _相手の手持ち札1, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか) :- 現在の決まり字(_まだ読まれていない札ならび,_自分の手持ち札ならび1,_相手の手持ち札ならび1,_決まり字ならび1), 決まり字で空札または札を取る(_読み札,_決まり字ならび1,_どんな札か1,_何字目でそれがわかったか1), 決まり字はどこにある(_どんな札か1,_自分の手持ち札ならび1,_相手の手持ち札ならび1,_どちら1), ならびから削除(_読み札,_まだ読まれていない札ならび,_まだ読まれていない札ならび2), ならびから削除(_読み札,_自分の手持ち札1,_自分の手持ち札2), ならびから削除(_読み札,_相手の手持ち札1,_相手の手持ち札2), 一枚読む(_残り読み札, _まだ読まれていない札ならび2, _自分の手持ち札2, _相手の手持ち札2, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか). 現在の決まり字(_まだ読まれていない札ならび,_自分の手元札ならび,_相手の手元札ならび,_決まり字ならび) :- append(_自分の手持ち札ならび,_相手の手持ち札ならび,_手持ち札として存在する札ならび), 決まり字判断(_手持ち札として存在する札ならび,_まだ読まれていない札ならび,_決まり字ならび). 決まり字判断([],_,[]) :- !. 決まり字判断([_手持ち札|R1],_まだ読まれていない札ならび,[[_手持ち札,Len,_決まり字]|R2]) :-   先頭から共通部分の次の文字までで最長のもの(_手持ち札,_まだ読まれていない札ならび,Len,_決まり字),   決まり字判断(R1,_まだ読まれていない札ならび,R2). 先頭から共通部分の次の文字までで最長のもの(_手持ち札,_まだ読まれていない札ならび,Len,_決まり字) :-   findmax([Len,_決まり字],     (  member(_札,_まだ読まれていない札ならび),       \+(_札=_手持ち札),       先頭から共通部分の次の文字まで(1,_手持ち札,_札,_決まり字,Len)),[Len,_決まり字]),!. 先頭から共通部分の次の文字までで最長のもの([_決まり字|_],_,[1,_決まり字]). 先頭から共通部分の次の文字まで(N,[A|R1],[A|R2],[A|R3],Len) :-   N2 is N + 1,   先頭から共通部分の次の文字まで(R1,R2,R3,Len),!. 先頭から共通部分の次の文字まで(Len,[A|R1],_,[A],Len). 決まり字で空札または札を取る(_読み札,_決まり字ならび,_どんな札か,_何字目でそれがわかったか) :- atom_chars(_読み札,Chars1), append(L1,[_文字|L2],Chars1), 札をとるか(L1,_文字,_決まり字ならび,_どんな札か,_何字目でそれがわかったか). 札をとるか(L1,_文字,_決まり字ならび,_どんな札か,_何字目でそれがわかったか) :- append(L1,[_文字],_決まり字), member([_どんな札か,_何字目でそれがわかったか,_決まり字],_決まり字ならび). 決まり字はどこにある(_札,_自分の手持ち札ならび,自分の手持ち札) :- member(_札,_自分の札ならび). 決まり字はどこにある(_札,_自分の手持ち札ならび,相手の手持ち札) :- member(_札,_相手の手持ち札ならび). 間を取る. 四人一首表示(_自分の手持ち札ならび, _相手の手持ち札ならび), _読み札, _どちら, _何字目でそれがわかったか) :- write('私の札は\n'), writeAln(_自分の手持ち札ならび), write('相手の札は\n'), writeAln(_相手の手持ち札ならび), write('読み札は\n'), writeAn(_読み札), write_formatted('どこにあるか %t\n何字目でそれがわかったか %t字目\n',[_どちら,_何字目でそれがわかったか]),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% writeAln([]). writeAln([L|R]) :- concat_atom(L,A),write_formatted('%t\n',[A]),writeAln(R). writeAn(L) :- concat_atom(L,A),write_formatted('%t\n',[A]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/497 # # [1] 授業単元:C # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10200.txt # # 初期設定された文字列の順序を逆に並べ替えるプログラムを作成せよ。 # ただし、並べ替える部分は関数とし、文字列の長さは最大255文字とする % Prolog 初期設定されたというところが微妙。Prologだと・・・かな 初期設定された文字列の順序を逆に並べ替える :- retract('(初期)設定文字列'(_文字列)), 文字列の反転(_文字列,_反転された文字列), asserta('(初期)設定文字列'(_反転された文字列)). 文字列の反転(_文字列,_反転された文字列) :- atom_chars(_文字列,Chars), reverse(Chars,RChars), atom_chars(_反転された文字列,RChars). 文字列の先頭と末尾から対にして取り出す(_文字列,C1,C2) :- sub_atom(_文字列,S,1,R,C1), sub_atom(_文字列,R,1,_,C2). ならびの先頭と末尾から対にして取り出す(_ならび,C1,C2) :- append(L0,[C1|L1],_ならび), length(L0,Len), length(R,Len), append(_,[C2|R],_ならび). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/486 # # [1] 授業単元:C言語演習 # [2] 問題文: 1〜100までの数字を繰り返し入力し、最後に0を入力するとこれまでに # 入力された値の合計値を表示するプログラムを作成しなさい。ただし # 1〜100以外の数字が入力されたときは”エラー”と表示させる。 '1〜100までの数字を繰り返し入力し、最後に0を入力するとこれまでに入力された値の合計値を表示する'(_合計値) :- findsum(X,(repeat,get_integer(X),(X=0,!,fail;範囲範囲チェック(X)),_合計値), write_formatted('合計は%t\n',[_合計値]). 整数範囲チェック(X):- X > 0,X =< 100. 整数範囲チェック(X):- \+((X >0,X =<100)),write('整数範囲エラー\n'),fail. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % *** user: findsum / 3 *** findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), 加算(_値ならび,_合計値),!. % *** user: 加算 / 2 *** 加算([],0) :- !. 加算(X,S) :- 加算_1(X,0,S) . % *** user: 加算_1 / 3 *** 加算_1([],S,S) :- !. 加算_1([A|R],Y,S) :- Z is A + Y, 加算_1(R,Z,S). % *** user: get_integer / 1 *** get_integer(N) :- get_line(Line), ( Line = end_of_file, !, fail ; atom_to_term(Line,N,_), integer(N) ), ! . get_integer(N) :- get_integer(N) . % *** user: get_line / 1 *** get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). % *** user: get_line_1 / 2 *** get_line_1('\n',[]) :- !. get_line_1(end_of_file,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R) . % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/745 # # # [1] 授業単元:プログラミング初歩 # # [2] 問題文(含コード&リンク): # # ・文字列を,a ならば z,b ならば y,c ならば x のように,小文字も大文字もアルファベットの逆順の出現文字に置き換えるプログラムを作りなさい. # ・文字列が与えられたとき,アルファベットを大文字,小文字を区別せずに出現頻度順に小文字で並べた文字列を返すプログラムを作りなさい. # 文字列が与えられたとき,アルファベットを大文字,小文字を区別せずに出現頻度順に小文字で並べた文字列を返す(_文字列,_出現頻度順に文字を並べ替えた文字列) :-   atom_chars(_文字列,_文字ならび),   出現頻度順に文字ならびを変換(_文字ならび,[],_出現頻度順に並べ替えたもじならび),   atom_chars(_出現頻度順に並べ替えたもじならび,_出現頻度順に文字を並べ替えた文字列). 出現頻度順に文字ならびを変換([],Y,X) :-   sort(Y,Z),   出現頻度ならびから逆順に文字選択(Z,[],X). 出現頻度順に文字ならびを変換([C|R1],Y,X) :-   出現頻度ならびをカウントアップ(C,Y,Z),   出現頻度順に文字ならびを変換(R1,Z,X). 出現頻度ならびをカウントアップ(C,[],[1,C2]) :- to_lower(C,C2), !. 出現頻度ならびをカウントアップ(C,[[N,C2]|R1],[[N2,C2]|R1]) :- to_lower(C,C2), N2 is N + 1,!. 出現頻度ならびをカウントアップ(C,[[N,C1]|R1],[[N,C1]|R2]) :-   出現頻度ならびをカウントアップ(C,R1,R2). 出現頻度ならびから逆順に文字選択([],X,X) :- !. 出現頻度ならびから逆順に文字選択([[N,C]|R1],Y,X) :-   出現頻度ならびから逆順に文字選択(R1,[C|Y],X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/745 # # # [1] 授業単元:プログラミング初歩 # # [2] 問題文(含コード&リンク): # # ・文字列を,a ならば z,b ならば y,c ならば x のように,小文字も大文字もアルファベットの逆順の出現文字に置き換えるプログラムを作りなさい. # ・文字列が与えられたとき,アルファベットを大文字,小文字を区別せずに出現頻度順に小文字で並べた文字列を返すプログラムを作りなさい. # '文字列を,a ならば z,b ならば y,c ならば x のように,小文字も大文字もアルファベットの逆順の出現文字に置き換える'(_文字列,_アルファベットの逆順に変換された文字列) :- atom_chars(_文字列,_文字ならび), アルファベット逆順変換(_文字ならび,_アルファベットの逆順に変換された文字ならび), atom_chars(_アルファベットの逆順に変換された文字列,_アルファベットの逆順に変換された文字ならび). アルファベット逆順変換([],[]). アルファベット逆順変換([A|R1],[B|R2]) :- 逆順アルファベット探索(A,B), アルファベット逆順変換(R1,R2). 逆順アルファベット探索(A,B) :- アルファベットと逆順アルファベット(_,L1,L2), append(L0,[A|_],L1), length(L0,Len), length(L3,Len), append(L3,[B|_],L2). アルファベットと逆順アルファベット(小文字,[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],[z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a]). アルファベットと逆順アルファベット(大文字,['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'], ['Z','Y','X','W','V','U','T','S','R','Q','P','O','N','M','L','K','J','I','H','G','F','E','D','C','B','A']). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/172 # # 論理の問題ですが # # 95年「ここ数年で一番出来が良い」 # 96年「10年に1度の逸品」 # 97年「1976年以来の品質」 # 98年「10年に1度の当たり年」 # 99年「品質は昨年より良い」 # 00年「出来は上々で申し分の無い仕上がり」 # 01年「ここ10年で最高」 # 02年「過去10年で最高と言われた01年を上回る出来栄え」「1995年以来の出来」 # 03年「100年に1度の出来」「近年にない良い出来」 # 04年「香りが強く中々の出来栄え」 # 05年「ここ数年で最高」 # 06年「昨年同様良い出来栄え」 # 07年「柔らかく果実味が豊かで上質な味わい」 # 08年「豊かな果実味と程よい酸味が調和した味 # 09年「50年に1度の出来栄え」 # # です % とにもかくにも、こんな述語を一度構成しましょう。何をするかはそれから。 'ボージョレ・ヌーボーの謳い文句'('95年','ここ数年で一番出来が良い'). 'ボージョレ・ヌーボーの謳い文句'('96年','10年に1度の逸品'). 'ボージョレ・ヌーボーの謳い文句'('97年','1976年以来の品質'). 'ボージョレ・ヌーボーの謳い文句'('98年','10年に1度の当たり年'). 'ボージョレ・ヌーボーの謳い文句'('99年','品質は昨年より良い'). 'ボージョレ・ヌーボーの謳い文句'('00年','出来は上々で申し分の無い仕上がり'). 'ボージョレ・ヌーボーの謳い文句'('01年','ここ10年で最高'). 'ボージョレ・ヌーボーの謳い文句'('02年','過去10年で最高と言われた01年を上回る出来栄え,1995年以来の出来'). 'ボージョレ・ヌーボーの謳い文句'('03年','100年に1度の出来,近年にない良い出来'). 'ボージョレ・ヌーボーの謳い文句'('04年','香りが強く中々の出来栄え'). 'ボージョレ・ヌーボーの謳い文句'('05年','ここ数年で最高'). 'ボージョレ・ヌーボーの謳い文句'('06年','昨年同様良い出来栄え'). 'ボージョレ・ヌーボーの謳い文句'('07年','柔らかく果実味が豊かで上質な味わい'). 'ボージョレ・ヌーボーの謳い文句'('08年','豊かな果実味と程よい酸味が調和した味'). 'ボージョレ・ヌーボーの謳い文句'('09年','50年に1度の出来栄え'). ここ数年で一番出来が良い(_年産,_謳い文句) :- ここ数年で(_年産,_ここ数年), 一番出来が良い(_年産,_ここ数年,_謳い文句). 一番出来が良い(_年産,_ここ数年,_一番出来が良い) :- findall(_出来具合2,( member(_年産2,_ここ数年), 'ボージョレ・ヌーボーの謳い文句'(_年産2,_出来具合2)),_ここ数年のボージョレ・ヌーボー出来具合ならび), 最高の謳い文句(_ここ数年のボージョレ・ヌーボー出来具合ならび,_一番出来が良い). ここ数年で(_年産,_ここ数年) :- 年齢によって微妙に違うここ数年を得る(_年産,_数年), _起点年 is _年 - _数年, findall(_年産2,( between(_起点年,_年,_年_2), ヘッドゼロサプライ(2,_年_2,_年_2_2), atomic_list_concat([_年_2_2,年],_年産2)),_ここ数年). 年齢によって微妙に違うここ数年を得る(_年産,_数年) :- 年を切り取る(_年産,_年), 定義者の年齢(_年齢), 数年は定義者の年齢によって異なる(_年齢,_数年). 年を切り取る(_年産,_年) :- sub_atom(_年産,S,1,_,年), sub_atom(_年産,0,S,_,_年2), read_term_from_atom(_年2,_年,_). 定義者の年齢(60). 数年は定義者の年齢によって異なる(_年齢,3) :- _年齢 < 70. 数年は定義者の年齢によって異なる(_年齢,5) :- _年齢 >= 70. ヘッドゼロサプライ(_桁数,_整数,_数文字列) :- number_chars(_整数,Chars), length(Chars,_文字列の桁数), ヘッドゼロサプライ(_桁数,Chars,_文字列の桁数,_数文字列). ヘッドゼロサプライ(_桁数,Chars,_文字列の桁数,_数文字列) :- 文字列の桁数の不足分だけ0文字ならびを生成(_桁数,_文字列の桁数,_0文字ならび), append(_0文字ならび,Chars,_数文字ならび), atom_chars(_数文字列,_数文字ならび). 文字列の桁数の不足分だけ0文字ならびを生成(_桁数,_文字列の桁数,_0文字ならび) :- _桁の不足 is _桁数 - _文字列の桁数, length(_0文字ならび,_桁の不足), 全て0で埋める(_0文字ならび,'0'). 全て0で埋める([],_). 全て0で埋める([A|R],A) :- 全て0で埋める(R,A). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/123 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 文字列GHIJKLMABCDERSTUVWFNOPQXYZに対して入力した文字列の第1文字目と第2文字目の間にある文字列を表示するプログラムを作る。 # 例:入力文字列がCQであったときCDERSTUVWFNOPQを表示する。 文字列('GHIJKLMABCDERSTUVWFNOPQX'). 文字列から入力された第1文字目と第2文字目の間にある文字列を取り出して表示 する(_第1文字目,_第2文字目,_表示する副文字列) :- 文字列(_文字列), atom_chars(_文字列,Chars), append(_,[_第1文字目|R1],Chars), append(Chars2,[_第2文字目|_],R1), atom_chars(_表示する副文字列,Chars2), write_formatted('%t\n',[_表示する副文字列]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/93 # # [1] 授業単元:Cプログラミング # [2] 問題文(含コード&リンク):入力した文字列中のアルファベットについて、大文字なら小文字、小文字なら大文字に変換するプログラムを作成せよ。 # また、アルファベット以外の入力は全て'*'に置き換えるようにすること。 # '入力した文字列中のアルファベットについて、大文字なら小文字、小文字なら大文字に変換する'(_入力した文字列,_大文字なら小文字、小文字なら大文字に変換された文字列) :- atom_chars(_入力した文字列,Chars), 大文字なら小文字、小文字なら大文字に変換する'(Chars,Chars2), atom_chars(_大文字なら小文字、小文字なら大文字に変換された文字列,Chars2). 大文字なら小文字、小文字なら大文字に変換する'([A|R1],[B|R2]) :- 大文字・小文字(A,B), 大文字なら小文字、小文字なら大文字に変換する'(R1,R2),!. 大文字なら小文字、小文字なら大文字に変換する'([B|R1],[A|R2]) :- 大文字・小文字(A,B), 大文字なら小文字、小文字なら大文字に変換する'(R1,R2),!. 大文字なら小文字、小文字なら大文字に変換する'([_|R1],['*'|R2]) :- 大文字なら小文字、小文字なら大文字に変換する'(R1,R2),!. 大文字・小文字('A',a). 大文字・小文字('B',b). 大文字・小文字('C',c). 大文字・小文字('D',d). 大文字・小文字('E',e). 大文字・小文字('F',f). 大文字・小文字('G',g). 大文字・小文字('H',h). 大文字・小文字('I',i). 大文字・小文字('J',j). 大文字・小文字('K',k). 大文字・小文字('L',l). 大文字・小文字('M',m). 大文字・小文字('N',n). 大文字・小文字('O',o). 大文字・小文字('P',p). 大文字・小文字('Q',q). 大文字・小文字('R',r). 大文字・小文字('S',s). 大文字・小文字('T',t). 大文字・小文字('U',u). 大文字・小文字('V',v). 大文字・小文字('W',w). 大文字・小文字('X',x). 大文字・小文字('Y',y). 大文字・小文字('Z',z). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/76 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 問題1 # # 次の文章をプログラム中に文字列として与える. # # The metropolitan government and the Tokyo 2016 Bid Committee had a budget of 15 billion yen to campaign to host the Games, of which 10 billion yen was shouldered by the metropolitan government. # # アルファベット(ピリオド含む,大文字,小文字は区別しない),数字がそれぞれ何回出現したかをカウントして出力するプログラムを作成せよ # 文章('The metropolitan government and the Tokyo 2016 Bid Committee had a budget of 15 billion yen to campaign to host the Games, of which 10 billion yen was shouldered by the metropolitan government.'). 'アルファベット(ピリオド含む,大文字,小文字は区別しない),数字がそれぞれ何回出現したかをカウントして出力する'(_アルファベットの出現度数,_数字の出現度数) :- 文章(_文章), atom_chars(_文章,_文字ならび), アルファベット(_アルファベット), 数字(_数字ならび), 'アルファベット(ピリオド含む,大文字,小文字は区別しない),数字がそれぞれ何回出現したかをカウントして'(_文字ならび,_アルファベット,_数字ならび,0,_アルファベットの出現度数,0,_数字の出現度数), write_formatted('アルファベット出現度数 ... %t\n'), write_formatted('数字出現度数 ... %t\n'), 'アルファベット(ピリオド含む,大文字,小文字は区別しない),数字がそれぞれ何回出現したかをカウントして'([],_,_,[C_アルファベットの出現度数,字ならび,0,_アルファベットの出現度数,0,_数字の出現度数). 'アルファベット(ピリオド含む,大文字,小文字は区別しない),数字がそれぞれ何回出現したかをカウントして'([],_,_,_アルファベットの出現度数,_アルファベットの出現度数,_数字の出現度数,_数字の出現度数) :- !. 'アルファベット(ピリオド含む,大文字,小文字は区別しない),数字がそれぞれ何回出現したかをカウントして'([A|R],_アルファベット,_数字ならび,_アルファベット出現度数1,_アルファベットの出現度数,_数字出現度数1,_数字の出現度数) :- アルファベットカウンター([A|R],_アルファベット,_アルファベット出現度数1,_更新されたアルファベット出現度数), 数字カウンター([A|R],_数字ならび,_数字出現度数1,_更新された数字出現度数), 'アルファベット(ピリオド含む,大文字,小文字は区別しない),数字がそれぞれ何回出現したかをカウントして'(R,_アルファベット,_数字ならび,_更新されたアルファベット出現度数,_アルファベットの出現度数,_更新された数字の出現度数,_数字の出現度数). アルファベットカウンター([A|R],_アルファベット,_カウンター,_更新されたカウンター) :- member(A,_アルファベット), _更新されたカウンター is _カウンター + 1,!. アルファベットカウンター([A|R],_アルファベット,_カウンター,_カウンター) :- \+(member(A,_アルファベット)),!. 数字カウンター([A|R],_数字ならび,_カウンター,_更新されたカウンター) :- member(A,_数字ならび), _更新されたカウンター is _カウンター + 1,!. 数字カウンター([A|R],_数字ならび,_カウンター,_カウンター) :- \+(member(A,_数字ならび)),!. アルファベット(['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,'.']). 数字(['0','1','2','3','4','5','6','7','8','9']). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/68 # # [1] 授業単元: ネットワークプログラミング # [2] 問題文(含コード&リンク): #  あなたのマシンのIPアドレスを表示しなさい # あなたのマシンのIPアドレスを表示(IPアドレス) :- system(ifconfig,user_input,Stream), get_chars(Stream,L), 'inet addr:を探す'(L,R1), 'IPアドレスを切り取る'(R1,IPL), atom_chars(IPアドレス,IPL), write(IPアドレス). 'inet addr:を探す'([i,n,e,t,' ',a,d,d,r,':'|R1],R1). 'inet addr:を探す'([A|R1],R2) :- 'inet addr:を探す'(R1,R2). 'IPアドレスを切り取る'([],[]) :- !. 'IPアドレスを切り取る'(['\n'|_],[]) :- !. 'IPアドレスを切り取る'([' '|_],[]) :- !. 'IPアドレスを切り取る'([A|R1],[A|R2]) :- 'IPアドレスを切り取る'(R1,R2). ?- 'a##'. # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/97 # # struct meibo {char name[20];int eigo; int kokugo;} # みたいな構造体でmeibo_t[]にループでどんどんデータを入れて生きたいのですがどうすれば良いですか? # int a= 0; meibo[a]=みたいにするとエラーがでますし、何か[0]にどんどん数字が足されてるような気がします # }; # meibo(L) :- findall(L2,(get_line(Line),(Line=end_of_file,!,fail;split(Line,[','],L2))),L). % 以下のサイトは # 出典:: 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/990 # # テンプレ無視してすみませんでした。 # # [1] 授業単元:プログラミング論 # [2] 問題文:国語・数学・理科の3教科の得点を入力し、平均点が #     90点以上…「平均点X 評価はAです。」 #      80点以上…「平均点X 評価はBです。」 #      70点未満…「平均点X 追試の対象です。」 # と表示するプログラムを作成しなさい。 # #   実行例 #     国語90 #     数学90 #     理科90 # #   平均点90点 評価はAです。 # 試験の個人平均点による評価 :- 三科目の点数を得る(_国語,_数学,_理科), 試験の個人平均点による評価(_国語,_数学,_理科,_評価), write_formatted('平均点%t点 評価は%tです。\n'). 試験の個人平均点による評価(_国語,_数学,_理科,_評価) :- 相加平均([_国語,_数学,_理科],_相加平均), 試験の個人平均点による評価(_相加平均,_評価). 試験の個人平均点による評価(_相加平均,'A') :- _相加平均 >= 90. 試験の個人平均点による評価(_相加平均,'B') :- _相加平均 >= 80,_相加平均 < 90. 試験の個人平均点による評価(_相加平均,'C') :- _相加平均 >= 70,_相加平均 < 80. 試験の個人平均点による評価(_相加平均,'追試の対象') :- _相加平均 < 70. 三科目の点数を得る(_国語,_数学,_理科) :- write('科目名点数で改行して三科目の点数を入れてください\n'), 三科目の点数ならびを得る([],L), member([国語,_国語],L), member([数学,_数学],L), member([理科,_理科],L),!. 三科目の点数ならびを得る(L,L) :- length(L,3),!. 三科目の点数ならびを得る(L1,L) :- get_line(_行), 科目と点数を得る(_行,_科目,_点数), \+(member([_科目,_],L1)), 三科目の点数ならびを得る([[_科目,_点数]|L1],L),!. 三科目の点数ならびを得る(L1,L) :- write('その科目はすでに入力済みであるか、適切な科目でありません\n'), 三科目の点数ならびを得る(L1,L). 科目と点数を得る(_行,_科目,_点数) :- atom_chars(_行,Chars), 空白を取り除く(Chars,Chars2), 科目と点数を得る(Chars,_科目,_点数). 空白を取り除く([],[]) :- !. 空白を取り除く([' '|R1],R2) :- 空白を取り除く(R1,R2),!. 空白を取り除く([A|R1],[A|R2]) :- 空白を取り除く(R1,R2),!. 科目と点数を得る([国,語|R],国語,_点数) :- 点数を得る(R,_点数),!. 科目と点数を得る([数,学|R],数学,_点数) :- 点数を得る(R,_点数),!. 科目と点数を得る([理,科|R],理科,_点数) :- 点数を得る(R,_点数),!. 点数を得る(L) :- number_chars(_点数,L), integer(_点数), _点数 >= 0, _点数 =< 100. % 以下のサイトは # 出典 :: Rubyの宿題教えてください。2限目 # シーザー暗号を解くプログラムを作り,以下の暗号文を解きな # さい. # Hwduytlwfumd nx ymj uwfhynhj fsi xyzid tk mninsl # nsktwrfynts. Ns rtijws ynrjx, hwduytlwfumd nx htsxnijwji f # gwfshm tk gtym rfymjrfynhx fsi htruzyjw xhnjshj, fsi nx # fkknqnfyji hqtxjqd bnym nsktwrfynts ymjtwd, htruzyjw # xjhzwnyd, fsi jslnsjjwnsl. # Hwduytlwfumd nx zxji ns fuuqnhfyntsx uwjxjsy ns # yjhmstqtlnhfqqd fiafshji xthnjynjx; jcfruqjx nshqzij ymj # xjhzwnyd tk FYR hfwix, htruzyjw ufxxbtwix, fsijqjhywtsnh # htrrjwhj, bmnhm fqq ijujsi ts hwduytlwfumd. # # # 暗号を解く関数は problem2 とし,関数 problem2 の引数を暗 # 号の文字列とする.(例: def problem2(str)) # カエサル暗号のずらし(5). 与えられた暗号文('Hwduytlwfumd nx ymj uwfhynhj fsi xyzid tk mninsl \nnsktwrfynts. Ns rtijws ynrjx, hwduytlwfumd nx htsxnijwji f \ngwfshm tk gtym rfymjrfynhx fsi htruzyjw xhnjshj, fsi nx \nfkknqnfyji hqtxjqd bnym nsktwrfynts ymjtwd, htruzyjw \nxjhzwnyd, fsi jslnsjjwnsl. \nHwduytlwfumd nx zxji ns fuuqnhfyntsx uwjxjsy ns \nyjhmstqtlnhfqqd fiafshji xthnjynjx; jcfruqjx nshqzij ymj \nxjhzwnyd tk FYR hfwix, htruzyjw ufxxbtwix, fsijqjhywtsnh \nhtrrjwhj, bmnhm fqq ijujsi ts hwduytlwfumd. \n'). c2_713 :- 与えられた暗号文(_暗号文), カエサル暗号の復号(_暗号文,_平文), write_formatted('元の平文は\n%t\n',[_平文]),!. カエサル暗号の復号(_暗号文,_平文) :- カエサル暗号のずらし(_ずらし), カエサル暗号(_ずらし,_平文,_暗号文). アルファベット(大文字,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']). アルファベット(小文字,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). カエサル暗号(_ずらし,_平文,_暗号文) :- atomic(_平文), アルファベット(大文字,_アルファベット大文字), アルファベット(小文字,_アルファベット小文字), ならびの回転(左方向,_ずらし,_アルファベット大文字,_アルファベットの二), ならびの回転(左方向,_ずらし,_アルファベット小文字,_アルファベットの三), append(_アルファベット大文字,_アルファベット小文字,_アルファベット), append(_アルファベットの二,_アルファベットの三,_アルファベットの四), atom_chars(_平文,Chars), findall(C2,カエサル暗号解読(Chars,_アルファベット,_アルファベットの四,C2),Chars2), atom_chars(_暗号文,Chars2). カエサル暗号(_ずらし,_平文,_暗号文) :- var(_平文), atomic(_暗号文), アルファベット(大文字,_アルファベット大文字), アルファベット(小文字,_アルファベット小文字), ならびの回転(右方向,_ずらし,_アルファベット大文字,_アルファベットの二), ならびの回転(右方向,_ずらし,_アルファベット小文字,_アルファベットの三), append(_アルファベット大文字,_アルファベット小文字,_アルファベット), append(_アルファベットの二,_アルファベットの三,_アルファベットの四), atom_chars(_暗号文,Chars), findall(C2,カエサル暗号解読(Chars,_アルファベット,_アルファベットの四,C2),Chars2), atom_chars(_平文,Chars2). カエサル暗号解読(Chars,_アルファベット,_アルファベットの二,C2) :- member(C1,Chars), カエサル暗号一文字解読(C1,_アルファベット,_アルファベットの二,C2). カエサル暗号一文字解読(C1,_アルファベット,_アルファベットの二,C2) :- list_nth(N,_アルファベット,C1), list_nth(N,_アルファベットの二,C2),!. カエサル暗号一文字解読(C1,_,_,C1). ならびの回転(左方向,1,[A|R],L) :- append(R,[A],L). ならびの回転(左方向,N,[A|R],L) :- N > 1, append(R,[A],L1), N1 is N - 1, ならびの回転(左方向,N1,L1,L). ならびの回転(右方向,1,L1,L2) :- append(L0,[A],L1), append([A],L0,L2). ならびの回転(右方向,N,L1,L2) :- N > 1, append(L0,[A],L1), append([A],L0,L3), N1 is N - 1, ならびの回転(右方向,N1,L3,L2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/725 # # [1] 授業単元: アルゴリズム[I] # [2] 問題文(含コード&リンク):a,b,c,d,eの5文字をアルファベットとして #  重複なく4文字をで構成される全てのwordのなかで部分文字列として、 #  ad,bd,deを含まないものを表示せよ 'a,b,c,d,eの5文字をアルファベットとして重複なく4文字で構成される全てのwordのなかで部分文字列として、ad,bd,deを含まないものを表示' :- 順列([a,b,c,d,e],4,L), \+(append(_,[a,d|_],L)), \+(append(_,[b,d|_],L)), \+(append(_,[d,e|_],L)), atom_chars(_語,L), write_formatted('%t\n',[_語]), fail. 'a,b,c,d,eの5文字をアルファベットとして重複なく4文字で構成される全てのwordのなかで部分文字列として、ad,bd,deを含まないものを表示'. % *** user: '順列' / 3 *** 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(A,Y,Z), M is N - 1, 順列(Z,M,X). % *** user: del / 3 *** del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/463 # # 【課題】 # http://ime.nu/www51.tok2.com/home/rg550/cgi-bin/hosoku/img0047.zip # 【課題1】 # 実行例のようにキーボードから文字列を読み込み、文字型の配列に一文字づつ格納 # した後、整列し(順番はどちらでもかまいません)、出力するプログラムを # 作成しなさい。 # 【課題2】 # 0から9までの整数乱数を100個発生させ、実行例のようにその出現分布を棒グラフと # 値で出力するプログラムを作成しなさい。また、100個の乱数の平均値も合わせて # 出力しなさい。 # ただし、0から9 それぞれの個数を数えるための変数に必ず配列を用いてください。 # (出現個数カウント用の変数を10個用意してはいけません。) 例えば、出現個数 # カウント用の配列 count[] を用意すると、 count[0] に0が出現した回数が # 格納される。もし0が10回出現した場合、count[0]=10となる。) % 課題1 '実行例のようにキーボードから文字列を読み込み、文字型の配列に一文字づつ格納した 後、整列し(順番はどちらでもかまいません)、出力する' :- get_chars(_文字ならび), sort(_文字ならび,_整列した文字ならび), atom_chars(_整列した文字列,_整列した文字ならび), write_formatted('%t\n',[_整列した文字列]). % 課題2 '0から9までの整数乱数を100個発生させ、実行例のようにその出現分布を棒グラフと値 で出力する' :- findall([N,0,[]],for(0,N,9),_出現個数カウント用ならび), '0から9までの整数乱数を100個発生させ'(1,L1), 'その出現分布を棒グラフと値で出力する'(L1,_出現個数カウント用ならび). '0から9までの整数乱数を100個発生させ'(N,[]) :- N > 100,!. '0から9までの整数乱数を100個発生させ'(N,[_乱整数|R]) :- _乱整数 is random mod 10, N2 is N + 1, '0から9までの整数乱数を100個発生させ'(N2,R). 'その出現分布を棒グラフと値で出力する'([],L) :- 'グラフと値で出力'(L),!. 'その出現分布を棒グラフと値で出力する'([N|R],L) :- member([N,_カウント,L1],L), _カウント2 is _カウント + 1, ならびの置換([N,_カウント,L1],[N,_カウント2,[_|L1]],L,L2), 'その出現分布を棒グラフと値で出力する'(R,L2). グラフと値で出力([]). グラフと値で出力([[N,C,L]|R]) :- all(L,'*'), write_formatted(' %t: %t %t\n',[N,L,C]), グラフと値で出力(R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/598 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): 2つの整数値と1つの文字を、例えば「4+2」のように入力し、 # 入力に応じた四則演算を行って結果を出力するプログラムを作成しなさい。 # ただし、中央の文字に四則演算の記号以外の文字が入力された時のことも考慮しなさい。 二項式とは(_式文字列,N1,_演算子,N2,_答え,_診断) :- atom_chars(_式文字列,_式文字ならび), 整数文字ならび(_式文字ならび,_整数文字ならびの一,R1), 演算子文字ならび(R1,_演算子文字ならび,R2), 整数文字ならび(R2,_整数文字ならびの二,R), number_chars(N1,_整数文字ならびの一), number_chars(N2,_整数文字ならびの二), atom_chars(_演算子,_演算子文字ならび). 二項式診断(N1,_演算子,N2,_答え,_診断). 演算子文字ならび([],[],[]). 演算子文字ならび([A|R],[],[A|R]) :- 四則演算子ではない(A),数字である(A). 演算子文字ならび([A|R1],[A|R2],R) :- 四則演算子ではない(A),数字ではない(A),演算子文字ならび(R1,R2,R). 演算子文字ならび([A|R1],[A|R2],R) :- 四則演算子である(A),演算子文字ならび(R1,R2,R). 整数文字ならび([A|R],[],[A|R]) :- 数字ではない(A).. 整数文字ならび([A|R],[A1|R2],R) :- 数字である(A),整数文字ならび(R1,R2,R). 二項式診断(N1,_演算子,N2,_答え,演算子が四則演算子ではありません) :- \+(member(_演算子,[+,-,*,/])),!. 二項式診断(N1,_演算子,N2,_答え,正常終了) :- integer(N1),integer(N2),member(_演算子,[+,-,*,/]),_式 =..[_演算子,N1,N2],_答え is _式. 数字である(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']). 数字ではない(A) :- \+(member(A,['0','1','2','3','4','5','6','7','8','9'])). 四則演算子である(A) :- member(A,['+','-','*','/']). 四則演算子ではない(A) :- \+(member(A,['+','-','*','/'])). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/510 # # [1] プログラミング入門 # [2] 文字列sを逆に並べる関数reverse(s) を書け。 # さらにこの関数を使って、入力を行ごとに反転させるプログラムを作成せよ。という問題です。 'reverse(s)'(S,_反転されたS) :- atom_chars(S,S1), 反転(S1,S2), atom_chars(S2,_反転されたS). 反転([],[]). 反転([A|R1],R) :- 反転(R,R2), append(R2,[A],R). 入力を行ごとに反転させる(_反転された入力行のならび) :- get_line(_行), 入力を行ごとに反転させる(_行,_反転された入力行のならび). 入力を行ごとに反転させる(end_of_file,[]) :- !. 入力を行ごとに反転させる(_行,[_反転された行|R]) :- 'reverse(s)'(_行,_反転された行), get_line(_次の行), 入力を行ごとに反転させる(_次の行,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/510 # # [1] プログラミング入門 # [2] 文字列sを逆に並べる関数reverse(s) を書け。 # さらにこの関数を使って、入力を行ごとに反転させるプログラムを作成せよ。という問題です。 'reverse(s)'(S,_反転されたS) :- atom_chars(S,S1), 反転(S1,S2), atom_chars(S2,_反転されたS). 反転([],[]). 反転([A|R1],R) :- 反転(R,R2), append(R2,[A],R). 入力を行ごとに反転させる(_反転された入力行のならび) :- get_line(_行), 入力を行ごとに反転させる(_行,_反転された入力行のならび). 入力を行ごとに反転させる(end_of_file,[]) :- !. 入力を行ごとに反転させる(_行,[_反転された行|R]) :- 'reverse(s)'(_行,_反転された行), get_line(_次の行), 入力を行ごとに反転させる(_次の行,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/510 # # [1] プログラミング入門 # [2] 文字列sを逆に並べる関数reverse(s) を書け。 # さらにこの関数を使って、入力を行ごとに反転させるプログラムを作成せよ。という問題です。 'reverse(s)'(S,_反転されたS) :- atom_chars(S,S1), 反転(S1,S2), atom_chars(S2,_反転されたS). 反転([],[]). 反転([A|R1],R) :- 反転(R,R2), append(R2,[A],R). 入力を行ごとに反転させる(_反転された入力行のならび) :- get_line(_行), 入力を行ごとに反転させる(_行,_反転された入力行のならび). 入力を行ごとに反転させる(end_of_file,[]) :- !. 入力を行ごとに反転させる(_行,[_反転された行|R]) :- 'reverse(s)'(_行,_反転された行), get_line(_次の行), 入力を行ごとに反転させる(_次の行,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/444 # 【課題】課題は3つあります。 # http://www.dotup.org/uploda/www.dotup.org318192.zip % 問題1 星ピラミットの表示 入力された段数になるように星文字でピラミッドを築く :- 入力された段数に(_入力された段数), なるように星文字でピラミッドを築く(_入力された段数). なるように星文字でピラミッドを築く(_入力された段数) :- _最終行の星数 is (_入力された段数 - 1) * 2 + 1, length(L,_最終行の星数), between(1,_入力された段数,N), 星文字でピラミッドを築く(N), N = _入力された段数. 入力された段数に(_入力された段数) :- write('段数を入れてください : '), get_integer(_段数). 星文字でピラミッドを築く(N) :- length(L1,N), all(L1,'*'), append(L0,L1,L0,L), all(L0,' '), atom_chars(Atom,L), writef(' %t \n',[Atom]). 乱数を使って発生させた2つの整数のたし算を5問示しそれぞれの回答診断と5問答えるのに要した時間を表示 :- _開始時刻 is time, for(1,N,5), 一問答える, N = 5, _終了時刻 is time, _回答するのに要した時間 is _終了時刻 - _開始時刻, writef('5問回答までの時間は%t秒でした。\n',[_回答するのに要した時間]). 一問答える :- A is random(100), B is random(100), writef('%t + %t =? ',[A,B]),get_integer(_答え), _正解 is A + B, 回答診断(_正解,_答え,_診断), writef('%t\n',[_診断]). 回答診断(_正解,_正解,'正解です!!'). 回答診断(_正解,_答え,_診断) :- 1 is abs(_正解 - _答え), concat_atom(['惜しいです。正解は',_正解],_診断). 回答診断(_正解,_答え,_診断) :- \+(_答え=_正解), \+(1 is abs(_正解 - _答え)), concat_atom(['間違いです。正解は',_正解],_診断). 'ファイル名を入力させてそのファイルの行数その中に現れる小文字、大文字、その他の文字数を表示する' :- 'ファイル名を入力させて'(_ファイル名), get_chars(_ファイル名,Chars). '行数、小文字数、大文字数、その他文字数の集計'(Chars,_行数,_小文字数,_大文字数,_その他文字数), そのファイルの行数その中に現れる小文字、大文字、その他の文字数を表示する'(_行数,_小文字数,_大文字数,_その他文字数). 'ファイル名を入力させて'(_ファイル名) :- write('ファイル名を入力してください\n'), get_line(_ファイル名). そのファイルの行数その中に現れる小文字、大文字、その他の文字数を表示する'(_行数,_小文字数,_大文字数,_その他文字数) :- writef('%t行ありました\n',[_行数]), writef('小文字の数は%t\n',[_小文字数]), writef('大文字の数は%t\n',[_大文字数]), writef('その他の数は%t\n',[_その他文字数]). '行数、小文字数、大文字数、その他文字数の集計'([],0,0,0,0). '行数、小文字数、大文字数、その他文字数の集計'(['\n'|R],S1,S2,S3,S4) :- 行数の加算(R,S1,S2,S3,S4). '行数、小文字数、大文字数、その他文字数の集計'([A|R],S1,S2,S3,S4) :- 小文字数の加算([A|R],S1,S2,S3,S4,S11,S12,S13,S14). '行数、小文字数、大文字数、その他文字数の集計'([A|R],S1,S2,S3,S4) :- 大文字数の加算([A|R],S1,S2,S3,S4,S11,S12,S13,S14). '行数、小文字数、大文字数、その他文字数の集計'([_|R],S1,S2,S3,S4) :- その他文字数の加算(R,S1,S2,S3,S4). 行数の加算(R,S1,S2,S3,S4) :- '行数、小文字数、大文字数、その他文字数の集計'(R,S11,S2,S3,S4), S1 is S11 + 1,!. 小文字数の加算([A|R],S1,S2,S3,S4) :- A @>= 'a',A @=< 'z', '行数、小文字数、大文字数、その他文字数の集計'(R,S1,S21,S3,S4), S2 is S21 + 1,!. 大文字数の加算([A|R],S1,S2,S3,S4) :- A @>= 'A',A @=< 'Z', '行数、小文字数、大文字数、その他文字数の集計'(R,S1,S2,S31,S4), S3 is S31 + 1,!. その他文字数の加算(R,S1,S2,S3,S4) :- '行数、小文字数、大文字数、その他文字数の集計'(R,S1,S2,S3,S41), S4 is S41 + 1,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_integer(N) :- repeat, get_line(Line), atom_to_term(Line,M,_), get_integer_診断(M,N),!. get_integer_診断(end_of_file,-1). get_integer_診断(N,N) :- integer(N). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/461 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10031.txt # # 問題1:整数表記を ::= {|'_'}*に書き換える。 # 正の整数をdigitだけではなく、'_'もトークンの一部として判別させてやるようにプログラムを書きかえる # 例えば、10_23と仮に有った場合は10=整数値、_=識別子、23=整数値という風に判別されるのではなく10_23=1023=整数値となるようにしなさい。 # 問題2:以下のようなトークンも判別できるようにしてみる。 # 句切り文字:'(', # 句切り文字:'(', # 句切り文字:';', # 演算子:'=' % 問題1 整数表記の定義例(_t923の整数表記,_整数値) :- integer(_t923の整数表記,_整数値). integer(Atom,Integer) :- atom_chars(Atom,Chars), integer(Chars,IntegerChars), number_chars(Integer,IntegerChars). integer([],[]). integer([A,'_'|R1],[A|R2]) :- digit(A),integer(R1,R2). integer([A|R1],[A|R2]) :- digit(A),integer(R1,R2). % 以下のサイトは # 出典:: http://yomi.mobi/read.cgi/pc11/pc11_tech_1215986178 (レス番号146) # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # キーボードから100点満点のテストの点数を入力し(-1で終了)、 # 10点ごとの人数を int型の配列 count[11]に数えるプログラムを # 作成せよ。 テストは100点満点とし、それ以外の入力はエラーとし # て無視する。ただし -1 はデータの終了を表すものとする。 点数 # の入力が終了したら、度数分布を画面に出力して終了する。出力は # 人数と,*(アスタリスク)によるグラフとする。 t904 :- write('点数(整数)をカンマで区切って入力してください : '), get_line(Line), split(Line,[','],_成績ならび), findall(U,(member(V,_成績ならび),'10点ごとの丸め'(V,U)),_丸めた成績ならび), 分布ならびを得る(_丸めた成績ならび,[0,10,20,30,40,50,60,70,80,90,100],[[],[],[],[],[],[],[],[],[],[],[]],L1), アスタリスクによる棒グラフ([0,10,20,30,40,50,60,70,80,90,100],L1). '10点ごとの丸め'(_点数,_10点ごとに丸めた点数) :- _10点ごとに丸めた点数 is (_点数 // 10) * 10. 分布ならびを得る([],_,L,L) :- !. 分布ならびを得る([V|R],L1,L2,L3) :- list_nth(N,L1,V), list_nth(N,L2,W), 要素番号によるならびの置換(N,[*|W],L2,L4), 分布ならびを得る(R,L1,L4,L3). アスタリスクによる棒グラフ([A|R1],[L|R2]) :- atom_chars(B,L), write_formatted('%3d %t\n',[A,B]), アスタリスクによる棒グラフ(R1,R2). % 以下のサイトは # 出典:: http://yomi.mobi/read.cgi/pc11/pc11_tech_1215986178 (レス番号55) # # [1] 授業単元:プログラミング2 # [2] 問題文(含コード&リンク): # アルファベットと数字からなる文字列 str と文字 c を引数として受け取り, # 文字列 str から文字 c をすべて削除する返す関数 del_chrを定義し, # 動作を確認するプログラムを作成せよ. del_chr(_対象文字列,_削除する文字,_削除された文字列) :- atom_chars(_対象文字列,_対象文字ならび), findall(C,(member(C,_対象文字ならび),\+(C=_削除する文字)),L), atom_chars(_削除された文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列から特定文字を削除する(_対象文字列,_削除する文字,_削除された文字列) :- atom_chars(_対象文字列,_対象文字ならび), findall(_文字,( member(_文字,_対象文字ならび), \+(_文字=_削除する文字)), L), atom_chars(_削除された文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列から特定文字を削除する(_対象文字列,_削除する文字,_削除された文字列) :- atom_chars(_対象文字列,_対象文字ならび), findall(_文字,( append(_,[_文字|_],_対象文字ならび), \+(_文字=_削除する文字)), L), atom_chars(_削除された文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列から特定文字を削除する(_対象文字列,_削除する文字,_削除された文字列) :- findall(_文字,( sub_atom(_対象文字列,_,1,_,_文字), \+(_文字=_削除する文字)), L), atom_chars(_削除された文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列から特定文字を削除する(_対象文字列,_削除する文字,_削除された文字列) :- sub_atom(_対象文字列,S,1,_,_削除する文字), sub_atom(_対象文字列,0,S,_,_副文字列1), S2 is S + 1, sub_atom(_対象文字列,S2,_,_,_副文字列2), 文字列から特定文字を削除する(_副文字列2,_削除する文字,_副文字列3), concat_atom([_副文字1,_副文字列3],_削除された文字列),!. 文字列から特定文字を削除する('',_,'') :- !. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列から特定文字を削除する(_対象文字列,_削除する文字,_削除された文字列) :- atom_chars(_対象文字列,_対象文字ならび), ならびから特定文字を削除する(_対象文字ならび,_削除する文字,_削除された文字ならび), atom_chars(_削除された文字列,_削除された文字ならび). ならびから特定文字を削除する([],_,[]). ならびから特定文字を削除する([_文字|R1],_文字,R2) :- ならびから特定文字を削除する(R1,_文字,R2),!. ならびから特定文字を削除する([A|R1],_文字,[A|R2]) :- \+(A == _文字), ならびから特定文字を削除する(R1,_文字,R2),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247636661/669 # # ちょっと質問 # レシピリスト #  オムレツ:卵 バター #  オムライス:卵 バター ご飯 玉葱 人参 ベーコン #  カレー:じゃがいも 人参 玉葱 牛肉 ルー #  ・・・ # 在庫リスト # 豚肉 バター じゃがいも トマト 牛乳・・・ # # というリストがあり、今の在庫でどんなものが出来るか、 # どんなものが出来そうか?を優先順位つけたい場合 # どういうやり方がスマートでしょう? # レシピリストを頭から順に、在庫リストと総当たりで比較? # 逆に在庫リストにあるものを1個ずつ拾ってレシピリストと比較? # # こういうプログラムってどっかにあるかなぁ 作ることのできるお勧め料理は(_料理ならび) :- 料理種別を選択してもらう(_種別), 現在の材料で作ることのできる料理を探す(_料理ならびの一), 確信度が高い順に並べ直す(_種別,_料理ならびの一,_料理ならび). 現在の材料で作ることのできる料理を探す([_料理|R]) :- レシピ(_料理,_材料ならび), すべての材料が在庫としてある(_材料ならび), 現在の材料で作ることのできる料理を探す(R). 現在の材料で作ることのできる料理を探す([]). すべての材料が在庫としてある([]) :- !. すべての材料が在庫としてある([_材料|R]) :- 在庫(_材料), すべての材料が在庫としてある(R). 料理種別を選択してもらう(_種別) :- write('どんな種類の料理をお望みですか\n'), get_line(_文), 料理種別を選択してもらう(_文,_種別). 料理種別を選択してもらう(_文,_種別) :- 文を解析して種別を得る(_文,_種別), member(_種別,[肉料理,魚料理,卵料理]),!. 料理種別を選択してもらう(_,_種別) :- write('申し訳ございませんが現在ご用意できるのは'), 可能な料理種別を列挙する, write('しかございません。この中からお選びください\n'), get_line(_文), 料理種別を選択してもらう(_文,_種別). 可能な料理種別を列挙する :- concat_atom([肉料理,魚料理,卵料理],と,_列挙文字列), write_formatted('%t',[_列挙文字列]). 確信度が高い順に並べ直す(_種別,_料理ならびの一,_料理ならび) :- 料理ならびに確信度を付加(_種別,_料理ならびの一,_確信度が先頭に付いた料理ならび), rsort(_確信度が先頭に付いた料理ならび,_確信度が先頭に付いた料理ならびの二), 先頭の確信度を外す(_確信度が先頭に付いた料理ならびの二,_料理ならび). 料理ならびに確信度を付加(_,[],[]) :- !. 料理ならびに確信度を付加(_種別,[_料理|R1],[[_確信度,_料理]|R2]) :- 分類確信度(_種別,_料理,_確信度), 料理ならびに確信度を付加(_種別,R1,R2),!. 料理ならびに確信度を付加(_種別,[_料理|R1],[[0,_料理]|R2]) :- 料理ならびに確信度を付加(_種別,R1,R2),!. 先頭の確信度を外す([],[]) :- !. 先頭の確信度を外す([[_|_料理]|R1],[_料理|R2]) :- 先頭の確信度を外す(R1,R2). レシピ(オムレツ,[卵,バター]). レシピ(オムライス,[卵,バター,ご飯,玉葱,人参,ベーコン]). レシピ(カレー,[じゃがいも,人参,玉葱,牛肉,ルー]). 在庫(豚肉). 在庫(バター). 在庫(じゃがいも). 在庫(トマト). 在庫(牛乳). 在庫(卵). 在庫(人参). 分類確信度(肉料理,オムレツ,20). 分類確信度(肉料理,カレー,50). 分類確信度(肉料理,ターンシチュー,90). 分類確信度(肉料理,ビーフステーキ,100). 分類確信度(卵料理,ボイルドエッグ,100). 分類確信度(卵料理,ベーコンスクランブル,80). 分類確信度(卵料理,茶碗蒸し,70). 分類確信度(卵料理,オムレツ,60). 分類確信度(魚料理,シュリンプカレー,80). 文を解析して料理種別を得る(_文,_種別) :- atom_chars(_文,_文字ならび), 料理種別を解析して得る(_文字ならび,R,_種別). 料理種別を解析して得る(_文,_残りの文,_種別) :- 料理種別(_文,_残りの文の一,_種別), 料理種別の後置詞(_残りの文の一,_残りの文), 料理種別の述部(_残りの文の二,_残りの文). 料理種別を解析して得る(_文,_残りの文,_種別) :- 料理種別(_文,_残りの文の一,_種別), 料理種別の後置詞(_残りの文の一,_残りの文),!. 料理種別を解析して得る(_文,_残りの文,_種別) :- 料理種別(_文,[],_種別),!. 料理種別([肉,料,理|R],R,肉料理). 料理種別([卵,料,理|R],R,卵料理). 料理種別([魚,料,理|R],R,魚料理). 料理種別([す,っ,ぽ,ん,料,理|R],R,すっぽん料理). 料理種別の後置詞([を|R],R). 料理種別の後置詞([が|R],R). 料理種別の述部([食,べ,た,い|R],R). 料理種別の述部([く,だ,さ,い|R],R). rsort(L1,L2) :- sort(L1,L3),reverse(L3,L2). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1135125328_02.html # # 問題文 # データを読み込み2進、8進、10進、16進で表示せよ。 # ただし、読み込みはgetchar()で4桁入力。表示はputchar()で必要桁数表示する。 # データが0の時処理を終了、データ入力はXXXXとする。 'データを読み込み2進、8進、10進、16進で表示' :- repeat, write('4桁の数字を入力してください : '), get_char(Line), atom_to_term(Line,_10進数,_), 'データを読み込み2進、8進、10進、16進で表示'(_10進数). 'データを読み込み2進、8進、10進、16進で表示'(0) :- !. 'データを読み込み2進、8進、10進、16進で表示'(_10進数) :- 'N進数'(2,_10進数,_2進数文字列), 'N進数'(8,_10進数,_8進数文字列), 'N進数'(16,_10進数,_16進数文字列), writef('%tの 2進数表示は %t, 8進数表示は %t, 16進数表示は %t,です\n',[_2進数文字列,_8進数文字列,_16進数文字列]), fail. 'N進数'(N,_10進数,_N進数文字列) :- 'N進数'(N,_10進数,[],X), atomic_list_concat(X,_N進数文字列). 'N進数'(N,J,Y,[M|Y]) :- J < N,'N進数利用文字'(J,M),!. 'N進数'(N,J,Y,X) :- J >= N, J2 is J // N, M is J mod N, 'N進数利用文字'(M,M2), 'N進数'(N,J2,[M2|Y],X). 'N進数利用文字ならび'(N,_利用文字ならび) :- length(L1,N), findall(A,'N進数利用文字'(_,A),L), append(L1,_,L). 'N進数剰余数利用文字ならび'(N,_剰余数利用文字ならび) :- length(L1,N), findall([M,A],'N進数利用文字'(M,A),L), append(L1,_,L). 'N進数を利用した簡単な暗号化'(N,_文,_暗号化された文) :- atom_codes(_文,Codes), Y is 65536 // N, atomic_length(Y,_桁数), 'N進数を利用した簡単な暗号化'(N,_桁数,Codes,_暗号化された文字ならび), atomic_list_concat(_暗号化された文字ならび,' ',_暗号化された文). 'N進数を利用した簡単な暗号化'(_,_,[],[]). 'N進数を利用した簡単な暗号化'(N,_桁数,[A|R1],[C|R2]) :- 'N進数'(N,A,[],L), '頭部に零を詰める'(_桁数,L,L2), atom_chars(C,L2), 'N進数を利用した簡単な暗号化'(N,_桁数,R1,R2). 'N進数利用文字'(0,'0'). 'N進数利用文字'(1,'1'). 'N進数利用文字'(2,'2'). 'N進数利用文字'(3,'3'). 'N進数利用文字'(4,'4'). 'N進数利用文字'(5,'5'). 'N進数利用文字'(6,'6'). 'N進数利用文字'(7,'7'). 'N進数利用文字'(8,'8'). 'N進数利用文字'(9,'9'). 'N進数利用文字'(10,'A'). 'N進数利用文字'(11,'B'). 'N進数利用文字'(12,'C'). 'N進数利用文字'(13,'D'). 'N進数利用文字'(14,'E'). 'N進数利用文字'(15,'F'). 'N進数利用文字'(16,'G'). 'N進数利用文字'(17,'H'). 'N進数利用文字'(18,'I'). 'N進数利用文字'(19,'J'). 'N進数利用文字'(20,'K'). 'N進数利用文字'(21,'L'). 'N進数利用文字'(22,'M'). 'N進数利用文字'(23,'N'). 'N進数利用文字'(24,'O'). 'N進数利用文字'(25,'P'). 'N進数利用文字'(26,'Q'). 'N進数利用文字'(27,'R'). 'N進数利用文字'(28,'S'). 'N進数利用文字'(29,'T'). 'N進数利用文字'(30,'U'). 'N進数利用文字'(31,'V'). 'N進数利用文字'(32,'W'). 'N進数利用文字'(33,'X'). 'N進数利用文字'(34,'Y'). 'N進数利用文字'(35,'Z'). 'N進数利用文字'(36,'a'). 'N進数利用文字'(37,'b'). 'N進数利用文字'(38,'c'). 'N進数利用文字'(39,'d'). 'N進数利用文字'(40,'e'). 'N進数利用文字'(41,'f'). 'N進数利用文字'(42,'g'). 'N進数利用文字'(43,'h'). 'N進数利用文字'(44,'i'). 'N進数利用文字'(45,'j'). 'N進数利用文字'(46,'k'). 'N進数利用文字'(47,'l'). 'N進数利用文字'(48,'m'). 'N進数利用文字'(49,'n'). 'N進数利用文字'(50,'o'). 'N進数利用文字'(51,'p'). 'N進数利用文字'(52,'q'). 'N進数利用文字'(53,'r'). 'N進数利用文字'(54,'s'). 'N進数利用文字'(55,'t'). 'N進数利用文字'(56,'u'). 'N進数利用文字'(57,'v'). 'N進数利用文字'(58,'w'). 'N進数利用文字'(59,'x'). 'N進数利用文字'(60,'y'). 'N進数利用文字'(61,'z'). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/php/1147830986/9 # # 1.1行ずつURLが記述されたテキストファイルを読み込み、 # 2.そのURLのコンテンツを取得して # 3.タイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) # するプログラムを作ってください。 # 尚テキストファイルに記述されているURLは妥当なものと見なして構わないものとする。 一行ずつURLが記述されたテキストファイルを読み込み、そのURLのコンテンツを取得してタイトルとURLを画面に出力する(File) :- 一行ずつURLが記述されたテキストファイルを読み込み(File,Lines), そのURLのコンテンツを取得して(URL,_コンテンツ,_タイトル), タイトルとURLを画面に出力(_タイトル,URL), fail. 一行ずつURLが記述されたテキストファイルを読み込み、そのURLのコンテンツを取得してタイトルとURLを画面に出力する(_). 一行ずつURLが記述されたテキストファイルを読み込み(File,URL) :- get_chars(File,Lines), member(URL,Lines). 'そのURLのコンテンツを取得して'(URL,_コンテンツ,_タイトル) :- w3c(URL,Lines2), concat_atom(Lines,_改行を削除した全文), atom_chars(_改行を削除した全文,_コンテンツ), タイトルを得る(_コンテンツ,_タイトル). タイトルとURLを画面に出力(_タイトル,URL) :- write_formatted('%t,%t\n',[_タイトル,URL]). タイトルを得る([|R1],_タイトル) :- (A=t;A='T'),(B=i;B='I'),(C=t;C='T'),(D=l;D='L'),(E=e;E='E'), タイトル文字ならびを切り取る(R1,_タイトル文字ならび), concat_atom(_タイトル文字ならび,_タイトル). タイトルを得る([_|R1],_タイトル) :- タイトルを得る(R1,_タイトル). タイトル文字ならびを切り取る(['<','/',A,B,C,D,E,'>'|_],[]) :- (A=t;A='T'),(B=i;B='I'),(C=t;C='T'),(D=l;D='L'),(E=e;E='E'),!. タイトル文字ならびを切り取る([A|R1],[A|R2]) :- タイトル文字ならびを切り取る(R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/408 # # 【 課題 】[文字列"GPIB-002.70V"から文字列"-002.70"を取り出して、 #       その文字列をDoubleオブジェクトにし、それをdouble型 #       実数値に変換して数値を表示 '文字列"GPIB-002.70V"から文字列"-002.70"を取り出して、その文字列をDoubleオブジェクトにし、それをdouble型実数値に変換して数値を表示'(_文字列,_浮動小数点数値) :- atom_chars(_文字列,_文字ならび), 連続する数字候補文字ならび(_文字ならび,_数字候補文字ならび), concat_atom(_数字候補文字ならび,_数字候補文字列), atom_to_term(_数字候補文字列,_浮動小数点数値,_). 連続する数字候補文字ならび(_文字ならび,_数字候補文字ならび) :- 数値候補文字まで読み飛ばし(_文字ならび,_数値文字から始まる文字ならび), 数字候補文字ならび(_数値文字から始まる文字ならび,_数字候補文字ならび). 数字候補文字ならび([],[]). 数字候補文字ならび(['e','+',A|R1],['e','+',A|R2]) :- 数値文字候補(A), 数字候補文字ならびの二(R1,R2),!. 数字候補文字ならび(['e','-',A|R1],['e','-',A|R2]) : 数値文字候補(A),- 数字候補文字ならびの二(R1,R2),!. 数字候補文字ならび([A,'.',B|R1],[A,'.',B|R2]) :- 数値文字候補(A), 数値文字候補(B), 数字候補文字ならびの二(R1,R2),!. 数字候補文字ならび([A|R1],[A|R2]) :- 数値文字候補(A), 数字候補文字ならび(R1,R2). 数字候補文字ならび([A|R1],[]) :- \+(数値文字候補(A)). 数字候補文字ならびの二([],[]). 数字候補文字ならびの二([A|R1],[A|R2]) :- 数値文字候補(A), 数字候補文字ならびの二(R1,R2). 数字候補文字ならびの二([A|R1],[]) :- \+(数値文字候補(A)). 数値候補文字まで読み飛ばし(['+',A|R1],['+',A|R1]) :- 数値文字候補(A),!. 数値候補文字まで読み飛ばし(['-',A|R1],['-',A|R1]) :- 数値文字候補(A),!. 数値候補文字まで読み飛ばし([A|R1],[A|R1]) :- 数値文字候補(A),!. 数値候補文字まで読み飛ばし([_|R1],R2) :- 数値候補文字まで読み飛ばし(R1,R2). 数値文字候補(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/758 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク): # カエサル暗号(A〜Z)の暗号文を入力して平文を含んだリストを出力しなさい。 # # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9972.txt# アルファベット(['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']). カエサル暗号(_ずらし,_平文,_暗号文) :- atomic(_平文), アルファベット(_アルファベット), ならびの回転(左方向,_ずらし,_アルファベット,_アルファベットの二), atom_chars(_平文,Chars), findall(C2,(member(C1,Chars),list_nth(N,_アルファベット,C1),list_nth(N,_アルファベットの二,C2)),Chars2), atom_chars(_暗号文,Chars2). カエサル暗号(_ずらし,_平文,_暗号文) :- var(_平文), atomic(_暗号文), アルファベット(_アルファベット), ならびの回転(右方向,_ずらし,_アルファベット,_アルファベットの二), atom_chars(_暗号文,Chars), findall(C2,(member(C1,Chars),list_nth(N,_アルファベット,C1),list_nth(N,_アルファベットの二,C2)),Chars2), atom_chars(_平文,Chars2). ならびの回転(左方向,1,[A|R],L) :- append(R,[A],L). ならびの回転(左方向,N,[A|R],L) :- N > 1, append(R,[A],L1), N1 is N - 1, ならびの回転(左方向,N1,L1,L). ならびの回転(右方向,1,L1,L2) :- append(L0,[A],L1), append([A],L0,L2). ならびの回転(右方向,N,L1,L2) :- N > 1, append(L0,[A],L1), append([A],L0,L3), N1 is N - 1, ならびの回転(右方向,N1,L3,L2). % 以下のサイトは # 出典:: 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). % 以下のサイトは 全角数値文字列整数変換(_全角文字数値,_整数) :- atom_chars(_全角文字数値,Chars), 全角数値文字ならび整数変換(Chars,_整数). 全角数値文字ならび整数変換(Chars,_整数) :- 全角数値文字ならび整数変換(Chars,0,_整数). 全角数値文字ならび整数変換([],N,N) :- !. 全角数値文字ならび整数変換([A|R],N1,N) :- 全角文字整数変換(A,M), N2 is 10 * N + M, 全角数値文字ならび整数変換(R,N2,N). 全角文字整数変換('0',0). 全角文字整数変換('1',1). 全角文字整数変換('2',2). 全角文字整数変換('3',3). 全角文字整数変換('4',4). 全角文字整数変換('5',5). 全角文字整数変換('6',6). 全角文字整数変換('7',7). 全角文字整数変換('8',8). 全角文字整数変換('9',9). % 以下のサイトは %文字列置換 %
%このディレクトリの索引

% *** user: '文字列置換' / 5 ***
'文字列置換'(_文字列,_置換述語,_要素変数,_置換変数,_置換された文字列) :-
    atom_chars(_文字列,_ならび),
    '全要素に適用して置換'(_ならび,_置換述語,_要素変数,_置換変数,_置換ならび),
    concat_atom(_置換ならび,_置換された文字列),
    ! .

% *** user: '文字列置換' / 4 ***
'文字列置換'(_対象文字列,_置換される副文字列,_置換する副文字列,_置換された文字列) :-
    replace(_対象文字列,_置換される副文字列,_置換する副文字列,_置換された文字列),
    ! .

% *** user: replace_all / 4 ***
replace_all('',A,B,'') :-
    ! .
replace_all(String,S1,'',X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    replace_31(StringL,S1L,Y),
    concat_atom(Y,X),
    ! .
replace_all(String,S1,S2,X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    atom_chars(S2,S2L),
    replace_41(StringL,S1L,S2L,Y),
    concat_atom(Y,X),
    ! .

% *** user: replace / 4 ***
replace(String,S1,'',X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    replace_3(StringL,S1L,Y),
    concat_atom(Y,X),
    ! .
replace(String,S1,S2,X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    atom_chars(S2,S2L),
    replace_4(StringL,S1L,S2L,Y),
    concat_atom(Y,X),
    ! .

% *** user: replace_3 / 3 ***
replace_3(L,L1,R) :-
    append(L1,R,L),
    ! .
replace_3([A|R],L1,[A|R2]) :-
    replace_3(R,L1,R2) .
% *** user: replace_4 / 4 ***
replace_4(L,L1,L2,R2) :-
    append(L1,R,L),
    append(L2,R,R2),
    ! .
replace_4([A|R],L1,L2,[A|R2]) :-
    replace_4(R,L1,L2,R2) .

% *** user: replace_31 / 3 ***
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) .

% *** user: replace_41 / 4 ***
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) .

% *** user: '全要素に適用して置換' / 5 ***
'全要素に適用して置換'(L,P,Element,_置換変数,X) :-
    length(L,Len),
    findall(U,(for(1,N,Len) , list_nth(N,L,A,Element,C) , (error_protect(P,fail) , U = _置換変数 ; \+(error_protect(P,fail)) , U = Element)),X) .

% *** user: 'split' / 3 ***
split(_文,_区切り語ならび,_区切られた語ならび) :-
    区切り語ならびの変形(_区切り語ならび,SeparatersL),
    atom_chars(_文,_文字ならび),
    split_1(_文字ならび,SeparatersL,_区切られた語ならび).

% *** user: 'split_1' / 3 ***
split_1([],SeparatersL,[]).
split_1(L1,SeparatersL,[A|R]) :-
    \+(L1=[]),
    split_2(L1,SeparatersL,L2,R2),
    \+(L2=[]),
    atom_chars(A,L2),
    split_1(R2,SeparatersL,R).
split_1(L1,SeparatersL,X) :-
    \+(L1=[]),
    split_2(L1,SeparatersL,L2,R2),
    L2=[],
    split_1(R2,SeparatersL,X).

% *** user: 'split_2' / 4 ***
split_2([],_,[],[]).
split_2(L1,SeparatersL,[],R) :-
    member(L2,SeparatersL),
    append(L2,R,L1).
split_2([A|R1],SeparatersL,[A|R2],R) :-
    \+((member(L2,SeparatersL),append(L2,_,[A|R1]))),
    split_2(R1,SeparatersL,R2,R).

% *** user: '区切り語ならび