このディレクトリの索引

% 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #48 # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/5oepZpDW # #include # double heikin(int a[]); # # int main(void) # { # int data[5],i; # double ave; # for (i=0;i<=4;i++) # { # printf("data[%d]= ",i); # scanf("%d",&data[i]); # } # ave=heikin(data); # printf("heikin=%f \n",ave); # return 0; # } # # double heikin(int a[]) # { # int i,k=0; # for(i=0;i<=4;i++) # { # k=k+a[i]; # } # return((double)k/5); # } # 上記のプログラムに5人の得点(10点満点)を受け取ると、合格者数を戻すgoukaku関数を追加せよ、但し6点以上で合格とする。 # そして5人のテストの得点を整数型配列data[5]の要素にそれぞれ入力すると # 5人の平均点に加えて合格者数も出力するプログラムをheikin関数およびgoukaku関数を利用して作成しなさい。 # '5人の得点(10点満点)を受け取ると、合格者数を戻す述語を定義する。但し6点以上で合格とする。そして5人のテストの得点を入力すると5人の平均点に加えて合格者数も出力する。' :- '5人の得点(10点満点)を受け取ると'(_5人の得点ならび), 平均点を出力する(_5人の得点ならび), '6点以上を取った合格者数を出力する'(_5人の得点ならび). 平均点を出力する(_5人の得点ならび) :- 平均点を戻す(_5人の得点ならび,_平均点), writef('平均点 = %w 点\n',[_平均点]). 平均点を戻す(_5人の得点ならび,_平均点) :- sum_list(_5人の得点ならび,_合計点), _平均点 is _合計点 / 5. '6点以上を取った合格者数を出力する'(_5人の得点ならび) :- '6点以上を取った合格者数を戻す'(_5人の得点ならび,_合格者数), writef('合格者数 = %w 人\n',[_合格者数]). '5人の得点(10点満点)を受け取ると'(_5人の得点ならび) :- findall(_得点,( '5人の', '得点(10点満点)を受け取る'(_得点)),_5人の得点ならび). '5人の' :- between(1,5,_). '得点(10点満点)を受け取る'(_得点) :- 行入力(_行文字列), '診断: 得点(10点満点)を受け取る'(_行文字列,_得点),!. '得点(10点満点)を受け取る'(_得点) :- '得点(10点満点)を受け取る'(_得点). '診断: 得点(10点満点)を受け取る'(_行文字列,_得点) :- 行文字列を解析して0から10の範囲の得点を得る(_行文字列,_得点),!. '診断: 得点(10点満点)を受け取る'(_行文字列,_得点) :- writef('入力された %w からは適切な得点が得られません。再入力をお願いします。\n',[_行文字列]), fail. 行文字列を解析して0から10の範囲の得点を得る(_行文字列,_得点) :- 行文字列を解析して(_行文字列,_得点), '0から10の範囲の得点を得る'(_得点). 行文字列を解析して(_行文字列,_得点) :- read_term_from_atom(_行文字列,_得点,[]). '0から10の範囲の得点を得る'(_得点) :- integer(_得点), member(_得点,[0,1,2,3,4,5,6,7,8,9,10]). 行入力(_行文字列) :- read_line_to_codes(current_input,Codes), atom_codes(_行文字列,Codes). '6点以上を取った合格者数を戻す'(_5人の得点ならび,_合格者数) :- findall(_,( '6点以上で合格とする'(_5人の得点ならび)),L), length(L,_合格者数). '6点以上で合格とする'(_5人の得点ならび) :- member(_得点,_5人の得点ならび), _得点 >= 6. % 以下のサイトは # 出典 :: ★★ 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. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 137代目 #936 # お手上げです。頑張ったのですが、できませんでした。 # 申し訳ないですけどお願いします。 # # 問題 # # 複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力するプログラムを作成せよ. # # 【実行例】 # # 何個の文字列を入力しますか?:4 # 入力文字列[1]:Computer # 入力文字列[2]:Science # 入力文字列[3]:Tarou # 入力文字列[4]:Tanaka # # 繋ぎ合わせる順番: # 2 # 4 # 3 # 1 # # 結果:ScienceTanakaTarouComputer # '複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する' :- '複数の文字列を読み込み,'(_複数の,_入力文字列ならび), 'さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する'(_複数の,_入力文字列ならび). '複数の文字列を読み込み,'(_複数の,_入力文字列ならび) :- 複数の(_複数の), findall(_行,( 文字列を読み込み(_複数の,_行)),_入力文字列ならび). 複数の(_複数の) :- 整数を得る('何個の文字列を入力しますか?: ',true,_複数の), writef('文字列を%w行連続して入力してください\n',[_複数の]). 文字列を読み込み(_複数の,_行) :- between(1,_複数の,_), 行入力(_行). 'さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する'(_複数の,_入力文字列ならび) :- 'さらに,それらの文字列を繋ぎ合わせる順番を入力し'(_複数の,_取り出し順ならび), 結果を出力する(_入力文字列ならび,_取り出し順ならび). 'さらに,それらの文字列を繋ぎ合わせる順番を入力し'(_複数の,_取り出し順ならび) :- write('入力した文字列を繋ぎ合わせる順番を入力してください\n'), それらの文字列を繋ぎ合わせる順番を入力し(_複数の,_取り出し順ならび). それらの文字列を繋ぎ合わせる順番を入力し(_複数の,_取り出し順ならび) :- findall(_番目,( 順番を入力し(_複数の,_番目)),_取り出し順ならび). 順番を入力し(_複数の,_番目) :- between(1,_複数の,_), 整数を得る(_番目). 整数を得る(_番目) :- 整数を得る('',true,_番目). 結果を出力する(_入力文字列ならび,_取り出し順ならび) :- 結果を(_入力文字列ならび,_取り出し順ならび,_指定した順番の文字列ならび), 出力する(_指定した順番の文字列ならび). 結果を(_入力文字列ならび,_取り出し順ならび,_指定した順番の文字列ならび) :- findall(_文字列,( 指定順に取り出す(_入力文字列ならび,_取り出し順ならび,_文字列)),_指定した順番の文字列ならび). 指定順に取り出す(_入力文字列ならび,_取り出し順ならび,_文字列) :- member(_番目,_取り出し順ならび), nth1(_番目,_入力文字列ならび,_文字列). 出力する(_指定した順番の文字列ならび) :- 文字列を指定した順番に繋ぎ合わせて(_指定した順番の文字列ならび,_表示文字列), writef('繋ぎ合わせた文字列は: %w\n',[_表示文字列]). 文字列を指定した順番に繋ぎ合わせて(_指定した順番の文字列ならび,_表示文字列) :- atomic_list_concat(_指定した順番の文字列ならび,_表示文字列). 整数を得る(_催促文,_条件,_整数) :- 以下の入力に失敗した場合は再入力する, '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 以下の入力に失敗した場合は再入力する :- repeat. '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- call(_条件). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #531 # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # 平成○年の値を入力し、西暦に変換するプログラムを作成 # '平成○年の値を入力し、西暦に変換する' :- '平成○年の値を入力し漢数字を数字に変換する'(_数字), '平成元年は西暦1989年であることから西暦を得る'(_数字,_西暦), format('西暦は ~w です。\n',[_西暦]). '平成○年の値を入力し漢数字を数字に変換する'(_数字) :- '平成○年の値を入力し'(_漢数字年), 漢数字を数字に変換する(_漢数字年,_数字). '平成○年の値を入力し'(_漢数字年) :- write('平成○年を入力してください : '), 漢数字年を得る(_漢数字年). 漢数字年を得る(_漢数字年) :- 行入力されたものが漢数字であるか検査する(_漢数字年),!. 漢数字年を得る(_漢数字年) :- 漢数字年を得る(_漢数字年). 行入力されたものが漢数字であるか検査する(_漢数字年) :- 行入力(_行), 年は切り取って検査する(_行,_年が切り取られた行), 漢数字年入力検査(_年が切り取られた行,_漢数字年). 年は切り取って検査する(_行,_年が切り取られた行) :- 末尾文字が年だったら切り取る(_行,_年が切り取られた行),!. 年は切り取って検査する(_行,_行). 末尾文字が年だったら切り取る(_行,_年が切り取られた行) :- sub_atom(_行,_,1,0,年), sub_atom(_行,0,_,1,_年が切り取られた行). 漢数字年入力検査(元,元) :- !. 漢数字年入力検査(_漢数字年,_漢数字年) :- forall(sub_atom(_漢数字年,_,1,_,A),'漢数字・数字'(A,_)),!. 漢数字年入力検査(_行,_) :- writef('入力された %t からは漢数字が得られませんでした。再入力をお願いします。\n',[_行]), fail. 漢数字を数字に変換する(元,1) :- !. 漢数字を数字に変換する(_年,_数字) :- '二桁年の数字を得る'(_年,_数字). 漢数字を数字に変換する(_年,_数字) :- '一桁年の数字を得る'(_年,_数字). '二桁年の数字を得る'(_年,_数字) :- '十の桁、一の桁の漢数字を切り取り数字を得る'(_年,_数字). '十の桁、一の桁の漢数字を切り取り数字を得る'(_年,_数字) :- '十の桁、一の桁の漢数字を得る'(_年,_十の桁の漢数字,_一の桁の漢数字), '十の桁、一の桁の数字を得る'(_十の桁の漢数字,_一の桁の漢数字,_十の桁の数字,_一の桁の数字), _数字 is _十の桁の数字 * 10 + _一の桁の数字. '十の桁、一の桁の漢数字を得る'(_年,_十の桁の漢数字,_一の桁の漢数字) :- sub_atom(_年,0,1,R,_十の桁の漢数字), sub_atom(_年,R,1,0,_一の桁の漢数字), R > 0. '十の桁、一の桁の数字を得る'(_十の桁の漢数字,_一の桁の漢数字,_十の桁の数字,_一の桁の数字) :- '漢数字・数字'(_十の桁の漢数字,_十の桁の数字), '漢数字・数字'(_一の桁の漢数字,_一の桁の数字). '一桁年の数字を得る'(_年,_数字) :- sub_atom(_年,0,1,0,_一の桁の漢数字), '漢数字・数字'(_一の桁の漢数字,_数字). '平成元年は西暦1989年であることから西暦を得る'(_数字,_西暦) :- _西暦 is _数字 + 1989 - 1. '漢数字・数字'(一,1). '漢数字・数字'(二,2). '漢数字・数字'(三,3). '漢数字・数字'(四,4). '漢数字・数字'(五,5). '漢数字・数字'(六,6). '漢数字・数字'(七,7). '漢数字・数字'(八,8). '漢数字・数字'(九,9). '漢数字・数字'(十,1). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは :- use_module(library(socket)). :- op(800,xfx,(::)). :- op(850,fx,(!)). (! _目標) :- (keizo97:6013 :: _目標). _ホスト:_ポート :: _目標 :- クライアント(_ホスト,_ポート,findall(_目標,_目標,_目標ならび)), 全解を取り出す(_目標,_目標ならび). クライアント(_ホスト,_ポート, _項) :- 項にfindallを被せて目標として送信する(_ホスト,_ポート,_項,_ソケット,In,Out), ホストから情報受信(In,_行2), 受信情報の評価(_項,_行2,_項2,In,Out). 受信情報の評価(_項,_行2,_項2,In,Out) :- catch(read_term_from_atom(_行2,_項2,[]),E,(ストリームを閉じる(In,Out),fail)), ストリームを閉じる(In,Out), 送信項と受信項の単一化(_項,_項2). ホストから情報受信(In,_行2) :- '% end_of_file行までの表示'(In), 行入力(In,_行2). '% end_of_file行までの表示'(In) :- 行入力(In,_行), '% end_of_file行までの表示'(In,_行). '% end_of_file行までの表示'(In,'% end_of_file') :- !. '% end_of_file行までの表示'(In,_行) :- '% end_of_file行が来るまで表示して行く'(In,_行). '% end_of_file行が来るまで表示して行く'(In,_行) :- format('~w\n',[_行]), 行入力(in,_行2), '% end_of_file行までの表示'(In,_行2). 項にfindallを被せて目標として送信する(_ホスト,_ポート,_項,_ソケット,In,Out) :- サーバと接続する(_ホスト, _ポート,_ソケット), tcp_open_socket(_ソケット, In, Out), 情報を送信する(Out,_項). サーバと接続する(_ホスト, _ポート,_ソケット) :- tcp_socket(_ソケット), tcp_connect(_ソケット, _ホスト:_ポート). 全解を取り出す(P,L) :- member(P,L). 行入力(In,_行) :- read_line_to_codes(In,Codes), atom_codes(_行,Codes). エラー情報の送信(Out,_エラー情報) :- writef('%w\n',[_エラー情報]), format(Out,'~%w\n',[_エラー情報]). 情報を送信する(Out,_項) :- format(Out,'%w\n',[_項]), flush_output(Out). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). % 以下のサイトは :- use_module(library(socket)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(_ポート) :- tcpソケットの準備(_ソケット,_ポート), 接続されたらソケットを開く(_ソケット, AcceptFd, _), tcpインタプリタ(AcceptFd). tcpソケットの準備(_ソケット,_ポート) :- tcp_socket(_ソケット), tcp_bind(_ソケット, _ポート), tcp_listen(_ソケット, 5). 接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out) :- tcp_accept(AcceptFd, _ソケット, _Peer), tcp_open_socket(_ソケット, In, Out). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out), 一行読み出し項に変換(In,_項), インタプリタの実行(_ソケット,In,Out,_項). インタプリタの実行(_ソケット,In,Out,_項) :- 親タスクで実行(In,Out,_項), 小タスクで実行(_ソケット,In,Out,_項). 親タスクで実行(In,Out,_項) :- 項は親タスクで実行するべきもの(_項), 親タスクで実行(In,Out,_項), fail. 親タスクで実行(_,_,_項) :- 項は子タスクで実行するべきもの(_項). 項は親タスクで実行するべきもの(_項) :- _項 = findall(_,exec(_),_). 項は子タスクで実行するべきもの(_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項) :- catch(_項,_エラー情報,エラー発生時はfail扱い), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(_ソケット,In,Out,_項) :- tell(Out), thread_create(項を実行して結果を返す(In, Out, _項),_,[]). 項を実行して結果を返す(In, Out, _項) :- 目標評価(In, Out, _項), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 目標評価(In, Out, _項) :- catch(_項,_エラー情報,エラー情報の送信(Out,_エラー情報),!. 目標評価(In, Out, _項) :- _項=false. 一行読み出し項に変換(In,_項,_エラー情報) :- 行入力(In,_行), 行を解析して項を得る(_行,_項,_エラー情報). 行を解析して項を得る(_行,_項,_エラー情報) :- catch(read_term_from_atom(_行,_項,[]),_エラー情報,_項 = false). 行入力(In,_行) :- read_line_to_codes(In,Codes), atom_codes(_行,Codes). エラー情報の送信(Out,_エラー情報) :- format('~w\n',[_エラー情報]), format(Out,'~w\n',[_エラー情報]). 情報を送信する(Out,_項) :- write(Out,'% end_of_file\n'), 項書き出す(Out,_項). 項を書き出す(Out,_項) :- format(Out,'~w\n',[_項]), flush_output(out). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). エラー発生時はfail扱い :- fail. % 以下のサイトは :- use_module(library(socket)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(_ポート) :- tcpソケットの準備(_ソケット,_ポート), 接続されたらソケットを開く(_ソケット, AcceptFd, _), tcpインタプリタ(AcceptFd). tcpソケットの準備(_ソケット,_ポート) :- tcp_socket(_ソケット), tcp_bind(_ソケット, _ポート), tcp_listen(_ソケット, 5). 接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out) :- tcp_accept(AcceptFd, _ソケット, _Peer), tcp_open_socket(_ソケット, In, Out). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out), 一行読み出し項に変換(In,_項), インタプリタの実行(_ソケット,In,Out,_項). インタプリタの実行(_ソケット,In,Out,_項) :- 親タスクで実行(In,Out,_項), 小タスクで実行(_ソケット,In,Out,_項). 親タスクで実行(In,Out,_項) :- 項は親タスクで実行するべきもの(_項), 親タスクで実行(In,Out,_項), fail. 親タスクで実行(_,_,_項) :- 項は子タスクで実行するべきもの(_項). 項は親タスクで実行するべきもの(_項) :- _項 = findall(_,exec(_),_). 項は子タスクで実行するべきもの(_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項) :- catch(_項,_エラー情報,エラー発生時はfail扱い), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(_ソケット,In,Out,_項) :- thread_create(項を実行して結果を返す(In, Out, _項),_,[]). 項を実行して結果を返す(In, Out, _項) :- ( catch(_項,_エラー情報,エラー情報の送信(Out,_エラー情報)); _項=false),!, 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 一行読み出し項に変換(In,_項,_エラー情報) :- 行入力(In,_行), 行を解析して項を得る(_行,_項,_エラー情報). 行を解析して項を得る(_行,_項,_エラー情報) :- catch(read_term_from_atom(_行,_項,[]),_エラー情報,_項 = false). 行入力(In,_行) :- read_line_to_codes(In,Codes), atom_codes(_行,Codes). エラー情報の送信(Out,_エラー情報) :- format('~w\n',[_エラー情報]), format(Out,'~w\n',[_エラー情報]). 情報を送信する(Out,_項) :- 項を文字列に変換する(_項,_文字列), 書き出す(Out,_文字列). 書き出す(Out,_文字列) :- format(Out,'~w\n',[_文字列]), flush_output(Out). 項を文字列に変換する(_項,_文字列) :- swritef(String,'%t',[_項]), string_to_atom(String,_文字列). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). エラー発生時はfail扱い :- fail. % 以下のサイトは :- use_module(library(socket)). :- op(800,xfx,(::)). :- op(850,fx,(!)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(Port) :- tcpソケットの準備(Socket,Port), 接続されたらソケットを開く(Socket, AcceptFd, _), tcpインタプリタ(AcceptFd). tcpソケットの準備(Socket,Port) :- tcp_socket(Socket), tcp_bind(Socket, Port), tcp_listen(Socket, 5). 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out) :- tcp_accept(AcceptFd, Socket, _Peer), tcp_open_socket(Socket, In, Out). 一行読み出し項に変換(In,Line,_項,E1) :- 行入力(In,Line), catch(read_term_from_atom(Line,_項,[]),E1,_項 = false). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out), 一行読み出し項に変換(In,Line,_項,E1), 親タスクで実行(In,Out,_項), 小タスクで実行(Socket,In,Out,_項). 親タスクで実行(In,Out,_項) :- 親タスクで実行(In,Out,_項,E), fail. 親タスクで実行(In,Out,_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項,E) :- _項 = findall(_,exec(_),_), catch(_項,E,fail), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(Socket,In,Out,_項) :- thread_create(項を実行して結果を返す(In, Out, _項),_,[]). 項を実行して結果を返す(In, Out, _項) :- ( catch(_項,E2,エラー情報の送信(Out,E2)); _項=false),!, 情報を送信する(Out,_項), ストリームを閉じる(In,Out). クライアント(Host, Port, _項) :- 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd), 行入力(ReadFd,Line2), catch(read_term_from_atom(Line2,_項2,[]),E,(ストリームを閉じる(ReadFd,WriteFd),fail)), ストリームを閉じる(ReadFd,WriteFd), 送信項と受信項の単一化(_項,_項2). 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd) :- サーバと接続する(Host, Port,Socket), tcp_open_socket(Socket, ReadFd, WriteFd), 情報を送信する(WriteFd,_項). サーバと接続する(Host, Port,Socket) :- tcp_socket(Socket), tcp_connect(Socket, Host:Port). (! P) :- (keizo97:6013 :: P). Network:Port :: P :- クライアント(Network,Port,findall(P,P,L)), 全解を取り出す(P,L). 全解を取り出す(P,L) :- member(P,L). 行入力(In,Line) :- read_line_to_codes(In,Codes), atom_codes(Line,Codes). エラー情報の送信(Out,E) :- write(E),nl, writeq(Out,E), write(Out,'\n'). 情報を送信する(Out,_項) :- 項を文字列に変換する(_項,_文字列), 書き出す(Out,_文字列). 書き出す(Out,_文字列) :- write(Out,_文字列), write(Out,'\n'), flush_output(Out). 項を文字列に変換する(_項,_文字列) :- swritef(String,'%t',[_項]), string_to_atom(String,_文字列). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). % 以下のサイトは :- use_module(library(socket)). :- op(800,xfx,(::)). :- op(850,fx,(!)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(Port) :- tcpソケットの準備(Socket,Port), 接続されたらソケットを開く(Socket, AcceptFd, _), tcpインタプリタ(AcceptFd). tcpソケットの準備(Socket,Port) :- tcp_socket(Socket), tcp_bind(Socket, Port), tcp_listen(Socket, 5). 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out) :- tcp_accept(AcceptFd, Socket, _Peer), tcp_open_socket(Socket, In, Out). 一行読み出し項に変換(In,Line,_項,E1) :- 行入力(In,Line), catch(read_term_from_atom(Line,_項,[]),E1,_項 = false). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out), 一行読み出し項に変換(In,Line,_項,E1), 親タスクで実行(In,Out,_項), 小タスクで実行(Socket,In,Out,_項). 親タスクで実行(In,Out,_項) :- 親タスクで実行(In,Out,_項,E), fail. 親タスクで実行(In,Out,_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項,E) :- _項 = findall(_,exec(_),_), catch(_項,E,fail), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(Socket,In,Out,_項) :- fork(Pid), ( Pid == child -> 項を実行して結果を返す(In, Out, _項), ストリームを閉じる(In,Out), halt; tcp_close_socket(Socket) ). 項を実行して結果を返す(In, Out, _項) :- ( catch(_項,E2,エラー情報の送信(Out,E2)); _項=false),!, 情報を送信する(Out,_項). クライアント(Host, Port, _項) :- 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd), 行入力(ReadFd,Line2), catch(read_term_from_atom(Line2,_項2,[]),E,(ストリームを閉じる(ReadFd,WriteFd),fail)), ストリームを閉じる(ReadFd,WriteFd), 送信項と受信項の単一化(_項,_項2). 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd) :- サーバと接続する(Host, Port,Socket), tcp_open_socket(Socket, ReadFd, WriteFd), 情報を送信する(WriteFd,_項). サーバと接続する(Host, Port,Socket) :- tcp_socket(Socket), tcp_connect(Socket, Host:Port). (! P) :- (keizo97:6013 :: P). Network:Port :: P :- クライアント(Network,Port,findall(P,P,L)), 全解を取り出す(P,L). 全解を取り出す(P,L) :- member(P,L). 行入力(In,Line) :- read_line_to_codes(In,Codes), atom_codes(Line,Codes). エラー情報の送信(Out,E) :- write(E),nl, writeq(Out,E), write(Out,'\n'). 情報を送信する(Out,_項) :- 項を文字列に変換する(_項,_文字列), 書き出す(Out,_文字列). 書き出す(Out,_文字列) :- write(Out,_文字列), write(Out,'\n'), flush_output(Out). 項を文字列に変換する(_項,_文字列) :- swritef(String,'%t',[_項]), string_to_atom(String,_文字列). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). % 以下のサイトは # 出典 :: 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++の宿題片付けます 167代目 #309 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&amp;リンク):入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返すプログラム。 # [3] 環境 #  [3.1] OS:Windows #  [3.2] コンパイラ名とバージョン:Visual C++ 2010 #  [3.3] 言語:C++ # [4] 期限:4月18日 '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す' :- '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(0). '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和) :- 入力した奇数の和が20を超えるまで(_入力した奇数の和),!. '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和_1) :- '入力した数が奇数の場合表示する。奇数でない場合はなにもしない。'(_入力した奇数の和_1). 入力した奇数の和が20を超えるまで(_入力した奇数の和) :- _入力した奇数の和 > 20. '入力した数が奇数の場合表示する。奇数でない場合はなにもしない。'(_入力した奇数の和_1) :- '入力した数が奇数の場合表示する。'(_入力した奇数の和_1). '入力した数が奇数の場合表示する。奇数でない場合はなにもしない。'(_入力した奇数の和_1) :- '奇数でない場合はなにもしない。'(_入力した奇数の和_1). '入力した数が奇数の場合表示する。'(_入力した奇数の和_1) :- '入力した数が奇数の場合'(_入力した数), 表示する(_入力した数), _入力した奇数の和_2 is _入力した数 + _入力した奇数の和_1, '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和_2). '入力した数が奇数の場合'(_入力した数) :- 入力した数が(_入力した数), 奇数の場合(_入力した数). '奇数でない場合はなにもしない。'(_入力した奇数の和) :- '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和). 入力した数が(_入力した数) :- 整数を得る('整数を入力して下さい: ',true,_入力した数),!. 奇数の場合(_入力した数) :- 1 is _入力した数 mod 2. 表示する(_入力した数) :- writef('%w\n',[_入力した数]). 整数を得る(_催促文,_条件,_整数) :- write(_催促文), 行を得る(_行), 整数入力検査(_行,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 行を得る(_行) :- read_line_to_codes(user_input,_codes), atom_codes(_行,_codes). 整数入力検査(_行,_条件,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査と条件検査(_行,_整数,_条件). 整数検査と条件検査(_行,_整数,_条件) :- 整数検査(_行,_整数), 条件検査(_行,_条件). 整数検査(_行,_整数) :- integer(_整数),!. 整数検査(_整数) :- writef('入力された行 %w から整数は得られません。\n',[_行]), fail. 条件検査(_行,_条件) :- call(_条件),!. 条件検査(_行,_条件) :- writef('入力された行 %w からは、条件 %w が真になりません。\n',[_行,_条件]), fail. % 以下のサイトは ファイルから全行読み取る(_ファイル,_全行) :- open(_ファイル,read,_ストリーム), ストリームから全行読み取る(_ストリーム,_全行), close(_ストリーム). ストリームから全行読み取る(_ストリーム,[]) :- at_end_of_stream(_ストリーム),!. ストリームから全行読み取る(_ストリーム,_全行) :- ストリームから全行読み取って行く(_ストリーム,_全行). ストリームから全行読み取って行く(_ストリーム,[_行|R]) :- 行入力(_ストリーム,_行), ストリームから全行読み取る(_ストリーム,R). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは ファイル行入力(_ファイル,_ストリーム,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,end_of_file) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは ファイル行入力(_ファイル,_ストリーム,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,_) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!,fail. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは ファイル行入力(_ファイル,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,end_of_file) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは ファイル行入力(_ファイル,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,_) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!,fail. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは # 最大の利益 # 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 とする) の最大値を求めてください。' :- 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび), 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび) :- 時系列数を得る(_時系列数), 時刻tに於ける価格ならびを得る(_時系列数,_時刻tに於ける価格ならび). 時刻tに於ける価格ならびを得る(_時系列数,_時刻tに於ける価格ならび) :- findall(_価格,( 時刻tに於ける価格(_時系列数,_価格)),_時刻tに於ける価格ならび). 時刻tに於ける価格(_時系列数,_価格) :- between(1,_時系列数,_t), 価格を得る(_価格). 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大価格差,( 為替差の利益(_時刻tに於ける価格ならび,_時刻tの投資に対する最大価格差)),_最大の為替差の利益). 為替差の利益(_時刻tに於ける価格ならび,_時刻tの投資に対する最大価格差) :- append(_,[_時刻tの価格|_その後の価格ならび],_時刻tに於ける価格ならび), 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差). 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差) :- findmax(_時刻tの価格との価格差,( 時刻tの投資に対する価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差)),_時刻tの投資に対する最大価格差). 時刻tの投資に対する価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差) :- member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格. 時系列数を得る(_時系列数) :- 数を得る(_時系列数). 価格を得る(_価格) :- 数を得る(_価格). 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). 数を得る(_数) :- 行入力(_行), 数入力検査(_行,_数). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 数入力検査(_行,_数) :- read_term_from_atom(_行,_数,[]), number(_数). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 134代目 #154 # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/www.acm-japan.org/past-icpc/domestic2008/problems/all_ja.html # 等しい合計点 # # 太郎と花子はそれぞれカードを何枚か持っている. # 各カードには点数が書かれている.太郎のカードと花子のカードを 1 枚ずつ交換して, # それぞれの持つカードの合計点数が等しくなるようにしたい. # どのカードとどのカードを交換したらよいか. # # ただし,カードを交換しなくても合計点数が等しい場合でも,必ずカードの交換を行うものとする. # Input # 入力は,いくつかのデータセットからなる.各データセットは次の形式で与えられ # # n m # s1 # s2 # ... # 各データセットの最初の行は空白ひとつで区切られたふたつの数 n と m を含み, # n は太郎のカードの枚数,m は花子のカードの枚数を表す.続く n+m 行には, # 各カードの点数が 1 行にひとつずつ並ぶ. # 最初の n 個の点数 (s1 から sn まで) は太郎のカードの点数, # 残りの m 個の点数 (sn+1 から sn+m まで) は花子のカードの点数を表す. # n および m は 100 以下の正の整数とし,カードの点数は 0 以上 100 以下の整数値とする. # # 入力の終わりは,空白ひとつで区切られたふたつの 0 を含む 1 行で示される. '太郎の手札と花子の手札を 1 枚ずつ交換して,それぞれの持つ手札の合計点数が等しくなるようにしたい' :- 太郎と花子の手札を読み込む(_太郎の手札ならび,_花子の手札ならび), '太郎の手札と花子の手札を 1 枚ずつ交換して,それぞれの持つ手札の合計点数が等しくする'(_太郎の手札ならび,_花子の手札ならび,_太郎の手札から抜いた手札,_花子の手札から抜いた手札). 太郎と花子の手札を読み込む(_太郎の手札ならび,_花子の手札ならび) :- '行を入力し、空白を区切りに太郎の手札の枚数と花子の手札の枚数を得る'(_太郎の手札の枚数,_花子の手札の枚数), '点数を入力し、太郎と花子に分配する'(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札ならび,_花子の手札ならび). '行を入力し、空白を区切りに太郎の手札の枚数と花子の手札の枚数を得る'(_太郎の手札の枚数,_花子の手札の枚数) :- 行を文字コードとして読み取る(_文字コードならび), '空白のコードを区切りに、文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(_文字コードならび,_太郎の手札の枚数,_花子の手札の枚数). '空白を区切りに太郎の手札の枚数と花子の手札の枚数を得る'(_太郎の手札の枚数,_花子の手札の枚数) :- 行を文字コードとして読み取る(_文字コードならび), '空白のコードを区切りに、文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(_文字コードならび,_太郎の手札の枚数,_花子の手札の枚数). 行を文字コードとして読み取る(_文字コード) :- get_line_to_codes(user_input,_文字コード). 整数を得る(_整数) :- 行を得る(_行), 行を整数に変換する(_行,_整数). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). 行を得る(_行) :- get_line_to_codes(user_input,_文字コードならび), atom_codes(_行,文字コードならび). '空白のコードを区切りに、文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(_文字コードならび,_太郎の手札の枚数,_花子の手札の枚数) :- '空白のコードを区切りに、'(_文字コードならび,L1,L2), '文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(L1,L2,_太郎の手札の枚数,_花子の手札の枚数). '空白のコードを区切りに、'(_文字コードならび,L1,L2) :- append(L1,[32|L2],_文字コードならび). '文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(L1,L2,_太郎の手札の枚数,_花子の手札の枚数) :- number_codes(_太郎の手札の枚数,L1), number_codes(_花子の手札の枚数,L2). '点数を入力し、太郎と花子に分配する'(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札,_花子の手札) :- 太郎と花子の手札を読み込む(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札,_花子の手札). 太郎と花子の手札を読み込む(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札,_花子の手札) :- 太郎の手札を読み込む(_太郎の手札の枚数,_太郎の手札), 花子の手札を読み込む(_花子の手札の枚数,_花子の手札),!. 太郎の手札を読み込む(_太郎の手札の枚数,_太郎の手札) :- findnsols(_整数,_太郎の手札の枚数,( 連続して整数を読み込む(_整数)),_太郎の手札). 花子の手札を読み込む(_花子の手札の枚数,_花子の手札) :- findnsols(_整数,_花子の手札の枚数,( 連続して整数を読み込む(_整数)),_花子の手札). 連続して整数を読み込む(_整数) :- repeat, 整数を得る(_整数). '太郎の手札と花子の手札を 1 枚ずつ交換して,それぞれの持つ手札の合計点数が等しくする'(_太郎の手札,_差し替える太郎の手札,_花子の手札,_差し替える花子の手札,_等しい合計) :- '太郎の手札と花子の手札を 1 枚ずつ交換して'(_太郎の手札,_花子の手札,_差し替える太郎の手札,_差し替える花子の手札,_差し替えた太郎の手札,_差し替えた花子の手札), 合計点数が等しい(_差し替えた太郎の手札,_差し替えた花子の手札,_等しい合計). '太郎の手札と花子の手札を 1 枚ずつ交換して'(_太郎の手札,_花子の手札,_太郎の手札から抜いた手札,_花子の手札から抜いた手札,_差し替えた太郎の手札,_差し替えた花子の手札) :- select(_太郎の手札から抜いた手札,_太郎の手札ならび,_花子の手札から抜いた手札,_差し替えた太郎の手札ならび), select(_花子の手札から抜いた手札,_花子の手札,_太郎の手札から抜いた手札,_差し替えた花子の手札). 合計点数が等しい(_差し替えた太郎の手札,_差し替えた花子の手札,_等しい合計) :- sum_list(_差し替えた太郎の手札,_等しい合計), sum_list(_差し替えた花子の手札,_等しい合計). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/505 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): #  キーボードから正負の整数をデタラメに入力し、整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ # 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数の和,_5つの正の整数の平均) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'([],_5つの正の整数ならび), 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均). 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび,_正の整数ならび) :- 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび),!. 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび). 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび) :- length(_正の整数ならび,5). 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数), '正の整数のみをリストに格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2), 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_2,_正の整数ならび). 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 整数を入力する(_整数),!. 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数). 整数を入力する(_整数) :- 行入力(_行), '診断 :: 整数'(_行,_整数). '診断 :: 整数'(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). '正の整数のみをリストに格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2) :- _整数 >= 0, append(_正の整数ならび_1,[_整数],_正の整数ならび_2). '正の整数のみをリストに格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_1) :- _整数 < 0. 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均) :- sum_list(_5つの正の整数ならび,_5つの正の整数の和), _5つの正の整数の平均 is floor((_5つの正の整数の和 / 5) * 10 + 0.5) / 10. 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/7 # # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示するプログラムを作成しなさい。 # ただし、文字を大文字に変換する関数を作成し、それを利用すること。 # 'キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示する' :- キーボードから入力した文字列を(_文字コードならび), 'すべて大文字に変換して(小文字は大文字に、大文字はそのままに)'(_文字コードならび,_大文字に変換された文字コードならび), 表示する(_大文字に変換された文字コードならび). キーボードから入力した文字列を(_文字コードならび) :- write('文字列を入力してください : '), read_line_to_codes(user_input,_文字コードならび). 'すべて大文字に変換して(小文字は大文字に、大文字はそのままに)'(_文字コードならび,_大文字に変換された文字コードならび) :- findall(_変換されたコード,( member(_文字コード,_文字コードならび), '小文字は大文字に、大文字はその(_文字コード,_変換された文字コード)),_大文字に変換された文字コードならび). '小文字は大文字に、大文字はそのままに'(_文字コード,_変換された文字コード) :- 小文字は大文字に(_文字コード,_変換された文字コード). '小文字は大文字に、大文字はそのままに'(_文字コード,_文字コード) :- 大文字はそのままに(_文字コード). 小文字は大文字に(_文字コード,_変換された文字コード) :- 小文字の場合は(_文字コード), 大文字に変換して(_文字コード,_変換されたコード). 大文字はそのままに(_文字コード) :- \+(小文字の場合は(_文字コード)). 小文字の場合は(_文字コード) :- between(97,121,_文字コード). 大文字に変換して(_文字コード,_変換されたコード) :- _大文字コード is _文字コード - 32. 表示する(_大文字に変換された文字コードならび) :- atom_codes(_文字列,_大文字に変換された文字コードならび), writef('%w\n',[_文字列]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 143代目 #7 # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した三つの整数値の平均値を求めるプログラムを作成しなさい。 # ただし、平均値を求める関数 float ave(int a,int b) # を利用すること。 % % ave()の代わりに述語 二項平均/3 を使うこととする。 % キーボードから入力した三つの整数値の平均値を求める :- 三つの整数値を得る(_整数の一,_整数の二,_整数の三), 三項平均を二項平均だけから求める(100,_整数の一,_整数の二,_整数の三,_平均値), 平均値表示(_平均値). 三つの整数値を得る(_整数の一,_整数の二,_整数の三) :- キーボードから入力した整数値(_整数の一), キーボードから入力した整数値(_整数の二), キーボードから入力した整数値(_整数の三). 三項平均を二項平均だけから求める(N,_平均値の一,_平均値の二,_平均値の三,_平均値) :- '終了条件::三つの平均値が一致した時か、Nが0に至った時'(N,_平均値の一,_平均値の二,_平均値の三,_平均値),!. 三項平均を二項平均だけから求める(N,_整数の一,_整数の二,_整数の三,_平均値) :- '終了条件に達するまで、三項平均を二項平均だけから求める'(N,_整数の一,_整数の二,_整数の三,_平均値). '終了条件::三つの平均値が一致した時か、Nが0に至った時'(_,_平均値,_平均値,_平均値,_平均値). '終了条件::三つの平均値が一致した時か、Nが0に至った時'(0,_平均値,_,_,_平均値). '終了条件に達するまで、三項平均を二項平均だけから求める'(N,_整数の一,_整数の二,_整数の三,_平均値) :- 三項の組合せに対して二項平均を取る(_整数の一,_整数の二,_整数の三,_二項平均の一,_二項平均の二,_二項平均の三), succ(N_1,N), 三項平均を二項平均だけから求める(N_1,_二項平均の二,_二項平均の三,_二項平均の一,_平均値). 三項の組合せに対して二項平均を取る(_整数の一,_整数の二,_整数の三,_二項平均の一,_二項平均の二,_二項平均の三) :- 二項平均(_整数の一,_整数の二,_二項平均の一), 二項平均(_整数の一,_整数の三,_二項平均の二), 二項平均(_整数の二,_整数の三,_二項平均の三). 二項平均(_第一項,_第二項,_二項平均) :- _二項平均 is (_第一項 + _第二項) / 2. 平均値表示(_平均値) :- writef('平均値は %t です。\n',[_平均値]). キーボードから入力した整数値(_整数) :- write('整数を入力してください : '), 行入力(Line), キーボードから入力した整数値診断(Line,_整数),!. キーボードから入力した整数値(_整数) :- キーボードから入力した整数値(_整数). キーボードから入力した整数値診断(Line,_整数) :- read_term_from_atom(Line,_整数,[]), integer(_整数),!. キーボードから入力した整数値診断(Line,_整数) :- writef('入力された %t からは整数は得られません。再入力をお願いします。\n',[Line]), fail. 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/7 # # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示するプログラムを作成しなさい。 # ただし、文字を大文字に変換する関数を作成し、それを利用すること。 # 'キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示する' :- キーボードから入力した文字列を(_文字コードならび), すべて大文字に変換して(_文字コードならび,_大文字に変換された文字コードならび), 表示する(_大文字に変換された文字コードならび). キーボードから入力した文字列を(_文字コードならび) :- write('文字列を入力してください : '), read_line_to_codes(user_input,_文字コードならび). すべて大文字に変換して([],[]). すべて大文字に変換して(L1,L2) :- 小文字場合は大文字に変換する(L1,L2). 小文字場合は大文字に変換する([_文字コード|R1],[_変換されたコード|R2]) :- 小文字の場合は大文字に変換して(_文字コード,_変換されたコード), すべて大文字に変換して(R1,R2). 小文字の場合は大文字に変換して(_文字コード,_変換されたコード) :- 小文字の場合は(_文字コード), 大文字に変換して(_文字コード,_変換されたコード). 小文字の場合は大文字に変換して(_文字コード,_文字コード) :- 小文字でない場合は変換せずに(_文字コード). 小文字の場合は(_文字コード) :- between(97,121,_文字コード). 大文字に変換して(_文字コード,_変換されたコード) :- _大文字コード is _文字コード - 32. 小文字でない場合は変換せずに(_文字コード) :- \+(小文字の場合は(_文字コード)). 表示する(_大文字に変換された文字コードならび) :- atom_codes(_文字列,_大文字に変換された文字コードならび), writef('%w\n',[_文字列]). % 以下のサイトは # 出典 :: Yahoo 知恵袋 pata0103さんの質問 # - - - # 1 2 - # 1 - 3 # このようなテキストファイルを読み取って # int a[3][3]という配列に # 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する # といったことをするにはどのようにコードを書けばいいのでしょう? # 簡単なことで申し訳ありませんがよろしくお願いします。 # '- - - 1 2 - 1 - 3 このようなテキストファイルを読み取って int a[3][3]という配列に 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(_ファイル,_a) :- テキストファイルを読み取って(_ファイル,_Lines), 'int a[3][3]という配列に 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(Lines,_a). このようなテキストファイルを読み取って(_ファイル,Lines) :- get_lines(_ファイル,Lines). 'int a[3][3]という配列に 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(Lines,_a) :- findall(L,( 読み取った行をならびに変換し(Line,L1), 'ならびの各要素に、座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(L1,L)),_a). 読み取った行をならびに変換し(Line,L1) :- member(Line,Lines), split(Line,[' '],L1). 'ならびの各要素に、座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(L1,L) :- findall(B,( member(A,L1), '”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(A,B)),L). '”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(-,-1) :- !. '”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(_数字,_数字). get_line(Line) :- read_line_to_codes(user_input,Codes), atom_codes(Line,Codes). get_lines([]) :- at_end_of_stream(user_input),!. get_lines([Line|R]) :- get_line(Line), get_lines(R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/576 # 西暦何年かを入力するとその年に月曜日が何回あるか数え # 52回なら1を、53回なら0を出力するプログラムお願いします… # # 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします # (0を入力したら終わりです) # # 入力できるのは1989〜5000です # # '西暦何年かを入力するとその年に月曜日が何回あるか数え 52回なら1を、53回なら0を出力するプログラムお願いします… 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします (0を入力したら終わりです) 入力できるのは1989〜5000です' :- '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_西暦ならび). '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび) :- findall(_西暦,( '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('西暦(1989~5000)を入力して下さい',_西暦), ( _西暦=0,!,fail;true)),_西暦ならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([]). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([_西暦|_残りならび]) :- 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_1または0), 出力する(_西暦,_1または0), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_残りならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- 'その年に月曜日が何回あるか数え'(_西暦,_月曜日の回数), '52回なら1を、53回なら0を'(_月曜日の回数,_0または1). 'その年に月曜日が何回あるか数え'(_西暦,_月曜日の回数) :- findall(1,( 日付と曜日の生成(_西暦,1,1,_年,_月,_日,月曜), ( \+(_年 = _西暦),!,fail;true)),L), length(L,_月曜日の回数). '52回なら1を、53回なら0を'(52,1). '52回なら1を、53回なら0を'(53,0). 出力する(_西暦,_1または0) :- writef('%t年 %t\n',[_西暦,_1または0]). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- writef('%t ',[_催促文]), get_line(_入力行), '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦). '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('0',0) :- !. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦) :- read_term_from_atom(_入力行,_西暦,[]), integer(_西暦), between(1889,5000,_西暦),!. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_) :- writef('入力された文字列"%t"から1899年から5000年範囲の西暦が得られませんでした\n再入力をお願いします\n',[_入力行]), fail. get_line(Line) :- read_line_to_codes(user_input,Codes), atom_codes(Line,Codes). '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). '日付と曜日の生成'(_起点年月日文字列,_年月日文字列,_曜日) :- 年月日文字列から整数年月日を得る(_起点年月日文字列,_起点年,_起点月,_起点日), '日付と曜日の生成'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日), 整数から文字列(4,_年,_年文字列), 整数から文字列(2,_月,_月文字列), 整数から文字列(2,_日,_日文字列), atomic_list_concat([_年文字列,_月文字列,_日文字列],_年月日文字列). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- _翌日の月 is _月 + 1, '十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月),!. '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは '日付と曜日の生成'(_年_1,_月_1,_日_1,_起点日からの日数,_年,_月,_日,_曜日) :- '日付と曜日の生成'(_年_1,_月_1,_日_1,0,_起点日からの日数,_年,_月,_日,_曜日). '日付と曜日の生成'(_年,_月,_日,_日数,_日数,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_起点日からの日数_1,_起点日からの日数,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), succ(_起点日からの日数_1,_起点日からの日数_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_起点日からの日数_2,_起点日からの日数,_年,_月,_日,_曜日). '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). '日付と曜日の生成'(_起点年月日文字列,_年月日文字列,_曜日) :- 年月日文字列から整数年月日を得る(_起点年月日文字列,_起点年,_起点月,_起点日), '日付と曜日の生成'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日), 整数から文字列(4,_年,_年文字列), 整数から文字列(2,_月,_月文字列), 整数から文字列(2,_日,_日文字列), atomic_list_concat([_年文字列,_月文字列,_日文字列],_年月日文字列). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- _翌日の月 is _月 + 1, '十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月),!. '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). 整数から文字列(_文字列桁,_整数,_定数) :- '整数・文字番号変換'(_整数,_文字番号ならび), ならびの長さ(_文字番号ならび,_ならびの長さ), _不足桁 is _文字列桁 - _ならびの長さ, 頭部に零を詰める(_不足桁,_文字番号ならび,_整形された文字番号ならび), '定数・文字番号変換'(_定数,_整形された文字番号ならび),!. 年月日文字列から整数年月日を得る(_年月日文字列,_年,_月,_日) :- sub_atom(_年月日文字列,0,4,4,_年文字列), sub_atom(_年月日文字列,2,2,2,_月文字列), sub_atom(_年月日文字列,4,2,0,_日文字列), 文字列ならびから整数ならびを得る([_年文字列,_月文字列,_日文字列],[_年,_月,_日]). 文字列ならびから整数ならびを得る([],[]). 文字列ならびから整数ならびを得る([_文字列|R1],[_整数|R2]) :- get_term_from_atom(_文字列,_整数,[]), 文字列ならびから整数ならびを得る(R1,R2). ならびの長さ(_ならび,_ならびの長さ) :- length(_ならび,_ならびの長さ). '整数・文字番号変換'(_整数,_文字番号ならび) :- number_codes(_整数,_文字番号ならび). 頭部に零を詰める(0,_文字ならび,_文字ならび) :- !. 頭部に零を詰める(_桁,[_|_未決定ならび],_文字ならび) :- _桁 < 0,!, _残り桁 is _桁 + 1, 頭部に零を詰める(_残り桁,_未決定ならび,_文字ならび). 頭部に零を詰める(_桁,_文字ならび,[48|_未決定ならび]) :- _残り桁 is _桁 - 1, 頭部に零を詰める(_残り桁,_文字ならび,_未決定ならび). '定数・文字番号変換'(_定数,_文字番号ならび) :- atom_codes(_定数,_文字番号ならび). % 以下のサイトは # 問題文 # (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). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/745 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 1)変数名 kokugo,shakai,rika を整数型で宣言する。(国語、社会、理科) # 変数名 goukei,heikinを整数型で宣言する。(合計、平均) # 2)「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。 # 3)3科目の合計を求める。 # 4)enumを使うこと # '「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。' :- forall(科目の点数を入力する(_科目,_点数),assertz(成績(_科目,_点数))). 科目の点数を入力する(_科目,_点数) :- 科目と催促文を得る(_科目,_催促文), 整数を得る(_催促文,integer(_点数),_点数). 科目と催促文を得る(_科目,_催促文) :- member(_科目,[国語,社会,理科]), swritef(_催促文,'%tの点数=',[_科目]). '3科目の合計を求める。'(_合計) :- findsum(_点数,成績(_,_点数),_合計). '3科目の平均を求める。'(_平均) :- findavg(_点数,成績(_,_点数),_平均). findsum(A,_目標,_合計) :- findall(A,_目標,_解ならび), sum_list(_解ならび,_合計). findavg(A,_目標,_相和平均) :- findall(A,_目標,_解ならび), 相和平均(_解ならび,_相和平均). 相和平均([_標本|R],_相和平均) :- length([_標本|R],_標本数), sum_list([_標本|R],_合計), _相和平均 is _合計 / _標本数. 整数を得る(_催促文,_条件,_整数) :- write(_催促文), 行を得る(_行), 整数入力検査(_行,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 行を得る(_行) :- read_line_to_codes(user_input,_codes), atom_codes(_行,_codes). 整数入力検査(_行,_条件,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査と条件検査(_行,_整数,_条件). 整数検査と条件検査(_行,_整数,_条件) :- 整数検査(_行,_整数), 条件検査(_行,_条件). 整数検査(_行,_整数) :- integer(_整数),!. 整数検査(_整数) :- writef('入力された行 %w から整数は得られません。\n',[_行]), fail. 条件検査(_行,_条件) :- call(_条件),!. 条件検査(_行,_条件) :- writef('入力された行 %w からは、条件 %w が真になりません。\n',[_行,_条件]), fail. % 以下のサイトは # 出典: C/C++の宿題片付けます 167代目 #698 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # ?以下のプログラムを作成しなさい. # 5件の数字を入力し、上位3位までの # 数字を順に表示する # (数字の大きい順) # # 実行例) # 22 入力1 # 30 入力2 # 10 入力3 # 40 入力4 # 2 入力5 # 40 30 22 出力 # 123 入力1 # 25 入力2 # 294 入力3 # -100 入力4 # 80 入力5 # 294 123 80 出力 # -20 入力1 # -25 入力2 # -394 入力3 # -50 入力4 # -80 入力5 # -20 -25 -50 出力 # [3] 環境 . #  [3.1] Windows 8.1 #  [3.2] Visual studio 2013 #  [3.3] C # [4] 期限:2014年7月14日0:00 '5件の数字を入力し、上位3位までの 数字を順に表示する (数字の大きい順)' :- '5件の数字を入力し、'(_5件の数字ならび), '上位3位までの数字を順に表示する(数字の大きい順)'(_5件の数字ならび). '5件の数字を入力し、'(_5件の数字ならび) :- findall(_数字,( 数字の入力(_数字)),_5件の数字ならび). 数字の入力(_数字) :- '_件目の入力を促す', 数字入力(_行,_数字). '_件目の入力を促す' :- append(L1,[_件目|R],[1,2,3,4,5]), length([_件目|R],_残り件数), writef('%w件目(残り%w件) の数字を入力して下さい : ',[_件目,_残り件数]). 数字入力(_行,_数字) :- 行入力し数字を得る(_行,_数字),!. 数字入力(_行,_数字) :- 数字入力(_行,_数字). 行入力し数字を得る(_行,_数字) :- 行入力(_行), 数字検査(_行,_数字). 行入力(_行) :- read_line_to_codes(user_input,_codes), atom_codes(_行,_codes). 数字検査(_行,_数字) :- 行を解析し数字を得る(_行,_数字),!. 数字検査(_行,_) :- 再入力を要請する(_行). 行を解析し数字を得る(_行,_数字) :- atom_number(_行,_数字). 再入力を要請する(_行) :- writef('入力された文字列 %w は数字ではありません。再入力をお願いします。\n',[_行]), fail. '上位3位までの数字を順に表示する(数字の大きい順)'(_5件の数字ならび) :- '上位3位までの数字を順に(数字の大きい順)'(_5件の数字ならび,[],_上位3位までの数字ならび), 表示する(_上位3位までの数字ならび). '上位3位までの数字を順に(数字の大きい順)'([],[_1,_2,_3|_],[_1,_2,_3]). '上位3位までの数字を順に(数字の大きい順)'([M|R1],L1,_上位3位までの数字ならび) :- 挿入する(M,L1,L2), '上位3位までの数字を順に(数字の大きい順)'(R1,L2,_上位3位までの数字ならび). 挿入する(M,L1,L2) :- 'L1が[]であるかL1の先頭要素よりMが大きい時停止する'(M,L1,L2). 挿入する(M,L1,L2) :- 挿入するべき位置を捜す(M,L1,L2). 'L1が[]であるかL1の先頭要素よりMが大きい時停止する'(M,[],[M]). 'L1が[]であるかL1の先頭要素よりMが大きい時停止する'(M,[N|R],[M,N|R]) :- M >= N,!. 挿入するべき位置を捜す(M,[N|R2],[N|R3]) :- M < N, 挿入する(M,R2,R3). 表示する(_上位3位までの数字ならび) :- writef('%w %w %w\n',_上位3位までの数字ならび). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 167代目 #309 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&amp;リンク):入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返すプログラム。 # [3] 環境 #  [3.1] OS:Windows #  [3.2] コンパイラ名とバージョン:Visual C++ 2010 #  [3.3] 言語:C++ # [4] 期限:4月18日 '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す' :- '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(0). '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和) :- 入力した奇数の和が20を超えるまで(_入力した奇数の和),!. '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和_1) :- '入力した数が奇数の場合表示する。奇数でない場合はなにもしない。'(_入力した奇数の和_1). 入力した奇数の和が20を超えるまで(_入力した奇数の和) :- _入力した奇数の和 > 20. '入力した数が奇数の場合表示する。奇数でない場合はなにもしない。'(_入力した奇数の和_1) :- '入力した数が奇数の場合表示する。'(_入力した奇数の和_1). '入力した数が奇数の場合表示する。奇数でない場合はなにもしない。'(_入力した奇数の和_1) :- '奇数でない場合はなにもしない。'(_入力した奇数の和_1). '入力した数が奇数の場合表示する。'(_入力した奇数の和_1) :- '入力した数が奇数の場合'(_入力した数), 表示する(_入力した数), _入力した奇数の和_2 is _入力した数 + _入力した奇数の和_1, '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和_2). '入力した数が奇数の場合'(_入力した数) :- 入力した数が(_入力した数), 奇数の場合(_入力した数). '奇数でない場合はなにもしない。'(_入力した奇数の和) :- '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和). 入力した数が(_入力した数) :- 整数を得る('整数を入力して下さい: ',true,_入力した数),!. 奇数の場合(_入力した数) :- 1 is _入力した数 mod 2. 表示する(_入力した数) :- writef('%w\n',[_入力した数]). 整数を得る(_催促文,_条件,_整数) :- write(_催促文), 行を得る(_行), 整数入力検査(_行,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 行を得る(_行) :- read_line_to_codes(user_input,_codes), atom_codes(_行,_codes). 整数入力検査(_行,_条件,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査と条件検査(_行,_整数,_条件). 整数検査と条件検査(_行,_整数,_条件) :- 整数検査(_行,_整数), 条件検査(_行,_条件). 整数検査(_行,_整数) :- integer(_整数),!. 整数検査(_整数) :- writef('入力された行 %w から整数は得られません。\n',[_行]), fail. 条件検査(_行,_条件) :- call(_条件),!. 条件検査(_行,_条件) :- writef('入力された行 %w からは、条件 %w が真になりません。\n',[_行,_条件]), fail. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/854 # ●Regular Expressionの使用環境 # Becky! Internet Mail Ver.2 # # ●検索か置換か? # 検索 # # ●説明 # +0900を含まないものを検索したい # # ●対象データ # +0900 # +0500 # +0630 # # ●希望する結果 # +0500 # +0630 # # よろしくお願いします。 # # '+0900を含まないものを検索したい'(_文字列) :- 行ならび入力(_行ならび), '+0900を含まないものを検索したい'(_行ならび,_文字列). '+0900を含まないものを検索したい'(_行ならび,_文字列) :- member(_文字列,_行ならび), '+0900を含まないものを'(_文字列). '+0900を含まないものを'(_文字列) :- \+(sub_atom(_文字列,_,_,_,'+0900')). 行ならび入力([]) :- at_end_of_stream(user_input),!. 行ならび入力(_行ならび) :- 行を入力して行く(_行ならび) :- 行を入力して行く([_行|_残り行ならび]) :- 行入力(_行), 行ならび入力(_残り行ならび). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/505 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): #  キーボードから正負の整数をデタラメに入力し、整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ # 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数の和,_5つの正の整数の平均) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'([],_5つの正の整数ならび), 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均). 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび,_正の整数ならび) :- 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび),!. 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび). 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび) :- length(_正の整数ならび,5). 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数), '正の整数のみを配列に格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2), 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_2,_正の整数ならび). 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 行入力(_行), '診断 :: 整数'(_行,_整数),!. 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数). '診断 :: 整数'(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). '正の整数のみを配列に格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2) :- _整数 >= 0, append(_正の整数ならび_1,[_整数],_正の整数ならび_2). '正の整数のみを配列に格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_1) :- _整数 < 0. 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均) :- sum_list(_5つの正の整数ならび,_5つの正の整数の和), _5つの正の整数の平均 is floor((_5つの正の整数の和 / 5) * 10 + 0.5) / 10. 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 166代目 #59 # 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 10000秒を入力して、2時間46分40秒と表示させるにはどうすればよいですか? '10000秒を入力して、2時間46分40秒と表示させるにはどうすればよいですか?' :- '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。 秒を入力して、時間、分、秒を表示させる'. '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。 秒を入力して、時間、分、秒を表示させる' :- '秒を入力して、'(_入力した秒), '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。 時間、分、秒を表示させる'(_入力した秒). '秒を入力して、'(_入力した秒) :- '秒は正の整数である。正の整数を得る'(_入力した秒). '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。 時間、分、秒を表示させる'(_入力した秒) :- '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。 時間、分、秒を'(_入力した秒,_時間,_分,_秒), 表示させる(_入力した秒,_時間,_分,_秒). '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。 時間、分、秒を'(_入力した秒,_時間,_分,_秒) :- '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。'(_入力した秒,_時間,_分,_秒). '時間は_入力した秒を3600で割った商、分は3600で割った剰余を60で割った商、秒はその剰余である。'(_入力した秒,_時間,_分,_秒) :- '時間は_入力した秒を3600で割った商、'(_入力した秒,_時間), '分は3600で割った剰余を60で割った商、 秒はその剰余である。'(_入力した秒,_分,_秒). '時間は_入力した秒を3600で割った商、'(_入力した秒,_時間) :- _時間 is _入力した秒 // 3600. '分は3600で割った剰余を60で割った商、 秒はその剰余である。'(_入力した秒,_分,_秒) :- '分は_入力した秒を3600で割った剰余をさらに60で割った商、'(_入力した秒,_分), '秒は_入力した秒を3600で割った剰余をさらに60で割った剰余である。'(_入力した秒,_秒). '分は_入力した秒を3600で割った剰余をさらに60で割った商、'(_入力した秒,_分) :- _3600秒で割った余り is _入力した秒 mod 3600, _分 is _3600秒で割った余り // 60. '秒は_入力した秒を3600で割った剰余をさらに60で割った剰余である。'(_入力した秒,_秒) :- _3600秒で割った余り is _入力した秒 mod 3600, _秒 is _3600秒で割った余り mod 60. 表示させる(_入力した秒,_時間,_分,_秒) :- writef('入力した %w秒は %w時間%w分%w秒になります。\n',[_入力した秒,_時間,_分,_秒]). '秒は正の整数である。正の整数を得る'(_整数) :- write('秒(正の整数)を入力して下さい :: '), 行入力(_文字列), 正の整数入力検査(_文字列,_整数),!. '秒は正の整数である。正の整数を得る'(_整数) :- write('再入力をお願いします。\n'), '秒は正の整数である。正の整数を得る'(_整数). 行入力(_文字列) :- read_line_to_codes(current_input,Codes), atom_codes(_文字列,Codes). 正の整数入力検査(_文字列,_整数) :- 文字列は数値であり(_文字列,_整数),!, 正の整数(_整数). 文字列は数値であり(_文字列,_整数) :- atom_number(_文字列,_整数),!. 文字列は数値であり(_文字列,_整数) :- writef('入力された%wから数値が得られません。',[_文字列]), fail. 正の整数(_整数) :- 整数(_整数),!, 正の(_整数). 整数(_整数) :- integer(_整数),!. 整数(_整数) :- write('入力された数%wは整数ではありません。',[_整数]), fail. 正の(_整数) :- _整数 >= 0,!. 正の(_整数) :- writef('入力された整数%wは負数でした。',[_整数]), fail. % 以下のサイトは # お題:表計算ソフトで使われる列名 A,B,C,...,Z,AA,AB,AC,...,AZ,BA,BB,BC,... # をAを1番目とした番号に変換せよ '表計算ソフトで使われる列名 A,B,C,...,Z,AA,AB,AC,...,AZ,BA,BB,BC,...をAを1番目とした番号に変換せよ'(_列名,_番号) :- atom_codes(_列名,_文字コードならび), 順序番号に変換する(_文字コードならび,_番号). 順序番号に変換する([],0). 順序番号に変換する([_文字番号|_残りならび],_番号) :- length(_残りならび,_乗), 順序番号に変換する(_残りならび,_番号_1), _番号 is (_文字番号 - 64) * (26 ^ _乗) + _番号_1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/91 # # Youtubeみたいなランダムでユニークなn文字数の文字列を作る方法を教えてください 'Youtubeみたいなランダムでユニークなn文字数の文字列を作る'(_n,_文字列) :- 'ランダムでユニークなn文字数の文字コードならびを作る'(_n,[],Chars), atom_codes(_文字列,Code). 'ランダムでユニークなn文字数の文字コードならびを作る'(0,L,L). 'ランダムでユニークなn文字数の文字コードならびを作る'(M,L1,L) :- ユニークな文字コードを選択する(L1,Code), M_1 is M - 1, 'ランダムでユニークなn文字数の文字コードならびを作る'(M_1,[Code|L1],L). ユニークな文字を選択する(L,Code) :- Code is random(75) + 48, アルファベットの範囲(Code), \+(member(Code,L)),!. ユニークな文字を選択する(L,Code) :- ユニークな文字を選択する(L,Code). アルファベットの範囲(Code) :- between(48,57,Code). アルファベットの範囲(Code) :- between(65,90,Code). アルファベットの範囲(Code) :- between(97,122,Code). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/91 # # Youtubeみたいなランダムでユニークなn文字数の文字列を作る方法を教えてください 'Youtubeみたいなランダムでユニークなn文字数の文字列を作る'(_n,_文字列) :- 'ランダムでユニークなn文字数の文字コードならびを作る'(_n,[],Chars), atom_codes(_文字列,Code). 'ランダムでユニークなn文字数の文字コードならびを作る'(0,L,L). 'ランダムでユニークなn文字数の文字コードならびを作る'(M,L1,L) :- ユニークな文字コードを選択する(L1,Code), M_1 is M - 1, 'ランダムでユニークなn文字数の文字コードならびを作る'(M_1,[Code|L1],L). ユニークな文字を選択する(L,Code) :- Code is random(75) + 48, アルファベットの範囲(Code), \+(member(Code,L)),!. ユニークな文字を選択する(L,Code) :- ユニークな文字を選択する(L,Code). アルファベットの範囲(Code) :- between(48,57,Code). アルファベットの範囲(Code) :- between(65,90,Code). アルファベットの範囲(Code) :- between(97,122,Code). % 以下のサイトは # 出典 :: 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/496 # # [1] C言語プログラミング2 # [2] 問題1・入力した文字列から文字を一文字ずつ交互に読み取り、文字列1、文字列2として結果を出力するプログラムを作成せよ。 # 問題2・また、文字列1、文字列2を入力し、それぞれから一文字ずつ交互に読み取った結果を文字列として出力するプログラムを作成せよ。 # 条件1・500文字前後の文字列を扱えるようにせよ。 # 条件2・問題1の文字列が奇数の場合は文字列1の側に奇数で余った一文字を入れること。(問題2の文字列1が一文字多い場合読み取りを忘れないように) # 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。 # 問題1・例 # 文字列・abcdefghijklm # ↓ # 文字列1・acegikm # 文字列2・bdfhjl # # 問題2・例 # 文字列1・acegikm # 文字列2・bdfhjl # ↓ # 文字列・abcdefghijklm # '入力した文字列から文字を一文字ずつ交互に読み取り、文字列1、文字列2として結果を出力するプログラムを作成せよ。 条件1・500文字前後の文字列を扱えるようにせよ。 条件2・問題1の文字列が奇数の場合は文字列1の側に奇数で余った一文字を入れること。(問題2の文字列1が一文字多い場合読み取りを忘れないように) 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。 問題1・例 文字列・abcdefghijklm ↓ 文字列1・acegikm 文字列2・bdfhjl' :- '入力した文字列から'(_入力した文字列), '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'(_入力した文字列,_文字列1,_文字列2), 結果を出力する(_入力した文字列,_文字列1,_文字列_2). 入力した文字列から(_入力した文字列) :- write('文字列を入力してください : '), get_line(_入力した文字列). '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'('','',''). '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'(_文字列,_文字列1,_文字列2) :- sub_atom(_文字列,0,1,R,_文字), sub_atom(_文字列,1,R,0,_文字列3), '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'(_文字列3,_文字列2,_文字列4), atom_concat(_文字,_文字列4,_文字列1). get_line(_文字列) :- read_line_to_codes(user_input,Codes), atom_codes(_文字列,Codes). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/439 # # [1] プログラム演習 # [2] 入力した文字列をASCIIコードに応じた2進数に変換するプログラムを作成せよ。 # (注釈:百文字程度の変換を行えるようにすること) # 例:abc→011000010110001001100011 # また、2進数から文字列に戻す変換を行うプログラムも作成せよ。 # 例:011000010110001001100011→abc # '入力した文字列をASCIIコードに応じた2進数に変換する' :- 入力した文字列を(_入力したASCIIコードならび), 'ASCIIコードならび2進数ビットならび変換'(_入力したASCIIコードならび,_2進数ビットならび), atomic_list_concat(_2進数ビットならび,_2進数列), writef('%t\n',[_2進数列]). '2進数から文字列に戻す変換'(_2進数ビットならび,_ASCIIコードならび) :- 入力した2進数列(_入力した2進数列), 入力したASCIIコードを2進数ビットならびに変換(_入力したASCIIコードならび,_2進数ビットならび), 'ASCIIコードならび2進数ビットならび変換'(_ASCIIコードならび,_2進数ビットならび), atom_codes(_ASCII文字列,_ASCIIコードならび), writef('%t\n',[_ASCII文字列]). 入力した文字列を(_入力したASCIIコードならび) :- read_line_to_codes(user_input,_入力したASCIIコードならび). 入力した2進数列(_入力した2進数列) :- read_line_to_codes(user_input,_入力した2進数列). 'ASCIIコードならび2進数ビットならび変換'([],[]). 'ASCIIコードならび2進数ビットならび変換'([_文字コード|R1],[_b1,_b2,_b3,_b4,_b5,_b6,_b7,_b8|R2]) :- 'ASCIIコード2進数表'(_ASCIIコード,[_b1,_b2,_b3,_b4,_b5,_b6,_b7,_b8]), 'ASCIIコードならび2進数ビットならび変換'(R1,R2). 'ASCIIコード2進数'(0,[0,0,0,0,0,0,0,0]). 'ASCIIコード2進数'(1,[0,0,0,0,0,0,0,1]). 'ASCIIコード2進数'(2,[0,0,0,0,0,0,1,0]). 'ASCIIコード2進数'(3,[0,0,0,0,0,0,1,1]). 'ASCIIコード2進数'(4,[0,0,0,0,0,1,0,0]). 'ASCIIコード2進数'(5,[0,0,0,0,0,1,0,1]). 'ASCIIコード2進数'(6,[0,0,0,0,0,1,1,0]). 'ASCIIコード2進数'(7,[0,0,0,0,0,1,1,1]). 'ASCIIコード2進数'(8,[0,0,0,0,1,0,0,0]). 'ASCIIコード2進数'(9,[0,0,0,0,1,0,0,1]). 'ASCIIコード2進数'(10,[0,0,0,0,1,0,1,0]). 'ASCIIコード2進数'(11,[0,0,0,0,1,0,1,1]). 'ASCIIコード2進数'(12,[0,0,0,0,1,1,0,0]). 'ASCIIコード2進数'(13,[0,0,0,0,1,1,0,1]). 'ASCIIコード2進数'(14,[0,0,0,0,1,1,1,0]). 'ASCIIコード2進数'(15,[0,0,0,0,1,1,1,1]). 'ASCIIコード2進数'(16,[0,0,0,1,0,0,0,0]). 'ASCIIコード2進数'(17,[0,0,0,1,0,0,0,1]). 'ASCIIコード2進数'(18,[0,0,0,1,0,0,1,0]). 'ASCIIコード2進数'(19,[0,0,0,1,0,0,1,1]). 'ASCIIコード2進数'(20,[0,0,0,1,0,1,0,0]). 'ASCIIコード2進数'(21,[0,0,0,1,0,1,0,1]). 'ASCIIコード2進数'(22,[0,0,0,1,0,1,1,0]). 'ASCIIコード2進数'(23,[0,0,0,1,0,1,1,1]). 'ASCIIコード2進数'(24,[0,0,0,1,1,0,0,0]). 'ASCIIコード2進数'(25,[0,0,0,1,1,0,0,1]). 'ASCIIコード2進数'(26,[0,0,0,1,1,0,1,0]). 'ASCIIコード2進数'(27,[0,0,0,1,1,0,1,1]). 'ASCIIコード2進数'(28,[0,0,0,1,1,1,0,0]). 'ASCIIコード2進数'(29,[0,0,0,1,1,1,0,1]). 'ASCIIコード2進数'(30,[0,0,0,1,1,1,1,0]). 'ASCIIコード2進数'(31,[0,0,0,1,1,1,1,1]). 'ASCIIコード2進数'(32,[0,0,1,0,0,0,0,0]). 'ASCIIコード2進数'(33,[0,0,1,0,0,0,0,1]). 'ASCIIコード2進数'(34,[0,0,1,0,0,0,1,0]). 'ASCIIコード2進数'(35,[0,0,1,0,0,0,1,1]). 'ASCIIコード2進数'(36,[0,0,1,0,0,1,0,0]). 'ASCIIコード2進数'(37,[0,0,1,0,0,1,0,1]). 'ASCIIコード2進数'(38,[0,0,1,0,0,1,1,0]). 'ASCIIコード2進数'(39,[0,0,1,0,0,1,1,1]). 'ASCIIコード2進数'(40,[0,0,1,0,1,0,0,0]). 'ASCIIコード2進数'(41,[0,0,1,0,1,0,0,1]). 'ASCIIコード2進数'(42,[0,0,1,0,1,0,1,0]). 'ASCIIコード2進数'(43,[0,0,1,0,1,0,1,1]). 'ASCIIコード2進数'(44,[0,0,1,0,1,1,0,0]). 'ASCIIコード2進数'(45,[0,0,1,0,1,1,0,1]). 'ASCIIコード2進数'(46,[0,0,1,0,1,1,1,0]). 'ASCIIコード2進数'(47,[0,0,1,0,1,1,1,1]). 'ASCIIコード2進数'(48,[0,0,1,1,0,0,0,0]). 'ASCIIコード2進数'(49,[0,0,1,1,0,0,0,1]). 'ASCIIコード2進数'(50,[0,0,1,1,0,0,1,0]). 'ASCIIコード2進数'(51,[0,0,1,1,0,0,1,1]). 'ASCIIコード2進数'(52,[0,0,1,1,0,1,0,0]). 'ASCIIコード2進数'(53,[0,0,1,1,0,1,0,1]). 'ASCIIコード2進数'(54,[0,0,1,1,0,1,1,0]). 'ASCIIコード2進数'(55,[0,0,1,1,0,1,1,1]). 'ASCIIコード2進数'(56,[0,0,1,1,1,0,0,0]). 'ASCIIコード2進数'(57,[0,0,1,1,1,0,0,1]). 'ASCIIコード2進数'(58,[0,0,1,1,1,0,1,0]). 'ASCIIコード2進数'(59,[0,0,1,1,1,0,1,1]). 'ASCIIコード2進数'(60,[0,0,1,1,1,1,0,0]). 'ASCIIコード2進数'(61,[0,0,1,1,1,1,0,1]). 'ASCIIコード2進数'(62,[0,0,1,1,1,1,1,0]). 'ASCIIコード2進数'(63,[0,0,1,1,1,1,1,1]). 'ASCIIコード2進数'(64,[0,1,0,0,0,0,0,0]). 'ASCIIコード2進数'(65,[0,1,0,0,0,0,0,1]). 'ASCIIコード2進数'(66,[0,1,0,0,0,0,1,0]). 'ASCIIコード2進数'(67,[0,1,0,0,0,0,1,1]). 'ASCIIコード2進数'(68,[0,1,0,0,0,1,0,0]). 'ASCIIコード2進数'(69,[0,1,0,0,0,1,0,1]). 'ASCIIコード2進数'(70,[0,1,0,0,0,1,1,0]). 'ASCIIコード2進数'(71,[0,1,0,0,0,1,1,1]). 'ASCIIコード2進数'(72,[0,1,0,0,1,0,0,0]). 'ASCIIコード2進数'(73,[0,1,0,0,1,0,0,1]). 'ASCIIコード2進数'(74,[0,1,0,0,1,0,1,0]). 'ASCIIコード2進数'(75,[0,1,0,0,1,0,1,1]). 'ASCIIコード2進数'(76,[0,1,0,0,1,1,0,0]). 'ASCIIコード2進数'(77,[0,1,0,0,1,1,0,1]). 'ASCIIコード2進数'(78,[0,1,0,0,1,1,1,0]). 'ASCIIコード2進数'(79,[0,1,0,0,1,1,1,1]). 'ASCIIコード2進数'(80,[0,1,0,1,0,0,0,0]). 'ASCIIコード2進数'(81,[0,1,0,1,0,0,0,1]). 'ASCIIコード2進数'(82,[0,1,0,1,0,0,1,0]). 'ASCIIコード2進数'(83,[0,1,0,1,0,0,1,1]). 'ASCIIコード2進数'(84,[0,1,0,1,0,1,0,0]). 'ASCIIコード2進数'(85,[0,1,0,1,0,1,0,1]). 'ASCIIコード2進数'(86,[0,1,0,1,0,1,1,0]). 'ASCIIコード2進数'(87,[0,1,0,1,0,1,1,1]). 'ASCIIコード2進数'(88,[0,1,0,1,1,0,0,0]). 'ASCIIコード2進数'(89,[0,1,0,1,1,0,0,1]). 'ASCIIコード2進数'(90,[0,1,0,1,1,0,1,0]). 'ASCIIコード2進数'(91,[0,1,0,1,1,0,1,1]). 'ASCIIコード2進数'(92,[0,1,0,1,1,1,0,0]). 'ASCIIコード2進数'(93,[0,1,0,1,1,1,0,1]). 'ASCIIコード2進数'(94,[0,1,0,1,1,1,1,0]). 'ASCIIコード2進数'(95,[0,1,0,1,1,1,1,1]). 'ASCIIコード2進数'(96,[0,1,1,0,0,0,0,0]). 'ASCIIコード2進数'(97,[0,1,1,0,0,0,0,1]). 'ASCIIコード2進数'(98,[0,1,1,0,0,0,1,0]). 'ASCIIコード2進数'(99,[0,1,1,0,0,0,1,1]). 'ASCIIコード2進数'(100,[0,1,1,0,0,1,0,0]). 'ASCIIコード2進数'(101,[0,1,1,0,0,1,0,1]). 'ASCIIコード2進数'(102,[0,1,1,0,0,1,1,0]). 'ASCIIコード2進数'(103,[0,1,1,0,0,1,1,1]). 'ASCIIコード2進数'(104,[0,1,1,0,1,0,0,0]). 'ASCIIコード2進数'(105,[0,1,1,0,1,0,0,1]). 'ASCIIコード2進数'(106,[0,1,1,0,1,0,1,0]). 'ASCIIコード2進数'(107,[0,1,1,0,1,0,1,1]). 'ASCIIコード2進数'(108,[0,1,1,0,1,1,0,0]). 'ASCIIコード2進数'(109,[0,1,1,0,1,1,0,1]). 'ASCIIコード2進数'(110,[0,1,1,0,1,1,1,0]). 'ASCIIコード2進数'(111,[0,1,1,0,1,1,1,1]). 'ASCIIコード2進数'(112,[0,1,1,1,0,0,0,0]). 'ASCIIコード2進数'(113,[0,1,1,1,0,0,0,1]). 'ASCIIコード2進数'(114,[0,1,1,1,0,0,1,0]). 'ASCIIコード2進数'(115,[0,1,1,1,0,0,1,1]). 'ASCIIコード2進数'(116,[0,1,1,1,0,1,0,0]). 'ASCIIコード2進数'(117,[0,1,1,1,0,1,0,1]). 'ASCIIコード2進数'(118,[0,1,1,1,0,1,1,0]). 'ASCIIコード2進数'(119,[0,1,1,1,0,1,1,1]). 'ASCIIコード2進数'(120,[0,1,1,1,1,0,0,0]). 'ASCIIコード2進数'(121,[0,1,1,1,1,0,0,1]). 'ASCIIコード2進数'(122,[0,1,1,1,1,0,1,0]). 'ASCIIコード2進数'(123,[0,1,1,1,1,0,1,1]). 'ASCIIコード2進数'(124,[0,1,1,1,1,1,0,0]). 'ASCIIコード2進数'(125,[0,1,1,1,1,1,0,1]). 'ASCIIコード2進数'(126,[0,1,1,1,1,1,1,0]). 'ASCIIコード2進数'(127,[0,1,1,1,1,1,1,1]). 'ASCIIコード2進数'(128,[1,0,0,0,0,0,0,0]). 'ASCIIコード2進数'(129,[1,0,0,0,0,0,0,1]). 'ASCIIコード2進数'(130,[1,0,0,0,0,0,1,0]). 'ASCIIコード2進数'(131,[1,0,0,0,0,0,1,1]). 'ASCIIコード2進数'(132,[1,0,0,0,0,1,0,0]). 'ASCIIコード2進数'(133,[1,0,0,0,0,1,0,1]). 'ASCIIコード2進数'(134,[1,0,0,0,0,1,1,0]). 'ASCIIコード2進数'(135,[1,0,0,0,0,1,1,1]). 'ASCIIコード2進数'(136,[1,0,0,0,1,0,0,0]). 'ASCIIコード2進数'(137,[1,0,0,0,1,0,0,1]). 'ASCIIコード2進数'(138,[1,0,0,0,1,0,1,0]). 'ASCIIコード2進数'(139,[1,0,0,0,1,0,1,1]). 'ASCIIコード2進数'(140,[1,0,0,0,1,1,0,0]). 'ASCIIコード2進数'(141,[1,0,0,0,1,1,0,1]). 'ASCIIコード2進数'(142,[1,0,0,0,1,1,1,0]). 'ASCIIコード2進数'(143,[1,0,0,0,1,1,1,1]). 'ASCIIコード2進数'(144,[1,0,0,1,0,0,0,0]). 'ASCIIコード2進数'(145,[1,0,0,1,0,0,0,1]). 'ASCIIコード2進数'(146,[1,0,0,1,0,0,1,0]). 'ASCIIコード2進数'(147,[1,0,0,1,0,0,1,1]). 'ASCIIコード2進数'(148,[1,0,0,1,0,1,0,0]). 'ASCIIコード2進数'(149,[1,0,0,1,0,1,0,1]). 'ASCIIコード2進数'(150,[1,0,0,1,0,1,1,0]). 'ASCIIコード2進数'(151,[1,0,0,1,0,1,1,1]). 'ASCIIコード2進数'(152,[1,0,0,1,1,0,0,0]). 'ASCIIコード2進数'(153,[1,0,0,1,1,0,0,1]). 'ASCIIコード2進数'(154,[1,0,0,1,1,0,1,0]). 'ASCIIコード2進数'(155,[1,0,0,1,1,0,1,1]). 'ASCIIコード2進数'(156,[1,0,0,1,1,1,0,0]). 'ASCIIコード2進数'(157,[1,0,0,1,1,1,0,1]). 'ASCIIコード2進数'(158,[1,0,0,1,1,1,1,0]). 'ASCIIコード2進数'(159,[1,0,0,1,1,1,1,1]). 'ASCIIコード2進数'(160,[1,0,1,0,0,0,0,0]). 'ASCIIコード2進数'(161,[1,0,1,0,0,0,0,1]). 'ASCIIコード2進数'(162,[1,0,1,0,0,0,1,0]). 'ASCIIコード2進数'(163,[1,0,1,0,0,0,1,1]). 'ASCIIコード2進数'(164,[1,0,1,0,0,1,0,0]). 'ASCIIコード2進数'(165,[1,0,1,0,0,1,0,1]). 'ASCIIコード2進数'(166,[1,0,1,0,0,1,1,0]). 'ASCIIコード2進数'(167,[1,0,1,0,0,1,1,1]). 'ASCIIコード2進数'(168,[1,0,1,0,1,0,0,0]). 'ASCIIコード2進数'(169,[1,0,1,0,1,0,0,1]). 'ASCIIコード2進数'(170,[1,0,1,0,1,0,1,0]). 'ASCIIコード2進数'(171,[1,0,1,0,1,0,1,1]). 'ASCIIコード2進数'(172,[1,0,1,0,1,1,0,0]). 'ASCIIコード2進数'(173,[1,0,1,0,1,1,0,1]). 'ASCIIコード2進数'(174,[1,0,1,0,1,1,1,0]). 'ASCIIコード2進数'(175,[1,0,1,0,1,1,1,1]). 'ASCIIコード2進数'(176,[1,0,1,1,0,0,0,0]). 'ASCIIコード2進数'(177,[1,0,1,1,0,0,0,1]). 'ASCIIコード2進数'(178,[1,0,1,1,0,0,1,0]). 'ASCIIコード2進数'(179,[1,0,1,1,0,0,1,1]). 'ASCIIコード2進数'(180,[1,0,1,1,0,1,0,0]). 'ASCIIコード2進数'(181,[1,0,1,1,0,1,0,1]). 'ASCIIコード2進数'(182,[1,0,1,1,0,1,1,0]). 'ASCIIコード2進数'(183,[1,0,1,1,0,1,1,1]). 'ASCIIコード2進数'(184,[1,0,1,1,1,0,0,0]). 'ASCIIコード2進数'(185,[1,0,1,1,1,0,0,1]). 'ASCIIコード2進数'(186,[1,0,1,1,1,0,1,0]). 'ASCIIコード2進数'(187,[1,0,1,1,1,0,1,1]). 'ASCIIコード2進数'(188,[1,0,1,1,1,1,0,0]). 'ASCIIコード2進数'(189,[1,0,1,1,1,1,0,1]). 'ASCIIコード2進数'(190,[1,0,1,1,1,1,1,0]). 'ASCIIコード2進数'(191,[1,0,1,1,1,1,1,1]). 'ASCIIコード2進数'(192,[1,1,0,0,0,0,0,0]). 'ASCIIコード2進数'(193,[1,1,0,0,0,0,0,1]). 'ASCIIコード2進数'(194,[1,1,0,0,0,0,1,0]). 'ASCIIコード2進数'(195,[1,1,0,0,0,0,1,1]). 'ASCIIコード2進数'(196,[1,1,0,0,0,1,0,0]). 'ASCIIコード2進数'(197,[1,1,0,0,0,1,0,1]). 'ASCIIコード2進数'(198,[1,1,0,0,0,1,1,0]). 'ASCIIコード2進数'(199,[1,1,0,0,0,1,1,1]). 'ASCIIコード2進数'(200,[1,1,0,0,1,0,0,0]). 'ASCIIコード2進数'(201,[1,1,0,0,1,0,0,1]). 'ASCIIコード2進数'(202,[1,1,0,0,1,0,1,0]). 'ASCIIコード2進数'(203,[1,1,0,0,1,0,1,1]). 'ASCIIコード2進数'(204,[1,1,0,0,1,1,0,0]). 'ASCIIコード2進数'(205,[1,1,0,0,1,1,0,1]). 'ASCIIコード2進数'(206,[1,1,0,0,1,1,1,0]). 'ASCIIコード2進数'(207,[1,1,0,0,1,1,1,1]). 'ASCIIコード2進数'(208,[1,1,0,1,0,0,0,0]). 'ASCIIコード2進数'(209,[1,1,0,1,0,0,0,1]). 'ASCIIコード2進数'(210,[1,1,0,1,0,0,1,0]). 'ASCIIコード2進数'(211,[1,1,0,1,0,0,1,1]). 'ASCIIコード2進数'(212,[1,1,0,1,0,1,0,0]). 'ASCIIコード2進数'(213,[1,1,0,1,0,1,0,1]). 'ASCIIコード2進数'(214,[1,1,0,1,0,1,1,0]). 'ASCIIコード2進数'(215,[1,1,0,1,0,1,1,1]). 'ASCIIコード2進数'(216,[1,1,0,1,1,0,0,0]). 'ASCIIコード2進数'(217,[1,1,0,1,1,0,0,1]). 'ASCIIコード2進数'(218,[1,1,0,1,1,0,1,0]). 'ASCIIコード2進数'(219,[1,1,0,1,1,0,1,1]). 'ASCIIコード2進数'(220,[1,1,0,1,1,1,0,0]). 'ASCIIコード2進数'(221,[1,1,0,1,1,1,0,1]). 'ASCIIコード2進数'(222,[1,1,0,1,1,1,1,0]). 'ASCIIコード2進数'(223,[1,1,0,1,1,1,1,1]). 'ASCIIコード2進数'(224,[1,1,1,0,0,0,0,0]). 'ASCIIコード2進数'(225,[1,1,1,0,0,0,0,1]). 'ASCIIコード2進数'(226,[1,1,1,0,0,0,1,0]). 'ASCIIコード2進数'(227,[1,1,1,0,0,0,1,1]). 'ASCIIコード2進数'(228,[1,1,1,0,0,1,0,0]). 'ASCIIコード2進数'(229,[1,1,1,0,0,1,0,1]). 'ASCIIコード2進数'(230,[1,1,1,0,0,1,1,0]). 'ASCIIコード2進数'(231,[1,1,1,0,0,1,1,1]). 'ASCIIコード2進数'(232,[1,1,1,0,1,0,0,0]). 'ASCIIコード2進数'(233,[1,1,1,0,1,0,0,1]). 'ASCIIコード2進数'(234,[1,1,1,0,1,0,1,0]). 'ASCIIコード2進数'(235,[1,1,1,0,1,0,1,1]). 'ASCIIコード2進数'(236,[1,1,1,0,1,1,0,0]). 'ASCIIコード2進数'(237,[1,1,1,0,1,1,0,1]). 'ASCIIコード2進数'(238,[1,1,1,0,1,1,1,0]). 'ASCIIコード2進数'(239,[1,1,1,0,1,1,1,1]). 'ASCIIコード2進数'(240,[1,1,1,1,0,0,0,0]). 'ASCIIコード2進数'(241,[1,1,1,1,0,0,0,1]). 'ASCIIコード2進数'(242,[1,1,1,1,0,0,1,0]). 'ASCIIコード2進数'(243,[1,1,1,1,0,0,1,1]). 'ASCIIコード2進数'(244,[1,1,1,1,0,1,0,0]). 'ASCIIコード2進数'(245,[1,1,1,1,0,1,0,1]). 'ASCIIコード2進数'(246,[1,1,1,1,0,1,1,0]). 'ASCIIコード2進数'(247,[1,1,1,1,0,1,1,1]). 'ASCIIコード2進数'(248,[1,1,1,1,1,0,0,0]). 'ASCIIコード2進数'(249,[1,1,1,1,1,0,0,1]). 'ASCIIコード2進数'(250,[1,1,1,1,1,0,1,0]). 'ASCIIコード2進数'(251,[1,1,1,1,1,0,1,1]). 'ASCIIコード2進数'(252,[1,1,1,1,1,1,0,0]). 'ASCIIコード2進数'(253,[1,1,1,1,1,1,0,1]). 'ASCIIコード2進数'(254,[1,1,1,1,1,1,1,0]). 'ASCIIコード2進数'(255,[1,1,1,1,1,1,1,1]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/439 # # [1] プログラム演習 # [2] 入力した文字列をASCIIコードに応じた2進数に変換するプログラムを作成せよ。 # (注釈:百文字程度の変換を行えるようにすること) # 例:abc→011000010110001001100011 # また、2進数から文字列に戻す変換を行うプログラムも作成せよ。 # 例:011000010110001001100011→abc # '入力した文字列をASCIIコードに応じた2進数に変換する' :- 入力した文字列を(_入力した文字列), 'ASCIIコードに応じた2進数に変換する'(_入力した文字列,_2進数ならび), flatten(_2進数ならび,_平坦な2進数ならび), atomic_list_concat(_平坦な2進数ならび,_表示文字列), writef('%t\n',[_表示文字列]). 'ASCIIコードに応じた2進数に変換する'(_入力した文字列,_2進数ならび) :- atom_codes(_入力した文字列,Codes), findall(_2進数,( member(_ASCIIコード,Codes), 'ASCIIコードに応じた2進数'(_ASCIIコード,_2進数)), _2進数ならび). 'ASCIIコードに応じた2進数'(_ASCIIコード,_2進数) :- 'ASCIIコードに応じた2進数'(_ASCIIコード,[],_2進数). 'ASCIIコードに応じた2進数'(0,L,L) :- !. 'ASCIIコードに応じた2進数'(N,L1,L) :- N_2 is N // 2, _b is N mod 2, 'ASCIIコードに応じた2進数'(N_2,[_b|L1],L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/392 # # (1)C言語 # (2)問題:キーボードから正の整数を入力するとその桁数を表示するプログラムを作成せよ。 # (3)windows7 visual studio2010 # (4)期限:12月20日 # (5)よろしくお願いします。 # # 'キーボードから正の整数を入力するとその桁数を表示する' :- 'キーボードから正の整数を入力すると'(_正の整数), 'その桁数を表示する'(_正の整数). 'キーボードから正の整数を入力すると'(_正の整数) :- 整数を得る(正の整数,_正の整数 > 0,_正の整数). 'その桁数を表示する'(_正の整数) :- number_chars(_正の整数,Chars), length(Chars,_その桁数), writef('%t桁です\n',[_その桁数]). 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. get_line(Line) :- read_line_to_codes(user_input,Codes), atom_codes(Line,Codes). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/138 # # [1] 授業単元: ファイル読み取り コサイン類似度 # [2] 問題文(含コード&amp;リンク):http://ime.nu/codepad.org/pX1MdXpC #   問題中のsample.txtの例 http://ime.nu/www1.axfc.net/uploader/so/2707638.txt #   問題中のtest.txtの例 http://ime.nu/www1.axfc.net/uploader/so/2707641.txt # # /* # 二つのtxtファイルがある # sample.txtはファイル名と500個の数値の文字列が一行書かれている。 # txtファイルを例として上げる # 例: # # test.txtはsample.txtと同じようなファイル名と500個の数値の文字列を一行とした文字列が # 不特定多数並んでいる。txtファイルを例として上げる。 # 例: # # この2つのtxtファイルを使って次の動作をするプログラムを作れ # # ?sample.txtに書かれている数値を読み取って、配列a[n]に格納する。 # nは数値の番号で0からはじめる。 # # ?test.txtを読み取って、一行ごとに数値を配列b[i][j]に格納する #  iには行数、jには数値の番号を入れる。番号は0からはじめる。 #  余裕があれば、ファイル名を別の配列に格納する # # ?それぞれ格納された配列の数値をつかって繰り返し文を使い # # c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数*sqrt(b[i][j]*b[i][j])をすべて足した数} # # の計算を行う。 # 考え方は下の用になる # # c[0]=(a[0]*b[0][0]+a[1]*b[0][1]+a[2]*b[0][2]+...+a[n]*b[0][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[0][0]*b[0][0]+b[0][1]*b[0][1]+b[0][2]*b[0][2]+...+b[0][j]*b[1][j])); # # c[1]=(a[0]*b[1][0]+a[1]*b[1][1]+a[2]*b[1][2]+...+a[n]*b[1][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[1][0]*b[1][0]+b[1][1]*b[1][1]+b[1][2]*b[1][2]+...+b[1][j]*b[1][j])); # # c[2]=(a[0]*b[2][0]+a[1]*b[2][1]+a[2]*b[2][2]+...+a[n]*b[2][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[2][0]*b[2][0]+b[2][1]*b[2][1]+b[2][2]*b[2][2]+...+b[2][j]*b[2][j])); # # ・ # ・ # ・ # # c[i]=(a[0]*b[i][0]+a[1]*b[i][1]+a[2]*b[i][2]+...+a[n]*b[i][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[i][0]*b[i][0]+b[i][1]*b[i][1]+b[i][2]*b[i][2]+...+b[i][j]*b[i][j])); # # # ?画面にc[i]をすべて表示させる。余裕があれば同時に?で格納したファイル名も出力する # # # /* # '二つのtxtファイルがある sample.txtはファイル名と500個の数値の文字列が一行書かれている。 txtファイルを例として上げる 例: test.txtはsample.txtと同じようなファイル名と500個の数値の文字列を一行とした文字列が 不特定多数並んでいる。txtファイルを例として上げる。 例: この2つのtxtファイルを使って次の動作をするプログラムを作れ 1)sample.txtに書かれている数値を読み取って、配列a[n]に格納する。 nは数値の番号で0からはじめる。 2)test.txtを読み取って、一行ごとに数値を配列b[i][j]に格納する  iには行数、jには数値の番号を入れる。番号は0からはじめる。  余裕があれば、ファイル名を別の配列に格納する 3)それぞれ格納された配列の数値をつかって繰り返し文を使い c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数*sqrt(b[i][j]*b[i][j])をすべて足した数} の計算を行う。'(_c) :- 'sample.txtに書かれている数値を読み取って、_aに格納する'(_a), 'test.txtを読み取って、配列bに格納する'(_b), 'c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数の計算を行う'(_a,_b,_c). 'sample.txtに書かれている数値を読み取って、_aに格納する。'(_a) :- get_numbers('sample.txt',_a). 'test.txtを読み取って、配列bに格納する'(_b) :- 'test.txtを読み取って'(Lines), 配列bに格納する(Lines,_b). 'test.txtを読み取って'(Lines) :- get_lines('test.txt',Lines). 配列bに格納する(Lines,_b) :- findall(L,( member(A,Lines), atom_codes(A,L)), _b). 'c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数の計算を行う'(_a,_b,_c) :- 'sqrt(a[n]*a[n])をすべて足した数'(_a,V), findsum(X,( 'a[n]*b[i][j]をすべて足した数'(_a,_b,W), X is W / (V * sqrt(S_1))), _c). 'sqrt(a[n]*a[n])をすべて足した数'(_a,X) :- findsum(U,( member(A,_a), U is A * A), S_0), X is sqrt(S_1). 'a[n]*b[i][j]をすべて足した数'(_a,_bW) :- member(L,_b), findsum(Y,( nth0(_nth0_1,L,N), nth0(_nth0_1,_a,M), Y is M * N), W). get_numbers(File,Numbers) :- get_lines(File,Lines), findall(Number,( member(Line,Lines), atom_to_number(Line,Number)), Numbers). % 以下のサイトは # [1] プログラミング # [2] 50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求めるプログラムを作成せよ. # # 次のような出力が得られることを確認せよ (表示形式は各自工夫せよ). # o 310円 → 50円×3枚+80円×2枚+120円×0枚 # o 390円 → 50円×3枚+80円×0枚+120円×2枚, 50円×3枚+80円×3枚+120円×0枚 # [3] 環境 #  [3.1] winXP sp2 #  [3.2] cygwin #  [3.3] C # [4] 2006年10月23日23時59分 # [5] 途中までやったんで埋める形でお願いします # 途中までやったぶんは次書きます '50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求めて、これを表示する. ' :- 'キーボードから金額 t を入力し'(_金額t), '50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求める'(_金額t,_切手枚数の組合せならび), 組合せを表示する(_金額t,_切手枚数の組合せならび). '50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求める. '(_金額t,_切手枚数の組合せならび) :- setof([_50円切手の枚数,_80円切手の枚数,_120円切手の枚数], [_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数] ^ 組合せ合計が金額tと一致する(_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数)),_切手枚数の組合せならび). 'キーボードから金額 t を入力し'(_金額t) :- 整数を得る('金額t ',_金額t > 0,_金額t). 組合せ合計が金額tと一致する(_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数) :- 組合せ合計が金額tと一致する(_L,_金額t), 組合せ枚数を数える(L,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数). 組合せ合計が金額tと一致する(_L,_金額t) :- between(1,12,N), 組合せ([50,50,50,50,80,80,80,80,120,120,120],N,L), sum_list(L,_金額t), 組合せ枚数を数える(L,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数) :- 度数(member(50,L),_50円切手の枚数), 度数(member(80,L),_80円切手の枚数), 度数(member(120,L),_120円切手の枚数). 組合せを表示する(_,[]) :- write('切手の組合せは作れません\n'). 組合せを表示する(_金額t,_切手枚数の組合せならび) :- forall(append(_,[[_50円切手の枚数,_80円切手の枚数,_120円切手の枚数]|R],_切手枚数の組合せならび), writef('%w -> 50円切手×%w枚+80円切手×%w枚+120円切手×%w枚\n',[_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数])). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R2]) :- 'Nを1減らして残り要素の組合せ'(R1,N,R2). 組合せ([_|R1],N,R2) :- 'Nはそのままで残り要素の組合せ'(R1,N,R2). 'Nを1減らして残り要素の組合せ'(R1,N,R2) :- N > 1, succ(N_1,N), 組合せ(R1,N_1,R2). 'Nはそのままで残り要素の組合せ'(R1,N,R2) :- N > 1, 組合せ(R1,N,R2). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/463 # # 休み中の課題なのですが、わからないので教えて頂きたいです。 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/vb7pZ # # 飲食店の6月分の帳簿データbook-6.datがテキストで書かれてあり、中身を見てみると #  左端から、日付 支出(1)/収入(0) 商品名 単価 数量 #  20120601 1 meat 125 10000 #  20120602 1 rice 2000 10 #  20120603 0 uriage 500 100 #  20120603 1 beer 140 24 # となっているものとする。  ただし、支出は1、収入は0とする。 # このようなデータを読み取って残高を計算するプログラムを作りたい。以下のプログラムをコンパイルが通り、 # 目的の動作をするように直接書き込んで補いなさい。(どこを補うべきかも考えること) # ただし、商品名は空白を含まない文字列とし、繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、 # 入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。 '飲食店の6月分の帳簿データbook-6.datからテキストデータを読み取って残高を計算する。ただし、商品名は空白を含まない文字列とし、繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_残高表,_残高) :- '飲食店の6月分の帳簿データbook-6.datからテキストデータを読み取って'(LL), '繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金), 繰越金を付加して残高を計算する(LL,_繰越金,_残高表,_残高). '飲食店の6月分の帳簿データbook-6.datからテキストデータを読み取って'(LL) :- get_split_lines('book-6.dat',[' ',','],LL). '繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金) :- 整数を得る(繰越金,_繰越金候補), '入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金候補,_繰越金),!. '入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金候補,_繰越金) :- writef('入力された繰越金 %t で間違いありませんか?\n間違いがなければ改行\n間違っていたら 正しい繰越金を入力してください : ',[_繰越金候補]), get_line(Line), 間違いがあるならば何度でも入力しなおす(Line,_繰越金候補,_繰越金),!. 間違いがあるならば何度でも入力しなおす('',_繰越金,_繰越金) :- !. 間違いがあるならば何度でも入力しなおす(Line,_,_繰越金) :- 間違いがある, atom_to_term(Line,_繰越金候補,_), integer(_繰越金候補), '入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金候補,_繰越金). 間違いがある. 繰越金を付加して残高を計算する(LL,_繰越金,[[_日付,0,繰越金,0,0,_繰越金]|_残高表],_残高) :- LL = [[_日付|_]|_], 残高を計算する(LL,_繰越金,_残高表,_残高). 残高を計算する([],_残高,[],_残高). 残高を計算する([[_日付,_支出または収入区分,_商品名,_単価,_数量]|R1],_残高_1,[[_日付,_支出または収入区分,_商品名,_単価,_数量,_残高_2]|R2],_残高) :- 支出または収入区分に従って行の計算(_残高_1,_支出または収入区分,_単価,_数量,_残高_2), 残高を計算する(R1,_残高_2,R2,_残高). 支出または収入区分に従って行の計算(_残高_1,1,_単価,_数量,_残高_2) :- _残高_2 is _残高_1 - _単価 * _数量. 支出または収入区分に従って行の計算(_残高_1,0,_単価,_数量,_残高_2) :- _残高_2 is _残高_1 + _単価 * _数量. get_split_lines(File,_区切り文字列ならび,LL) :- get_lines(File,_行ならび), findall(L,( member(_行,_行ならび), split(_行,_区切り文字列ならび,L)),LL) . get_lines(File,_行ならび) :- open(File,read,Instream), 行入力(Instream,_行), 行入力ならび(Instream,_行ならび), close(Instream). 行入力ならび(Instream,[]) :- at_end_of_stream(Instream),!. 行入力ならび(Instream,[_行|R]) :- 行入力(Instream,_行), 行入力ならび(Instream,R). get_split_line(_区切り文字列ならび,_語彙ならび) :- 行入力(_行), split(_行,_区切り文字列ならび,_語彙ならび). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 行入力(Instream,_行) :- read_line_to_codes(Instream,Codes), atom_codes(_行,Codes). split('',_,[]) :- !. split(_文字列,_区切り文字列ならび,[_前文字列|R]) :- member(_区切り文字列,_区切り文字列ならび), sub_atom(_文字列,_前文字列,_区切り文字列,_後文字列), split(_後文字列,_区切り文字列ならび,R),!. split(_文字列,_区切り文字ならび,[_文字列]) :- \+(member(_文字列,_区切り文字ならび)),!. split(_,_,[]). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/90 # # 助けてください! # C言語の課題です。 # # 「自分のフルネームをアルファベット小文字で入力し、そのアスキーコードを、10進数で求めて平均、分散、標準偏差を表示」 # を表すソースを教えてください。 # '自分のフルネームをアルファベット小文字で入力し、そのアスキーコードを、10進数で求めて平均、分散、標準偏差を表示' :- 自分のフルネームをアルファベット小文字で入力し(_自分のフルネーム), 'そのアスキーコードを、10進数で求めて'(_自分のフルネーム,_自分のフルネームのアスキーコードならび), '平均、分散、標準偏差を表示'(_自分のフルネームのアスキーコードならび). 自分のフルネームをアルファベット小文字で入力し(_自分のフルネーム) :- write('自分のフルネームをアルファベット小文字で入力してください : '), get_line(_自分のフルネーム). 'そのアスキーコードを、10進数で求めて'(_自分のフルネーム,_自分のフルネームのアスキーコードならび) :- atom_codes(_自分のフルネーム,_自分のフルネームのアスキーコードならび). '平均、分散、標準偏差を表示'(_自分のフルネーム,_自分のフルネームのアスキーコードならび) :- 相加平均(_自分のフルネームのアスキーコードならび,_相加平均), 分散(_自分のフルネームのアスキーコードならび,_分散), 標準偏差(_自分のフルネームのアスキーコードならび,_標準偏差), writef('自分のフルネーム = %t, 自分のフルネームのアスキーコード = %t, 平均 = %t, 分散 = %t, 標準偏差 = %t\n',[_自分のフルネーム,_自分のフルネームのアスキーコードならび,_平均,_分散,_標準偏差]). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0,M). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 分散(L,V) :- length(L,N), 相加平均(L,M), 分散(L,N,M,0.0,V). 分散([],N,M,S,V) :- V is S / N,!. 分散([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散(R,N,M,S2,V). 標準偏差(L,V) :- length(L,N), 相加平均(L,M), 標準偏差(L,N,M,0.0,V). 標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!. 標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 標準偏差(R,N,M,S2,V). % 以下のサイトは # 出典 :: # [1] 授業単元: # [2] 問題文(含コード&リンク): # 試合で自分のチームが勝つ・負ける・引き分けるの予想を、10人に予想してもらってプログラムに入力する。 # 予想した人が男性の場合は M を入力し、女性の場合は W を入力する。 # 勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。 # それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し表示するプログラムを、 # # 構造体 # struct datatype # { # char sex;// 男女の性別、男性 M、女性 W # int expectation;// 勝ち 1、負け 2、引き分け 0 # } # # を利用して作成せよ # '試合で自分のチームが勝つ・負ける・引き分けるの予想を、10人に予想してもらってプログラムに入力する。予想した人が男性の場合は M を入力し、女性の場合は W を入力する。勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。 それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し表示する' :- '試合で自分のチームが勝つ・負ける・引き分けるの予想を、10人に予想してもらってプログラムに入力する。予想した人が男性の場合は M を入力し、女性の場合は W を入力する。勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。'(_10人の予想ならび), 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し表示する'(_10人の予想ならび). '試合で自分のチームが勝つ・負ける・引き分けるの予想を、10人に予想してもらってプログラムに入力する。予想した人が男性の場合は M を入力し、女性の場合は W を入力する。勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。'(_10人の予想ならび) :- findnsols([_性別,_予想],10,( '予想を入力する。予想した人が男性の場合は M を入力し、女性の場合は W を入力する。勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。'(_性別,_予想)),_10人の予想ならび),!. '予想を入力する。予想した人が男性の場合は M を入力し、女性の場合は W を入力する。勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。'(_性別,_予想) :- write('性別を入力してください(M or F) : '), 行入力(_性別), 整数を得る('勝ち=1, 負け=2, 引き分け=0 を入力してください',between(0,2,_予想),_予想). 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し表示する'(_10人の予想ならび) :- 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し'(_10人の予想ならび,_予想結果ならび), 表示する(_予想結果ならび). 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し'(_10人の予想ならび,_予想結果ならび) :- findall([_性別,_勝ち合計,_引き分け合計,_負け合計],( '男女別に「 勝ち1・引き分け0・負け2 」を集計し'(_性別,_勝ち合計,_引き分け合計,_負け合計)),_予想結果ならび). '男女別に「 勝ち1・引き分け0・負け2 」を集計し'(_性別,_勝ち合計,_引き分け合計,_負け合計) :- 男女別に(_性別), '「 勝ち1・引き分け0・負け2 」を集計し'(_性別,_勝ち合計,_引き分け合計,_負け合計). 男女別に(_性別):- member(_性別,['M','F']). '「 勝ち1・引き分け0・負け2 」を集計し'(_性別,_勝ち合計,_引き分け合計,_負け合計) :- 勝ち1合計(_10人の予想ならび,_性別,_勝ち合計), 引き分け0合計(_10人の予想ならび,_性別,_引き分け合計), 負け2合計(_10人の予想ならび,_性別,_負け合計). 勝ち1合計(_10人の予想ならび,_性別,_勝ち):- 度数(member([_性別,1],_10人の予想ならび),_勝ち). 引き分け0合計(_10人の予想ならび,_性別,_引き分け):- 度数(member([_性別,0],_10人の予想ならび),_引き分け). 負け2合計(_10人の予想ならび,_性別,_負け):- 度数(member([_性別,2],_10人の予想ならび),_負け). 表示する(_予想結果ならび):- forall(member([_性別,_勝ち,_引き分け,_負け]_予想結果ならび), writef('%w 勝ち=%w,引き分け=%w,負け=%w\n',[_性別,_勝ち,_引き分け,_負け])). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). % 整数を得る/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/827 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/qQfTmJyV # リンク先のコードは分数を読み込み、その分数を約分した結果を表示するものの一部であり、 # このプログラムを完成させよ。ただし、分子と分母に0を入力すると終了する。 # # 実行例 # bunshi:36 # bunbo:48 # 3/4 # bunshi:-12 # bunbo:15 # -4/5 # bunshi:0 # bunbo:0 # # '分数を読み込み、その分数を約分した結果を表示する' :- '分数を読み込み、'(_分数), その分数を約分した結果を(_分数,_約分した結果), 表示する(_分数,_約分した結果). '分数を読み込み、'(_分数) :- 分子を読み込む(_分子), 分母を読み込む(_分母), _分数 = _分子 / _分母. 分子を読み込む(_分子) :- 整数を得る(分子,_分子). 分母はを読み込む(_分母) :- 整数を得る(分母,_分母). その分数を約分した結果を(_分子_1 / _分母_1,_分子 / _分母) :- 最大公約数(_分子_1,_分母_1,_最大公約数), _分子 is _分子_1 // _最大公約数, _分母 is _分母_1 // _最大公約数. 表示する(_分子_1/_分母_1,_分子/_分母) :- writef('入力した分数 %t/%t\n約分した分数 %t/%t\n',[_分子_1,_分母_1,_分子,_分母]). 整数を得る(_催促文,_整数) :- 催促文を表示して整数を得る(_催促文,_整数),!. 整数を得る(_催促文,_整数) :- 整数を得る(_催促文,_整数). 催促文を表示して整数を得る(_催促文,_整数) :- writef('%wを入力して下さい : ',[_催促文]), 整数を得る(_整数). 整数を得る(_整数) :- 行入力(_行), 整数検査(_行,_整数). 行入力(_行) :- read_line_to_codes(user_input,_codes), atom_codes(_行,_codes). 整数検査(_行,_整数) :- atom_number(_行,_整数), integer(_整数),!. 整数検査(_行,_) :- writef('入力された %w は整数ではありません。再入力をお願いします。\n',[_行]), fail. 最大公約数をユークリッドの互除法で求める(M,N,_最大公約数) :- ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(M,N,_最大公約数). ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_被除数,_除数,_最大公約数) :- _剰余 is _被除数 mod _除数, 割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_被除数,_除数,_剰余,_最大公約数). 割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_被除数,_除数,0,_最大公約数) :- 割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数),!. 割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_被除数,_除数,_剰余,_最大公約数) :- '割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_被除数,_除数,_剰余,_最大公約数). 割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数) :- _除数 = _最大公約数. '割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_被除数,_除数,_剰余,_最大公約数) :- ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_除数,_剰余,_最大公約数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/625 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/www.fluid.cse.nagoya-u.ac.jp/~ishihara/c/ #    7/6の課題 # 9.1 ニュートン法 # # f(x)=0の解を求めるアルゴリズム. # # x=x0を初期値(近似値)として,x=x0におけるy=f(x)の接線:y-f(x0)=f'(x0)(x-x0)と # x軸との交点 x=x1=x0-f(x0)/f'(x0)を新しい近似値とする。 # 反復回数上限(1000). f(X,Y) :- Y is 2 * X * X - 7 * X + 6. df(X,Y) :- Y is 4 * X - 7. 'f(x)=0の解を求める' :- 数を得る(初期値x0,_初期値), ニュートン法(_初期値,_反復回数,_収束解), writef('収束解 = %t\n',[_収束解]). 'f(x)=0の解を求める' :- write('収束しません\n'). ニュートン法(_初期値,_反復回数,_収束解) :- 反復回数上限(_反復回数上限), f(_初期値,Y1), df(_初期値,Y2), X_0 is _初期値 - Y1 / Y2, ニュートン法(1,_反復回数上限,X_0,Y1,_反復回数,_収束解). ニュートン法(_反復回数,_反復回数上限,_,_,_) :- _反復回数 > _反復回数上限,!,fail. ニュートン法(_反復回数,_,X,Y,_反復回数,X) :- abs(Y) < 1.0e-09. ニュートン法(_反復回数_1,_反復回数上限,X_1,Y,_反復回数,X) :- f(X_1,Y1), df(X_1,Y2), X_2 is X_1 - Y1 / Y2, _反復回数_2 is _反復回数_1 + 1, ニュートン法(_反復回数_2,_反復回数上限,X_2,Y1,_反復回数,X). 数を得る(A,N) :- writef('%w : ',[A]), 行を得る(_行), read_term_from_atom(_行,N,[]). 行を得る(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 数を得る % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #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関数のプログラムを作成しなさい。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。 # 四季(0,春). 四季(1,夏). 四季(2,秋). 四季(3,冬). '四季述語を定義し、キーボードから0,1,2,3を入力した場合に、それぞれ 春,夏,秋,冬 と表示する。0,1,2,3以外の数字が入力された場合には、入力し直す' :- 'キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_数字), 'それぞれ 春,夏,秋,冬 と表示する。'(_数字). 'キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_数字) :- キーボードから入力(_入力), '診断: キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_入力,_数字),!. 'キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_数字) :- 'キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_数字). '診断: キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_入力,_数字) :- '0,1,2,3を入力した'(_入力,_数字),!. '診断: キーボードから0,1,2,3を入力した場合に(0,1,2,3以外の数字が入力された場合には、入力し直す)'(_入力,_数字) :- '0,1,2,3以外の数字が入力された'(_入力,_), fail. キーボードから入力(_入力) :- read_line_to_codes(user_input,Codes), atom_codes(_入力,Codes). '0,1,2,3を入力した'(_入力,_数字) :- read_term_from_atom(_入力,_数字,[variable_names(_),variables(_)]), member(_数字,[0,1,2,3]). '0,1,2,3以外の数字が入力された'(_入力,_) :- \+('キーボードから0,1,2,3を入力した'(_入力,_数字)). 'それぞれ 春,夏,秋,冬 と表示する。'(_数字) :- 四季(_数字,_春_夏_秋_冬), writef('%t\n',[_春_夏_秋_冬]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/533 # # [1] 授業単元: C # [2] 問題文: # アルファベットから成る文字列strをJISコード表にしたがいn文字ずつ # ずらして暗号文cryptogramを作成する関数を作成さなさい。 # このような暗号化をシーザー暗号と言う。 # 数字は数字内で同様にずらすこと。 # ただし、それ以外の記号や空白はそのまま無変換とする。 # 平文とnを引数にとり、暗号文を返す関数を作りなさい。 # 実行例には、平文を暗号化した場合と、 # その暗号文を平文に戻した場合を含めること。 # % % 数値コードを計算して求めるシーザー暗号 % シーザー暗号(_n文字ずらし,_平文,_暗号文) :- atom_codes(_平文,_文字コードならび), 文字コードならびを変換する(_n文字ずらし,_文字コードならび,_変換された文字コードならび), atom_codes(_暗号文,_変換された文字コードならぴ). シーザー暗号の平文化(_n文字ずらし,_暗号文,_平文) :- _n_1 is _n文字ずらし * (-1), シーザー暗号(_n_1,_暗号文,_平文). 文字コードならびを変換する(_,[],[]). 文字コードならびを変換する(_n文字ずらし,[_文字コード|R1],[_変換された文字コード|R2]) :- 文字コードを変換する(_n文字ずらし,_文字コード,_変換された文字コード), 文字コードならびを変換する(_n文字ずらし,R1,R2). 文字コードを変換する(_n文字ずらし,_文字コード,_変換された文字コード) :- between(65,90,_文字コード), _変換された文字コード is ((_文字コード-65+_n文字ずらし) mod 26) + 65,!. 文字コードを変換する(_n文字ずらし,_文字コード,_変換された文字コード) :- between(97,122_文字コード), _変換された文字コード is ((_文字コード-97+_n文字ずらし) mod 26) + 97,!. 文字コードを変換する(_n文字ずらし,_文字コード,_変換された文字コード) :- between(48,57,_文字コード), _変換された文字コード is ((_文字コード-48+_n文字ずらし) mod 10) + 48,!. 文字コードを変換する(_,_文字コード,_文字コード). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #164 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # n人の点数を読み込み、その中央値を求めたい。 # そこで、次の関数を 作成しなさい。 # *標準入力から読み込んだ点数を配列に代入する関数。 # ただし、呼び出し時には人数は与えられず、負の点数が入力されたら、 # その直前までの点数を返すものとする。また、人数を関数の返却値で返す。 # 例.85, 58, 90, 65, 45, -1 のときは、5名の点数を配列に入れ、 # 関数自身は人数の5を返却する。 # *配列の中身を昇順に並べ替える関数。ここで、配列のi番目とj番目の要 # 素の値を入れ替えるには、次のように行う。 # int temp = ary[i]; # ary[i] = ary[j]; # ary[j] = temp; # * 配列から中央値を返却する関数。 # 中央値は、データ数が奇数個のときは、 1番目から数えて(n+1)/2番目の # データであり、偶数個のときは、n/2番目とn/2+1番目のデータの平均値でる。 # 例.50, 70, 90のときは、中央値は70であり、50, 70, 80, 90のときは、 中 # 央値は75である。 # 適切な実行例を作成し、上記の関数が正しく動作することを示しなさい。 # 'n人の点数を読み込み、その中央値を求めたい。そこで、次の関数を作成しなさい。 *標準入力から読み込んだ点数を配列に代入する関数。ただし、呼び出し時には人数は与えられず、負の点数が入力されたら、その直前までの点数を返すものとまた、人数を関数の返却値で返す。'(_人数,_中央値) :- 整数を得る(人数,_人数), '人数分の点数を入力する。ただし、負の点数が入力されたら、その直前の点数を返す'(_人数,_点数ならび), 中央値(_点数ならび,_中央値). '人数分の点数を入力する。ただし、負の点数が入力されたら、その直前の点数を返す'(_人数,_点数ならび) :- findall(_人数,_点数,( 整数を得る(点数,_点数), ( _点数 < 0,!,fail;true)),_点数ならび),!. 中央値(_標本ならび,_中央値) :- 整列して中央値を得る(_標本ならび,_中央値). 整列して中央値を得る(_標本ならび,_中央値) :- 重複要素を残す整列(_標本ならび,_整列した標本ならび), 中央値を得る(_整列した標本ならび,_中央値). 中央値を得る(_整列した標本ならび,_中央値) :- length(_整列した標本ならび,_要素数), _要素数の半分 is _要素数 // 2, 中央値を得る(_整列した標本ならび,_要素数,_要素数の半分,_中央値). 中央値を得る(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- '標本数が奇数の時は中央順位、偶数の時は中央二値の平均値'(_整列した標本ならび,_要素数,_要素数の半分,_中央値). '標本数が奇数の時は中央順位、偶数の時は中央二値の平均値'(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 標本数が奇数の時は中央順位(_整列した標本ならび,_要素数,_要素数の半分,_中央値). '標本数が偶数の時は中央順位、偶数の時は中央二値の平均値'(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 標本数が偶数の時は中央二値の平均値(_整列した標本ならび,_要素数,_要素数の半分,_中央値). 標本数が奇数の時は中央順位(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 奇数(_要素数), 中央順位(_中央値). 中央順位(_整列した標本ならび,_要素数の半分,_中央値) :- length(L1,_要素数の半分), length(L2,_要素数の半分), append(L1,[_中央値|L2],_整列した標本ならび). 標本数が偶数の時は中央二値の平均値(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 偶数(_要素数), 中央二値(_整列した標本ならび,_要素数の半分,_中央値_1,_中央_2), _中央値 is (_中央値_1 + _中央値_2) / 2. 中央二値(_整列した標本ならび,_要素数の半分,_中央値_1,_中央_2) :- length([_|L1],_要素数の半分), length([_|L2],_要素数の半分), append(L1,[_中央値1,_中央値2|L2],_整列した標本ならび). 奇数(_奇数) :- 1 is _奇数 mod 2. 偶数(_偶数) :- 0 is _偶数 mod 2. 重複要素を残す整列([],[]) :- !. 整列(_対象ならび,_整列したならび) :- _対象ならび = [_軸要素|_残り対象ならび], 重複要素を残す整列(_軸要素,_残り対象ならび,_整列したならび). 重複要素を残す整列(_軸要素,_軸要素を除いた対象ならび,_整列したならび) :- 分割(_軸要素,_軸要素を除いた対象ならび,_軸要素に等しいかより小さい要素のならび,_軸要素より大きい要素のならび), 重複要素を残す整列(_軸要素に等しいかより小さい要素のならび,_整列した軸要素に等しいかより小さい要素のならび), 重複要素を残す整列(_軸要素より大きい要素のならび,_整列した軸要素より大きい要素のならび), append(_軸要素に等しいかより小さい要素のならび,[_軸要素|_整列した軸要素より大きい要素のならび],_整列したならび). 分割(_軸要素,[],[],[]). 分割(_軸要素,[_要素|_残り対象ならび],[_要素|_軸要素に等しいかより小さい要素のならび],_軸要素より大きい要素のならび) :- _要素 @=< _軸要素, 分割(_軸要素,_残り対象ならび,_軸要素に等しいかより小さい要素のならび,_軸要素より大きい要素のならび). 分割(_軸要素,[_要素|_残り対象ならび],_軸要素に等しいかより小さい要素のならび,[_要素|_軸要素より大きい要素のならび]) :- _要素 @> _軸要素, 分割(_軸要素,_残り対象ならび,_軸要素に等しいかより小さい要素のならび,_軸要素より大きい要素のならび). 整数を得る(_催促文字列,_整数) :- 行入力して整数に変換する(_催促文字列,_整数),!. 整数を得る(_催促文字列,_整数) :- 整数を得る(_催促文字列,_整数). 行入力して整数に変換する(_催促文字列,_整数) :- 行入力(_催促文字,_行), 整数検査(_行,_整数). 行入力(_催促文字,_行) :- writef('%w ',[_催促文字]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 整数検査(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #48 # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/5oepZpDW # #include # double heikin(int a[]); # # int main(void) # { # int data[5],i; # double ave; # for (i=0;i<=4;i++) # { # printf("data[%d]= ",i); # scanf("%d",&data[i]); # } # ave=heikin(data); # printf("heikin=%f \n",ave); # return 0; # } # # double heikin(int a[]) # { # int i,k=0; # for(i=0;i<=4;i++) # { # k=k+a[i]; # } # return((double)k/5); # } # 上記のプログラムに5人の得点(10点満点)を受け取ると、合格者数を戻すgoukaku関数を追加せよ、但し6点以上で合格とする。 # そして5人のテストの得点を整数型配列data[5]の要素にそれぞれ入力すると # 5人の平均点に加えて合格者数も出力するプログラムをheikin関数およびgoukaku関数を利用して作成しなさい。 # '5人の得点(10点満点)を受け取ると、合格者数を戻す述語を定義する。但し6点以上で合格とする。そして5人のテストの得点を入力すると5人の平均点に加えて合格者数も出力する。' :- '5人の得点(10点満点)を受け取ると'(_5人の得点ならび), 平均点を出力する(_5人の得点ならび), '6点以上を取った合格者数を出力する'(_5人の得点ならび). 平均点を出力する(_5人の得点ならび) :- 平均点を戻す(_5人の得点ならび,_平均点), writef('平均点 = %w 点\n',[_平均点]). 平均点を戻す(_5人の得点ならび,_平均点) :- sum_list(_5人の得点ならび,_合計点), _平均点 is _合計点 / 5. '6点以上を取った合格者数を出力する'(_5人の得点ならび) :- '6点以上を取った合格者数を戻す'(_5人の得点ならび,_合格者数), writef('合格者数 = %w 人\n',[_合格者数]). '5人の得点(10点満点)を受け取ると'(_5人の得点ならび) :- findall(_得点,( '5人の', '得点(10点満点)を受け取る'(_得点)),_5人の得点ならび). '5人の' :- between(1,5,_). '得点(10点満点)を受け取る'(_得点) :- 行入力(_行文字列), '診断: 得点(10点満点)を受け取る'(_行文字列,_得点),!. '得点(10点満点)を受け取る'(_得点) :- '得点(10点満点)を受け取る'(_得点). '診断: 得点(10点満点)を受け取る'(_行文字列,_得点) :- 行文字列を解析して0から10の範囲の得点を得る(_行文字列,_得点),!. '診断: 得点(10点満点)を受け取る'(_行文字列,_得点) :- writef('入力された %w からは適切な得点が得られません。再入力をお願いします。\n',[_行文字列]), fail. 行文字列を解析して0から10の範囲の得点を得る(_行文字列,_得点) :- 行文字列を解析して(_行文字列,_得点), '0から10の範囲の得点を得る'(_得点). 行文字列を解析して(_行文字列,_得点) :- read_term_from_atom(_行文字列,_得点,[]). '0から10の範囲の得点を得る'(_得点) :- integer(_得点), member(_得点,[0,1,2,3,4,5,6,7,8,9,10]). 行入力(_行文字列) :- read_line_to_codes(current_input,Codes), atom_codes(_行文字列,Codes). '6点以上を取った合格者数を戻す'(_5人の得点ならび,_合格者数) :- findall(_,( '6点以上で合格とする'(_5人の得点ならび)),L), length(L,_合格者数). '6点以上で合格とする'(_5人の得点ならび) :- member(_得点,_5人の得点ならび), _得点 >= 6. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/398 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 配列・文字列 # 数字で入力した数を数値に変換するプログラムを作成せよ。 # すなわち,入力を文字列"1234"として受け取り,整数に変換し、値1234にする。 # 負の数-1234にも対応すること。 小数12.34に対応した場合は加点する。 # 実行結果には、000, 0123や数字以外の文字を含む場合も入れること。 # 例えば、"12a34"は12に変換してよい。 # ※無限ループ、ポインタ等は使用不可 # 数字で入力した数を数値に変換する(_文字列,_数値) :- atom_codes(_文字列,Codes), コードならびを数値に変換する(Codes,_数値). コードならびを数値に変換する(Codes,_数値) :- \+(member(46,Codes)), コードならびを整数に変換する(Codes,_数値). コードならびを数値に変換する(Codes,_数値) :- member(46,Codes), コードならびを実数に変換する(Codes,_数値). コードならびを整数に変換する([],0) :- !. コードならびを整数に変換する([45|R],N) :- コードならびを整数に変換する(R,N_1), N is N_1 * -1,!. コードならびを整数に変換する([Code|R],N) :- コードならびを整数に変換する(R,N_1), N is N_1 * 10 + Code-48. コードならびを実数に変換する(Codes,_実数) :- append(L1,[46|R],Codes), コードならびを整数に変換する(L1,N1), コードならびを整数に変換する(R,N2), 実数を構成する(N1,N2,_実数). 実数を構成する(N1,N2,_実数) :- N1 < 0, '10で割っていく'(N2,N2,V), _実数 is N1 - V,!. 実数を構成する(N1,N2,_実数) :- N1 >= 0, '10で割っていく'(N2,N2,V), _実数 is N1 + V,!. '10で割っていく'(0,V,V) :- !. '10で割っていく'(N_1,V_1,V) :- N_2 is N // 10, V_2 is V_1 / 10, '10で割っていく'(N_2,V_2,V). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/557 # # 初めて書き込みます。よろしくお願い致します。固定長バイトの文字列の中の一部を抜き出すところがわかりませんでした。 # 1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上の # それぞれのテキストデータ・ファイルがある。 # 文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を # 比較し、 # 同じなら、文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を # 置き換える。 # 文字列Bの4カラム目が50バイト以下なら " "空白で埋める。 # 50バイトより大きい場合50バイトまでの大きさを対象とする。 # # 置き換え対象領域は日本語全角漢字含む文字列となる。 # 文字列Aの対象領域は2バイトx20文字+1バイト10文字で整形されている。 # 文字列AはSolaris10上のファイル。文字列BはエクセルファイルをCSV保存してFFFTPでSolaris10へコピーしたもの。 # 文字コード:文字列A(EUC-JP)、文字列B(sjis2eucで変換) # # 1ー77バイトが1バイト、77ー126が変換対象。126ー150が1バイトです。 '文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上のそれぞれのテキストデータ・ファイルがある。' :- get_lines('文字列A',Lines1), get_lines('文字列B',Lines2), '文字列Aの全行を置換する'(Lines1,Lines2,Lines3), 'Lines3を文字列Aに書き戻す'(Lines3,_文字列A),!. '文字列Aの全行を置換する'([],_,[]) :- !. '文字列Aの全行を置換する'([_文字列A|R1],Lines2,[_置換した文字列|R3]) :- 'Lines2を検索して文字列Aを置換する'(_文字列A,Lines2,_置換した文字列), '文字列Aの全行を置換する'(R1,Lines2,R3). 'Lines2を検索して文字列Aを置換する'(_文字列A,[],_文字列A) :- !. 'Lines2を検索して文字列Aを置換する'(_文字列A,[_文字列B|R2],_置換した文字列) :- '文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列),!. 'Lines2を検索して文字列Aを置換する'(_文字列A,[_|R2],_置換した文字列) :- 'Lines2を検索して文字列Aを置換する'(_文字列A,R2,_置換した文字列),!. '文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列) :- split(_文字列B,[' ',','],L), '文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を比較し同じなら'(_文字列A,L), '文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列). '文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列) :- sub_byte_atom(_文字列A,0,76,_,S1), sub_byte_atom(_文字列A,126,_,0,S3), '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2), concat_atom([S1,S2,S3],_置換された文字列),!. '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :- '文字列Bの4カラム目が'(L,S2_1), '50バイト以下なら'(S2_1), '" "空白で埋める'(S2_1,S2),!. '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :- nth1(4,L,S_1), sub_byte_atom(S_1,0,50,_,S2). '文字列Bの4カラム目が50バイト以下なら'(L) :- nth1(4,L,S_1), atom_byte_length(S_1,_長さ), _長さ =< 50,!. '" "空白で埋める'(S2_1,S2) :- length(L2,50), atom_byte_codes(S2_1,L_1), append(L_1,_,L2), 変数を空白に置換(L2), atom_byte_codes(S2,L2),!. 変数を空白に置換([]). 変数を空白に置換([' '|R]) :- 変数を空白に置換(R),!. 変数を空白に置換([A|R]) :- 変数を空白に置換(R). 'Lines3を文字列Aに書き戻す'(Lines3) :- put_lines('文字列A',Lines3). atom_byte_codes(Atom,ByteCodes) :- atom(Atom), atom_codes(Atom,Codes), バイトに分解(Codes,ByteCodes),!. atom_byte_codes(Atom,ByteCodes) :- \+(atom(Atom)), 'ByteCodes2Codes'(ByteCodes,Codes), atom_codes(Atom,Codes),!. 'ByteCodes2Codes'([],[]). 'ByteCodes2Codes'([A,B|R1],[C|R2]) :- A > 127, B > 127, C is 256 * A + B, 'ByteCodes2Codes'(R1,R2),!. 'ByteCodes2Codes'(R1,R2) :- 'ByteCodes2Codes'(R1,R2),!. atom_byte_length(Atom,ByteLength) :- atom_codes(_文字列,Codes), バイトに分解(Codes,ByteCodes), length(ByteCodes). atom_byte_codes(Atom,ByteCodes) :- atom_codes(Atom,Codes), バイトに分解(Code,ByteCodes). sub_byte_atom(_文字列,_スタートバイト位置,_バイト数,_残りバイト,_副文字列) :- atom_codes(_文字列,Codes), バイトに分解(Codes,ByteCodes), sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList), atom_code(_副文字列,SubList). sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList) :- length(L0,_スタートバイト位置), length(L1,_バイト数), append(L0,SubList,L2,ByteCodes), length(L2,_残りバイト),!. バイトに分解([],[]). バイトに分解([A|R1],[B,C|R2]) :- A > 255, B is A // 256, C is A mod 256, バイトに分解(R1,R2),!. バイトに分解([A|R1],[A|R2]) :- バイトに分解(R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/522 # # [1] 授業単元: 情報処理 # [2] 問題文 # (1) # http://ime.nu/ideone.com/F0NZo # # 上記のプログラムはオープンするファイルが abc に限られている。 # キーボードからファイル名を読み込んで、そのファイルをオープンするように変更せよ。 # 'キーボードからファイル名を読み込んで、そのファイルをオープンする'(_ストリーム,_診断) :- 'キーボードからファイル名を読み込んで'(_ファイル名), 'そのファイルをオープンする'(_ファイル,_ストリーム,_診断). 'キーボードからファイル名を読み込んで'(_ファイル名) :- write('ファイル名を入力して下さい : '), get_line(Line), 'キーボードから読み込んだファイル名診断'(Line,_ファイル名,_診断). 'キーボードからファイル名を読み込んで'(_ファイル名) :- 'キーボードからファイル名を読み込んで'(_ファイル名). 'キーボードから読み込んだファイル名診断'(Line,Line,正常なファイル名) :- '入力文字列がファイル名として許された文字のみからなる'(Line), 'ピリオドは存在したとしても一箇所で、最初の文字と最後の文字はピリオドでない'(Line),!. 'キーボードから読み込んだファイル名診断'(Line,_,ファイル名になれない) :- writef('入力された %t はファイル名になりません。再入力をお願いします。\n',[Line]), fail. 'そのファイルをオープンする'(_ファイル,_ストリーム,正常終了) :- catch(open(_ファイル,read,_ストリーム),_エラー情報,オープンエラー(_エラー情報)),!. 'そのファイルをオープンする'(_,_,異常終了). '入力文字列がファイル名として許された文字のみからなる'(Line) :- atom_codes(Line,Codes), 全ての文字はアルファベット(Codes),!. 'ピリオドは存在したとしても一箇所で、最初の文字と最後の文字はピリオドでない'(Line) :- split(Line,['.'],[_,_]),!. 'ピリオドは存在したとしても一箇所で、最初の文字と最後の文字はピリオドでない'(Line) :- split(Line,['.'],[_]),!. オープンエラー(_エラー情報) :- writef('ファイルオープンエラー: %t\n',[_エラー情報]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/669 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): 文字列HeLLo中の文字について、大文字は小文字に #                小文字は大文字に変換せよ。 # '文字列HeLLo中の文字について、大文字は小文字に小文字は大文字に変換する' :- atom_codes('HeLLo',Codes), 大文字小文字相互変換(Codes,Codes2), atom_codes(_変換された文字列,_変換された文字コードならび), writef('%t',[_変換された文字列]). 大文字小文字相互変換([],[]). 大文字小文字相互変換([Code1|R1],[Code2|R2]) :- Code1 >= 65, Code1 =< 90, Code2 is Code1 + 32, 大文字小文字相互変換(R1,R2). 大文字小文字相互変換([Code1|R1],[Code2|R2]) :- Code1 >= 97, Code1 =< 122, Code2 is Code1 - 32, 大文字小文字相互変換(R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/620 # # 【 課題 】(源列を入力すると16進数が表示されるプログラム #       (例)I have a dream と入力するとI have a dreamが16進数で出力される。 #       16進数を入力すると文字列が表示されるプログラム(,竜侫弌璽献腑) # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】SWT # 【 期限 】12/20 まで # 【 Ver  】1.6.0_24 # 【 補足 】プログラム中でどのような操作がされているか #       コメントをつけてくださると嬉しいです。 # よろしくお願いします。 # # '文字列を入力すると16進数が表示される' :- write('文字列を入力して下さい : '), get_line(_文字列), '文字列を16進数表記ならびに変換する'(_文字列,_16進数表記ならび), 表示される(_16進数表記ならび). '文字列を16進数表記ならびに変換する'(_文字列,_16進数表記ならび) :- atom_codes(_文字列,Codes), 文字コードを16進数に変換(Codes,_16進数表記ならび), 文字コードを16進数に変換([],_16進数表記ならび,_16進数表記ならび). 文字コードを16進数に変換([Code|R1],R2,_16進数表記ならび) :- Code < 256, 文字コードを16進文字表記に変換(Code,_16進数文字表記), 文字コードを16進数に変換([Code|R1],[_16進数文字表記|R2],_16進数表記ならび). 文字コードを16進数に変換([Code|R1],R2,_16進数表記ならび) :- Code >= 256, Code1 is Code // 256, Code2 is Code mod 256, 文字コードを16進数に変換([Code1,Code2|R1],R2,_16進数表記ならび). 文字コードを16進文字表記に変換(Code,_16進数文字表記) :- Code1 is Code // 16, Code2 is Code mod 16, '10進数16進文字表記'(Code1,CodeA), '10進数16進文字表記'(Code2,CodeB), atom_concat(CodeA,CodeB,_16進数文字表記). '10進数16進文字表記'(0,'0'). '10進数16進文字表記'(1,'1'). '10進数16進文字表記'(2,'2'). '10進数16進文字表記'(3,'3'). '10進数16進文字表記'(4,'4'). '10進数16進文字表記'(5,'5'). '10進数16進文字表記'(6,'6'). '10進数16進文字表記'(7,'7'). '10進数16進文字表記'(8,'8'). '10進数16進文字表記'(9,'9'). '10進数16進文字表記'(10,'A'). '10進数16進文字表記'(11,'B'). '10進数16進文字表記'(12,'C'). '10進数16進文字表記'(13,'D'). '10進数16進文字表記'(14,'E'). '10進数16進文字表記'(15,'F'). 表示される(_16進数表記ならび) :- concat_atom(_16進数表記ならび,_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/624 # # [1] 授業単元:リスト構造体 # [2] 問題文(含コード&リンク): # enqueue()とdequeue()を用いて実行結果が # # Please input E(登録) or D(削除): E # Input number and name: 8 Nakamura # Please input E(登録) or D(削除): E # Input number and name: 3 Saito # Please input E(登録) or D(削除): D # Number=8 Name=Nakamura # Please input E(登録) or D(削除): D # Number=3 Name=Saito # Please input E(登録) or D(削除): D # No Data! # Please input E(登録) or D(削除): E # ・ # ・ # ・ # のように動作するプログラムを作成せよ # :- dynamic(キュー/2). 'enqueue()とdequeue()を用いて実行' :- start_queue, 要求の取得(_要求), 'enqueue()とdequeue()を用いて実行'(_要求). 要求の取得(_要求) :- write('Please input E(登録) or D(削除) or q(終了) : '), 行入力(_要求),!. 'enqueue()とdequeue()を用いて実行'(q) :- !. 'enqueue()とdequeue()を用いて実行'('E') :- enqueue, fail. 'enqueue()とdequeue()を用いて実行'('D') :- dequeue, fail. 'enqueue()とdequeue()を用いて実行'(_) :- 要求の取得(_要求), 'enqueue()とdequeue()を用いて実行'(_要求). start_queue :- キューの生成(一時的). enqueue :- write('Input number and name: '), 'Input number and name'(_number,_name), キューへの追加(一時的,[_number,_name]). 'Input number and name'(_number,_name) :- 区切り入力([' ',','],[_number,_name]). dequeue :- キューからの取り出し(一時的,_項), dequeue診断(_項,_診断), writef('%w\n',[_診断]). dequeue診断([],' No Data!') :- !. dequeue診断([_number,_name],_表示文字列) :- concat_atom(['nunmber = ',_number,' name = ',_name],_表示文字列). キューの生成(_キューの名前) :- キュー(_キューの名前,_), writef('%wというキューは既に存在します。登録できません。\n',[_キューの名前]),!. キューの生成(_キューの名前) :- asserta(キュー(_キューの名前,[])). キューからの取り出し(_キューの名前,_取り出した項) :- retract(キュー(_キューの名前,[_取り出した項|R])), asserta(キュー(_キューの名前,R)),!. キューからの取り出し(_キューの名前,[]). キューへの追加(_キューの名前,_追加する項) :- retract(キュー(_キューの名前,_キュー)), append(_キュー,[_追加する項],_追加されたキュー), asserta(キュー(_キューの名前,_追加されたキュー)). キューを空にする(_キュー名) :- retract(キュー(_キューの名前,_)), asserta(キュー(_キューの名前,[])). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 区切り入力(_区切り文字列ならび,_区切られた文字列ならび) :- 行入力(_行), 区切り文字列によって区切る(_行,_区切り文字列ならび,_区切られた文字列ならび). 区切り文字列によって区切る(_文字列,_区切り文字列ならび,[_前文字列|R]) :- sub_atom(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび), 区切り文字列によって区切る(_後文字列,_区切り文字列ならび,R),!. 区切り文字列によって区切る(_文字列,_,[_文字列]). 区切り文字列によって区切る('',_,[]). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % % キューは引数内の論理変数として重リストを使って定義し、 % それを更新しながら持ちまわるのが普通だが、 % ここでは愚直に、キューを述語としてassertし、reatract/assertを % 繰り返して値を出入りさせる述語群を定義してみた。 % % 以下のサイトは # 出典:: 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_codes(_数字文字列,_コードならび), 文字数値変換(_小数点位置文字,_小数点位置), コードならび変換後の頭部ゼロサプレス(_コードならび,_小数点位置,_フラグ,_表示コードならび), atom_codes(_表示文字列,_表示コードならび),!. コードならび変換後の頭部ゼロサプレス(_コードならび,_小数点位置,_フラグ,_表示文字列) :- 'B文字以下の除去'(_コードならび,_コードならび_1), 整数部と小数点部を分離(_コードならび_1,_小数点位置,_整数部コードならび,_小数部コードならび), '整数部頭部のコード変換'(_整数部コードならび,_フラグ,_変換された整数部コードならび), append(_変換された整数部コードならび,[46|_小数部コードならび],_表示コードならび),!. 文字数値変換(_小数点位置文字,_小数点位置) :- atom_to_term(_小数点位置文字,_小数点位置,_). 'B文字以下の除去'(_コードならび_1,_コードならび_2) :- append(_コードならび_2,[66|R],_コードならび_1),!. 'B文字以下の除去'(_コードならび,_コードならび). 整数部と小数点部を分離(_コードならび,_小数点位置,_整数部コードならび,_小数部コードならび) :- length(_小数部コードならび,_少数点位置), append(_整数部コードならび,_小数部コードならび,_コードならび),!. 整数部と小数点部を分離(_コードならび,_小数点位置,_整数部コードならび,_小数部コードならび) :- 'コードが7桁に満たない時は頭部にゼロを詰めておく'(_コードならび,_頭部にゼロを詰めたコードならび), 整数部と小数点部を分離(_頭部にゼロを詰めたコードならび,_小数点位置,_整数部コードならび,_小数部コードならび). 'コードが7桁に満たない時は頭部にゼロを詰めておく'(_コードならび,_頭部にゼロを詰めたコードならび) :- length(_頭部にゼロを詰めたコードならび,7), append(L1,_コードならび,_頭部にゼロを詰めたコードならび), all(L1,48). 整数部頭部のコード変換([],_,[]). 整数部頭部のコード変換([A|R],_,[A|R]) :- \+(A = 48),!. 整数部頭部のコード変換([48|R1],'1',[0|R2]) :- 整数部頭部のコード変換(R1,R2),!. 整数部頭部のコード変換([48|R1],_フラグ,[32|R2]) :- \+(_フラグ = '1'), 整数部頭部のコード変換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/12 # # 【 課題 】疑似乱数を生成する java.util.Random クラスを使って、 # 占いを行う Fortune クラスを作りなさい。fortune メソッドを作成し、 # そのメソッドに String クラスの # インスタンスを渡せば名前占いを、 # また整数 (int) を渡せば誕生日占いを # するようにしなさい。 # 名前占いと誕生日占いのアルゴリズムは # 適当に決めなさい。 # 占い結果は「絶好調!」「まあまあ」 # 「絶不調orz」とし、 # それぞれ30%、40%、40%の確率で # 出るようにしなさい。 # # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】6/29 0:00まで # 【 Ver  】java.version 1.6.0_25 # # 画像が消されてしまったようなので # 再書き込みさせてもらいました。 # 本日中にお願いします。 # # '擬似乱数を生成して、占いを行う'(_文字列または整数) :- '文字列を渡せば名前占いを、また整数 (int) を渡せば誕生日占いをする'(_文字列または整数,_占いの結果), writef('占いの結果は %t です。\n',[_占いの結果]). '文字列を渡せば名前占いを、また整数 (int) を渡せば誕生日占いをする'(_文字列,占いの結果) :- atom(_文字列), 名前占い(_文字列,_占いの結果). '文字列を渡せば名前占いを、また整数 (int) を渡せば誕生日占いをする'(_整数._占いの結果) :- integer(_整数), 誕生日占い(_整数,_占いの結果). 名前占い(_文字列,_占いの結果) :- atom_codes(_文字列,Codes), sum(Codes,Sum), N is Sum mod 12 + 1, '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(N,_占い結果). 誕生日占い(_整数,_占いの結果) :- 整数から星座を得る(_整数,_星座), nth1(_何番目,[牡牛座,双子座,蟹座,獅子座,乙女座,天秤座,蠍座,射手座,山羊座,山羊座,水瓶座,魚座],_星座), '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_何番目,_占い結果). '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(N,_占い結果) :- 擬似乱数を生成する(_擬似乱数), _判定数 is ((_擬似乱数 * N) mod 110) + 1, '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_判定数,_占い結果). '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_判定数,'絶好調!') :- _判定数 >= 1, _判定数 =< 30. '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_判定数,まあまあ) :- _判定数 >= 31, _判定数 =< 70. '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_判定数,'絶不調orz') :- _判定数 >= 71, _判定数 =< 110. 名前占い(_文字列,_占いの結果) :- atom_codes(_文字列,Codes), sum(Codes,Sum), N is Sum mod 12 + 1, '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(N,_占い結果). 誕生日占い(_整数,_占いの結果) :- 整数から星座を得る(_整数,_星座), nth1(_何番目,[牡牛座,双子座,蟹座,獅子座,乙女座,天秤座,蠍座,射手座,山羊座,山羊座,水瓶座,魚座],_星座), '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_何番目,_占い結果). 擬似乱数を生成する(_擬似乱数) :- _擬似乱数 is random(3521). 整数から星座を得る(_整数,_星座) :- _月 is _整数 // 100, _日 is _整数 mod 100, 星座判定(_月,_日,_星座). 星座判定(_月,_日,_星座) :- 星座(_星座,_月下限/_日下限-_月上限/_日上限), _月 = _月下限, _月 = _月上限, _日 >= _日下限, _日 =< _日上限,!. 星座判定(_月,_日,_星座) :- 星座(_星座,_月下限/_日下限-_月上限/_日上限), _月 = _月下限, _日 >= _日下限,!. 星座判定(_月,_日,_星座) :- 星座(_星座,_月下限/_日下限-_月上限/_日上限), _月 = _月上限, _日 =< _日上限,!. 星座(牡牛座,4/21-5/21). 星座(双子座,5/22-6/21). 星座(蟹座,6/22-7/22). 星座(獅子座,7/23-8/22). 星座(乙女座,8/23-9/23). 星座(天秤座,9/24-10/23). 星座(蠍座,10/24-11/22). 星座(射手座,11/23-12/21). 星座(山羊座,12/22-12/31). 星座(山羊座,1/1-1/20). 星座(水瓶座,1/21-2/18). 星座(魚座,2/19-3/20). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/876 # # [1] 授業単元:プログラム作成 # [2]D, C, B, A, S, Invalid という成績を表す列挙体 # enum result を定義し,点数(int 型)を引数として # enum result 型の値を返す関数 # seiseki_hantei(int sc) # と,enum result 型の値を引数として,成績を表示する関数も作成する # 点数と成績は以下の通とする # 0〜59 点: D # 60〜69 点: C # 70〜79 点: B # 80〜89 点: A # 90〜100 点: S # それ以外: Invalid # # # る関数 # print_seiseki(enum result res) # を作成せよ.この2 つの関数を使用して,以下の実行例 # のように点数を入力すると成績を表示するmain 関数も # 作成すること.点数と成績の関係は以下の通りとする. # 例. # 点数(整数)を入力してください:91 # 成績はS です。 # 成績判定表(0,59,'D'). 成績判定表(60,69,'C'). 成績判定表(70,79,'B'). 成績判定表(80,89,'A'). 成績判定表(90,100,'S'). '成績を入力して判定し、それを表示する' :- 成績を入力して(_成績), 成績を判定し(_成績,_判定), 判定を表示する(_判定). 成績を入力して(_成績) :- write('点数(整数)を入力してください:'), 行入力(_行), 成績入力診断(_行,_成績),!. 成績を入力して(_成績) :- 成績を入力して(_成績). 成績入力診断(_行,_成績) :- read_term_from_atom(_行,_成績,[valiable_names(_),valiables(_)]), integer(_成績),!. 成績入力診断(_行,_成績) :- writef('入力された%tからは整数が得られません。再入力をお願いします。\n',[_行]), fail. 成績を判定し(_成績,_判定) :- 成績判定表(_下限,_上限,_判定), _成績 >= _下限, _成績 =< _上限,!. 成績を判定し(_,異常値). 判定を表示する(_判定) :- writef('判定は%tです\n',[_判定]),!. 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/829 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # ユーザーに入力させた半角英数字の文字列を、char型配列に入れ、一字ずつずらして表示させるプログラムの作成。 # 入力された順番と同じになったら表示終了とする。 # 例 abcd # bcda # cdab #   dabc # abcd # # ポインタを使うと思います。それから、strlen(c)を使うようです。 # 'ユーザーに入力させた半角英数字の文字列を、char型配列に入れ、一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。' :- 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_半角英数字の文字列). 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列) :- write('半角英数字の文字列を入力してください : '), get_line(Line), 'ユーザーに入力させた半角英数字の文字列入力検査'(Line,_半角英数字の文字列),!. 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列) :- 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列). 'ユーザーに入力させた半角英数字の文字列入力検査'(Line,Line) :- atom_codes(Line,Codes), \+((append(_,[N|_],Codes), 半角英数字のコード(N))),!. 'ユーザーに入力させた半角英数字の文字列入力検査'(Line,_半角英数字の文字列) :- writef('入力された %t には半角英数字以外の文字が含まれています。再入力をお願いします。\n',[Line]), fail. 半角英数字のコード(N) :- N >= 48,N =< 57,!. 半角英数字のコード(N) :- N >= 65,N =< 90,!. 半角英数字のコード(N) :- N >= 97,N =< 122,!. '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_半角英数字の文字列) :- 入力された文字列を表示する(_半角英数字の文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_半角英数字の文字列,_一文字ずらした文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_一文字ずらした文字列,_半角英数字の文字列). '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_文字列,_文字列) :- 入力された順番と同じになったら表示終了とする。',!. '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_文字列,_半角英数字の文字列) :- '一字ずつずらして表示させる'(_文字列,_一文字ずらした文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_一文字ずらした文字列,_半角英数字の文字列). '一字ずつずらして表示させる'(_文字列,_一文字ずらした文字列) :- sub_atom(_文字列,0,1,R,_先頭文字), sub_atom(_文字列,1,R,0,_残り文字列), concat_atom([_残り文字列,_先頭文字],_一文字ずらした文字列), writef('%t\n',[_一文字ずらした文字列]). 入力された文字列を表示する(_半角英数字の文字列) :- writef('%t\n',[_半角英数字の文字列]). 入力された順番と同じになったら表示終了とする。'. % % 一文字ずらしてというところが、「先読み」的な制御となり、ややこしい。 % % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #531 # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # 平成○年の値を入力し、西暦に変換するプログラムを作成 # '平成○年の値を入力し、西暦に変換する' :- '平成○年の値を入力し漢数字を数字に変換する'(_数字), '平成元年は西暦1989年であることから西暦を得る'(_数字,_西暦), format('西暦は ~w です。\n',[_西暦]). '平成○年の値を入力し漢数字を数字に変換する'(_数字) :- '平成○年の値を入力し'(_漢数字年), 漢数字を数字に変換する(_漢数字年,_数字). '平成○年の値を入力し'(_漢数字年) :- write('平成○年を入力してください : '), 漢数字年を得る(_漢数字年). 漢数字年を得る(_漢数字年) :- 行入力されたものが漢数字であるか検査する(_漢数字年),!. 漢数字年を得る(_漢数字年) :- 漢数字年を得る(_漢数字年). 行入力されたものが漢数字であるか検査する(_漢数字年) :- 行入力(_行), 年は切り取って検査する(_行,_年が切り取られた行), 漢数字年入力検査(_年が切り取られた行,_漢数字年). 年は切り取って検査する(_行,_年が切り取られた行) :- 末尾文字が年だったら切り取る(_行,_年が切り取られた行),!. 年は切り取って検査する(_行,_行). 末尾文字が年だったら切り取る(_行,_年が切り取られた行) :- sub_atom(_行,_,1,0,年), sub_atom(_行,0,_,1,_年が切り取られた行). 漢数字年入力検査(元,元) :- !. 漢数字年入力検査(_漢数字年,_漢数字年) :- forall(sub_atom(_漢数字年,_,1,_,A),'漢数字・数字'(A,_)),!. 漢数字年入力検査(_行,_) :- writef('入力された %t からは漢数字が得られませんでした。再入力をお願いします。\n',[_行]), fail. 漢数字を数字に変換する(元,1) :- !. 漢数字を数字に変換する(_年,_数字) :- '二桁年の数字を得る'(_年,_数字). 漢数字を数字に変換する(_年,_数字) :- '一桁年の数字を得る'(_年,_数字). '二桁年の数字を得る'(_年,_数字) :- '十の桁、一の桁の漢数字を切り取り数字を得る'(_年,_数字). '十の桁、一の桁の漢数字を切り取り数字を得る'(_年,_数字) :- '十の桁、一の桁の漢数字を得る'(_年,_十の桁の漢数字,_一の桁の漢数字), '十の桁、一の桁の数字を得る'(_十の桁の漢数字,_一の桁の漢数字,_十の桁の数字,_一の桁の数字), _数字 is _十の桁の数字 * 10 + _一の桁の数字. '十の桁、一の桁の漢数字を得る'(_年,_十の桁の漢数字,_一の桁の漢数字) :- sub_atom(_年,0,1,R,_十の桁の漢数字), sub_atom(_年,R,1,0,_一の桁の漢数字), R > 0. '十の桁、一の桁の数字を得る'(_十の桁の漢数字,_一の桁の漢数字,_十の桁の数字,_一の桁の数字) :- '漢数字・数字'(_十の桁の漢数字,_十の桁の数字), '漢数字・数字'(_一の桁の漢数字,_一の桁の数字). '一桁年の数字を得る'(_年,_数字) :- sub_atom(_年,0,1,0,_一の桁の漢数字), '漢数字・数字'(_一の桁の漢数字,_数字). '平成元年は西暦1989年であることから西暦を得る'(_数字,_西暦) :- _西暦 is _数字 + 1989 - 1. '漢数字・数字'(一,1). '漢数字・数字'(二,2). '漢数字・数字'(三,3). '漢数字・数字'(四,4). '漢数字・数字'(五,5). '漢数字・数字'(六,6). '漢数字・数字'(七,7). '漢数字・数字'(八,8). '漢数字・数字'(九,9). '漢数字・数字'(十,1). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/9 # # C言語プログラミング # [2] あるlistを読み込みアルファベット順に並び替 え標準出力するプログラムを作成せよ。 # [3.1] Windows vista # [3.2] gcc # [3.3] 言語: C # [4] 期限: 2011年8月2日 # [5] その他の制限: strcpyを使ってはいけないという制限があるんですが # 一度strcpy作ってから変 えてみたんですがいまいち分かりません、 # どうすればいいでしょうか? # http://ime.nu/codepad.org/LbBL9T3T # # 'あるlistを読み込みアルファベット順に並び替え標準出力する' :- あるlist(_list), アルファベット順に並び替え(_list,_整列したlist), 標準出力する(_整列したlist). アルファベット順に並び替え([],[]). アルファベット順に並び替え([_基礎語彙|_list],_整列したlist) :- 辞書順分割(_基礎語彙,_list,_小さいならび,_等しいか大きいならび), アルファベット順に並び替え(_小さいならび,_list_2), アルファベット順に並び替え(_等しいか大きいならび,_list_3), append(_小さいならび,[_基礎語彙|_等しいか大きいならび],_整列したlist). 辞書順分割(_,[],[],[]). 辞書順分割(_基礎語彙,[_語彙|R1],[_語彙|R2],R3) :- 辞書順で比較(_語彙,_基礎語彙,小さい), 辞書順分割(_基礎語彙,R1,R2,R3),!. 辞書順分割(_基礎語彙,[_語彙|R1],R2,[_語彙|R3]) :- 辞書順で比較(_語彙,_基礎語彙,等しいか大きい), 辞書順分割(_基礎語彙,R1,R2,R3),!. 辞書順で比較(_語彙1,_語彙2,_比較) :- atom_codes(_語彙1,Codes1), atom_codes(_語彙2,Codes2), 辞書順コード比較(Codes1,Codes2,_比較). 辞書順コード比較([],[_|_],小さい) :- !. 辞書順コード比較([_|_],[],等しいか大きい) :- !. 辞書順コード比較([A|R1],[B|R2],小さい) :- A >= 65, A =< 90, B >= 97, B =< 122, A =< B - 32,!. 辞書順コード比較([A|R1],[B|R2],等しいか大きい) :- A >= 65, A =< 90, B >= 97, B =< 122, A > B - 32,!. 辞書順コード比較([A|R1],[B|R2],小さい) :- A >= 97, A =< 122, B >= 65, B =< 90, A - 32 < B,!. 辞書順コード比較([A|R1],[B|R2],等しいか大きい) :- A >= 97, A =< 122, B >= 65, B =< 90, A - 32 >= B,!. 辞書順コード比較([A|R1],[A|R2],_比較) :- 辞書順コード比較(R1,R2,_比較). 辞書順コード比較([A|R1],[B|R2],小さい) :- A < B,!. 辞書順コード比較([A|R1],[B|R2],等しいか大きい) :- A >= B,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/751 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # 1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示するプログラムを作成しなさい # このプログラムの入力は、英字以外の文字が入力される場合を考慮しなくてもよい # '1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示する' :- '1行最大80文字の空白を挟まない英字文字列を入力したとき(Line), '大文字の文字を小文字に、小文字の文字を大文字にして表示する'(Line). '1行最大80文字の空白を挟まない英字文字列を入力したとき'(Line) :- get_line(Line1), 最大80文字の空白を挟まない英字文字列(Line1,Line),!. 最大80文字の空白を挟まない英字文字列(Line1,Line) :- findall(Char,( subatom(Line1,_,1,_,Char), \+(Char=' ')), L1), 最大80文字(L1,Line). 最大80文字(L,Line) :- Length =< 80, concat_atom(L,Line). 最大80文字(L,Line) :- Length > 80, length(L0,80), append(L0,_,L), concat_atom(L0,Line). '大文字の文字を小文字に、小文字の文字を大文字にして表示する'(Line) :- atom_codes(Line,Codes), append(_,[Code|R],Codes), '大文字コードを小文字コードに、小文字コードを大文字コードに変換'(Code,Code2), put_code(Code2), R = [], write('\n'). '大文字コードを小文字コードに、小文字コードを大文字コードに変換'(Code,Code2) :- Code >= 65, Code =< 90, Code2 is Code + 32,!. '大文字コードを小文字コードに、小文字コードを大文字コードに変換'(Code,Code2) :- Code >= 97, Code =< 122, Code2 is Code - 32,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/751 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # 1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示するプログラムを作成しなさい # このプログラムの入力は、英字以外の文字が入力される場合を考慮しなくてもよい # '1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示する' :- '1行最大80文字の空白を挟まない英字文字列を入力したとき(Line), '大文字の文字を小文字に、小文字の文字を大文字にして表示する'(Line). '1行最大80文字の空白を挟まない英字文字列を入力したとき'(Line) :- get_line(Line1), 最大80文字の空白を挟まない英字文字列(Line1,Line),!. 最大80文字の空白を挟まない英字文字列(Line1,Line) :- findall(Char,( subatom(Line1,_,1,_,Char), \+(Char=' ')), L1), 最大80文字(L1,Line). 最大80文字(L,Line) :- Length =< 80, concat_atom(L,Line). 最大80文字(L,Line) :- Length > 80, length(L0,80), append(L0,_,L), concat_atom(L0,Line). '大文字の文字を小文字に、小文字の文字を大文字にして表示する'(Line) :- atom_codes(Line,Codes), append(_,[Code|R],Codes), '大文字コードを小文字コードに、小文字コードを大文字コードに変換'(Code,Code2), put_code(Code2), R = [], write('\n'). '大文字コードを小文字コードに、小文字コードを大文字コードに変換'(Code,Code2) :- Code >= 65, Code =< 90, Code2 is Code + 32,!. '大文字コードを小文字コードに、小文字コードを大文字コードに変換'(Code,Code2) :- Code >= 97, Code =< 122, Code2 is Code - 32,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/168 # # よろしくお願いします # # ●正規表現の使用環境 # PHP # # ●検索か置換か? # 置換 # # ●説明 # いくつか連続した\nを、すべて<br />に置換 # # ●対象データ # \n # \n\n\n # (連続数は1〜n) # # ●希望する結果 # <br /> # <br /><br /><br /> # # # 'いくつか連続した改行を、すべてhtmlの改行指定に変換'(_文字列,_変換された文字列) :- atom_codes(_文字列,Code1), コードならびの改行をすべてhtmlの改行指定に変換(Code1,Code2), atom_codes(_変換された文字列,Code2). コードならびの改行をすべてhtmlの改行指定に変換([],[]). コードならびの改行をすべてhtmlの改行指定に変換([10|R1],[60,47,98,114,62|R2]) :- コードならびの改行をすべてhtmlの改行指定に変換(R1,R2),!. コードならびの改行をすべてhtmlの改行指定に変換([Code|R1],[Code|R2]) :- コードならびの改行をすべてhtmlの改行指定に変換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/204 # # 【質問テンプレ】 # [1] 授業単元:プログラム言語 # [2] 問題文:コマンドプロンプト上で名前と # 国語、社会、数学、理科、社会の5科目の成績を入力して、 # それをバイナリファイルで保存するプログラムを作成せよ。 # 保存するファイル名はこれらを入力する前、つまり一番最初に入力して # そのファイル名で保存するものとする。 # 30件の入力があるか、EOFの入力を持って入力を終了するものとする。 # また、これとは別に入力して作成されたバイナリファイルを開く # プログラムを作成すること。 # sample # 保存したいファイル名:student.dat # 名前:tanaka # 国語:65 # 社会:80 # 数学:54 # 理科:71 # 英語:48 #   ・ #   ・ #   ・ # ※30件かEOFの入力を持って終了 # プログラムを開くほう # sample # オープンしたいファイル:student.dat # tanakaさんの成績 国語:65点 社会:80点 数学:54点 理科:71点 英語:48点#                       ・ #                       ・ #                       ・ # 科目名(国語). 科目名(社会). 科目名(数学). 科目名(理科). 科目名(英語). 国語、社会、数学、理科、英語の5科目の成績を入力して、それをバイナリファイルで保存する :- length(_成績ならび,30), write('保存したいファイル名:'),get_line(_保存ファイル名), write('名前:'),get_line(_名前), 国語、社会、数学、理科、英語の5科目の成績を入力(_名前,_成績ならびの一), 末尾の変数部分を切り取る(_成績ならびの一,_成績ならび), バイナリファイルで保存する(_保存ファイル名,_成績ならび). 国語、社会、数学、理科、英語の5科目の成績を入力(end_of_file,L) :- !. 国語、社会、数学、理科、英語の5科目の成績を入力(_名前,[[_名前|_5科目の成績]]) :- '5科目の成績を入力'(_名前,_5科目の成績), write('名前:'),get_line(_名前2),!. 国語、社会、数学、理科、英語の5科目の成績を入力(_名前,[[_名前|_5科目の成績]|R]) :- '5科目の成績を入力'(_名前,_5科目の成績), write('名前:'),get_line(_名前2), 国語、社会、数学、理科、英語の5科目の成績を入力して(_名前2,R). '5科目の成績を入力'(_5科目の成績) :- findall([_科目名,_成績],( 科目名(_科目名), writef('%t: ',[_科目名]), get_integer(_成績)), _5科目の成績). 末尾の変数部分を切り取る([],[]) :- !. 末尾の変数部分を切り取る([V|R],[]) :- var(V),!. 末尾の変数部分を切り取る([A|R1],[A|R2]) :- 末尾の変数部分を切り取る(R1,R2). バイナリファイルで保存する(_保存ファイル名,_成績ならび) :- open(_保存ファイル名,write,Outstream,[type(binary)]), append(_,[_科目ならび]|R],_成績ならび), '8ビットコードで一行分書き出す'(Outstream,_項目ならび), R = [], close(Outstream),!. '8ビットコードで一行分書き出す'(Outstream,[_氏名,_5科目ならび]) :- 氏名の出力(Outstream,_氏名), append(_,[[_科目名,_成績ならび]|R],_5科目ならび), 成績ならびの出力(Outstream,_5科目ならび), R = [], put_byte(Outstream,10),!. 氏名の出力(Outstream,_氏名) :- atom_codes(_氏名,Codes), 全角文字を8ビット展開(Codes,Codes1), append(_,[Code|R1],Code1), put_byte(Outstream,Code), R1 = [], put_byte(Outstream,32),!. 成績ならびの出力(Outstream,_5科目ならび) :- append(_[[_科目名,_成績]|R],_5科目ならび), 科目名の出力(Outstream,_科目名), 成績の出力(Outstream,_成績), R = [],!. 科目名の出力(Outstram,_科目名) :- atom_codes(_項目名,Codes), 全角文字を8ビット展開(Codes,Codes2), append(_,[Code|R],Code2), put_byte(Outstream,Code), R = [], put_byte(Outstream,58),!. 成績の出力(Outstram,_成績) :- number_codes(_成績,Codes), append(_,[Code|R],Code), put_byte(Outstream,Code), R = [], put_byte(Outstream,32),!. 全角文字を8ビット展開([],[]). 全角文字を8ビット展開([N|R1],[N2,N3|R2]) :- N >= 256, N2 is N // 256, N3 is N mod 256, 全角文字を8ビット展開(R1,R2). 全角文字を8ビット展開([N|R1],[N|R2]) :- N < 256, 全角文字を8ビット展開(R1,R2). % 以下のサイトは # 出典:: 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/41 # # [1] 授業単元: Cプログラミング2 # [2] 問題文(含コード&リンク): キーボードより文字列aと文字列bを入力し、 # 比較する(どちらが辞書並びで先かを表示する)プログラムを作りなさい。 # 但し、strcmp関数を用いてはならない。 # 'キーボードより文字列aと文字列bを入力し、比較する(どちらが辞書並びで先かを表示する)' :- 'キーボードより文字列aと文字列bを入力し'(_a,_b), '文字列aと文字列bをそれぞれコードならびに変換して'(_a,_b,Codes_a,Codes_b), 辞書順用にコード列を変換する(Code_a,Code_a_2), 辞書順用にコード列を変換する(Code_b,Code_b_2), '比較する(どちらが辞書並びで先かを表示する)'(_文字列a,Code_a_2,_文字列b,Cod_b_2). 'キーボードより文字列aと文字列bを入力し'(_a,_b) :- get_line(_文字列a), get_line(_文字列b). '文字列aと文字列bをそれぞれコードならびに変換して'(_a,_b,Codes_a,Codes_b) :- atom_codes(_文字列a,Codes_a), atom_codes(_文字列b,Codes_b). 辞書順用にコード列を変換する([],[]) :- !. 辞書順用にコード列を変換する([A|R1],[B|R2]) :- 英大文字は小文字に変換した上で10倍する(A,B), 辞書順用にコード列を変換する(R1,R2),!. 辞書順用にコード列を変換する([A|R1],[B|R2]) :- その他は10倍した上で1を足す(A,B), 辞書順用にコード列を変換する(R1,R2),!. 英大文字は小文字に変換した上で10倍する(A,B) :- between(65,90,A), B is (A + 32) * 10. その他は10倍した上で1を足す(A,B) :- B is A * 10 + 1. '比較する(どちらが辞書並びで先かを表示する)'(_文字列a,Code_a_2,_文字列b,Cod_b_2) :- Code_a_2 @=< Code_b_2, writef('%t %t の順\n',[_文字列a,_文字列b]),!. '比較する(どちらが辞書並びで先かを表示する)'(_文字列a,Code_a_2,_文字列b,Cod_b_2) :- Code_a_2 @> Code_b_2, writef('%t %t の順\n',[_文字列b,_文字列a]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/955 # # 【 課題 】ネットワークを使用したプログラムを作成 # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】 制限なし # 【 期限 】2月12日 # 【 Ver  】java version "1.5.0_26" # 【 補足 】サーバーを作り、そこにtelnetで接続してというプログラムです。例として、英単語に対応する日本語もったサーバを作り、クライアントから送られてきた単語に対応する日本語を送り出すものです。 # ほかに、チャットサーバーをつくり、接続済みのクライアント全てにデータを流すというものなどです。 # 母さんが倒れて課題をやる暇がなくて卑怯だとおもう...でも間に合いそうにない;どうか、手を貸していただきたい。 # もしできあがられましたら、deal_of_deal.yahoo.co.jpのほうへプログラムを書いて送ってくださいorz # # 英和辞典(eat,動詞,[食べる]). 英和辞典(room,名詞,[部屋,余地]). 英和辞典サーバ(_ポート番号) :- 'TCP/IPサーバ開設'(_ポート番号,Socket,Socket2,Input,Output), repeat, command_prompt, socket_raw_receive(NewSocket,4096,_,L,Length), append(L0,[13,10|_],L), atom_codes(_英単語,L0), 英単語に対応する日本語を返す(Output,_英単語), _英単語 = exit, 'TCP/IPサーバ閉鎖'(Socket,Socket2,Input,Output),!. command_prompt(Output) :- write(Output,'英単語をいれてください : '), flush_output(Output),!. 英単語に対応する日本語を返す(Output,exit) :- !. 英単語に対応する日本語を返す(Output,_英単語) :- 英和辞典(_英単語,_,_日本語ならび), append(_,[_日本語|R],_日本語ならび), write_formatted(Output,'%t\n',[_日本語]), flush_output(Output), R = [],!. 'TCP/IPサーバ開設'(Port,Socket,Socket2,Input,Output) :- socket(internet,stream,Socket), socket_bind(Socket,Port), repeat, socket_listen(Socket,1000000), socket_accept(Socket,Host : Port2,NewSocket), open(NewSocket,read,Input), open(NewSocket,write,Output). 'TCP/IPサーバ閉鎖'(Socket,Socket2,Input,Output) :- close(Output), close(Input), socket_shutdown(NewSocket), socket_shutdown(Socket). % 以下のサイトは # 出典:: 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 # # 3.1 気温と温度を入力すると、不快指数の値とその値で不快に感じる人の割合を # 表示するプログラムを作成せよ。 # (不快指数) = 0.81 * 気温 + 0.01 * 湿度 * (0.99 * 気温 - 14.3) + 46.3 # 不快指数の値によって次の表に示す割合の人が不快に感じるといわれている。 # 不快指数 割合 # 77未満 約9% # 77以上85未満 約65% # 85以上 約93% '気温と温度を入力すると、不快指数の値とその値で不快に感じる人の割合を表示する' :- '気温と湿度を入力すると、'(_気温,_湿度), 不快指数の値とその値で不快に感じる人の割合を表示する(_気温,_湿度,_不快指数). '気温と湿度を入力する、'(_気温,_湿度) :- 気温を入力する(_気温), 湿度を入力する(_湿度). 気温を入力する(_気温) :- write('気温を入力してください : '), 行入力(_行), 気温入力診断(_行,_気温),!. 気温を入力する(_気温) :- 気温を入力する(_気温). 湿度を入力する(_湿度) :- write('湿度を入力してください : '), 行入力(_行), 湿度入力診断(_行,_湿度),!. 湿度を入力する(_湿度) :- 湿度を入力する(_湿度). 気温入力診断(_行,_気温) :- read_term_from_atom(_行,_気温,[]), integer(_気温),!. 気温入力診断(_行,_) :- writef('入力された文字列 %t からは気温を得られませんでした。再入力をお願いします。\n',[_行]), fail. 湿度入力診断(_行,_湿度) :- read_term_from_atom(_行,_湿度,[]), integer(_湿度),!. 湿度入力診断(_行,_) :- writef('入力された文字列 %t からは湿度を得られませんでした。再入力をお願いします。\n',[_行]), fail. 不快指数の値とその値で不快に感じる人の割合を表示する(_気温,_湿度,_不快指数) :- 不快指数の値とその値で不快に感じる人の割合を(_気温,_湿度,_不快指数,_不快に感じる人の割合), 表示する(_不快指数,_不快に感じる人の割合). 不快指数の値とその値で不快に感じる人の割合を(_気温,_湿度,_不快指数,_不快に感じる人の割合) :- 不快指数の値と(_気温,_湿度,_不快指数), 不快に感じる人の割合を(_不快指数,_不快に感じる人の割合), 不快指数の値と(_気温,_湿度,_不快指数) :- _不快指数 is 0.81 * _気温 + 0.01 * _湿度 * (0.99 * _気温 - 14.3) + 46.3. 不快に感じる人の割合を(_不快指数,9) :- 不快指数が77未満(_不快指数). 不快に感じる人の割合を(_不快指数,65) :- 不快指数が77以上85未満の時(_不快指数). 不快に感じる人の割合を(_不快指数,85) :- 不快指数が85以上の時(_不快指数). 不快指数が77未満(_不快指数) :- _不快指数 < 77. 不快指数が77以上85未満の時(_不快指数) :- _不快指数 >= 77, _不快指数 < 85. 不快指数が85以上の時(_不快指数) :- _不快指数 >= 85. 表示する(_不快指数,_不快に感じる人の割合) :- writef('不快指数は %t, この状態を不快に感じる人の割合は 約%t%%です\n',[_不快指数,_不快に感じる人の割合]). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/143 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # # 3. 問1, 2 を利用して、8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す関数 # myatoi() を作成せよ。 # myatoi(_文字列,_整数値) :- '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(_文字列,_整数値). '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(_文字列,_整数値) :- '文字列を引数とし、これらの条件を同時に満たす時に整数値1を一つでも満たさない時には0戻す'(_文字列,1), '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、負の時には-1を、整数として文字列にエラーがある場合には0 を返す'(_文字列,_プラス1またはマイナス1), 符号を除いた文字列(_文字列,_符号を除いた文字列), 文字列を整数に変換(_文字列,_整数値の一), _整数値 is _整数値の一 * _ブラス1またはマイナス1. 文字列を整数に変換(_文字列,_整数値) :- atom_codes(_文字列,Codes), 文字列を整数に変換(Codes,0,_整数値). 文字列を整数に変換([],_整数値,整数値) :- !. 文字列を整数に変換([Code|R],_整数値1,整数値) :- _整数値2 is _整数値1 * 10 + Code - 48, 文字列を整数に変換(R,_整数値2,整数値). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/137 # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # # c言語の問題について # 10桁以上ある2進数をユーザに入力させ, # それを4桁ずつ区切って(16進数で)表示するプログラムを作成せよ # # 実行例です。 # H:\> prog0904 000111101001001 # 0001 = 1 # 1110 = e # 1001 = 9 # 001 = 1 # # '10桁以上ある2進数をユーザに入力させ,それを4桁ずつ区切って(16進数で)表示する' :- '10桁以上ある2進数をユーザに入力させ'(_10桁以上ある2進数), '4桁ずつ区切って(16進数で)表示する'(_10桁以上ある2進数). '10桁以上ある2進数をユーザに入力させ'(_10桁以上ある2進数) :- write('0または1が並ぶ2進数値を入力してください : \n'), get_line(Line), '10桁以上ある2進数入力診断'(Line,_10桁以上ある2進数),!. '10桁以上ある2進数をユーザに入力させ'(_10桁以上ある2進数) :- '10桁以上ある2進数をユーザに入力させ'(_10桁以上ある2進数). '10桁以上ある2進数入力診断'(Line,_10桁以上ある2進数) :- atom_length(Line,_文字列の長さ), _文字列の長さ < 10, write_formatted('入力された %t は10桁に達しません。再入力をお願いします。\n',[Line]),!, fail. '10桁以上ある2進数入力診断'(Line,_10桁以上ある2進数) :- atom_codes(Line,Codes), findall(N,( append(_,[Code|_],Codes), N is Code-48), _10桁以上ある2進数), '要素は0か1だけである'(_10桁以上ある2進数),!. '10桁以上ある2進数入力診断'(Line,_10桁以上ある2進数) :- write_formatted('入力された文字列 %t には0,1以外の文字が含まれています。再入力をお願いします。\n',[Line]), fail. '要素は0か1だけである'([]) :- !. '要素は0か1だけである'([0|R]) :- '要素は0か1だけである'(R),!. '要素は0か1だけである'([1|R]) :- '要素は0か1だけである'(R),!. '4桁ずつ区切って(16進数で)表示する'([]) :- !. '4桁ずつ区切って(16進数で)表示する'([A]) :- '16進数'([0,0,0,A]), write_formatted('%t = %t\n',[A,X]),!. '4桁ずつ区切って(16進数で)表示する'([A,B]) :- '16進数'(0,0,A,B,X), write_formatted('%t%t = %t\n',[A,B,X]),!. '4桁ずつ区切って(16進数で)表示する'([A,B,C]) :- '16進数'(0,A,B,C,X), write_formatted('%t%t%t = %t\n',[A,B,C,X]),!. '4桁ずつ区切って(16進数で)表示する'([A,B,C,D|R]) :- '16進数'(A,B,C,D,X), write_formatted('%t%t%t%t = %t\n',[A,B,C,D,X]), '4桁ずつ区切って(16進数で)表示する'(R). '16進数'(A,B,C,D,X) :- _値 is 8 * A + 4 * B + 2 * C + D, '16進数表示'(_値,X). '16進数表示'(N,X) :- N < 10, number_to_atom(N,X). '16進数表示'(10,'A'). '16進数表示'(11,'B'). '16進数表示'(12,'C'). '16進数表示'(13,'D'). '16進数表示'(14,'E'). '16進数表示'(15,'F'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/7 # # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示するプログラムを作成しなさい。 # ただし、文字を大文字に変換する関数を作成し、それを利用すること。 # 'キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示する' :- キーボードから入力した文字列を(_文字コードならび), すべて大文字に変換して(_文字コードならび,_大文字に変換された文字コードならび), 表示する(_大文字に変換された文字コードならび). キーボードから入力した文字列を(_文字コードならび) :- write('文字列を入力してください : '), read_line_to_codes(user_input,_文字コードならび). すべて大文字に変換して([],[]). すべて大文字に変換して(L1,L2) :- 小文字場合は大文字に変換する(L1,L2). 小文字場合は大文字に変換する([_文字コード|R1],[_変換されたコード|R2]) :- 小文字の場合は大文字に変換して(_文字コード,_変換されたコード), すべて大文字に変換して(R1,R2). 小文字の場合は大文字に変換して(_文字コード,_変換されたコード) :- 小文字の場合は(_文字コード), 大文字に変換して(_文字コード,_変換されたコード). 小文字の場合は大文字に変換して(_文字コード,_文字コード) :- 小文字でない場合は変換せずに(_文字コード). 小文字の場合は(_文字コード) :- between(97,121,_文字コード). 大文字に変換して(_文字コード,_変換されたコード) :- _大文字コード is _文字コード - 32. 小文字でない場合は変換せずに(_文字コード) :- \+(小文字の場合は(_文字コード)). 表示する(_大文字に変換された文字コードならび) :- atom_codes(_文字列,_大文字に変換された文字コードならび), writef('%w\n',[_文字列]). % 以下のサイトは # 出典:: 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/585 # # 2桁以上の英数字にマッチするけど3桁にはマッチしない正規表現はどう書けば良いんでしょうか? # '2桁以上の英数字にマッチするけど3桁にはマッチしない'(_文字列,_2桁以上の英数字) :- sub_atom(_文字列,_,_副文字列の長さ,_,_2桁以上の英数字), _副文字列の長さ >= 2, \+(_副文字列の長さ=3), atom_codes(_2桁以上の英数字,L), すべて英数コード(L). すべて英数コード([]) :- !. すべて英数コード([_コード|R]) :- 英数コード(_コード), すべて英数コード(R). 英数コード(Code) :- Code >=48,Code =< 57,!. 英数コード(Code) :- Code >=65,Code =< 90,!. 英数コード(Code) :- Code >=97,Code =< 122,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/585 # # 2桁の英数字にはマッチするけど3桁にはマッチしない正規表現はどう書けば良いんでしょうか? # % 「3桁にはマッチしない」は表現できない。 % こちらを参照してください '2桁の英数字にはマッチするけど3桁にはマッチしない'(_文字列,_2桁の英数字) :- sub_atom(_文字列,_,2,_,_2桁の英数字), atom_codes(_2桁の英数字,[Code1,Code2]), 英数コード(Code1), 英数コード(Code2). 英数コード(Code) :- Code >=48,Code =< 57,!. 英数コード(Code) :- Code >=65,Code =< 90,!. 英数コード(Code) :- Code >=97,Code =< 122,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/480 # # [1] 授業単元:プログラミング2 # [2] 問題文(含コード&リンク): # (1)文字列を入力してその文字列のデータサイズを求めて表示させるプログラムを作成せよ。 #  実行例: #    >入力文字列は? 大阪府 #    >文字列"大阪府"のデータサイズは 7byte # # # ヒント: # 入力文字列を一時保存するための入力バッファchar buf[256];を用意する # 文字列の大きさは関数strlenで求めることができる。string.hをインクルード # 文字列は最後にnull文字'\0'が入っており、strlenで求めた大きさにはnull文字は含まれないので注意すること。 # # (2)char*型配列 char *ps[10];を用意する。 # キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。 # ただし、文字列は動的確保を用いて文字列の大きさ分だけを確保し、余分なメモリをしようしないようにせよ。 # すべての文字列を入力し終わったら、ps[]に格納された文字列を順にディスプレイに表示させよ。 # # ヒント: # 最初にps[]の初期化としてps[]の各要素にNULLを代入しておく。 # 配列の動的確保も変数と同様に配列データの大きさ分(byte)をmallocで確保すればよい。 # プログラムの最後で、ps[]の各要素に対して、動的確保したメモリを開放するのを忘れないこと。 # # 文字列を入力してその文字列のデータサイズを求めて表示させる :- write('入力文字列は? '), get_line(Line), atom_codes(Line,Codes), findsum(Code_size,( append(_,[Code|_],Codes), Code_size is (Code // 32768) + 1), _データサイズ), write_formatted('入力文字列のデータサイズは%tです\n',[_データサイズ]). 'キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。' :- length(L1,10), 'キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。'(L1,_ps), put_lines(_ps). 'キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。'([],[]) :- !. 'キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。'([_|R1],[_行|R2]) :- get_line(_行), 'キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。'(R1,R2). % 以下のサイトは % 要素がすべてアトムであるリストがある時、その要素のアトムの表示最大桁を求める。 % ただし、文字コードはEUCとする。 表示最大桁([],_表示最大桁,_表示最大桁). 表示最大桁([_文字列|R],_これまでの表示最大桁,_表示最大桁) :- 表示桁数(_文字列,_文字列の表示桁数), _文字列の表示桁数 > _これまでの表示最大桁, 表示最大桁(R,_文字列の表示桁数,_表示最大桁). 表示最大桁([_文字列|R],_これまでの表示最大桁,_表示最大桁) :- 表示桁数(_文字列,_文字列の表示桁数), _文字列の表示桁数 =< _これまでの表示最大桁, 表示最大桁(R,_これまでの表示最大桁,_表示最大桁). 表示桁数(_文字列,_表示桁数) :- atom_codes(_文字列,Codes), findsum(N,(member(C,Codes),(C > 255,N=2;C =< 255,N=1)),Sum), _表示桁数 is truncate(Sum). % 副目標として、表示桁数/2が重複して呼び出されていて実行速度としては速いとはいえないが、 % わかりやすいコードということから、このコードを採用した。 % 以下のサイトは # 出典 :: ★★ 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. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 137代目 #936 # お手上げです。頑張ったのですが、できませんでした。 # 申し訳ないですけどお願いします。 # # 問題 # # 複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力するプログラムを作成せよ. # # 【実行例】 # # 何個の文字列を入力しますか?:4 # 入力文字列[1]:Computer # 入力文字列[2]:Science # 入力文字列[3]:Tarou # 入力文字列[4]:Tanaka # # 繋ぎ合わせる順番: # 2 # 4 # 3 # 1 # # 結果:ScienceTanakaTarouComputer # '複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する' :- '複数の文字列を読み込み,'(_複数の,_入力文字列ならび), 'さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する'(_複数の,_入力文字列ならび). '複数の文字列を読み込み,'(_複数の,_入力文字列ならび) :- 複数の(_複数の), findall(_行,( 文字列を読み込み(_複数の,_行)),_入力文字列ならび). 複数の(_複数の) :- 整数を得る('何個の文字列を入力しますか?: ',true,_複数の), writef('文字列を%w行連続して入力してください\n',[_複数の]). 文字列を読み込み(_複数の,_行) :- between(1,_複数の,_), 行入力(_行). 'さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する'(_複数の,_入力文字列ならび) :- 'さらに,それらの文字列を繋ぎ合わせる順番を入力し'(_複数の,_取り出し順ならび), 結果を出力する(_入力文字列ならび,_取り出し順ならび). 'さらに,それらの文字列を繋ぎ合わせる順番を入力し'(_複数の,_取り出し順ならび) :- write('入力した文字列を繋ぎ合わせる順番を入力してください\n'), それらの文字列を繋ぎ合わせる順番を入力し(_複数の,_取り出し順ならび). それらの文字列を繋ぎ合わせる順番を入力し(_複数の,_取り出し順ならび) :- findall(_番目,( 順番を入力し(_複数の,_番目)),_取り出し順ならび). 順番を入力し(_複数の,_番目) :- between(1,_複数の,_), 整数を得る(_番目). 整数を得る(_番目) :- 整数を得る('',true,_番目). 結果を出力する(_入力文字列ならび,_取り出し順ならび) :- 結果を(_入力文字列ならび,_取り出し順ならび,_指定した順番の文字列ならび), 出力する(_指定した順番の文字列ならび). 結果を(_入力文字列ならび,_取り出し順ならび,_指定した順番の文字列ならび) :- findall(_文字列,( 指定順に取り出す(_入力文字列ならび,_取り出し順ならび,_文字列)),_指定した順番の文字列ならび). 指定順に取り出す(_入力文字列ならび,_取り出し順ならび,_文字列) :- member(_番目,_取り出し順ならび), nth1(_番目,_入力文字列ならび,_文字列). 出力する(_指定した順番の文字列ならび) :- 文字列を指定した順番に繋ぎ合わせて(_指定した順番の文字列ならび,_表示文字列), writef('繋ぎ合わせた文字列は: %w\n',[_表示文字列]). 文字列を指定した順番に繋ぎ合わせて(_指定した順番の文字列ならび,_表示文字列) :- atomic_list_concat(_指定した順番の文字列ならび,_表示文字列). 整数を得る(_催促文,_条件,_整数) :- 以下の入力に失敗した場合は再入力する, '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 以下の入力に失敗した場合は再入力する :- repeat. '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- call(_条件). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/619 # # [1] 授業単元:Cプログラミング演習 # [2] 問題文(含コード&リンク): # 問題1. 10進数1234を2進数で表示するプログラムを作成せよ。 # 問題2. 変数の下位16ビット中の1のビット数を数える # '10進数1234を2進数で表示する' :- write('0b'), '10進数1234を2進数で表示する'(1234,[],L), append(_,[A|R],L), write_formatted('%t\n',[A]), R = []. '10進数1234を2進数で表示する'(_,L,L) :- !. '10進数1234を2進数で表示する'(N,L1,L) :- M is N mod 2, N1 is N // 2, '10進数1234を2進数で表示する'(N1,[M|L1],L). 変数の下位16ビット中の1のビット数を数える(_変数,_頻度) :- integer(_変数), M is _変数 mod 65536, 整数の下位16ビット中の1のビット数を数える(M,_頻度). 変数の下位16ビット中の1のビット数を数える(_変数,_頻度) :- atom(_変数), atom_codes(_変数,Codes), 'Codesの下位16ビット中の1のビット数を数える'(Codes,_頻度). 整数の下位16ビット中の1のビット数を数える(0,0) :- !. 整数の下位16ビット中の1のビット数を数える(N,X) :- 0 is N mod 2, N1 is N // 2, 整数の下位16ビット中の1のビット数を数える(N1,X). 整数の下位16ビット中の1のビット数を数える(N,X) :- 1 is N mod 2, N1 is N // 2, 整数の下位16ビット中の1のビット数を数える(N1,Y), X is Y + 1. 'Codesの下位16ビット中の1のビット数を数える'(Codes,_頻度) :- last(Codes,Code), Code >= 256, 整数の下位16ビット中の1のビット数を数える(N,_頻度),!. 'Codesの下位16ビット中の1のビット数を数える'(Codes,_頻度) :- last(Codes,Code), Code < 256, append(_,[A,B],Codes), N is (A * 256 + B) mod 65536, 整数の下位16ビット中の1のビット数を数える(N,_頻度),!. 'Codesの下位16ビット中の1のビット数を数える'([Code],_頻度) :- 整数の下位16ビット中の1のビット数を数える(Code,_頻度),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/504 # # [1]授業単元:プログラミング演習 # [2]問題文;離散探索木(26進)と外部ハッシュ法の比較(探索関数) #  キー:   文字列 #  使用ファイル: wordE100KR.dat #  上記ファイルを読み込み、通常の配列に格納する。 #  この配列から要素を読み込み、分離連鎖法および離散探索木(26進)を生成する。 #  格納された要素と同一の要素集合すなわち、配列に格納された用語集合に対して、1万語毎に探索を行い、照合回数、および探索時間を測定する。 #  結果として、照合回数について20個のデータ(2×10)、同様に探索時間について20個のデータ(2×10)が得られる。 #  これらのデータをExcelに格納し、表、グラフを作成し、分析せよ。 # [3]環境 # [3.1]OS;windowsXP # [3.2]コンパイラ名とバージョン:gcc # [3.3] 言語:C/C++どちらでも可 # [4]期限;7月8日 # # 使用ファイルはhttp://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/main.htmにあります。 # 丸投げで申し訳ありません。よろしくお願いします。 # 分離連鎖の初期化(_ハッシュ表の長さ) :- abolish(分離連鎖/2), abolish(ハッシュ表の長さ/1), assertz(ハッシュ表の長さ(_ハッシュ表の長さ)), M is _ハッシュ表の長さ - 1, for(0,N,M), assertz(分離連鎖(N,[])), N = M,!. 分離連鎖法による文字列の検索(_文字列,_付加情報) :- atom_codes(_文字列,Codes), 加算(Codes,Y), ハッシュ表の長さ(_ハッシュ表の長さ), _ハッシュ値 is truncate(Y) mod _ハッシュ表の長さ, 分離連鎖(_ハッシュ値,L), append(_,[[_文字列|_付加情報]|_],L). 分離連鎖法による文字列の追加(_文字列,_付加情報) :- atom_codes(_文字列,Codes), 加算(Codes,Y), ハッシュ表の長さ(_ハッシュ表の長さ), _ハッシュ値 is truncate(Y) mod _ハッシュ表の長さ, retract(分離連鎖(_ハッシュ値,L)), asserta(分離連鎖(_ハッシュ値,[[_文字列|_付加情報]|L])). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/198 # # ファイルkadai.txt に記述された数行の数値を表す文字列を読み込み、 # 整数に変更して数値として表示するプログラムを作成せよ。 # 関数としてstrtol()を使用すれば問題ないが、同じ機能の関数を作成すること。 # 基数の設定に関する引数は必要なくデフォルト(先頭が0 なら8 進、それ以外は10 進、16 進は使用しない)とする # 'ファイルkadai.txt に記述された数行の数値を表す文字列を読み込み、整数に変更して数値として表示する' :- get_lines('kadai.txt',_行ならび), append(_,[_行文字列|R],_行ならび), 整数に変更して(_行文字列,_整数), write_formatted('%t\n',[_整数]), R = []. 整数に変更して(_行文字列,_整数) :- sub_atom(_行文字列,0,1,_,'0'), atom_codes(_行文字列,Codes), reverse(Codes,Codes2), 反転した基数コードならびから10進数を得る(8,Codes2,_整数),!. 整数に変更して(_行文字列,_整数) :- atom_codes(_行文字列,Codes), reverse(Codes,Codes2), 反転した基数コードならびから10進数を得る(10,Codes2,_整数),!. 反転した基数コードならびから10進数を得る(_,[],0) :- !. 反転した基数コードならびから10進数を得る(_基数,[C|R],M) :- \+((C >=48,C =< 57)), 反転した基数コードならびから10進数を得る(_基数,R,M),!. 反転した基数コードならびから10進数を得る(_基数,[C|R],M) :- M0 is C - 48, 反転した基数コードならびから10進数を得る(_基数,R,M2), M is M2 * _基数 + M0. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/133 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク): # [1] 授業単元: # char buf[80]; # int main(int ac, char ** av) # { # int i; # buf[0] = '\0'; # for(i = 1; i < ac; i++){ # printf("%3d \"%s\"\n", strlen(av[i]), av[i]); # strcat(buf, av[i]); # } # printf("%3d \"%s\"\n", strlen(buf), buf); # # これを入力した文字列を逆順に表示できるように書き換えよ # 'バイナリーモードで読み込まれたバイトコードならびを逆順に並べ変えた後に、EUC全角文字を復元して文字列を作る'(_コードならび,_逆順文字列) :- reverse(_コードならび,_逆転したコードならび), 'EUC全角文字コードを復元する'(_コードならび,_文字単位ならび), atom_codes(_逆順文字列,_文字単位ならび). 'EUC全角文字コードを復元する'([],[]) :- !. 'EUC全角文字コードを復元する'([C1,C2|R1],[C|R2]) :- C1 > 127, C2 > 127, C is C2 * 256 + C1, 'EUC全角文字コードを復元する'(R1,R2),!. 'EUC全角文字コードを復元する'([C|R1],[C|R2]) :- 'EUC全角文字コードを復元する'(R1,R2),!. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 136代目 #602 # 【質問テンプレ】 # [1] 授業単元:画像処理 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10665.txt # # <問題文> # 画像ファイルを読み込み、その画像の濃度ヒストグラムを作成しなさい。 # すべての画像サイズは256*256となっている。 # ヒストグラムは階調値0-255を32段階でカウントする。 # また、頻度の表示は100個ごとに表示する。 '画像ファイルを読み込み、その画像の濃度ヒストグラムを作成する' :- '画像ファイルを読み込み'(_画像ファイル,_,_データ部値ならび), 'ヒストグラムの作成'(_データ部値ならび,LL), 'ヒストグラムの表示'(LL). '画像ファイルを読み込み'(_画像ファイル,_,_データ部値ならび) :- 'すべての画像サイズは256*256となっている'(_データ部サイズ), open(_画像ファイル,read,Input), 画像ファイルヘッダの読み込み(_画像ファイル,Input,_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ), close(Input), 画像ファイルデータ部の読み込み(_画像ファイル,_画像ファイルヘッダバイトサイズ,_データ部サイズ,_データ部値ならび),!. 画像ファイルデータ部の読み込み(_画像ファイル,_画像ファイルヘッダバイトサイズ,_データ部サイズ,_データ部値ならび) :- open(_画像ファイル,read,Input2,[type(binary)]), between(1,_画像ファイルヘッダバイトサイズ,N), get_byte(Input2,_), N = _画像ファイルヘッダバイトサイズ, findall(X,( between(1,_データ部サイズ,N), get_byte(Input2,X)) _データ部値ならび), close(Input2). 'すべての画像サイズは256*256となっている'(_データ部サイズ) :- _データ部サイズ is 256 * 256 * 3. 'ヒストグラムの作成'(_データ部値ならび,L1,LL) :- 'ヒストグラムは階調値0-255を32段階でカウントする'(L1,L2), '頻度の表示は100個ごとに'(L2,LL). 'ヒストグラムは階調値0-255を32段階でカウントする'([],[]) :- !. 'ヒストグラムは階調値0-255を32段階でカウントする'([R,G,B|R1],[_階調|R2]) :- _階調 is ((R + G + B) // 3) // 8, 'ヒストグラムは階調値0-255を32段階でカウントする'(R1,R2). '頻度の表示は100個ごとに'(L2,LL) :- findall(L_2,( between(0,31,N), count((member(M,L2),M >= N,M =< N + 31),Count_1), Count is Count_1 // 100, length(L_2,Count)), LL). 'ヒストグラムの表示'(_,[]) :- !. 'ヒストグラムの表示'(N,[L|R]) :- all(L,'*'), atomic_list_concat(L,_星表示), _範囲下限 is N * 32, _範囲上限 is _範囲下限 + 31, writef('%w~%w: %w\n',[_範囲下限,_範囲上限,_星表示]), N2 is N + 1, 'ヒストグラムの表示'(N2,R). 画像ファイルヘッダの読み込み(_画像ファイル,Input,_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ) :- findall(Line,( nth1(N,_,_), get_line(Input,Line), ( Line = '\n',!,fail; true )), _画像ファイルヘッダ), 画像ファイルヘッダサイズを得る(_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ),!. 画像ファイルヘッダサイズを得る([],1) :- !. 画像ファイルヘッダサイズを得る([Line|R],Size) :- 行のバイトサイズ(Line,_行のバイトサイズ), 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 1. 行のバイトサイズ([],1) :- !. 行のバイトサイズ([A|R],Size) :- char_code(A,Code), Code > 255, 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 2,!. 行のバイトサイズ([A|R],Size) :- char_code(A,Code), Code < 256, 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 1,!. all([],_). all([V|R],V) :- all(R,V). get_line(Input,Line) :- read_line_to_codes(Input,Codes), atom_codes(Line,Codes). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 136代目 #602 # 【質問テンプレ】 # [1] 授業単元:画像処理 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10665.txt # # <問題文> # 画像ファイルを読み込み、その画像の濃度ヒストグラムを作成しなさい。 # すべての画像サイズは256*256となっている。 # ヒストグラムは階調値0-255を32段階でカウントする。 # また、頻度の表示は100個ごとに表示する。 '画像ファイルを読み込み、その画像の濃度ヒストグラムを作成する' :- '画像ファイルを読み込み'(_画像ファイル,_,_データ部値ならび), 'ヒストグラムの作成'(_データ部値ならび,LL), 'ヒストグラムの表示'(LL). '画像ファイルを読み込み'(_画像ファイル,_,_データ部値ならび) :- 'すべての画像サイズは256*256となっている'(_データ部サイズ), open(_画像ファイル,read,Input), 画像ファイルヘッダの読み込み(_画像ファイル,Input,_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ), close(Input), 画像ファイルデータ部の読み込み(_画像ファイル,_画像ファイルヘッダバイトサイズ,_データ部サイズ,_データ部値ならび),!. 画像ファイルデータ部の読み込み(_画像ファイル,_画像ファイルヘッダバイトサイズ,_データ部サイズ,_データ部値ならび) :- open(_画像ファイル,read,Input2,[type(binary)]), between(1,_画像ファイルヘッダバイトサイズ,N), get_byte(Input2,_), N = _画像ファイルヘッダバイトサイズ, findall(X,( between(1,_データ部サイズ,N), get_byte(Input2,X)) _データ部値ならび), close(Input2). 'すべての画像サイズは256*256となっている'(_データ部サイズ) :- _データ部サイズ is 256 * 256 * 3. 'ヒストグラムの作成'(_データ部値ならび,L1,LL) :- 'ヒストグラムは階調値0-255を32段階でカウントする'(L1,L2), '頻度の表示は100個ごとに'(L2,LL). 'ヒストグラムは階調値0-255を32段階でカウントする'([],[]) :- !. 'ヒストグラムは階調値0-255を32段階でカウントする'([R,G,B|R1],[_階調|R2]) :- _階調 is ((R + G + B) // 3) // 8, 'ヒストグラムは階調値0-255を32段階でカウントする'(R1,R2). '頻度の表示は100個ごとに'(L2,LL) :- findall(L_2,( between(0,31,N), count((member(M,L2),M >= N,M =< N + 31),Count_1), Count is Count_1 // 100, length(L_2,Count)), LL). 'ヒストグラムの表示'(_,[]) :- !. 'ヒストグラムの表示'(N,[L|R]) :- all(L,'*'), atomic_list_concat(L,_星表示), _範囲下限 is N * 32, _範囲上限 is _範囲下限 + 31, writef('%w~%w: %w\n',[_範囲下限,_範囲上限,_星表示]), N2 is N + 1, 'ヒストグラムの表示'(N2,R). 画像ファイルヘッダの読み込み(_画像ファイル,Input,_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ) :- findall(Line,( nth1(N,_,_), get_line(Input,Line), ( Line = '\n',!,fail; true )), _画像ファイルヘッダ), 画像ファイルヘッダサイズを得る(_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ),!. 画像ファイルヘッダサイズを得る([],1) :- !. 画像ファイルヘッダサイズを得る([Line|R],Size) :- 行のバイトサイズ(Line,_行のバイトサイズ), 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 1. 行のバイトサイズ([],1) :- !. 行のバイトサイズ([A|R],Size) :- char_code(A,Code), Code > 255, 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 2,!. 行のバイトサイズ([A|R],Size) :- char_code(A,Code), Code < 256, 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 1,!. all([],_). all([V|R],V) :- all(R,V). get_line(Input,Line) :- read_line_to_codes(Input,Codes), atom_codes(Line,Codes). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/744 # [1]プログラミング演習 # [2]asciiコード表を出力しなさい。(main関数、プロトタイプ宣言、関数定義を全て書くこと。) # [3]windowsでコンパイラはborland C++ 5.5.1、C言語です。 # [4]火曜日まで # # よろしくお願いします。 # asciiコード表 :- asciiコード表先頭見出し, for(0,M,15), 二進数(4,M,[_m1,_m2,_m3,_m4]), write_formatted('%01d%01d%01d%01d %4d ',[_m1,_m2,_m3,_m4,M]), for(0,N,7), asciiコード表行表示(M,N), N = 7, write('\n'), M = 15. asciiコード表先頭見出し :- asciiコード表文字列最大byte長(_asciiコード表文字列最大byte長), _asciiコード表文字列最大byte長_2 is _asciiコード表文字列最大byte長 + 2, for(0,N1,7), 二進数(4,7,[_n1,_n2,_n3,_n4]), asciiコード表先頭見出し_1(_asciiコード表文字列最大byte長_2,N1,_n1,_n2,_n3,_n4), N1 = 7, write('\n'), for(0,N2,7), asciiコード表先頭見出し_2(N2), N1 = 7, write('\n'),!. asciiコード表先頭見出し_1(_欄の枠,N,_n1,_n2,_n3,_n4) :- N >= 0,N =< 1, write_formatted_atom('%01d%01d%01d%01d',[_n1,_n2,_n3,_n4],A), 文字列を欄の中心に据えて表示(_欄の枠,A),!. asciiコード表先頭見出し_1(_,N,_n1,_n2,_n3,_n4) :- N > 1, write_formatted_atom('%01d%01d%01d%01d',[_n1,_n2,_n3,_n4],A), 文字列を欄の中心に据えて表示(8,A),!. asciiコード表先頭見出し_2(N) :- N >= 0,N =< 1, write_formatted_atom('%1d',[N],A), 文字列を欄の中心に据えて表示(35,A),!. asciiコード表先頭見出し_2(N) :- N > 1, write_formatted_atom('%1d',[N],A), 文字列を欄の中心に据えて表示(8,A),!. asciiコード表行表示(M,N) :- M >=0,M =<1, _アスキーコード is 16 * M + N, asciiコード表(_アスキーコード,_,_文字列), 文字列を欄の中心に据えて表示(35,_文字列),!. asciiコード表行表示(M,N) :- M > 1, _アスキーコード is 16 * M + N, asciiコード表(_アスキーコード,_,_文字列), 文字列を欄の中心に据えて表示(8,_文字列),!. 文字列を欄の中心に据えて表示(_欄の桁,_文字列) :- name2(_文字列,L), length(L,_文字列長), _頭部の空白数 is (_欄の桁 - _文字列長) // 2, _尾部の空白数 is (_欄の桁 - _文字列長 - _頭部の空白数), concat_atom(['%',_頭部の空白数,s,'%s%',_尾部の空白数],F), writef(F,[' ',_文字列,' ']),!. asciiコード表文字列最大byte長(_asciiコード表文字列最大byte長) :- findmax(Byte長,(asciiコード表(_,_,_文字列),name(_文字列,L),length(L,Byte長)),_asciiコード表文字列最大byte長). asciiコード表(0,'0x00','NUL(null文字) '). asciiコード表(1,'0x01','SOH(ヘッダ開始)'). asciiコード表(2,'0x02','STX(テキスト開始)'). asciiコード表(3,'0x03','ETX(テキスト終了)'). asciiコード表(4,'0x04','EOT(転送終了)'). asciiコード表(5,'0x05','ENQ(照会)'). asciiコード表(6,'0x06','ACK(受信OK)'). asciiコード表(7,'0x07','BEL(警告)'). asciiコード表(8,'0x08','BS(後退)'). asciiコード表(9,'0x09','HT(水平タブ)'). asciiコード表(10,'0x0a','LF(改行)'). asciiコード表(11,'0x0b','VT(垂直タブ)'). asciiコード表(12,'0x0c','FF(改頁)'). asciiコード表(13,'0x0d','CR(復帰)'). asciiコード表(14,'0x0e','SO(シフトアウト)'). asciiコード表(15,'0x0f','SI(シフトイン)'). asciiコード表(16,'0x10','DLE(データリンクエスケープ)'). asciiコード表(17,'0x11','DC1(装置制御1)'). asciiコード表(18,'0x12','DC2(装置制御2)'). asciiコード表(19,'0x13','DC3(装置制御3)'). asciiコード表(20,'0x14','DC4(装置制御4)'). asciiコード表(21,'0x15','NAK(受信失敗)'). asciiコード表(22,'0x16','SYN(同期)'). asciiコード表(23,'0x17','ETB(転送ブロック終了)'). asciiコード表(24,'0x18','CAN(とりけし)'). asciiコード表(25,'0x19','EM(メディア終了)'). asciiコード表(26,'0x1a','SUB(置換)'). asciiコード表(27,'0x1b','ESC(エスケープ)'). asciiコード表(28,'0x1c','FS(フォーム区切り)'). asciiコード表(29,'0x1d','GS(グループ区切り)'). asciiコード表(30,'0x1e','RS(レコード区切り)'). asciiコード表(31,'0x1f','US(ユニット区切り)'). asciiコード表(32,'0x20','(スペース)'). asciiコード表(33,'0x21',!). asciiコード表(34,'0x22','"'). asciiコード表(35,'0x23',#). asciiコード表(36,'0x24',$). asciiコード表(37,'0x25','%'). asciiコード表(38,'0x26','&'). asciiコード表(39,'0x27',''''). asciiコード表(40,'0x28','('). asciiコード表(41,'0x29',')'). asciiコード表(42,'0x2a',*). asciiコード表(43,'0x2b',+). asciiコード表(44,'0x2c',','). asciiコード表(45,'0x2d',-). asciiコード表(46,'0x2e','.'). asciiコード表(47,'0x2f',/). asciiコード表(48,'0x30','0'). asciiコード表(49,'0x31','1'). asciiコード表(50,'0x32','2'). asciiコード表(51,'0x33','3'). asciiコード表(52,'0x34','4'). asciiコード表(53,'0x35','5'). asciiコード表(54,'0x36','6'). asciiコード表(55,'0x37','7'). asciiコード表(56,'0x38','8'). asciiコード表(57,'0x39','9'). asciiコード表(58,'0x3a',:). asciiコード表(59,'0x3b',;). asciiコード表(60,'0x3c',<). asciiコード表(61,'0x3d',=). asciiコード表(62,'0x3e',>). asciiコード表(63,'0x3f',?). asciiコード表(64,'0x40',@). asciiコード表(65,'0x41','A'). asciiコード表(66,'0x42','B'). asciiコード表(67,'0x43','C'). asciiコード表(68,'0x44','D'). asciiコード表(69,'0x45','E'). asciiコード表(70,'0x46','F'). asciiコード表(71,'0x47','G'). asciiコード表(72,'0x48','H'). asciiコード表(73,'0x49','I'). asciiコード表(74,'0x4a','J'). asciiコード表(75,'0x4b','K'). asciiコード表(76,'0x4c','L'). asciiコード表(77,'0x4d','M'). asciiコード表(78,'0x4e','N'). asciiコード表(79,'0x4f','O'). asciiコード表(80,'0x50','P'). asciiコード表(81,'0x51','Q'). asciiコード表(82,'0x52','R'). asciiコード表(83,'0x53','S'). asciiコード表(84,'0x54','T'). asciiコード表(85,'0x55','U'). asciiコード表(86,'0x56','V'). asciiコード表(87,'0x57','W'). asciiコード表(88,'0x58','X'). asciiコード表(89,'0x59','Y'). asciiコード表(90,'0x5a','Z'). asciiコード表(91,'0x5b','['). asciiコード表(92,'0x5c',\). asciiコード表(93,'0x5d',']'). asciiコード表(94,'0x5e',^). asciiコード表(95,'0x5f','_'). asciiコード表(96,'0x60',`). asciiコード表(97,'0x61',a). asciiコード表(98,'0x62',b). asciiコード表(99,'0x63',c). asciiコード表(100,'0x64',d). asciiコード表(101,'0x65',e). asciiコード表(102,'0x66',f). asciiコード表(103,'0x67',g). asciiコード表(104,'0x68',h). asciiコード表(105,'0x69',i). asciiコード表(106,'0x6a',j). asciiコード表(107,'0x6b',k). asciiコード表(108,'0x6c',l). asciiコード表(109,'0x6d',m). asciiコード表(110,'0x6e',n). asciiコード表(111,'0x6f',o). asciiコード表(112,'0x70',p). asciiコード表(113,'0x71',q). asciiコード表(114,'0x72',r). asciiコード表(115,'0x73',s). asciiコード表(116,'0x74',t). asciiコード表(117,'0x75',u). asciiコード表(118,'0x76',v). asciiコード表(119,'0x77',w). asciiコード表(120,'0x78',x). asciiコード表(121,'0x79',y). asciiコード表(122,'0x7a',z). asciiコード表(123,'0x7b','{'). asciiコード表(124,'0x7c','|'). asciiコード表(125,'0x7d','}'). asciiコード表(126,'0x7e',~). asciiコード表(127,'0x7f','DEL(削除)'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% name2(X,Y) :- atom(X), strlen(X,Len), findall(N,(for(1,M,Len) , char_code1(X,M,N1) , (N1 < 0 , N is N1 + 256 ; N1 >= 0 , N = N1)),Y),!. name2(A,[N]) :- atomic(A), name(A,[N]),!. name2(A,L) :- var(A), name21(L,L2), atom_codes(A,L2),!. name21([],[]) :- !. name21([N1,N2|R],[N|R2]) :- N1 > 127, N2 > 127, N is N1 * 256 + N2, name21(R,R2),!. name21([N1,N2|R],[N|R2]) :- N1 > 127, N2 < 128, N is N1 * 256 + N2, name21(R,R2),!. name21([N1|R],[N1|R2]) :- name21(R,R2). % 以下のサイトは # ただし、以下の条件を満たすようにすること # クライアントでquitが入力された場合、クライアントは接続を切りプログラムを # 終了し、サーバは接続が切れたら、次のクライアントの接続を待つ。 # サーバでquitが入力された場合、サーバは接続を切り、次のクライアントの # 接続を待ち、クライアントは接続が切られたらプログラムを終了する # エンターキーのみが入力された場合は、文字列を送らずもう一度文字列を # 入力させて、その文字列を送るようにする メッセージの送受信(Input,Output,_クライアントからのメッセージ,_サーバからのメッセージ) :- write_formatted('%t\n',[_クライアントからのメッセージ]), get_line(_サーバからのメッセージ),!. 応答型サーバ(_ポート,_ログ) :- socket(internet,stream,Socket), socket_bind(Socket,_ポート), 応答型サーバ(Socket,[],_ログ), socket_shutdown(Socket). 応答型サーバ(Socket,[[end_of_file,_]|R],R) :- !. 応答型サーバ(Socket,[[A,quit]|R],[[A,quit]|R]) :- !. 応答型サーバ(Socket,L1,L2) :- socket_listen(Socket), socket_accept(Socket,Host : _ポート2,NewSocket), open(NewSocket,read,Input), open(NewSocket,write,Output), メッセージの送受信(Input,Output,_クライアントからのメッセージ,_応答型サーバからのメッセージ), close(Input), close(Output). socket_shutdown(NewSocket), 応答型サーバ(Socket,[[クライアントからの_メッセージ,_応答型サーバからのメッセージ]|L1],L2). サーバメッセージの送信(Output,quit) :- !. サーバメッセージの送信(Output,_メッセージ) :- put_line(Output,_メッセージ),!. クライアント(_ホスト,_舫,_送信メッセージ,_受信メッセージ) :- クライアント通信確立(_ホスト, _舫, _差し込み口), open(_差し込み口, read, _入力), open(_差し込み口, write, _出力), クライアント送受信(_ホスト,_舫,_送信メッセージ, _入力, _出力,_受信文字コードならび), close(_入力), close(_出力), socket_shutdown(_差し込み口), atom_codes(_受信文字列,_受信文字コードならび),!. クライアント(_ホスト,_舫,_差し込み口) :- クライアント通信確立(_ホスト, _舫, _差し込み口), open(_差し込み口, read, _入力), open(_差し込み口, write, _出力), write('サーバーに送信するメッセージを入れてください : '), get_line(_送信メッセージ), クライアント送受信(_ホスト,_舫,_送信メッセージ, _入力, _出力,_受信文字コードならび), close(_入力), close(_出力), socket_shutdown(_差し込み口), atom_codes(_受信文字列,_受信文字コードならび), write_formatted('受信した文字列は %t \n',[_受信文字列]). クライアント通信確立(_ホスト, _サービス, _差し込み口) :- 定数(_サービス), !, net_service(_サービス, tcp, _舫), socket(internet, stream, _差し込み口), host_addr(_ホスト, Addr), socket_connect(_差し込み口, Addr : _舫). クライアント通信確立(_ホスト, _舫, _差し込み口) :- 整数(_舫), !, socket(internet, stream, _差し込み口), socket_connect(_差し込み口, _ホスト : _舫). クライアント(_ホスト,_舫,_送信メッセージ,_受信メッセージ) :- クライアント送受信(_ホスト,_舫,_送信メッセージ,_入力,_出力,_受信文字コードならび) :- write_formatted(_出力,'%t\n\n',[_送信メッセージ]), flush_output(_出力), get_code(_入力,Code), クライアント受信(_入力,Code,_受信文字コードならび). クライアント受信(_入力,(-1),[]) :- !. クライアント受信(_入力,_文字コード,[_文字コード|R]) :- get_code(_入力,_文字コード2), クライアント受信(_入力,_文字コード2,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/815 # # 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/915.txt# 【 形態 】1. Javaアプリケーション(main()で開始) # # しりとりゲームをするプログラム # 第一段階ーShiritori.javaを次に掲載する。 #      これをEclipseに入力する #    ー与えられた単語の可否を判定するためのクラスReferee.javaを作成する # # 第二段階ーReferee.javaをしりとりのルールにのっとった判定をさせるように改善 # # 第一段階のRefereeの使用 # ・直前に入力された単語の末尾の文字を記憶するchar型のフィールド #    lastChar # ・次の単語がどの文字で始まらなければならないかをchar型で返すメソッド # mustBeginWith() # ・引数として与えられた単語の可否を判定し、可ならtrueを返すとともにlastCharを更新し、否ならfalseを返すメソッド #    isOK(String newWord) # とりあえずは何でもかんでも「可」とするように作る 馬名しりとり :- write('最初の馬名は :'), get_line(_語1), sub_atom(_語1,0,1,_,_最初の文字), 馬名しりとり(_最初の文字,_語1,_語,[]). 馬名しりとり(_次の文字,_語,_語,_) :- \+(sub_atom(_語,0,1,_,_次の文字)), write_formatted('ゲームオーバー %t-%t はしりとりになっていません\n',[_次の文字,_語]), fail,!. 馬名しりとり(_次の文字,_語,_語,_履歴) :- member(_語,_履歴),!, write_formatted('ゲームオーバー %tは既出です\n',[_語]), fail. 馬名しりとり(_次の文字,_語,_,_) :- 五代血統書(_語), fail. 馬名しりとり(_次の文字,_語,_語,_履歴) :- sub_atom(_語,0,1,_,_次の文字), write_formatted('%t-%t\n',[_次の文字,_語]). 馬名しりとり(_,_語1,_語,_履歴) :- 馬名しりとりルール(_語1,_次の文字1), write('次の馬名は :'), get_line(_語2), 馬名しりとり(_次の文字1,_語2,_語,[_語1|_履歴]). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,ン), Len2 is Len + 1, sub_atom(_語,0,Len2,_,_語2), 馬名しりとり次の文字(_語2,_次の文字). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,ー), Len2 is Len + 1, sub_atom(_語,0,Len2,_,_語2), 馬名しりとり次の文字(_語2,_次の文字). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,_次の文字),!. % *** user: jbis / 2 *** 五代血統書(_馬名) :- jbis(_馬名,L), 五代血統表表示(L). jbis(_馬名,_血統書) :- このサイトの馬名はSJISが使われている(_馬名,_馬名sjis), 'url述語表現'(_馬名sjis,URL1), '%27を切り取る'(URL1,URL2), concat(['http://www.jbis.or.jp/navi_search/?sid=horse&keyword=',URL2],URL), jbis馬名サイト検索(URL,_馬名,_血統サイトの正確なURLならび), 馬名による血統検索(_血統サイトの正確なURLならび,_血統書). jbis馬名サイト検索(URL,_馬名,_血統サイトの正確なURLならび) :- w3c(URL,X), concat_atom(X,X2), sjis2euc(X2,X3), split(X3,['\n','\r'],X4), findall(URL2,( member(A,X4), この行には検索対象の馬名が存在する(A,_馬名), 血統サイトの正確なURLを構成する(A,URL2)),_血統サイトの正確なURLならび), !. 馬名による血統検索(_血統サイトの正確なURLならび,_血統書) :- member(URL,_血統サイトの正確なURLならび), w3c(URL,X), 取れたならびすべての行をEUCに変換(X,_EUC行ならび), findall(_先祖馬名,( member(_馬名を含む行,_EUC行ならび), 血統書の中の馬名を切り取る(_馬名を含む行,_先祖馬名)), _血統書). このサイトの馬名はSJISが使われている(_馬名,_馬名sjis) :- euc2sjis(_馬名,_馬名sjis),!. '%27を切り取る'(URL1,URL2) :- replace_all(URL1,'%27','',URL2),!. 取れたならびすべての行をEUCに変換(Y,Y4) :- concat_atom(Y,Y2), sjis2euc(Y2,Y3), split(Y3,['\n','\r'],Y4),!. この行には検索対象の馬名が存在する(_行,_馬名) :- sub_atom(_行,_,_,_,'cell-br-no sort-02'), split(_行,['','(',')','>'],L), 馬名は最後の二要素のうちのどちらかにある(L,_馬名),!. 馬名は最後の二要素のうちのどちらかにある(L,_馬名) :- append(_,[_馬名],L),!. 馬名は最後の二要素のうちのどちらかにある(L,_馬名) :- append(_,[_馬名,_],L),!. 血統サイトの正確なURLを構成する(_行,URL) :- split(_行,['"'],L), append(_,[U,_],L), concat_atom(['http://www.jbis.or.jp',U,'pedigree/'],URL),!. 血統書の中の馬名を切り取る(_行,_先祖馬名) :- 先祖馬名を含む行はmaleという文字列を含む(_行), sub_atom(_行,Start,Len,_,''), sub_atom(_行,0,Start,_,_行1), split_patern_1(_split_patern_1), split(_行1,_split_patern_1,L), last(L,_先祖馬名),!. 先祖馬名を含む行はmaleという文字列を含む(_行) :- sub_atom(_行,_,_,_,male),!. 血統クロス(_馬名,_クロスならび) :- jbis(_馬名,L), length(L1,31),length(L2,31),append(L1,L2,L), 積集合(L1,L2,_積集合), 血統クロス(_積集合,L1,L2,_クロスならび). 血統クロス([],L1,L2,[]) :- !. 血統クロス([H|R1],L1,L2,[[_世代1,_世代2]|R2]) :- list_nth(N,L1,H), list_nth(N1,L2,H), N2 is N1 + 31, 第何世代か(N,_世代ならび1), min(_世代ならび1,_世代1), 第何世代か(N2,_世代ならび2), min(_世代ならび2,_世代2), 血統クロス(R1,L1,L2,R2). 第何世代か(N,_世代ならび) :- findall(_世代,( 五代血統表表示テーブル(_五代血統表表示テーブル), member(N,_五代血統表表示テーブル), list_nth(_世代,_五代血統表表示テーブル,N)),_世代ならび). 五代血統表表示(L) :- 五代血統表表示テーブル(L1), 五代血統表一行表示(L,L1), fail. 五代血統表表示(_). 五代血統表一行表示(_,[]) :- wr('\n'),!. 五代血統表一行表示(L,[N|R]) :- \+(N=0), list_nth(N,L,_馬名), wr('%t',[_馬名]), 五代血統表一行表示(L,R),!. 五代血統表一行表示(L,[0|R]) :- wr('%15s',[' ']), 五代血統表一行表示(L,R),!. % *** user: 五代血統表表示テーブル / 1 *** 五代血統表表示テーブル([0,0,0,0,5]). 五代血統表表示テーブル([0,0,0,4,0]). 五代血統表表示テーブル([0,0,0,0,6]). 五代血統表表示テーブル([0,0,3,0,0]). 五代血統表表示テーブル([0,0,0,0,8]). 五代血統表表示テーブル([0,0,0,7,0]). 五代血統表表示テーブル([0,0,0,0,9]). 五代血統表表示テーブル([0,2,0,0,0]). 五代血統表表示テーブル([0,0,0,0,12]). 五代血統表表示テーブル([0,0,0,11,0]). 五代血統表表示テーブル([0,0,0,0,13]). 五代血統表表示テーブル([0,0,10,0,0]). 五代血統表表示テーブル([0,0,0,0,15]). 五代血統表表示テーブル([0,0,0,14,0]). 五代血統表表示テーブル([0,0,0,0,16]). 五代血統表表示テーブル([1,0,0,0,0]). 五代血統表表示テーブル([0,0,0,0,20]). 五代血統表表示テーブル([0,0,0,19,0]). 五代血統表表示テーブル([0,0,0,0,21]). 五代血統表表示テーブル([0,0,18,0,0]). 五代血統表表示テーブル([0,0,0,0,23]). 五代血統表表示テーブル([0,0,0,22,0]). 五代血統表表示テーブル([0,0,0,0,24]). 五代血統表表示テーブル([0,17,0,0,0]). 五代血統表表示テーブル([0,0,0,0,27]). 五代血統表表示テーブル([0,0,0,26,0]). 五代血統表表示テーブル([0,0,0,0,28]). 五代血統表表示テーブル([0,0,25,0,0]). 五代血統表表示テーブル([0,0,0,0,30]). 五代血統表表示テーブル([0,0,0,29,0]). 五代血統表表示テーブル([0,0,0,0,31]). 五代血統表表示テーブル([0,0,0,0,36]). 五代血統表表示テーブル([0,0,0,35,0]). 五代血統表表示テーブル([0,0,0,0,37]). 五代血統表表示テーブル([0,0,34,0,0]). 五代血統表表示テーブル([0,0,0,0,39]). 五代血統表表示テーブル([0,0,0,38,0]). 五代血統表表示テーブル([0,0,0,0,40]). 五代血統表表示テーブル([0,33,0,0,0]). 五代血統表表示テーブル([0,0,0,0,43]). 五代血統表表示テーブル([0,0,0,42,0]). 五代血統表表示テーブル([0,0,0,0,44]). 五代血統表表示テーブル([0,0,41,0,0]). 五代血統表表示テーブル([0,0,0,0,46]). 五代血統表表示テーブル([0,0,0,45,0]). 五代血統表表示テーブル([0,0,0,0,47]). 五代血統表表示テーブル([32,0,0,0,0]). 五代血統表表示テーブル([0,0,0,0,51]). 五代血統表表示テーブル([0,0,0,50,0]). 五代血統表表示テーブル([0,0,0,0,52]). 五代血統表表示テーブル([0,0,49,0,0]). 五代血統表表示テーブル([0,0,0,0,54]). 五代血統表表示テーブル([0,0,0,53,0]). 五代血統表表示テーブル([0,0,0,0,55]). 五代血統表表示テーブル([0,48,0,0,0]). 五代血統表表示テーブル([0,0,0,0,58]). 五代血統表表示テーブル([0,0,0,57,0]). 五代血統表表示テーブル([0,0,0,0,59]). 五代血統表表示テーブル([0,0,56,0,0]). 五代血統表表示テーブル([0,0,0,0,61]). 五代血統表表示テーブル([0,0,0,60,0]). 五代血統表表示テーブル([0,0,0,0,62]). split_patern_1(['\r','>',A,B]) :- AL = [60,47,97,62,60,47,116,100,62], BL = [60,47,97,62,60,117,108,32,99,108,97,115,115,61,34,108,105,115,116,45,105,99,111,110,45,48,49,34,62], atom_codes(A,AL), atom_codes(B,BL). % 以下のサイトは # [1] 授業単元:fortran # [2] 問題文(含コード&リンク):配列を使わずに平均値、分散、標準偏差を表示せよ # データ数nとn個のデータを入力し、平均値、分散、標準偏差を標示せよ。なおn≧5である。 # dimension、if、go toを使ってはいけない。 '配列を使わずに平均値、分散、標準偏差を表示' :- write('データ数 : '), get_integer(N), writef('%個の数を1個1行で連続して入力してください : ',[N]), get_line(Line), read_term_from_atom(Line,X,[]), '配列を使わずに平均値、分散、標準偏差を表示'(1,N,X,0,_,Z). _分散 is Z / N, _標準偏差 is sqrt(Z / (N - 1)), writef('平均値=%t,分散=%t,標準偏差=%t\n',[_平均値,_分散,_標準偏差]),!. '配列を使わずに平均値、分散、標準偏差を表示'(M,N,X,S,_平均,0.0) :- M > N,_平均 is S / N,!. '配列を使わずに平均値、分散、標準偏差を表示'(M,N,X,S1,_平均,Z) :- get_line(Line2), read_term_from_atom(line2,X2,[]), S2 is S1 + X, M1 is M - 1, '配列を使わずに平均値、分散、標準偏差を表示'(M1,N,X2,S2,_平均,Z2), Z is (X - _平均) ^ 2 + Z2. get_line(Line) :- read_line_to_codes(current_input,Codes), atom_codes(Line,Codes). get_integer(N) :- read_line_to_codes(current_input,Codes), number_codes(N,Codes), integer(N). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/458 # # [1] 基礎プログラミング実習 # # [2]99文字までの文字列を入力し,アルファベットの小文字は大文字に,アルファベットの大文字は小文字に, # またアルファベット以外の文字はアスタリスク’*’に変換した文字列を出力するプログラムを作成せよ. # 99文字以下の文字列を入力してください.abcABC123sDFgh#"x32YY= # # 変換された文字列はABCabc***SdfGH**X**yy*です. # # 追伸: # ちなみにどうやらアスキーコードを使うらしいです。 # 大文字のコードに32を足せば小文字のコードになるとか言ってました。 # これを使わなければいけないようです。 # あとライブラリ関数は使用不可です。 # 文字列とかやったの初めてです。 # # どうかお願いします。 # # 'アルファベットの小文字は大文字にアルファベットの大文字は小文字にまたアルファベット以外の文字はアスタリスク*に変換して表示' :- write('99文字以下の文字列を入力してください. '), get_line(Line), atom_codes(Line,Codes), length(Codes,_長さ), _長さ =< 99, 文字コードによる直接変換(Codes,Codes2), atom_codes(_変換された文字列,Codes2), write_formatted('変換された文字列は%tです\n',[_変換された文字列]). 文字コードによる直接変換([],[]). 文字コードによる直接変換([Code|R1],[Code2|R2]) :- Code >= 65,Code =< 90, Code2 is Code + 32, 文字コードによる直接変換(R1,R2). 文字コードによる直接変換([Code|R1],[Code2|R2]) :- Code >= 97,Code =< 122, Code2 is Code - 32, 文字コードによる直接変換(R1,R2). 文字コードによる直接変換([Code|R1],[42|R2]) :- \+((Code >= 65,Code =< 90)), \+((Code >= 97,Code =< 122)), 文字コードによる直接変換(R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/368 # # [1] 授業単元: プログラミング実習 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10180.txt # # 〜課題4〜 # 文字型配列 str='ABCDEFG'が初期設定されている。このstrのデータを英大文字から、英小文字に変換しなさい。 # str('ABCDEFG'). %%%%%%% 普通は以下の定義で済ます%%%%%%%%%%%% 英大文字から、英小文字に変換 :- str(Str1), to_lower(Str1,Str2), write_formatted('%t',[Str2]). &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 英大文字から、英小文字に変換 :- str(Str1), atom_codes(Str1,Codes1), findall(C,(member(A,Codes),C is A - 32),Codes2), atom_codes(Str2,Codes2), write_formatted('%t',[Str2]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 英大文字から、英小文字に変換 :- str(Str1), atom_codes(Str1,Codes1), 英大文字から、英小文字に変換(Codes1,Codes2), atom_codes(Str2,Codes2), write_formatted('%t',[Str2]). 英大文字から、英小文字に変換([],[]). 英大文字から、英小文字に変換([C1|R1],[C2|R2]) :- C2 is C1-32,英大文字から、英小文字に変換(R1,R2) % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/836 # # [1] 授業単元: プログラミング実習 # [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10095.txt # 文字列の配列を辞書順(アルファベット順)に並べ替えるプログラムを作成せよ 辞書順整列([_基準語|R1],X) :- atom_codes(_基準語,_基準語コードならび), 大小関係によって分類(R1,_基準語コードならび,_小さいグループ,_大きいグループ), 辞書順整列(_大きいグループ,_整列された大きいグループ), 辞書順整列(_小さいグループ,_整列された小さいグループ), append(_整列された小さいグループ,[_基準語|_整列された大きいグループ],X) . 辞書順整列([],[]). 大小関係によって分類([],_,[],[]). 大小関係によって分類([_語|R1],_基準語コードならび,[_語|_小さいグループ],_大きいグループ) :- atom_codes(_語,_語コードならび), 辞書順に比較基準語より小さいか等しい(_語コードならび,_基準語コードならび), 大小関係によって分類(R1,_基準語コードならび,_小さいグループ,_大きいグループ),!. 大小関係によって分類([_語|R1],_基準語コードならび,_小さいグループ,[_語|_大きいグループ]) :- 大小関係によって分類(R1,_基準値,_小さいグループ,_大きいグループ) . 辞書順に比較して基準語より小さいか等しい([],[]) :- !. 辞書順に比較して基準語より小さいか等しい([],[_|_]) :- !. 辞書順に比較して基準語より小さいか等しい([A|R1],[A|R2]) :- 辞書順に比較して基準語より小さいか等しい(R1,R2),!. 辞書順に比較して基準語より小さいか等しい([A|_],[B|_]) :- A >= 97, A =< 122, B >= 97, B =< 122,!, A < B. 辞書順に比較して基準語より小さいか等しい([A|_],[B|_]) :- A >= 97, A =< 122, B >= 65, B =< 90,!, A1 is A - 32, A1 < B. 辞書順に比較して基準語より小さいか等しい([A|_],[B|_]) :- A >= 65, A =< 90, B >= 97, B =< 122,!, B1 is B - 32, A < B1. 辞書順に比較して基準語より小さいか等しい([A|_],[B|_]) :- A < B,!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/442 # # 【 課題 】h ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/820.txt # 【 形態 】2. Applet # 1)各自のPC1とPC2のそれぞれにサーバーをたてる。 # サーバー1,2:メッセージを受け、自分のメッセージを付加(アペンド)して返す。 # # 2)その両方のサーバーに交信する以下のクライアントを作成する。 # クライアント:一方のサーバーにメッセージを送り、 # サーバーは、それまでにクライアントから来たメッセージを貯め、まとめて返す。 # Localhostではなく実際にipアドレスを確認し、複数のプロセッサ間の動作を # 確認すること。 サーバー(_舫い) :-   socket(internet,stream,Socket),   socket_bind(Socket,_舫い),   サーバー(_舫い,[]),   socket_shutdown(Socket). サーバー(_舫い,['shutdown -h server'|_]) :- !. サーバー(_舫い,_メッセージならび) :-   socket_listen(Socket),   socket_accept(Socket,Host : _舫い2,NewSocket),   open(NewSocket,read,Input),   open(NewSocket,write,Output),   get_line(Input,Line),   append(_メッセージならび,[Line],_メッセージならびの二),   サーバーメッセージの送信(Output,_メッセージならびの二),   close(Input),   close(Output).   socket_shutdown(NewSocket),   サーバー(_舫い,_メッセージならびの二). サーバーメッセージの送信(Output,_メッセージならび) :-   member(_メッセージ,_メッセージならび),   put_line(Output,_メッセージ),   fail. サーバーメッセージの送信(Output,_). クライアント(_ホスト,_舫,_送信メッセージ,_受信メッセージ) :- クライアント通信確立(_ホスト, _舫, _差し込み口), open(_差し込み口, read, _入力), open(_差し込み口, write, _出力), クライアント送受信(_ホスト,_舫,_送信メッセージ, _入力, _出力,_受信文字コードならび), close(_入力), close(_出力), socket_shutdown(_差し込み口), atom_codes(_受信文字列,_受信文字コードならび),!. クライアント(_ホスト,_舫,_差し込み口) :- クライアント通信確立(_ホスト, _舫, _差し込み口), open(_差し込み口, read, _入力), open(_差し込み口, write, _出力), write('サーバーに送信するメッセージを入れてください : '), get_line(_送信メッセージ), クライアント送受信(_ホスト,_舫,_送信メッセージ, _入力, _出力,_受信文字コードならび), close(_入力), close(_出力), socket_shutdown(_差し込み口), atom_codes(_受信文字列,_受信文字コードならび), write_formatted('受信した文字列は %t \n',[_受信文字列]). クライアント通信確立(_ホスト, _サービス, _差し込み口) :- 定数(_サービス), !, net_service(_サービス, tcp, _舫), socket(internet, stream, _差し込み口), host_addr(_ホスト, Addr), socket_connect(_差し込み口, Addr : _舫). クライアント通信確立(_ホスト, _舫, _差し込み口) :- 整数(_舫), !, socket(internet, stream, _差し込み口), socket_connect(_差し込み口, _ホスト : _舫). クライアント(_ホスト,_舫,_送信メッセージ,_受信メッセージ) :- クライアント送受信(_ホスト,_舫,_送信メッセージ,_入力,_出力,_受信文字コードならび) :- write_formatted(_出力,'%t\n\n',[_送信メッセージ]), flush_output(_出力), get_code(_入力,Code), クライアント受信(_入力,Code,_受信文字コードならび). クライアント受信(_入力,(-1),[]) :- !. クライアント受信(_入力,_文字コード,[_文字コード|R]) :- get_code(_入力,_文字コード2), クライアント受信(_入力,_文字コード2,R). % 以下のサイトは # 出典:: 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://pc12.2ch.net/test/read.cgi/tech/1255709298/355 # # [1] 授業単元:C言語とアルゴリズム # [2] 問題文:http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10016.txt # [1] 文字列処理(文字分類関数) # キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、 # その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントするプログラムを作成しなさい。 # ただし、入力する文字数は最大30文字とする。文字分類関数を必ず用いること # [2] 文字列処理(文字列操作関数、文字変換関数、文字分類関数) # キーボードから姓と名をそれぞれ入力し,それらを文字列操作関数を用いて連結した後 # 小文字と大文字を入れ換えた文字列を表示するプログラムを作成しなさい。ただし、入力する 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする' :- write('アルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力してください(最大30文字)\n'), get_line(Line), '30文字を越えたら切り取る'(Line,Line1), atom_codes(Line1,Codes), 文字種判定(Chars,_小文字カウント,_大文字カウント,_数字カウント), write_formatted('文字列 %t のなかに 小文字は %t文字 大文字は %t文字 数字は %t文字ありました\n',[Line1,_小文字カウント,_大文字カウント,_数字カウント]). '30文字を越えたら切り取る'(Line,Line1) :- sub_atom(Line,0,30,_,Line1),!. '30文字を越えたら切り取る'(Line,Line). 文字種判定([],0,0,0). 文字種判定([U|R],A,B,C) :- 文字種判定(R,A2,B,C),U >=97,U =< 122,A is A2 + 1. 文字種判定([U|R],A,B,C) :- 文字種判定(R,A,B2,C),U >=65,U =< 90,B is B2 + 1. 文字種判定([U|R],A,B,C) :- 文字種判定(R,A,B,C2),U >=48,U =< 57,C is C2 + 1. 'キーボードから姓と名をそれぞれ入力し,それらを文字列操作関数を用いて連結した後 小文字と大文字を入れ換えた文字列を表示するプログラムを作成しなさい。ただし、入力する' :- write('姓名をローマ字で入力してください\n'), write('姓 ? '),get_line(_姓), write('名 ? '),get_line(_名), atom_concat(_姓,_名,_姓名), atom_codes(_姓名,Codes), 大文字小文字相互変換(Codes,Codes2), atom_codes(_大文字小文字相互変換された姓名,Codes2), write_formatted('大文字と小文字を相互に変換した姓名は %t です\n',[_大文字小文字相互変換された姓名]). 大文字小文字相互変換([],[]). 大文字小文字相互変換([A|R1],[B|R2]) :- A >= 65, A =< 90, B is A + 32, 大文字小文字相互変換(R1,R2). 大文字小文字相互変換([A|R1],[B|R2]) :- A >= 97, A =< 122, B is A - 32, 大文字小文字相互変換(R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/55 # # [1] 授業単元:プログラム言語論 # [2] 問題文(含コード&リンク): # # 設問1.C言語、またはC++言語で、割り算を計算するdev(int x,int y)関数(*)を作成しなさい。 # ただし、不変表明(assert)を使って、0で除算を実行した場合にエラーを出力するようにすること。 # (*)関数devは、int型の返値を持ち、x/yを計算するものとする。 :- op(700,xfx,は). 関数定義(div(X,Y),Z) :- div(X,Y,Z). div(X,Y,Z) :- length(L1,X), length(L2,Y), div(L1,L2,DIV,MOD), length(DIV,Z). div(_,[],_,_) :- write('0除算エラー\n'),!. div(L1,L2,[_|D],MOD) :- append(L2,L3,L1), div(L3,L2,D,MOD). div(L1,L2,[],L1) :- \+(append(L2,L3,L1)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), '加算'(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 加算(trunc(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL),!. 加算(四捨五入(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!. 加算(切捨て(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!. 加算(切り上げ(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!. 加算([],L) :- var(L), L = 0.0e+00,!. 加算([],L) :- \+(var(L)), 加算の変数に零をおく(L),!. 加算([L|R],SL) :- ならび(L), 行列の転置([L|R],L1), 加算_2(L1,SL),!. 加算(X,S) :- 加算_1(X,0.0e+00,S) . 加算_1([],S,S) :- !. 加算_1([A|R],Y,S) :- ならび(A), ならび(Y), !, ならび加算(A,Y,Z), 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), 加算_1(R,Y,S),!. 加算_1([A|R],Y,S) :- A1 は A, Z is A1 + Y, 加算_1(R,Z,S). 加算_1(A,Y,S) :- とからりすと(A,L), !, 加算_1(L,Y,S) . 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. とからりすと(A,[A]) :- atomic(A),!. とからりすと(A と B,C) :- とからりすと(A,A1), とからりすと(B,B1), append(A1,B1,C). 変数(_変数) :- var(_変数). ならび([_|_]). _項 は (_ネットワーク :: _式) :- _ネットワーク :: _項 は _式, ! . _評価項 は N : L :- M は N, L1 は L, list_nth(M,L1,_評価項), ! . _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail) . _評価値 は [X|{P}] :- findall(X,P,_評価値), ! . _評価項 は ` _値 :- !, _評価項 = _値, ! . _項 は _式 :- var(_式), _項 = _式, ! . _項 は _式 :- error_protect(一時関数定義(_式,_項),fail) . _項 は _式 :- atom(_式), member(_式,[minint,maxint,cputtime,time,csize,cused,dbsize,dbused,gsize,gused,noptrs,ptrsued,ssize,sused,tsize,tused]), !, _項 is _式, ! . _項 は _式 :- 二項組込み関数(_式), 二項組込み関数の評価(_式,_項) . _項 は _式 :- 二項組込み関数(_式), !, fail . _項 は _式 :- functor(_式,Functor,1), arg(1,_式,Arg), Y は Arg, functor(_式_1,Functor,1), arg(1,_式_1,Y), member(Functor,[atom,real,integer,var,float,list]), !, error_protect(_式_1,fail), _項 = Y, ! . _項 は _式 :- atom(_式), error_protect(get_global(_式,_項),fail), ! . _項 は _式 :- real(_式), _項 = _式, ! . _項 は _式 :- real(_式), !, fail . _項 は _式 :- list(_式), findall(X,(member(U,_式) , X は U),_項) . _項 は _式 :- list(_式), !, fail. _項 は _erlang_module : _erlang関数 :- erlang関数評価(_erlang_module : _erlang関数,_項),!. _項 は _式 :- 関数定義(_式,_項),!. _項 は _式 :- functor(_式,_関数,_次数), function(_関数,_次数), findall(Arg,(for(1,N,_次数) , arg(N,_式,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), _式の二 =.. [_関数|L2], error_protect(_項 is _式の二,fail) . _項 は _評価関数 :- error_protect(_項 is _評価関数,fail),!. _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail),!. _項 は _評価項 :- 述語評価が可能(_評価項,_関数,_次数,_次数足す一), _評価項 =.. _評価項の項分解ならび, findall(Arg,(for(1,N,_次数) , arg(N,_評価項,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), append(L2,[_],_変数を付加した引数ならび), _解付き評価項 =.. [_関数|_変数を付加した引数ならび], error_protect(_解付き評価項,fail), arg(_次数足す一,_解付き評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), error_protect(_評価項,fail), arg(Arg,_評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), \+(error_protect(_評価項,fail)), _評価項 = _項,!. _項 は _式 :- atomic(_式), \+(述語評価が可能(_式,_関数,_次数,_次数足す一)), _項 = _式,!. 述語評価が可能(_評価項,_関数,_次数,_次数足す一) :- functor(_評価項,_関数,_次数), _次数足す一 is _次数 + 1, \+(predicate_type(_関数,_次数足す一,undefined)),!. 関数評価に於いて引数部分の関数評価([],[]). 関数評価に於いて引数部分の関数評価([L|R1],[L2|R2]) :- list(L), !, 関数評価に於いて引数部分の関数評価(L,L2), 関数評価に於いて引数部分の関数評価(R1,R2), ! . 関数評価に於いて引数部分の関数評価([F|R1],[F|R2]) :- \+(error_protect(F2 は F,fail)), !, 関数評価に於いて引数部分の関数評価(R1,R2) . 関数評価に於いて引数部分の関数評価([F|R1],[F2|R2]) :- error_protect(F2 は F,fail), 関数評価に於いて引数部分の関数評価(R1,R2) . erlang関数評価(os : cmd(Command),_項) :- erlang :: (os : cmd(Command) -> _項_1), _項 は string2atom(_項_1),!. erlang関数評価(_erlang_module : _erlang関数,_項) :- erlang :: (_erlang_module : _erlang関数 -> _項),!. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, number(_値の一), _値の二 は _項の二, number(_値の二), _値 is _値の一 + _値の二, !. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 + _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, list(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),LY), concat_list(LY,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atom(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),L), concat_atom(L,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 * _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(` _値,_値) :- !. 関数定義(@ _式,_値) :- _値 は _式,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _値の二 >= 0.0e+00, _四捨五入後の値 is floor(_値の二 + 0.5) * 1.0,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 is ceil(_値の二 - 0.5),!. 関数定義(切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二) * 1.0,!. 関数定義(切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二),!. 関数定義(十円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 10 + 0.5) * 10,!. 関数定義(十円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は trunc(_値の二 / 10) * 10,!. 関数定義(十円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 10) * 10,!. 関数定義(百円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 100 + 0.5) * 100,!. 関数定義(百円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 100) * 100,!. 関数定義(百円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二 / 100) * 100,!. 関数定義(整数化(_値),_整数化された値) :- _値の二 は _値, _整数化された値 is trunc(_値の二),!. 関数定義(char_code(_項),_値) :- ( atom(_項), atomic_length(_項,1), char_code(_項,_値) ; integer(_項), char_code(_値,_項) ; 複合項(_項), _項の一 は _項, _値 は char_code(_項の一) ), !. 関数定義($ _大域変数名,_値) :- atom(_大域変数名), get_global(_大域変数名,_値の一), _値 は _値の一,!. 関数定義(S,E) :- functor(S,select,1), to(S,E),!. 関数定義(setq(A,B),E) :- atom(A), B1 は B, set_global(A,B1), E = B1,!. 関数定義(++ A,X) :- A1 は A, list(A1), 加算(A1,X),!. 関数定義(A ++ B,X) :- C is B / A, X = A + C + B,!. 関数定義(car(A),E) :- A1 は A, A1 = [E|_],!. 関数定義(cdr(A),E) :- A1 は A, A1 = [_|E],!. 関数定義(cons(A,B),E) :- A1 は A, B1 は B, E = [A1|B1],!. 関数定義(length(A),E) :- A1 は A, list(A1), length(A1,E),!. 関数定義(decode(A,B,C,D),E) :- A1 は A, B1 は B, A1 = B1, E は C,!. 関数定義(decode(A,B,C,D),E) :- E は D,!. 関数定義(decompcons(A),E) :- A1 は A, decompcons(A1,E),!. 関数定義(substr(A,B,C),E) :- 関数定義(subatomic(A,B,C),E),!. 関数定義(subatomic(A,B,C),E) :- A1 は A, B1 は B, C1 は C, subatomic(A1,B1,C1,E),!. 関数定義(concat(A),E) :- A1 は A, concat(A1,E),!. 関数定義(concat(A,B),E) :- A1 は A, B1 は B, concat(A1,B1,E),!. 関数定義(append(A,B),E) :- A1 は A, B1 は B, append(A1,B1,E),!. 関数定義(reverse(A),E) :- A1 は A, reverse(A1,E),!. 関数定義(string2atom(A),E) :- A2 は A, flat(A2,B), atom_codes(E,B),!. 関数定義(P,E) :- functor(P,greatest,Arg), P =.. [greatest|L], findall(B,(member(A,L) , B は A),L2), max(L2,E),!. 関数定義(P,E) :- functor(P,least,Arg), P =.. [least|L], findall(B,(member(A,L) , B は A),L2), min(L2,E),!. 関数定義(cel(_列数,_行数,_行列),_解) :- _関数評価された行数 は _行数, _関数評価された列数 は _列数, list_nth(_関数評価された行数,_行列,_行), list_nth(_関数評価された列数,_行,_解),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/993 # # [1] 授業単元:c言語 # [2] 問題文 # 課題文1 # 文字を一文字入力して、文字コードが一個次の文字を表示するプログラムを作成せよ。 # # 課題文2 # 文字を一文字入力して、入力文字が a-z の範囲のときのみ、次のアルファベットを表示すプログラムを作成せよ。 # ただし、zを入力した場合は a を表示し、a-z以外の文字を入力した場合は # 入力した文字をそのまま表示すること。 # 例: aを入力 → b を出力 bを入力 → c を出力 zを入力 → a を出力 # 3を入力 → 3 を出力 $を入力 → $ を出力 Aを入力 → A を出力 # # 課題文3 # 文字を一文字入力して、入力された文字が、英字の小文字であるか、英字の大文字であるか、 # 数字であるか、それ以外の文字であるか判別して、判別結果を表示する # プログラムを作成せよ。 課題文1 :- write('一文字入力してください: '), get_line(_行), atom_codes(_行,[_文字コード|_]), 次の文字コードを得る(_文字コード,_次の文字コード), char_code(_次の文字,_次の文字コード), write_formatted('次の文字は"%t"です\n',[_次の文字]). 次の文字コードを得る(_文字コード,_次の文字コード) :- _文字コード < 0x8000, _次の文字コード is _文字コード + 1. 次の文字コードを得る(_文字コード,_次の文字コード) :- _文字コード >= 0x8000, _次の文字コード is _文字コード + 2. 課題文2 :- write('一文字入力してください: '), get_line(_行), sub_atom(_行,0,1,_,_文字), 課題文2_文字選択(_文字,_表示文字), write_formatted('課題文2の答えは"%t"です\n',[_表示文字]). 課題文2_文字選択(_文字,_表示文字) :- list_nth(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],L1), list_nth(N,L1,_表示文字),!. 課題文2_文字選択(_文字,_文字). 課題文3 :- write('一文字入力してください: '), get_line(_行), atom_codes(_行,[_文字コード|_]), 課題文3_文字種判別(_文字コード,_文字種別), write_formatted('文字種別は%tです\n',[_文字種別]). 課題文3_文字種判別(C,英小文字) :- C>=97,C=<122,!. 課題文3_文字種判別(C,英大文字) :- C>=65,C=<90,!. 課題文3_文字種判別(C,数字) :- C>=48,C=<57,!. 課題文3_文字種判別(_,それ以外の文字). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの左回転(_リスト,_ひとつ左回転したリスト) :- length(_リスト,_限界回転数), ならびの左回転(_限界回転数,_リスト,_ひとつ左回転したリスト). ならびの左回転(N,[A|R],L) :- N > 0, append(R,[A],L). ならびの左回転(N,[A|R],L) :- N > 0, M is N-1, append(R,[A],L2), ならびの左回転(M,L2,L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/926 # # 以前回答いただいた課題の発展課題です。よろしくお願いします。 # 以前の回答は>>841にあります。以前の問題文は>>770を参照してください。 # ただし>>770の分類には全角英数が抜けています。 # [1] 授業単元:プログラミング演習2 # [2] 問題文(含コード&リンク): # 前回の課題の分類の結果「半角英数:XX字、半角カナ:XX字・・・」 # という結果が得られたとき、その結果のファイルを読み込み # 各分類からその結果の比率に合わせてランダムに文字列を出力する # プログラムを作成せよ。出力する文字数は解析に用いた文字の合計である。 # (例えば半角英数が全体の60%だった場合、出力される文字列の中にランダムに半角英数文字が60%の割合で含まれることになる) # 分類は以下の通りとする。 # 1.半角英数 # 2.半角カナ # 3.半角記号 # 4.全角英数 # 5.全角かな # 6.全角記号 # 7.漢字 サンプルの文字分類('半角英数',9234). サンプルの文字分類('全角漢字',1061). サンプルの文字分類('全角記号',210). サンプルの文字分類('全角カナ',687). サンプルの文字分類('全角かな',705). t778(_生成文字数,_発生文) :- findall([_分類,_文字数],サンプルの文字分類(_分類,_文字数),_文字分類ならび), t778_1(_文字分類ならび,_生成文字数,_発生文). t778_1(_文字分類ならび,_生成文字数,_発生文) :- テキスト文字総数(_文字分類ならび,_テキスト総文字数), 乗算合同法によってM個の正規分布ならびを得る(_生成文字数,_正規分布1), 乗算合同法によってM個の正規分布ならびを得る(_生成文字数,_正規分布2), 連続文字番号の割り当て(0,_文字分類ならび,_仮文字番号ならび), t778(_正規分布1,_正規分布2,_仮文字番号ならび,_発生文字コードならび), atom_codes(_発生文,_発生文字コードならび). t778_2([],[],_,_,[]) :- !. t778_2([V1|R1],[V2|R2],_テキスト総文字数,_仮文字番号ならび,[_生成文字コード|R3]) :- member([_分類,_仮文字番号下限,_仮文字番号上限],_仮文字番号ならび), _テキスト総文字数 * V1 >= _仮文字番号下限, _テキスト総文字数 * V1 =< _仮文字番号上限, 一文字生成する(_分類,V2,_生成文字コード), t778_2(R1,R2,_テキスト総文字数,_仮文字番号ならび,R3). 一文字生成する(_分類,V,_生成文字コード) :- sub_atom(_分類,0,2,_,全角), eucコード分類(_分類,C1,C2), _生成文字コード is truncate((((C2 - C1 + 2) // 2) * V) * 2 + C1. 一文字生成する(_分類,V,_生成文字コード) :- sub_atom(_分類,0,2,_,半角), eucコード分類(_分類,C1,C2), _生成文字コード is truncate(((C2 - C1 + 1) * V) + C1. テキスト文字総数(_文字分類ならび,_テキスト総文字数) :- findsum(_発生文字数,member([_,_発生文字数],_文字分類ならび),_テキスト総文字数). 連続文字番号の割り当て(_,[],[]) :- !. 連続文字番号の割り当て(N,[[_分類,S]|R1],[[分類,N,N1]|R2]) :- N2 is N + S, N1 is N + S - 1, 連続文字番号の割り当て(N2,R1,R2). eucコード分類(半角英数,0x30,0x39). eucコード分類(半角英数,0x51,0x5a). eucコード分類(半角英数,0x61,0x6a). eucコード分類(全角数字,0xa3b0,0xa3b9). eucコード分類(半角カナ,0x8ea1,0x8ed6). eucコード分類(全角カナ,0xa5a1,0xa5f6). eucコード分類(全角かな,0xa4a1,0xa4f3). eucコード分類(全角記号,0xa1a1,0xa2fe). eucコード分類(全角漢字,0xb0a1,0xfcee). 乗算合同法によってM個の正規分布ならびを得る(M,L) :- _初期値 is random mod 29571, 乗算合同法によってM個の正規分布ならびを得る(M,_初期値,L). 乗算合同法によってM個の正規分布ならびを得る(M,_初期値,L) :- 乗算合同法による正規分布ならび(M,16087,_初期値,65535,L). 乗算合同法による正規分布ならび(0,A,N,_法,[]) :- !. 乗算合同法による正規分布ならび(M,A,N,_法,[X|R]) :- X is N / _法, 乗算合同法演算(A,N,_法,N2), M1 is M - 1, 乗算合同法による正規分布ならび(M1,A,N2,_法,R). 乗算合同法演算(A,N,_法,N2) :- N2 is (A * N) mod _法. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/770 # # [1] 授業単元:プログラミング演習2 # [2] 問題文(含コード&リンク): # テキストファイルを読み込み、 # 文字コード表を利用して種類ごとに文字を分類し、それぞれをカウントするプログラムを作れ # 分類は以下の通りとする。 # 1.半角英数 # 2.半角カナ # 3.半角記号 # 4.全角かな # 5.全角記号 # 6.漢字 # 以上のように分類した上で「半角英数:XX字、半角カナ:XX字・・・」というように結果をファイルに出力せよ。 # 使用する文字コード表は自由だが一般に使われているものを選択せよとのことでした。 # コード内にコメントで使用した文字コードを注釈として記載するようにとの連絡がありました。 eucコード分類(半角英数,0x30,0x39). eucコード分類(半角英数,0x51,0x5a). eucコード分類(半角英数,0x61,0x6a). eucコード分類(全角数字,0xa3b0,0xa3b9). eucコード分類(半角カナ,0x8ea1,0x8ed6). eucコード分類(全角カナ,0xa5a1,0xa5f6). eucコード分類(全角かな,0xa4a1,0xa4f3). eucコード分類(全角記号,0xa101,0xa2fe). eucコード分類(全角漢字,0xb0a1,0xfcee). 文字コード分類(_テキスト,_分類ならび) :- atom_codes(_テキスト,Codes), 文字コード分類(Codes,[],_分類ならび). 文字コード分類([],_分類ならび,_分類ならび). 文字コード分類([A|R1],_分類ならびの一,_分類ならび) :- eucコード分類(_分類,_コード下限,_コード上限), A >= _コード下限, A =< _コード上限, 分類ならびの更新(_分類ならびの一,_分類,_分類ならびの二), 文字コード分類(R1,_分類ならびの二,_分類ならび),!. 文字コード分類([_|R1],_分類ならびの一,_分類ならび) :- 文字コード分類(R1,_分類ならびの一,_分類ならび). 分類ならびの更新([],_分類,[[_分類,1]]) :- !. 分類ならびの更新([[_分類,_頻度の一]|R],_分類,[[_分類,_頻度の二]|R]) :- _頻度の二 is _頻度の一 + 1,!. 分類ならびの更新([U|R1],_分類,[U|R2]) :- 分類ならびの更新(R1,_分類,R2). 分類文字数(_分類文字数ならび) :- findall([_分類,_文字数],(eucコード分類(_分類,S,E),分類文字数計算(_分類,S,E,_文字数)), _分類文字数ならび). 分類文字数計算(_分類,S,E,_文字数) :- sub_atom(_分類,1,2,_,半角), _文字数 is E - S + 1. 分類文字数計算(_分類,S,E,_文字数) :- sub_atom(_分類,1,2,_,半角), _文字数 is (E - S) // 2 + 1. 分類文字のN字目(_分類,N,_文字コード) :- sub_atom(_分類1,2,_,半角), eucコード分類(_分類,S,E), _文字コード is S + N - 1. 分類文字のN字目(_分類,N,_文字コード) :- sub_atom(_分類1,2,_,全角), eucコード分類(_分類,S,_), _文字コード is (S + (N - 1) * 2). % 以下のサイトは # 出典::C/C++の宿題片付けます 第130代目 #676 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9965.txt # 以下のプログラムを作成せよ。 # 三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 # 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした # 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される # このような点数の変換プログラムを考える # 達成条件は # ・ファイルin.txtを開き、変換された点数データをファイルoutput.txtに書き込んでいる。 # ・ファイルからデータを読み込んだ時に、構造体にデータを入力している # ・ファイルout.txt内では、正しく点数が変換されている。 # ・名前は最大でも半角で20文字として。配列nameの外をアクセスしていない。 '以下のプログラムを作成せよ。 三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される このような点数の変換プログラムを考える 達成条件は ・ファイルin.txtを開き、変換された点数データをファイルoutput.txtに書き込んでいる。 ・ファイルからデータを読み込んだ時に、構造体にデータを入力している ・ファイルout.txt内では、正しく点数が変換されている。' :- get_lines('in.txt',Lines), 点数を嵩上げ計算する(Lines,L2), '変換された点数データをファイルoutput.txtに書き込んでいる。'('out.txt',L2). 点数を嵩上げ計算する(Lines,L2) :- 'Linesから名前・三科目点数ならびのならびに分解'(Lines,LL), 三科目の最高点を得る(LL,MaxA,MaxB,MaxC), 嵩上げ率の計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C), 嵩上げ計算した表示行ならびの生成(LL,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,L2). 'Linesから名前・三科目点数ならびのならびに分解'(Lines,LL) :- findall([Name2,A1,B1,C1],( member(Line,Lines), split(Line,[' ',','],[Name1,A1,B1,C1]), 名前の長さ制限(Name1,Name2)), LL). 三科目の最高点を得る(L,MaxA,MaxB,MaxC) :- findmax(A,(member([_,A,_,_],L)),MaxA), findmax(B,(member([_,_,B,_],L)),MaMaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C) :- _嵩上げ率A is 100 / MaxA, _嵩上げ率B is 100 / MaxB, _嵩上げ率C is 100 / MaxC. 嵩上げ計算(A,B,C,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX) :- AX is A * _嵩上げ率A, BX is B * _嵩上げ率B, CX is C * _嵩上げ率C. 嵩上げ計算した表示行ならびの生成(LL,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,L2) :- findall(表示行,( member([Name,A2,B2,C2],LL), 嵩上げ計算(A2,B2,C2,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX), atomic_list_concat([Name,AX,BX,CX],',',表示行)), L2). 名前の長さ制限(Name,NameX) :- atom_code(Name,L), 名前の長さ制限(0,L,LX), atom_codes(NameX,LX). 名前の長さ制限(_バイト累計_1,[A|R1],[A|R2]) :- char_code(A,Code), 文字のバイト累計(Code,_バイト累計_1,_バイト累計_2), 名前の長さ制限(_バイト累計_2,R1,R2). 名前の長さ制限(_,_,[]). 文字のバイト累計(Code,_バイト累計_1,_バイト累計_2) :- 全角文字の場合2バイト加算(Code,_バイト累計_1,_バイト累計_2). 文字のバイト累計(Code,_バイト累計_1,_バイト累計_2) :- 半角文字の場合1バイト加算(Code,_バイト累計_1,_バイト累計_2). 全角文字の場合2バイト加算(Code,_バイト累計_1,_バイト累計_2) :- Code > 255, _バイト累計_1 < 19, _バイト累計_2 is _バイト累計_1 + 2. 半角文字の場合1バイト加算(Code,_バイト累計_1,_バイト累計_2) :- Code < 256, _バイト累計_1 < 20, _バイト累計_2 is _バイト累計_1 + 2. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/676 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9965.txt # 以下のプログラムを作成せよ。 # 三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 # 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした # 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される # このような点数の変換プログラムを考える # 達成条件は # ・ファイルin.txtを開き、変換された点数データをファイルoutput.txtに書き込んでいる。 # ・ファイルからデータを読み込んだ時に、構造体にデータを入力している # ・ファイルout.txt内では、正しく点数が変換されている。 # ・名前は最大でも半角で20文字として。配列nameの外をアクセスしていない。 t741 :- get_lines('in.txt',Lines), findall([Name2,A1,B1,C1],(member(Lines),split(Lines,[' ',','],[Name1,A1,B1,C1]),名前の長さ制限(Name1,Name2)),L), findmax(A,(member([_,A,_,_],L),MaxA), findmax(B,(member([_,_,B,_],L),MaxB), findmax(A,(member([_,_,_,C],L),MaxC), 嵩上げ率の計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C), findall(S,( member([Name,A2,B2,C2],L),嵩上げ計算(A2,B2,C2,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX),concat_atom([Name,AX,BX,CX],',',S)),L2), put_lines('out.txt',L2). 嵩上げ率計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C) :- _嵩上げ率A is 100 / MaxA, _嵩上げ率B is 100 / MaxB, _嵩上げ率C is 100 / MaxC. 嵩上げ計算(A,B,C,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX) :- AX is A * _嵩上げ率A, BX is B * _嵩上げ率B, CX is C * _嵩上げ率C. 名前の長さ制限(Name,NameX) :- atom_code(Name,L), 名前の長さ制限(0,L,LX), atom_codes(NameX,LX). 名前の長さ制限(M,_,[]) :- M > 20,!. 名前の長さ制限(M,[A|R1],[]) :- char_code(A,Code), Code > 255, M > 18,!. 名前の長さ制限(M,[A|R1],[A|R2]) :- char_code(A,Code), Code > 255, M < 19, M2 is M + 2, 名前の長さ制限(M2,R1,R2),!. 名前の長さ制限(M,[A|R1],[A|R2]) :- char_code(A,Code), Code < 256, M2 is M + 1, 名前の長さ制限(M2,R1,R2),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/293 # # 【 課題 】テキストファイルをあらかじめ作っておいて、その内容を表示しながら # 別のファイルにコピーするプログラムを書け。 # コマンド例(file_a.txtからfile_b.txtへコピーする) # 内容例 # 123456 # 234567 # abcdefg 'テキストファイルをあらかじめ作っておいて、その内容を表示しながら別のファイルにコピーする'(_入力ファイル,_出力ファイル) :- open(_入力ファイル,read,Input), open(_出力ファイル,write,Output), '内容を表示しながら別のファイルにコピーする'(Input,Output), close(Output), close(Input),!. '内容を表示しながら別のファイルにコピーする'(Input,_) :- at_end_of_stream(Input),!. '内容を表示しながら別のファイルにコピーする'(Input,Output) :- 読み込んだ行を表示しながらコピーする(Input,Output). 読み込んだ行を表示しながらコピーする(Input,Output) :- 読み込んだ行を(Input,_行), 表示しながら(_行), コピーする(Output,_行), '内容を表示しながら別のファイルにコピーする'(Input,Output). 読み込んだ行を(Input,_行) :- get_line(Input,_行). get_line(Input,Line) :- read_line_to_codes(Input,Codes), atom_codes(Line,Codes). 表示しながら(_行) :- writef('%t\n',[_行]). コピーする(Output,_行) :- format(Output,'~w\n',[_行]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/231 # # 【 形態 】Javaアプリケーション(main()で開始) # 【 課題 】以下のようなサーバプログラムCountServer.javaとクライアントプログラム # CountClient.javaを作成してください。 # # [条件] # ・サーバは、クライアントから文字列を受信し、その文字数をカウントして #  結果をクライアントに返す。 # ・クライアントプログラムを実行時に、コマンドラインから、サーバホスト名 #  java CountClient サーバホスト名 "文字列" # ・クライアントは、サーバからの結果を受け取り、画面に表示する。 # ・サーバは、ポート番号 4321 で接続要求を受け付けるようにする。 # # サーバプログラムの実行 # >java CountServer # # クライアントプログラムの実行と実行結果 # >java CountClient host1 "Java Programming" # 16   server(Port) :- socket(internet,stream,Socket), socket_bind(Socket,Port), repeat, socket_listen(Socket), socket_accept(Socket,Host : Port2,NewSocket), socket_raw_receive(NewSocket,8192,_,_受信コードならび,_実際に受信した長さ), atom_codes(_受信した文,_受信コードならび), server_1(_受信した文,NewSocket), Message = quit, socket_shutdown(Socket),!. server_1(quit,NewSocket,Input,Output) :- socket_shutdown(NewSocket),!. server_1(_受信した文,NewSocket) :- atom_codes(Message,L), atom_length(Message,Length), open(NewSocket,write,Output,[type(binary)]), write_formatted(Output,'%t\r\n',[Length]), flush_output(Output), close(Output), socket_shutdown(NewSocket), ! . client(Host,Port) :- get_line(_伝送する文), socket(internet, stream, Socket), socket_connect(Socket, Addr : Port), open(Socket,read,Input), open(Socket,write,Output), write_formatted(Output,'%t\n',[_送信する文]), flush_output(Output), get_line(Input,_受信した文), client_1(_受信した文,Host,Socket,Input,Output), close(Input), close(Output), socket_shutdown(Socket). client_1(end_of_file,Input,Output) :- !. client_1(_受信した文,Input,Output) :- write_formatted('%t\n',[_受信した文]), get_line(Input,_次の受信した文), client_1(_次の受信した文,Input,Output). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 153代目 #624 # [1] 授業単元:リスト構造体 # [2] 問題文(含コード&リンク): # enqueue()とdequeue()を用いて実行結果が # # Please input E(登録) or D(削除): E # Input number and name: 8 Nakamura # Please input E(登録) or D(削除): E # Input number and name: 3 Saito # Please input E(登録) or D(削除): D # Number=8 Name=Nakamura # Please input E(登録) or D(削除): D # Number=3 Name=Saito # Please input E(登録) or D(削除): D # No Data! # Please input E(登録) or D(削除): E # ・ # ・ # ・ # のように動作するプログラムを作成せよ # '入力された英字文字列(a~z,A-Z)に、どの文字がいくつ入っているかを 調べるプログラムcount_char.cを作成せよ。 実行例 String: cbbbAcAccZ A: ** Z: * b: *** c: ****' :- '入力された英字文字列(a~z,A-Z)に'(_文字列), count_char(_文字列). '入力された英字文字列(a~z,A-Z)に'(_文字列) :- get_line(_文字列), '診断::入力された英字文字列(a~z,A-Z)'(_文字列),!. '入力された英字文字列(a~z,A-Z)に'(_文字列) :- '入力された英字文字列(a~z,A-Z)に'(_文字列). '診断::入力された英字文字列(a~z,A-Z)'(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),英字文字(_文字)). 英字文字(_文字) :- 英小文字(_文字). 英字文字(_文字) :- 英大文字(_文字). 英小文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 英大文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. count_char(_文字列) :- atom_chars(_文字列,Chars), count_char_1(Chars,[],QL), キューを表示する(QL). count_char_1([],X,X). count_char_1([A|R],QL,X) :- count_char_2(A,QL,QL2), count_char_1(R,QL2,X). count_char_2(A,[],[[A,QA]]) :- 新しいキューを作る(Q), キューに要素を追加する('*',Q,QA),!. count_char_2(A,[[A,QA]|R],[[A,QB],R]) :- キューに要素を追加する('*',QA,QB),!. count_char_2(A,[U|R1],[U|R2]) :- count_char_2(A,R1,R2). 新しいキューを作る(X-X). キューは空である(X-Y) :- X == Y. キューに要素を追加する(_要素,X-[_要素|Y],X-Y). キューを表示する(QL) :- forall(( member([U,Q-[]],QL), atomic_list_concat(Q,S)), writef('%w: %w\n',[U,S])). get_line(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). % % キューは引数内の論理変数として重リストを使って定義し、 % それを更新しながら持ちまわるのが普通だが、 % ここでは愚直に、キューを述語としてassertし、reatract/assertを % 繰り返して値を出入りさせる述語群を定義してみた。 % % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/574 # # [1] 授業単元:プログラミング序論演習 # [2] 問題文(含コード&リンク): CUI上で動くメーラーを作れ :- op(850,fx,rm). rm(File) :- concat_atom(['rm -f ',File],S), system(S),!. % *** user: mail / 1 *** mail(max) :- 'メール数の確認'(N), mail(N),!. mail(0) :- reconsult('listing/最終メール番号#1.pro'), 'メール数の確認'(N), '最終メール番号'(N2), M is N2 - N, ( M < 0, mail(M), retract('最終メール番号'(_)), asserta('最終メール番号'(N)), '最終メール番号の保存' ; M = 0 ; M > 0, retract('最終メール番号'(_)), asserta('最終メール番号'(N)), '最終メール番号の保存' ), !. mail(0) :- !. mail(N) :- N < 0, !, 'メール数の確認'(Max), rm tempmsg, abolish('受信先アドレス' / 1), reconsult('listing/最終メール番号#1.pro'), for(-1,M,N), open(tempmsg,append,Output), M2 is Max + M + 1, write(Output,'\n\n'), '返信入力表示'(Output,M2), close(Output), M = N, exists(tempmsg,read), cat tempmsg, '最終メール番号の保存', !. mail(N) :- N > 0, rm tempmsg, rm tempmsg2, rm tempmsg3, myhostname(Myhostname), 'メールを読む'(N), ! 'cat tempmsg | nkf -We', write('\n'), !. mail(N) :- \+(N = 0), exists(tempmsg,read), ! 'cat tempmsg | nkf -We', write('\n'), !. % *** user: mail10 / 1 *** mail10(N) :- integer(N), N < 0, 'メールの数を調べる'(Max), S is Max + N + 1, for(S,M,Max), write_formatted('\n#%t\n',[M]), mail10(M), M = Max, !. mail10(S - E) :- for(S,N,E), write_formatted('\n#%t\n',[N]), mail10(N), N = E, !. mail10(N) :- integer(N), \+(N = 0), N > 0, rm tempmsg, rm tempmsg2, rm tempmsg3, myhostname(Myhostname), 'メールを読む'(N), shs('cat tempmsg | nkf -We',L), member(A,L,R2), subatomic(A,1,7,'Status:'), for(1,M,10), list_nth(M,R2,X), write_formatted('%t\n',[X]), M = 10, !. % *** user: 'メール数の確認' / 2 *** 'メール数の確認'(_メールボックス,_メール数) :- 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,110,_差し込み口), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), repeat, get_line(_入力,C), split(C,[' '],L), list_nth(4,L,_メール数), \+(_メール数 = 'lock.'), write(_出力,'QUIT\r\n'), flush_output(_出力), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. % *** user: 'メール数の確認' / 1 *** 'メール数の確認'(_メール数) :- 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,110,_差し込み口), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), repeat, stream_read(_入力,C), split(C,[' '],L), list_nth(4,L,_メール数), \+(_メール数 = 'lock.'), write(_出力,'QUIT\r\n'), flush_output(_出力), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. % *** user: 'メールの数を調べる' / 1 *** 'メールの数を調べる'(_メールの数) :- 'メールサーバ'(_メールサーバ), 'クライアント通信確立'(_メールサーバ,110,_差し込み口), ( error_protect('私書箱'(_私書箱),fail) ; \+(error_protect('私書箱'(_),fail)), _私書箱 = takao ), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), get_line(_入力,A), write_formatted(_出力,'USER %t\r\n',[_私書箱]), flush_output(_出力), 'メールパスワードの送付'(_メールボックス,_入力,_出力), repeat, get_line(_入力,C), split(C,[' '],L), list_nth(4,L,_メールの数), \+(_メールの数 = 'lock.'), write(_出力,'QUIT\r\n'), flush_output(_出力), close(_入力), close(_出力), socket_shutdown(_差し込み口), ! . % *** user: 'メールを読む' / 6 *** 'メールを読む'(_メールボックス,N,A,B,C,X) :- integer(N), N > 0, 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,110,_差し込み口), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールユーザ名の送付'(_メールボックス,_入力,_出力), 'メールパスワードの送付'(_メールボックス,_入力,_出力), get_line(_入力,C), write_formatted(_出力,'RETR %t\r\n',[N]), flush_output(_出力), pop3_message_get(_入力,X), write(_出力,'QUIT\r\n'), flush_output(_出力), get_line(_入力,D), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. % *** user: 'メールを読む' / 5 *** 'メールを読む'(L,A,B,C,X) :- list(L), 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,110,_差し込み口), ( error_protect('私書箱'(_私書箱),fail) ; \+(error_protect('私書箱'(_私書箱),fail)), _私書箱 = default ), open(_差し込み口,read,_入力,A), open(_差し込み口,write,_出力,B), 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), get_line(_入力,C), ( member(N,L), write_formatted(_出力,'RETR %t\r\n',[N]), flush_output(_出力), pop3_message_get(_入力,X), write(_出力,'QUIT\r\n'), flush_output(_出力), fail ; true ), get_line(_入力,D), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. 'メールを読む'(N,A,B,C,X) :- integer(N), N > 0, 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,110,_差し込み口), ( error_protect('私書箱'(_私書箱),fail) ; \+(error_protect('私書箱'(_私書箱),fail)), _私書箱 = default ), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), pop3_message_get(_入力,X), write(_出力,'QUIT\r\n'), flush_output(_出力), get_line(_入力,D), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. % *** user: 'メールを読む' / 2 *** 'メールを読む'(N,X) :- var(X), integer(N), N =< 0, 'メール数の確認'(_メール数), M is _メール数 + N + 1, 'メールを読む'(M,_,_,_,X), concat_atom(X,'\n',_文), open(tempmsg,append,_出力2), write_formatted(_出力2,'%t',[_文]), flush_output(_出力2), close(_出力2), !. 'メールを読む'(N,FILE) :- \+(var(FILE)), integer(N), N =< 0, 'メールサーバアドレス'(_メールサーバアドレス), 'クライアント通信確立'(_メールサーバアドレス,110,_差し込み口), ( FILE = '', tmpnam(FILE_1) ; \+(FILE = ''), FILE = FILE_1 ), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールを読むの一'(N,FILE_1,_入力,_出力), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. % *** user: 'メールを読むの一' / 4 *** 'メールを読むの一'(N,FILE,_入力,_出力) :- 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), 'メール数の取得'(_入力,_メール数), _限界数 is _メール数 + N + 1, 'メールの取得'(_入力,_出力,FILE,_メール数,_限界数), 'メールサーバを切り離す'(_入力,_出力), !. % *** user: 'メールの取得' / 5 *** 'メールの取得'(_入力,_出力,FILE,Max,M) :- open(FILE,append,_出力2), write(_出力2,'\n'), for(Max,U,M), write_formatted(_出力,'RETR %t\r\n',[U]), flush_output(_出力), pop3_message_rw(_入力,_出力2), write(_出力2,'.\n'), U = M, write(_出力2,'\n'), close(_出力2), !. % *** user: pop3_message_rw / 2 *** pop3_message_rw(Input,Output) :- repeat, get_line(Input,S), replace_all(S,'\r','',S2), ( subatomic(S,1,1,'.') ; S = end_of_file ; S2 = [], write(Output,'\n'), fail ; \+(S2 = []), write_formatted(Output,'%t\n',[S2]), fail ),!. % *** user: pop3_message_get / 2 *** pop3_message_get(A,B) :- findall(E,(repeat , get_line(A,C) , replace_all(C,'\r','',D) , (sub_atom(C,0,1,'.') , (!) , fail ; C = end_of_file , (!) , fail ; D = [] , E = '\n' ; not D = [] , E = D)),B),!. % *** user: 'メール数の取得' / 2 *** 'メール数の取得'(_入力,_メール数) :- get_line(_入力,C), split(C,[' '],L), list_nth(4,L,_メール数). % *** user: 'メールパスワードの送付' / 3 *** 'メールパスワードの送付'(_メールボックス,_入力,_出力,B) :- メールパスワード(_メールボックス,_メールパスワード), get_line(_入力,B), write_formatted(_出力,'PASS %t\r\n',[_メールパスワード]), flush_output(_出力). % *** user: 'メールパスワードの送付' / 2 *** 'メールパスワードの送付'(_入力,_出力) :- メールパスワード(_メールパスワード), get_line(_入力,B), write_formatted(_出力,'PASS %t\r\n',[_メールパスワード]), flush_output(_出力). % *** user: 'メールユーザ名の送付' / 3 *** 'メールユーザ名の送付'(_メールボックス,_入力,_出力,A) :- メールユーザ(_メールボックス,_メールユーザ), get_line(_入力,A), write_formatted(_出力,'USER %t\r\n',[_メールボックス]), flush_output(_出力). 'メールユーザ名の送付'(_入力,_出力) :- メールユーザ(_メールユーザ), get_line(_入力,A), write_formatted(_出力,'USER %t\r\n',[_メールユーザ]), flush_output(_出力). % *** user: 'メールサーバを切り離す' / 2 *** 'メールサーバを切り離す'(_入力,_出力) :- write(_出力,'QUIT\r\n'), flush_output(_出力), get_line(_入力,D),!. smtp_iso(From,To,Subject,'文'(_文)) :- tmpnam(TMPNAM), tmpnam(TMPNAM2), open(TMPNAM,write,Output), write_formatted(Output,'%t\n',[_文]), close(Output), concat(['nkf -e -j ',TMPNAM,' >',TMPNAM2],S), system(S), smtp_iso(Input,Output,From,To,Subject,TMPNAM2,_診断), unlink(TMPNAM), unlink(TMPNAM2),!. smtp_iso(From,To,Subject,File) :- \+(list(File)), tmpnam(TMPFILE), concat(['nkf -e -j ',File,' >',TMPFILE],S1), base64(Subject,Subject64), sprintf('=?iso-2022-jp?B?%t?=',[Subject64],MimeSubject), smtp_server(Host), smtp_iso(Host,From,To,MimeSubject,TMPFILE,_診断), unlink(TMPFILE),!. smtp_iso(From,To,Subject,Files) :- list(Files), smtp_plus(Files,File1,Boundary), tmpnam(TMPFILE), concat(['cat ',File1,' | nkf -e -j >',TMPFILE],S1), base64(Subject,Subject64), sprintf('=?iso-2022-jp?B?%t?=',[Subject64],MimeSubject), smtp_server(Host), stmp_iso(Host,From,To,MimeSubject,TMPFILE,Boundary,_診断),!. % *** user: smtp_iso / 2 *** smtp_iso(To,(?- _質問)) :- tmpnam(TMPNAM), tell(TMPNAM), write_formatted('%q.\n',[(?- _質問)]), told, smtp_iso(To,'prolog@takao.ozaki.name','質問',TMPNAM), ! . % *** user: smtp_iso / 6 *** smtp_iso(_送信元,_送信先,MimeSubject,File,Data,_診断) :- 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,38,_差し込み口), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールユーザ名の送付'(_メールボックス,_入力,_出力), 'メールパスワードの送付'(_メールボックス,_入力,_出力), send_helo(Input,Output,Domain), send_from_to(Input,Output,_送信元,_送信先), send_data(Input,Output,Subject,_送信元,_送信先,Data), send_quit(Input,Output), shutdown(_差し込み口),!. send_helo(Input,Output,Domain) :- write_formatted(Output,'HELO %t\r\n',[Domain]), read(Input,_), write_formatted(Output,'EHLO %t\r\n',[Domain]), read(Input,_),!. send_from_to(Input,Output,From,To) :- write_formatted(Output,'MAIL FROM: %t\r\n',[From]), stream_read(Input,_), write_formatted(Output,'RCPT TO: %t\r\n',[To]), stream_read(Input,_),!. send_data(Input,Output,Subject,From,To,Data) :- write_formatted('DATA\r\n',[]), stream_read(Input,_), write_formatted(Output,'Subject: %t\r\nFrom: %t\r\nTo: %t\r\n\r\n',[Subject,From,To]), write_formatted(Output,'%t',[Data]), get_line(Input,_),!. send_quit(Input,Output) :- write_formatted(Output,'QUIT\r\n'), get_line(Input,_),!. % *** user: smtp_plus / 3 *** smtp_plus(FileList,File,Boundary) :- FileList = [File1|R], tmpnam(A1), tmpnam(A2), tmpnam(A3), Boundary = '------------000402050407020604050408', smtp_plus_base64_encode(R,FileList2), tmpnam(File), tell(File), write('This is a multi-part message in MIME format.\n'), smtp_plus_1(Boundary,File1), smtp_plus_2(Boundary,FileList2,R), told,!. % *** user: smtp_plus_1 / 2 *** smtp_plus_1(Boundary,File) :- write_formatted('--%t\n',[Boundary]), write('Content-Type: text/plain; charset=EUC-JP\n'), write('Content-Transfer-Encoding: 8bit\n\n'), open(File,read,Fp), repeat, get_code(Fp,X), ( X = -1 ; name(Y,[X]), write_formatted('%t',[Y]), fail ), write('\n'), write('\n'), close(Fp),!. % *** user: smtp_plus_2 / 3 *** smtp_plus_2(Boundary,[],_) :- write_formatted('\n--%t--\n',[Boundary]), write('.\n\n'),!. smtp_plus_2(Boundary,[File|R],[File_1|R2]) :- smtp_file_suffix(File,Suffix), smtp_file_mime(Suffix,Mime), write_formatted('\n--%t\n',[Boundary]), write_formatted('Content-Type: %t;\n',[Mime]), write_formatted(' name="%t"\n',[File_1]), write('Content-Transfer-Encoding: base64\n'), write('Content-Disposition: inline;\n'), write_formatted(' filename="%t"\n\n',[File_1]), open(File,read,Fp), repeat, get_code(Fp,X), ( X = -1 ; name(Y,[X]), write_formatted('%t',[Y]), fail ), close(Fp), smtp_plus_2(Boundary,R,R2). % *** user: smtp_plus_2 / 2 *** smtp_plus_2(_,[]) :- write('.\n\n'),!. smtp_plus_2(Boundary,[File|R]) :- smtp_file_suffix(File,Suffix), smtp_file_mime(Suffix,Mime), write_formatted('--%t\n',[Boundary]), write_formatted('Content-Type: %t;\n',[Mime]), write_formatted(' name="%t"\n',[File]), write('Content-Transfer-Encoding: base64\n'), write('Content-Disposition: inline;\n'), write_formatted(' filename="%t"\n\n',[File]), open(File,read,Fp), repeat, get_code(Fp,X), ( X = -1 ; name(Y,[X]), write_formatted('%t',[Y]), fail ), close(Fp), write_formatted('\n--%t--\n',[Boundary]), smtp_plus_2(Boundary,R). % *** user: smtp_plus / 2 *** smtp_plus(FileList,File) :- FileList = [File1|R], tmpnam(A1), tmpnam(A2), tmpnam(A3), concat([--------------------,A1,A2,A3],AX), replace_all(AX,'/tmp/','',Boundary), smtp_plus_base64_encode(R,FileList2), tmpnam(File), tell(File), write('Content-Type: multipart/mixed;\n'), write_formatted(' boundary="%t"\n\n',[Boundary]), write('This is multi-part message in MIME format.\n'), smtp_plus_1(Boundary,File1), smtp_plus_2(Boundary,FileList2), told, !. % *** user: smtp_file_mime / 2 *** smtp_file_mime(jpg,'image/jpeg') :- !. smtp_file_mime(jpeg,'image/jpeg') :- !. smtp_file_mime(txt,'text/plain') :- !. smtp_file_mime(xls,xls) :- !. smtp_file_mime(csv,csv) :- !. smtp_file_mime(html,'text/html') :- !. smtp_file_mime(ps,'application/postscript') :- !. smtp_file_mime(pdf,'application/postscript') :- !. smtp_file_mime(_,'text/plain') :- !. % *** user: smtp_file_suffix / 2 *** smtp_file_suffix(File,Suffix) :- decompcons(File,L), ( smtp_file_suffix_2(L,L2), concat(L2,Suffix) ; \+(smtp_file_suffix_2(L,_)), Suffix = txt ),!. % *** user: smtp_file_suffix_2 / 2 *** smtp_file_suffix_2(['.'|R],R) :- !. smtp_file_suffix_2([_|R1],R2) :- smtp_file_suffix_2(R1,R2). % *** user: smtp_plus_base64_encode / 2 *** smtp_plus_base64_encode([],[]) :-!. smtp_plus_base64_encode([File1|R1],[File2|R2]) :- base64_file_encode(File1,File2), smtp_plus_base64_encode(R1,R2). % *** user: 'クライアント通信確立' / 3 *** 'クライアント通信確立'(_ホスト,_サービス,_差し込み口) :- '定数'(_サービス), !, net_service(_サービス,tcp,_舫), socket(internet,stream,_差し込み口), host_addr(_ホスト,Addr), socket_connect(_差し込み口,Addr : _舫). 'クライアント通信確立'(_ホスト,_舫,_差し込み口) :- '整数'(_舫), !, socket(internet,stream,_差し込み口), socket_connect(_差し込み口,_ホスト : _舫). % *** user: get_line / 2 *** get_line(Stream,S) :- error_protect(get_code(Stream,X_4),X_4 = -1), get_line_1(Stream,X_4,L_4,[]), atom_codes(S,L_4), ! . get_line_1(Stream,10,[],[]) :- !. get_line_1(Stream,10,L,L2) :- !, reverse(L2,L). get_line_1(Stream,10,L_4,[13|L1_4]) :- !, reverse(L1_4,L_4). get_line_1(Stream,31,L_4,L1_4) :- !, reverse(L1_4,L_4). get_line_1(Stream,-1,L,[A|L1]) :- reverse([A|L1],L). get_line_1(Stream,-1,[101,110,100,95,111,102,95,102,105,108,101],L2) :- !. get_line_1(Stream,X_4,L_4,L1_4) :- error_protect(get_code(Stream,Y_4),Y_4 = -1), !, get_line_1(Stream,Y_4,L_4,[X_4|L1_4]). base64g(Atom,X) :- replace_all(Atom,' ','',Atom2), base64(X,Atom2) . base64s(Atom,X) :- \+(var(Atom)), name2(Atom,L1), base64_2(L1,Y), concat_atom(Y,X) . base64(Atom,X) :- \+(var(Atom)), atom_codes(Atom,L1), kjtoeuc(CodeList,L1), base64_2(CodeList,Y), concat_atom(Y,X),!. base64(X,Atom) :- var(X), atom_chars(Atom,List), base64_1(Y,List), concat_atom(Y,Y2), atom_codes(Y2,Codes), kjtoeuc(Codes,Y3), atom_codes(X,Y3),!. base64_1([],[]) :- !. base64_1(X,[A,B,C,=]) :- base64_table(A1,A), base64_table(B1,B), base64_table(C1,C), append(A1,B1,L1), append(L1,C1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_1(X,[A,B,=,=]) :- base64_table(A1,A), base64_table(B1,B), append(A1,B1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_1(X,[A,B,C,D|R]) :- base64_table(A1,A), base64_table(B1,B), base64_table(C1,C), base64_table(D1,D), append(A1,B1,L1), append(L1,C1,L2), append(L2,D1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_table([0,0,0,0,0,0],'A'). base64_table([0,0,0,0,0,1],'B'). base64_table([0,0,0,0,1,0],'C'). base64_table([0,0,0,0,1,1],'D'). base64_table([0,0,0,1,0,0],'E'). base64_table([0,0,0,1,0,1],'F'). base64_table([0,0,0,1,1,0],'G'). base64_table([0,0,0,1,1,1],'H'). base64_table([0,0,1,0,0,0],'I'). base64_table([0,0,1,0,0,1],'J'). base64_table([0,0,1,0,1,0],'K'). base64_table([0,0,1,0,1,1],'L'). base64_table([0,0,1,1,0,0],'M'). base64_table([0,0,1,1,0,1],'N'). base64_table([0,0,1,1,1,0],'O'). base64_table([0,0,1,1,1,1],'P'). base64_table([0,1,0,0,0,0],'Q'). base64_table([0,1,0,0,0,1],'R'). base64_table([0,1,0,0,1,0],'S'). base64_table([0,1,0,0,1,1],'T'). base64_table([0,1,0,1,0,0],'U'). base64_table([0,1,0,1,0,1],'V'). base64_table([0,1,0,1,1,0],'W'). base64_table([0,1,0,1,1,1],'X'). base64_table([0,1,1,0,0,0],'Y'). base64_table([0,1,1,0,0,1],'Z'). base64_table([0,1,1,0,1,0],a). base64_table([0,1,1,0,1,1],b). base64_table([0,1,1,1,0,0],c). base64_table([0,1,1,1,0,1],d). base64_table([0,1,1,1,1,0],e). base64_table([0,1,1,1,1,1],f). base64_table([1,0,0,0,0,0],g). base64_table([1,0,0,0,0,1],h). base64_table([1,0,0,0,1,0],i). base64_table([1,0,0,0,1,1],j). base64_table([1,0,0,1,0,0],k). base64_table([1,0,0,1,0,1],l). base64_table([1,0,0,1,1,0],m). base64_table([1,0,0,1,1,1],n). base64_table([1,0,1,0,0,0],o). base64_table([1,0,1,0,0,1],p). base64_table([1,0,1,0,1,0],q). base64_table([1,0,1,0,1,1],r). base64_table([1,0,1,1,0,0],s). base64_table([1,0,1,1,0,1],t). base64_table([1,0,1,1,1,0],u). base64_table([1,0,1,1,1,1],v). base64_table([1,1,0,0,0,0],w). base64_table([1,1,0,0,0,1],x). base64_table([1,1,0,0,1,0],y). base64_table([1,1,0,0,1,1],z). base64_table([1,1,0,1,0,0],'0'). base64_table([1,1,0,1,0,1],'1'). base64_table([1,1,0,1,1,0],'2'). base64_table([1,1,0,1,1,1],'3'). base64_table([1,1,1,0,0,0],'4'). base64_table([1,1,1,0,0,1],'5'). base64_table([1,1,1,0,1,0],'6'). base64_table([1,1,1,0,1,1],'7'). base64_table([1,1,1,1,0,0],'8'). base64_table([1,1,1,1,0,1],'9'). base64_table([1,1,1,1,1,0],+). base64_table([1,1,1,1,1,1],/). base64_table([A,B,C,D],X) :- base64_table([A,B,C,D,0,0],X). base64_table([A,B],X) :- base64_table([A,B,0,0,0,0],X). base64_a2b([],[]). base64_a2b([Atom|R],[A,B,C,D,E,F,G,H|R2]) :- atob(Atom,[A,B,C,D,E,F,G,H]), base64_a2b(R,R2). base64_2([],[]) :- !. base64_2([A,B,C|R],X) :- base64_i2b([A,B,C],L), base64_3(L,Z), base64_2(R,R2), append(Z,R2,X),!. base64_2([A,B],X) :- base64_i2b([A,B],L), base64_3(L,Z), append(Z,[=],X),!. base64_2([Y],X) :- base64_i2b([Y],L), base64_3(L,Z), append(Z,[=,=],X),!. base64_3([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X],[Z1,Z2,Z3,Z4]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H,I,J,K,L],Z2), base64_table([M,N,O,P,Q,R],Z3), base64_table([S,T,U,V,W,X],Z4),!. base64_3([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P],[Z1,Z2,Z3]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H,I,J,K,L],Z2), base64_table([M,N,O,P],Z3),!. base64_3([A,B,C,D,E,F,G,H],[Z1,Z2]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H],Z2). base64_i2b([],[]) :- !. base64_i2b([X|R],[1,B,C,D,E,F,G,H|R2]) :- var(X), itob(X,[1,B,C,D,E,F,G,H]), base64_i2b(R,R2),!. base64_i2b([X|R],[0,B,C,D,E,F,G,H|R2]) :- var(X), itob(U,[0,B,C,D,E,F,G,H]), X is U - 128, base64_i2b(R,R2),!. base64_i2b([Code|R],[A,B,C,D,E,F,G,H|R2]) :- itob(Code,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,A,B,C,D,E,F,G,H]), base64_i2b(R,R2) . name2(X,Y) :- atom(X), strlen(X,Len), findall(N,(for(1,M,Len) , char_code1(X,M,N1) , (N1 < 0 , N is N1 + 256 ; N1 >= 0 , N = N1)),Y),!. name2(A,[N]) :- atomic(A), name(A,[N]),!. name2(A,L) :- var(A), name21(L,L2), atom_codes(A,L2),!. name21([],[]) :- !. name21([N1,N2|R],[N|R2]) :- N1 > 127, N2 > 127, N is N1 * 256 + N2, name21(R,R2),!. name21([N1,N2|R],[N|R2]) :- N1 > 127, N2 < 128, N is N1 * 256 + N2, name21(R,R2),!. name21([N1|R],[N1|R2]) :- name21(R,R2). itob(N,L) :- itob(N,[],L1), length(L1,Len), Len2 is 8 - Len, length(L2,Len2), all(L2,0), append(L2,L1,L). itob(0,X,X) :- !. itob(N,Y,X) :- M is N mod 2, N2 is N // 2, itob(N2,[M|Y],X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/291 # # [1] 授業単元:コンピュータリテラシー # [2] 問題文(含コード&リンク):問題文と参考は以下です #   http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9806.txt # ・試験の過程を記録 # 1,番号、得点を入力したあと平均点を計算 # 2,番号順と得点順に並べ替え(ifを使いどちらか選択できるようにする) # 3,番号、得点、平均との差を出力 # 以上のプログラムを作成 成績を記録する :- write('番号と得点をスペースで区切って一行で入力してください\n'), get_line(_行), 成績を記録する(_行). 成績を記録する(end_of_file) :- !. 成績を記録する(_行) :- split(_行,[' '],[_番号,_得点]), assertz(成績(_番号,_得点)), get_line(_次の行), 成績を記録する(_次の行). 平均点(_平均点) :- findavg(_得点,成績(_,_得点),_平均点). 番号順に並べ直し(_番号順成績ならび) :- findall([_番号,_得点],成績(_番号,_得点),_成績ならび), quicksort(_成績ならび,_番号順成績ならび). 得点順に並べ直し(_得点順成績ならび) :- findall([_得点,番号],成績(_番号,_得点),_得点・番号成績ならび), quicksort(_得点・番号成績ならび,_整列した得点・番号ならび), 項目位置を元に戻す(_整列した得点・番号ならび,_得点順成績ならび). 項目位置を元に戻す([],[]). 項目位置を元に戻す([[A,B]|R1],[[B,A]|R2]) :- 項目位置を元に戻す(R1,R2). 番号、得点、平均との差の出力 :- 平均点(_平均点), write('番号 得点 平均との差\n'), 成績(_番号,_得点), _平均との差 is _得点 - _平均点, write_formatted('%t %t %t\n',[_番号,_得点,_平均との差]), fail. 番号、得点、平均との差の出力. quicksort([],[]) :- !. quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Gigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). partition([],Y,[],[]) :- !. partition([X|Xs],Y,[X|Ls],Bs) :- X @=< Y,partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X @> Y,partition(Xs,Y,Ls,Bs). %%%%%%%% findavg/3 加算/2 他 %%%%%%%%%%%%%%%%%%%% :- op(A,B,は). findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), '加算'(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 加算(trunc(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL),!. 加算(四捨五入(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!. 加算(切捨て(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!. 加算(切り上げ(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!. 加算([],L) :- var(L), L = 0.0e+00,!. 加算([],L) :- \+(var(L)), 加算の変数に零をおく(L),!. 加算([L|R],SL) :- ならび(L), 行列の転置([L|R],L1), 加算_2(L1,SL),!. 加算(X,S) :- 加算_1(X,0.0e+00,S) . 加算_1([],S,S) :- !. 加算_1([A|R],Y,S) :- ならび(A), ならび(Y), !, ならび加算(A,Y,Z), 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), 加算_1(R,Y,S),!. 加算_1([A|R],Y,S) :- A1 は A, Z is A1 + Y, 加算_1(R,Z,S). 加算_1(A,Y,S) :- とからりすと(A,L), !, 加算_1(L,Y,S) . 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. とからりすと(A,[A]) :- atomic(A),!. とからりすと(A と B,C) :- とからりすと(A,A1), とからりすと(B,B1), append(A1,B1,C). 変数(_変数) :- var(_変数). ならび([_|_]). _項 は (_ネットワーク :: _式) :- _ネットワーク :: _項 は _式, ! . _評価項 は N : L :- M は N, L1 は L, list_nth(M,L1,_評価項), ! . _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail) . _評価値 は [X|{P}] :- findall(X,P,_評価値), ! . _評価項 は ` _値 :- !, _評価項 = _値, ! . _項 は _式 :- var(_式), _項 = _式, ! . _項 は _式 :- error_protect(一時関数定義(_式,_項),fail) . _項 は _式 :- atom(_式), member(_式,[minint,maxint,cputtime,time,csize,cused,dbsize,dbused,gsize,gused,noptrs,ptrsued,ssize,sused,tsize,tused]), !, _項 is _式, ! . _項 は _式 :- 二項組込み関数(_式), 二項組込み関数の評価(_式,_項) . _項 は _式 :- 二項組込み関数(_式), !, fail . _項 は _式 :- functor(_式,Functor,1), arg(1,_式,Arg), Y は Arg, functor(_式_1,Functor,1), arg(1,_式_1,Y), member(Functor,[atom,real,integer,var,float,list]), !, error_protect(_式_1,fail), _項 = Y, ! . _項 は _式 :- atom(_式), error_protect(get_global(_式,_項),fail), ! . _項 は _式 :- real(_式), _項 = _式, ! . _項 は _式 :- real(_式), !, fail . _項 は _式 :- list(_式), findall(X,(member(U,_式) , X は U),_項) . _項 は _式 :- list(_式), !, fail. _項 は _erlang_module : _erlang関数 :- erlang関数評価(_erlang_module : _erlang関数,_項),!. _項 は _式 :- 関数定義(_式,_項),!. _項 は _式 :- functor(_式,_関数,_次数), function(_関数,_次数), findall(Arg,(for(1,N,_次数) , arg(N,_式,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), _式の二 =.. [_関数|L2], error_protect(_項 is _式の二,fail) . _項 は _評価関数 :- error_protect(_項 is _評価関数,fail),!. _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail),!. _項 は _評価項 :- 述語評価が可能(_評価項,_関数,_次数,_次数足す一), _評価項 =.. _評価項の項分解ならび, findall(Arg,(for(1,N,_次数) , arg(N,_評価項,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), append(L2,[_],_変数を付加した引数ならび), _解付き評価項 =.. [_関数|_変数を付加した引数ならび], error_protect(_解付き評価項,fail), arg(_次数足す一,_解付き評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), error_protect(_評価項,fail), arg(Arg,_評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), \+(error_protect(_評価項,fail)), _評価項 = _項,!. _項 は _式 :- atomic(_式), \+(述語評価が可能(_式,_関数,_次数,_次数足す一)), _項 = _式,!. 述語評価が可能(_評価項,_関数,_次数,_次数足す一) :- functor(_評価項,_関数,_次数), _次数足す一 is _次数 + 1, \+(predicate_type(_関数,_次数足す一,undefined)),!. 関数評価に於いて引数部分の関数評価([],[]). 関数評価に於いて引数部分の関数評価([L|R1],[L2|R2]) :- list(L), !, 関数評価に於いて引数部分の関数評価(L,L2), 関数評価に於いて引数部分の関数評価(R1,R2), ! . 関数評価に於いて引数部分の関数評価([F|R1],[F|R2]) :- \+(error_protect(F2 は F,fail)), !, 関数評価に於いて引数部分の関数評価(R1,R2) . 関数評価に於いて引数部分の関数評価([F|R1],[F2|R2]) :- error_protect(F2 は F,fail), 関数評価に於いて引数部分の関数評価(R1,R2) . erlang関数評価(os : cmd(Command),_項) :- erlang :: (os : cmd(Command) -> _項_1), _項 は string2atom(_項_1),!. erlang関数評価(_erlang_module : _erlang関数,_項) :- erlang :: (_erlang_module : _erlang関数 -> _項),!. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, number(_値の一), _値の二 は _項の二, number(_値の二), _値 is _値の一 + _値の二, !. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 + _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, list(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),LY), concat_list(LY,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atom(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),L), concat_atom(L,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 * _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(` _値,_値) :- !. 関数定義(@ _式,_値) :- _値 は _式,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _値の二 >= 0.0e+00, _四捨五入後の値 is floor(_値の二 + 0.5) * 1.0,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 is ceil(_値の二 - 0.5),!. 関数定義(切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二) * 1.0,!. 関数定義(切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二),!. 関数定義(十円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 10 + 0.5) * 10,!. 関数定義(十円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は trunc(_値の二 / 10) * 10,!. 関数定義(十円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 10) * 10,!. 関数定義(百円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 100 + 0.5) * 100,!. 関数定義(百円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 100) * 100,!. 関数定義(百円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二 / 100) * 100,!. 関数定義(整数化(_値),_整数化された値) :- _値の二 は _値, _整数化された値 is trunc(_値の二),!. 関数定義(char_code(_項),_値) :- ( atom(_項), atomic_length(_項,1), char_code(_項,_値) ; integer(_項), char_code(_値,_項) ; 複合項(_項), _項の一 は _項, _値 は char_code(_項の一) ), !. 関数定義($ _大域変数名,_値) :- atom(_大域変数名), get_global(_大域変数名,_値の一), _値 は _値の一,!. 関数定義(S,E) :- functor(S,select,1), to(S,E),!. 関数定義(setq(A,B),E) :- atom(A), B1 は B, set_global(A,B1), E = B1,!. 関数定義(++ A,X) :- A1 は A, list(A1), 加算(A1,X),!. 関数定義(A ++ B,X) :- C is B / A, X = A + C + B,!. 関数定義(car(A),E) :- A1 は A, A1 = [E|_],!. 関数定義(cdr(A),E) :- A1 は A, A1 = [_|E],!. 関数定義(cons(A,B),E) :- A1 は A, B1 は B, E = [A1|B1],!. 関数定義(length(A),E) :- A1 は A, list(A1), length(A1,E),!. 関数定義(decode(A,B,C,D),E) :- A1 は A, B1 は B, A1 = B1, E は C,!. 関数定義(decode(A,B,C,D),E) :- E は D,!. 関数定義(decompcons(A),E) :- A1 は A, decompcons(A1,E),!. 関数定義(substr(A,B,C),E) :- 関数定義(subatomic(A,B,C),E),!. 関数定義(subatomic(A,B,C),E) :- A1 は A, B1 は B, C1 は C, subatomic(A1,B1,C1,E),!. 関数定義(concat(A),E) :- A1 は A, concat(A1,E),!. 関数定義(concat(A,B),E) :- A1 は A, B1 は B, concat(A1,B1,E),!. 関数定義(append(A,B),E) :- A1 は A, B1 は B, append(A1,B1,E),!. 関数定義(reverse(A),E) :- A1 は A, reverse(A1,E),!. 関数定義(string2atom(A),E) :- A2 は A, flat(A2,B), atom_codes(E,B),!. 関数定義(P,E) :- functor(P,greatest,Arg), P =.. [greatest|L], findall(B,(member(A,L) , B は A),L2), max(L2,E),!. 関数定義(P,E) :- functor(P,least,Arg), P =.. [least|L], findall(B,(member(A,L) , B は A),L2), min(L2,E),!. 関数定義(cel(_列数,_行数,_行列),_解) :- _関数評価された行数 は _行数, _関数評価された列数 は _列数, list_nth(_関数評価された行数,_行列,_行), list_nth(_関数評価された列数,_行,_解),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/196 # # [1] 授業単元:プログラミング論 # [2] 問題文:入力ストリームから読み込んだ文字列を、データベースに格納する前に # スタックに一時的に格納するプログラムを作成する # このときデータをまとめたデータ文字列を一つずつスタックへプッシュしたり # ポップしたりする過程が分かるプログラムを作成する。 # なおスタックを実現するライブラリはスタックのための別のヘッダにまとめる # # [プログラムの例] # 入力ストリームから読み込んだデータ文字列をスタックへプッシュしたり # ポップしたりするたびにデータベースに格納された全データを表示する。 t516(Instream,Stack1,Stack2) :- get_code(Instream,Code), t516(Instream,Code,Stack1,Stack2). t516(Instream,-1,Stack1,Stack2) :- t516_popall(Stack1,Stack3,[],L), atom_codes(Atom,L), assertz(database(Atom)),!. t516(Instream,10,Stack1,Stack2) :- t516_popall(Stack1,Stack3,[],Codes), atom_codes(Atom,Codes), assertz(database(Atom)), get_code(Instream,Code), t516(Instream,Code,Stack3),!. t516(Insteam,A,Stack1,Stack2) :- push(A,stack1,Stack3), get_code(Instream,B), t516(Instream,B,Stack3,Stack2). t516_popall(Stack,Stack,X,X) :- empty(Stack),!. t516_popall(Stack1,Stack2,Y,X) :- pop(A,Stack1,Stack3), t516_popall(Stack3,Stack2,[A|Y],X). empty([]) :- write('stack empty :: []\n\n'). push(A,Stack,[A|Stack]) :- write_formatted('push:%t :: %t --> %t\n',[A,Stack,[A|Stack]]). pop(A,[A|Stack],Stack) :- write_formatted('pop:Pop :: %t --> %t Pop=%t\n',[[A|Stack],Stack,A]). % 以下のサイトは base64g(Atom,X) :- replace_all(Atom,' ','',Atom2), base64(X,Atom2) . base64s(Atom,X) :- \+(var(Atom)), name2(Atom,L1), base64_2(L1,Y), concat_atom(Y,X) . base64(Atom,X) :- \+(var(Atom)), atom_codes(Atom,L1), kjtoeuc(CodeList,L1), base64_2(CodeList,Y), concat_atom(Y,X),!. base64(X,Atom) :- var(X), atom_chars(Atom,List), base64_1(Y,List), concat_atom(Y,Y2), atom_codes(Y2,Codes), kjtoeuc(Codes,Y3), atom_codes(X,Y3),!. base64_1([],[]) :- !. base64_1(X,[A,B,C,=]) :- base64_table(A1,A), base64_table(B1,B), base64_table(C1,C), append(A1,B1,L1), append(L1,C1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_1(X,[A,B,=,=]) :- base64_table(A1,A), base64_table(B1,B), append(A1,B1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_1(X,[A,B,C,D|R]) :- base64_table(A1,A), base64_table(B1,B), base64_table(C1,C), base64_table(D1,D), append(A1,B1,L1), append(L1,C1,L2), append(L2,D1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_table([0,0,0,0,0,0],'A'). base64_table([0,0,0,0,0,1],'B'). base64_table([0,0,0,0,1,0],'C'). base64_table([0,0,0,0,1,1],'D'). base64_table([0,0,0,1,0,0],'E'). base64_table([0,0,0,1,0,1],'F'). base64_table([0,0,0,1,1,0],'G'). base64_table([0,0,0,1,1,1],'H'). base64_table([0,0,1,0,0,0],'I'). base64_table([0,0,1,0,0,1],'J'). base64_table([0,0,1,0,1,0],'K'). base64_table([0,0,1,0,1,1],'L'). base64_table([0,0,1,1,0,0],'M'). base64_table([0,0,1,1,0,1],'N'). base64_table([0,0,1,1,1,0],'O'). base64_table([0,0,1,1,1,1],'P'). base64_table([0,1,0,0,0,0],'Q'). base64_table([0,1,0,0,0,1],'R'). base64_table([0,1,0,0,1,0],'S'). base64_table([0,1,0,0,1,1],'T'). base64_table([0,1,0,1,0,0],'U'). base64_table([0,1,0,1,0,1],'V'). base64_table([0,1,0,1,1,0],'W'). base64_table([0,1,0,1,1,1],'X'). base64_table([0,1,1,0,0,0],'Y'). base64_table([0,1,1,0,0,1],'Z'). base64_table([0,1,1,0,1,0],a). base64_table([0,1,1,0,1,1],b). base64_table([0,1,1,1,0,0],c). base64_table([0,1,1,1,0,1],d). base64_table([0,1,1,1,1,0],e). base64_table([0,1,1,1,1,1],f). base64_table([1,0,0,0,0,0],g). base64_table([1,0,0,0,0,1],h). base64_table([1,0,0,0,1,0],i). base64_table([1,0,0,0,1,1],j). base64_table([1,0,0,1,0,0],k). base64_table([1,0,0,1,0,1],l). base64_table([1,0,0,1,1,0],m). base64_table([1,0,0,1,1,1],n). base64_table([1,0,1,0,0,0],o). base64_table([1,0,1,0,0,1],p). base64_table([1,0,1,0,1,0],q). base64_table([1,0,1,0,1,1],r). base64_table([1,0,1,1,0,0],s). base64_table([1,0,1,1,0,1],t). base64_table([1,0,1,1,1,0],u). base64_table([1,0,1,1,1,1],v). base64_table([1,1,0,0,0,0],w). base64_table([1,1,0,0,0,1],x). base64_table([1,1,0,0,1,0],y). base64_table([1,1,0,0,1,1],z). base64_table([1,1,0,1,0,0],'0'). base64_table([1,1,0,1,0,1],'1'). base64_table([1,1,0,1,1,0],'2'). base64_table([1,1,0,1,1,1],'3'). base64_table([1,1,1,0,0,0],'4'). base64_table([1,1,1,0,0,1],'5'). base64_table([1,1,1,0,1,0],'6'). base64_table([1,1,1,0,1,1],'7'). base64_table([1,1,1,1,0,0],'8'). base64_table([1,1,1,1,0,1],'9'). base64_table([1,1,1,1,1,0],+). base64_table([1,1,1,1,1,1],/). base64_table([A,B,C,D],X) :- base64_table([A,B,C,D,0,0],X). base64_table([A,B],X) :- base64_table([A,B,0,0,0,0],X). base64_a2b([],[]). base64_a2b([Atom|R],[A,B,C,D,E,F,G,H|R2]) :- atob(Atom,[A,B,C,D,E,F,G,H]), base64_a2b(R,R2). base64_2([],[]) :- !. base64_2([A,B,C|R],X) :- base64_i2b([A,B,C],L), base64_3(L,Z), base64_2(R,R2), append(Z,R2,X),!. base64_2([A,B],X) :- base64_i2b([A,B],L), base64_3(L,Z), append(Z,[=],X),!. base64_2([Y],X) :- base64_i2b([Y],L), base64_3(L,Z), append(Z,[=,=],X),!. base64_3([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X],[Z1,Z2,Z3,Z4]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H,I,J,K,L],Z2), base64_table([M,N,O,P,Q,R],Z3), base64_table([S,T,U,V,W,X],Z4),!. base64_3([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P],[Z1,Z2,Z3]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H,I,J,K,L],Z2), base64_table([M,N,O,P],Z3),!. base64_3([A,B,C,D,E,F,G,H],[Z1,Z2]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H],Z2). base64_i2b([],[]) :- !. base64_i2b([X|R],[1,B,C,D,E,F,G,H|R2]) :- var(X), itob(X,[1,B,C,D,E,F,G,H]), base64_i2b(R,R2),!. base64_i2b([X|R],[0,B,C,D,E,F,G,H|R2]) :- var(X), itob(U,[0,B,C,D,E,F,G,H]), X is U - 128, base64_i2b(R,R2),!. base64_i2b([Code|R],[A,B,C,D,E,F,G,H|R2]) :- itob(Code,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,A,B,C,D,E,F,G,H]), base64_i2b(R,R2) . name2(X,Y) :- atom(X), strlen(X,Len), findall(N,(for(1,M,Len) , char_code1(X,M,N1) , (N1 < 0 , N is N1 + 256 ; N1 >= 0 , N = N1)),Y),!. name2(A,[N]) :- atomic(A), name(A,[N]),!. name2(A,L) :- var(A), name21(L,L2), atom_codes(A,L2),!. name21([],[]) :- !. name21([N1,N2|R],[N|R2]) :- N1 > 127, N2 > 127, N is N1 * 256 + N2, name21(R,R2),!. name21([N1,N2|R],[N|R2]) :- N1 > 127, N2 < 128, N is N1 * 256 + N2, name21(R,R2),!. name21([N1|R],[N1|R2]) :- name21(R,R2). itob(N,L) :- itob(N,[],L1), length(L1,Len), Len2 is 8 - Len, length(L2,Len2), all(L2,0), append(L2,L1,L). itob(0,X,X) :- !. itob(N,Y,X) :- M is N mod 2, N2 is N // 2, itob(N2,[M|Y],X). % 以下のサイトは # 1. # um1toN(n)と呼び出すと(nは正の整数)、戻り値として 1 から n までの # が返ってくる関数sum1toNを作成せよ。(関数の部分のみ書くこと。) # 2. # の半径をキーボードから入力し、円周の長さと面積を求めて表示する プログラムを次のように作成した。 # 周の長さと面積を求める部分は関数 circleを使用している。この関数を書け。 # 周率は#defineで定義している PAI を使ってよい。 # # #include # #define PAI 3.14159 # 関数circleのプロトタイプ宣言 (省略) # int main(void ){ # double r, enshu, menseki; # printf("半径を入力 >>"); # scanf("%lf", &r); # circle(r, &enshu, &menseki); # printf("円周 = %f 面積 = %f\n" # , enshu, menseki); # return 0; # } # # │ │ # │    関数 circle │ # │ │ # 3. # 大きさ8のint型配列aに初期値として # 1 2 3 4 5 6 7 8 # を設定する。これを # 0 0 1 2 3 4 5 6 # のように要素を右に2つシフトして a[0],a[1]には 0 を入れ、 # その後配列の各要素を # a[0]=0 # a[1]=0 # a[2]=1 # a[3]=2 # a[4]=3 # a[5]=4 # a[6]=5 # a[7]=6 # # のように表示するプログラムを書け。 # # 4. # 文字列(最大80文字)をキーボードから読み込み、 # その文字列中で文字コードが最大の文字とその文字コードを # #   文字コード最大はY <89> # # (Yが最大の文字、89がその文字コードを意味する。) # のように表示するプログラムを次のように作成した。空欄を埋めてプログラム # を完成せよ。変数は宣言している分で足りるはずであるが、必要ならば追加してもよい。 # # #include # # # int main(void ){ # char ch[81], max; # int i; # gets(ch); # ┌──────────────┐ #   │ │ # │ │ # │ │ # └──────────────┘ # return 0; # } # % (1) sum1toN(1,1) :- !. sum1toN(N,X) :- M is N - 1,sum1toN(M,Y),X is N + Y. % (2) pi(3.14159). circle(_半径,_円周,_面積) :-   pi(PI),   _円周 is 2 * _半径 * PI,   _面積 is _半径 ^ 2 * PI. % (3) t357_3 :- 右にシフト(2,[1,2,3,4,5,6,7,8],_シフトされたならび), 表示(1,_シフトされたならび). 表示(_,[]) :- !. 表示(N,[A|R]) :- M is N - 1, write('a[%t]=%t',[M,C]), N2 is N + 1, 表示(N2,R). 右にシフト(0,X,X) :- !. 右にシフト(N,L,X) :- append(Y,[_],[0|L]), M is N - 1, 右にシフト(M,Y,X).    % (4) 最大の文字コード(_文字列,_最大の文字コード) :-   atom_codes(_文字列,[C|R]),   最大の文字コード(R,C,_最大の文字コード). 最大の文字コード([],X,X) :- !. 最大の文字コード([C|R],_現在の最大コード,_最大の文字コード) :-   C > _現在の最大コード,   最大の文字コード(R,C,_最大の文字コード),!. 最大の文字コード([C|R],_現在の最大コード,_最大の文字コード) :-   C =< _現在の最大コード,   最大の文字コード(R,_現在の最大コード,_最大の文字コード),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/75 # # [1] 授業単元: C # [2] 問題文(含コード&リンク): # キーボードから入力された1以上の整数nについて、次の例に示すように行番号と*を表示するプログラムを作成せよ # 。また、0や負の数が入力された場合はプログラムが終了するようにせよ。 # 表示結果の例 # 正の整数:6 # 1****** # 2 ***** # 3 **** # 4  *** # 5 ** # 6 * 'キーボードから入力された1以上の整数nについて、次の例に示すように 行番号と*を表示するプログラムを作成せよ。 また、0や負の数が入力された場合はプログラムが終了するようにせよ。 表示結果の例 正の整数:6 1****** 2 ***** 3 **** 4  *** 5 ** 6 * ' :- '整数_n'(_n), '行番号と*を表示する'(_n). '整数_n'(_n):- write('\n1以上の整数を入力してください。0以下を入力するとプログラムは停止します : '), read_line_to_codes(current_input,Codes), atom_codes(_行入力,Codes), atom_number(_行入力,_n), integer(_n). '行番号と*を表示する'(_n) :- _n =< 0,!. '行番号と*を表示する'(_n) :- length(L,_n), forall((append(L1,L2,L),\+(L2=[])),行表示(L1,L2,L)), 'キーボードから入力された1以上の整数nについて、次の例に示すように 行番号と*を表示するプログラムを作成せよ。 また、0や負の数が入力された場合はプログラムが終了するようにせよ。 表示結果の例 正の整数:6 1****** 2 ***** 3 **** 4  *** 5 ** 6 * '. 行表示(L1,L2,L) :- 空白と星で埋める(L1,L2), 行番号を得る(L1,_行番号), 表示する(L,_行番号,_空白と星文字列). 空白と星で埋める(L1,L2) :- 空白を埋める(L1), 星を埋める(L2). 空白を埋める(L1) :- all(L1,' '). 星を埋める(L2) :- all(L2,'*'). all([],_). all([V|R],V) :- all(R,V). 行番号を得る(L1,_行番号) :- length([_|L1],_行番号). 表示する(L,_行番号,_空白と星文字列) :- atomic_list_concat(L,_空白と星文字列), writef('%w%w\n',[_行番号,_空白と星文字列]). % 以下のサイトは # 入力ファイルを読み込み、顧客別売上明細書を出力する # # ・支店が変われば、支店合計を印字し改ページをする # ・顧客が変われば、顧客合計を印字し、1行空白を印字する # ・入力ファイルはソートされているものとする # ・入力ファイル、出力ファイルはコマンドライン引数で受け取る # ・20行を超える場合は、改ページする #  ただし、合計出力途中の場合は20行を超えていても出力する # ・金額出力時のカンマ編集をする # # ・例外処理は、コマンドライン引数が正しくない場合、入力・出力ファイルがオープンできない場合、入力ファイルにデータがない場合の4種類 # # ・突合せ処理(コントロールブレイク>)を使用する # # ・入力ファイルの支店コードから売上金額までクラス分けをする # (クラス分けがよく解りませんが、Cの構造体のようなものを使用せよと言われました) # # ・例外処理を書いたメインメソッド、突合せ処理メソッド、ヘッダメソッドの3つに分ける # # 下記の処理をヘッダメソッドとする # ここから # 帳票明細 # 001 東京 支店 出力日6月21日(出力した日)  P.1 # (空白行 1行) # 販売先 販売日 販売金額 # --------------------------------------------------------------- # ここまで # # # # ☆入力ファイル例 # ?支店コード ?支店名 ?販売日 ?販売先コード ?販売先名 ?売上金額 # # # 001 東京 20090601 0001 田中商店  1000 # 001 東京 20090602 0001 田中商店  5000 # 001 東京 20090603 0001 田中商店  10000 # 001 東京 20090601 0002 山田スーパー  3000 # 002 沖縄 20090604 0001 沖縄商店  7000 # ☆出力ファイル例 # # 帳票明細 # # 001 東京 支店 出力日6月21日(出力した日)  P.1 # (空白行 1行) # 販売先 販売日 販売金額 # --------------------------------------------------------------- # 0001 田中商店 6月1日 1,000 # 0001 田中商店 6月2日 5,000 # 0001 田中商店 6月3日 10,000 # ---------------------------------------------------------------- # 販売合計 件数 3 16,000 # (空白行 1行) # 0002 山田スーパー 6月1日 3,000 # ---------------------------------------------------------------- # 販売合計 件数 1 3,000 # (空白行 1行) #    **支店合計 件数 4 19,000 # # # # # 帳票明細 # 002 沖縄 支店 出力日6月21日(出力した日)  P.2 # (空白行 1行) # 販売先 販売日 販売金額 # ---------------------------------------------------------------- # 0001 沖縄商店 6月4日 7,000 # ---------------------------------------------------------------- # 販売合計 件数 1 7,000 # (空白行 1行) #    **支店合計 件数 1 7,000 #    ***総合計 件数 5 26,000 # # # # 入力ファイルを以下のように変更しましょう。 顧客別売上明細書を出力する :- 入力ファイルを読み込む(F1,F2,F3,L1,L2,L3), コントロールブレイク(L1,L2,L3,0,0,0,0,0,0,0). 入力ファイルを読み込む(F1,F2,F3,L1,L2,L3) :- ファイルを全行読み取る(F1,L1), ファイルを全行読み取る(F2,L2), ファイルを全行読み取る(F3,L3). コントロールブレイク([L1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(6,L1,[],L2,L3), 合計加算(L1,SX,SX2,SX3,SX4,SX5,SX6), 明細行表示(_頁,_頁1,_行,_行1,L1,L2,L3), write('---------------------------------------------------------------\n'), 改頁制御(_頁1,_頁2,_行1,_行2,L2,L3), 販売先合計表示(_行2,_行3,CX5,SX5), 改頁制御(_頁2,_頁3,_行3,_行4), 支店合計表示(_行4,_行5,CX4,SX4), 改頁制御(_頁3,_頁4,_行5,_行6), 総合計表示(_行3,_,CX3,SX3),!. コントロールブレイク([L1,L12|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(1,L1,L12,L2,L3), 合計加算(L1,SX1,SX2,SX3,SX4,SX5,SX6), 明細行表示(_頁,_頁1,_行,_行1,[K|R11],L2,L3), コントロールブレイク([L12|R1],[L2|R2],[L3|R3],_頁1,_行1,CX4,CX5,CX6,SX4,SX5,SX6). コントロールブレイク([L1,L12|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(2,L1,L12,L2,L3), 合計加算(L1,SX,SX2,SX3,SX4,SX5,SX6), 明細行表示(_頁,_頁1,_行,_行1,L1,L2,L3), 販売先合計表示(_頁1,_頁2,_行1,_行2,CX5,SX5), コントロールブレイク([L12|R1],[L2|R2],[L3|R3],_頁2,_行2,CX,0,CX6,SX4,0,SX6). コントロールブレイク([L1,L12|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(3,L1,L12,L2,L3), 合計加算(L1,SX,SX2,SX3,SX4,SX5,SX6), 明細印刷(_頁,_頁1,_行,_行1,L1,L2,L3), 販売先合計表示(_頁1,_頁2,_行2,_行3,CX5,SX5), 支店合計表示(_頁2,_頁3,_行4,_行5,CX4,SX4), コントロールブレイク([L12|R1],[L2|R2],[L3|R3],_頁3,0,0,0,CX3,0,0,SX3),!. コントロールブレイク([L1|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(4,L1,_,L2,L3), コントロールブレイク([L1|R1],R2,[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3),!. コントロールブレイク([L1|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(5,L1,_,L2,L3), コントロールブレイク([L1|R1],[L2|R2],R3,_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3). コントロールブレイクパターン(1,L1,L12,L2,L3) :- 鍵項目(売上明細,L1,[KL1,KL11|_]), 鍵項目(売上明細,L12,[KL1,KL11|_]), 鍵項目(支店名,L2,[KL1|_]), 鍵項目(販売先名,L3,[KL11|_]),!. コントロールブレイクパターン(2,L1,L12,L2,L3) :- 鍵項目(売上明細,L1,[KL1,KL11|_]), 鍵項目(売上明細,L12,[KL1,KL12|_]), not(KL11=KL12), 鍵項目(支店名L2,[KL1|_]), 鍵項目(販売先名,L3,[KL11|_]),!. コントロールブレイクパターン(3,L1,L12,_,_) :- 鍵項目(売上明細,L1,[KL1,_|_]), 鍵項目(売上明細,L12,[KL12,_|_]), not(KL1=KL12),!. コントロールブレイクパターン(4,L1,_,L2,_) :- 鍵項目(売上明細,L1,[KL1|_]), 鍵項目(支店名,L2,[KL2|_]), KL1 @> KL2,!. コントロールブレイクパターン(5,L1,_,_,L3) :- 鍵項目(売上明細,L1,[_,KL11|_]), 鍵項目(販売先名,L3,[KL3|_]), KL11 @> KL3,!. コントロールブレイクパターン(6,L1,[],L2,L3) :- 鍵項目(売上明細,L1,[KL1,KL11|_]), 鍵項目(支店名,L2,[KL1|_]), 鍵項目(販売先名,L3,[KL11|_]),!. 鍵項目(売上明細,[_支店コード,_,_販売先コード|_],[_支店コード,_販売先コード]). 鍵項目(支店名,[_支店コード|_],[_支店コード]). 鍵項目(販売先名,[_販売先コード|_],[_販売先コード]). 明細行表示(_頁,_次の頁,0,_次の行,L1,L2,L3) :- 鍵項目(支店名,L2,[_支店コード,_支店名|_]), 今日(_今日), sub_atom(_今日,4,2,_,_月), sub_atom(_今日,6,2,_,_日), 支店名見出し(_支店コード,_支店名,_月,_日,_頁), 明細行表示(_頁,_頁,0,6,L1,L2,L3),!. 明細行表示(_頁,_次の頁,_行,_次の行, [_支店コード,_支店名,_販売日,_販売先コード,_販売先名,_売上金額], L2,L3) :- _行 > 20, _頁1 is _頁 + 1, 明細行表示(_頁1,_次の頁,1,_次の行, [_支店コード,_支店名,_販売日,_販売先コード,_販売先名,_売上金額], L2,L3),!. 明細行表示(_頁,_頁,_行,_次の行, [_支店コード,_支店名,_販売日,_販売先コード,_販売先名,_売上金額], L2,L3) :- _行 < 20, sub_atom(_販売日,4,2,_,_月), sub_atom(_販売日,6,2,_,_日), カンマの挿入(10,_売上金額,_カンマ付き売上金額), write_formatted('%4d %-30s%2d月%2d日 %t\n',[_販売先コード,_販売先名,_月,_日,_カンマ付き販売金額]), _次の行 is _行 + 1,!. 支店合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 > 20, 改頁, _頁1 is _頁 + 1, 支店合計表示(_頁1,_次の頁,1,_次の行,_件数,_合計),!. 支店合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 =< 20, _次の行 is _行 + 1, カンマの挿入(10,_合計金額,_カンマ付き合計金額), write(' **支店合計 件数 %2d %t\n',[_件数,_カンマ付き合計金額]),!. 販売先合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 > 20, 改頁, _頁1 is _頁 + 1, 販売先合計表示(_頁1,_次の頁,1,_次の行,_件数,_合計),!. 販売先合計表示(_頁,_頁,_行,_次の行,_件数,_合計) :- _行 =< 20, _次の行 is _行 + 1, カンマの挿入(10,_合計金額,_カンマ付き合計金額), write(' 販売合計 件数 %2d %t\n',[_件数,_カンマ付き合計金額]),!. 総合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 > 20, 改頁, _次の頁 is _頁 + 1, 総合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計),!. 総合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 =< 20, _次の行 is _行 + 1, カンマの挿入(10,_合計,_カンマ付き合計), write_formatted(' 総合計 %t\n',[_カンマ付き合計]). 帳票明細見出し :- write('\n 帳票明細\n'). 支店名見出し(_支店コード,_支店名,_月,_日,_頁) :- write_formatted('\n%t %t 出力日%2d月%2d日 P.2d\n\n',[_支店コード,_支店名_月,_日,_頁]), write(' 販売先 販売日 販売金額\n'). write('---------------------------------------------------------------\n'). 明細行項目(L1,_支店コード,_販売日,_販売先コード,_売上金額) :- sub_atom(L1,0,3,A1),atom_to_term(A1,_支店コード), sub_atom(L1,3,8,A2),A2 = _販売日, sub_atom(L1,11,6,A3),atom_to_term(A3,_販売先コード), sub_atom(L1,19,8,A4),atom_to_term(A4,_売上金額). 支店名項目(L2,_支店コード,_支店名) :- sub_atom(L2,0,3,A1),atom_to_term(A1,_支店コード), sub_atom(L2,3,10,_支店名). 販売先名項目(L3,_販売先コード,_販売先名) :- sub_atom(L3,0,6,A),atom_to_term(A3,_販売先コード), sub_atom(L3,6,30,_販売先名). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% カンマの挿入(_表示桁数,_数値,_表示文字列) :- number(_数値), number_codes(_数値,Codes), atom_codes(_数値文字列,Codes), カンマの挿入(_表示桁数,_数値文字列,_表示文字列),!. カンマの挿入(_表示桁数,_数値文字列,_表示文字列) :- atom_chars(_数値文字列,_数値文字ならび), 正数部の長さ(_数値文字ならび,_数値桁数), カンマの挿入の二(_数値桁数,_数値文字ならび,_空白のない数値ならび), length(_空白のない数値ならび,_空白のない数値ならびの桁数), _空白数 is _表示桁数 - _空白のない数値ならびの桁数, 空白文字を連結する(_空白数,_空白のない数値ならび,_表示文字列),!. カンマの挿入の二(0,X,X) :- ! . カンマの挿入の二(1,X,X) :- ! . カンマの挿入の二(N,[-|R],[-|R1]) :- M is N - 1, カンマの挿入の二(M,R,R1),! . カンマの挿入の二(N,[ |R],[ |R1]) :- M is N - 1, カンマの挿入の二(M,R,R1),! . カンマの挿入の二(N,[A|R],[A,,|R1]) :- M is N - 1, 0 is M mod 3, カンマの挿入の二(M,R,R1),! . カンマの挿入の二(N,[A|R],[A|R1]) :- M is N - 1, カンマの挿入の二(M,R,R1),! . 正数部の長さ([],0) :- !. 正数部の長さ([.|_],0) :- !. 正数部の長さ([_|R],N) :- 正数部の長さ(R,M), N is M + 1,!. 空白文字を連結する(N,[_|R],_表示文字列) :- N < 0, M is N + 1, 空白文字を連結する(M,R,_表示文字列),!. 空白文字を連結する(0,_表示文字ならび,_表示文字列) :- 文字列の結合(_表示文字ならび,_表示文字列),!. 空白文字を連結する(N,_表示文字ならび,_表示文字列) :- M is N - 1, 空白文字を連結する(M,[' '|_表示文字ならび],_表示文字列),!. 改頁 :- char_code(C,12), write_formatted('%c',[C]),!. ファイルから全行読み取る(_ファイル,_全行) :- open(_ファイル,read,_ストリーム), ストリームから全行読み取る(_ストリーム,_全行), close(_ストリーム). ストリームから全行読み取る(_ストリーム,[]) :- at_end_of_stream(_ストリーム),!. ストリームから全行読み取る(_ストリーム,_全行) :- ストリームから全行読み取って行く(_ストリーム,_全行). ストリームから全行読み取って行く(_ストリーム,[_行|R]) :- 行入力(_ストリーム,_行), ストリームから全行読み取る(_ストリーム,R). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは # 課題8 暗号文を作成するプログラム ファイル名(AxP21xxx_kadai8_angou.java) # 適当な文字列を入力して、暗号化するプログラムである。 # 暗号キーは2桁とし、暗号文は奇数番目と偶数番目の文字位置を、 # 暗号キーの値だけ交互にずらして作成する。 # なお使用する文字種は[!]から[z]までの90 個とする(0x21〜0x7A) # 。またzを越えたら!に戻すこと。 # (例)暗号キーが「16」のとき # 元の文字列 暗号文字列 # b u n k y o → c ! o q z u # +1 +6 +1 +6 +1 +6 文字列の暗号化(_鍵整数,_元の文字列,_暗号文字列) :- integer(_鍵整数), _鍵整数>=10 _鍵整数=<99, atom_codes(_元の文字列,Codes), _奇数番目の鍵 is _鍵整数 // 10, _偶数番目の鍵 is _鍵整数 mod 10, 文字コードによる暗号化(_奇数番目の鍵,_偶数番目の鍵,Codes,_暗号Codes), atom_codes(_暗号文字列,_暗号Codes). 文字コードによる暗号化(_,_,[],[]) :- !. 文字コードによる暗号化(_鍵1,_鍵2,[A|R1],[B|R2]) :- 一文字の暗号化(_鍵1,A,B), 文字コードによる暗号化(_鍵2,_鍵1,R1,R2). 一文字の暗号化(_変位,_文字コード,_暗号化された文字コード) :- _文字コード+_変位 =< 122,!, _暗号化された文字コード is _文字コード+_変位. 一文字の暗号文字化(_変位,_文字コード,_暗号化された文字コード) :- _文字コード+_変位 >122,!, _暗号化された文字コード is _文字コード+_変位-90.