このディレクトリの索引

% 以下のサイトは # 出典 :: ★★ 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. % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), once(成績データを得る(_成績ならび)). 成績データを得る(_成績ならび) :- findnsols(100,[_学籍番号,_成績],( 連続した行入力(_行), (行入力終了条件(_行),!,fail;split(_行,[' '],[_学籍番号,_成績]))),_成績ならび). 連続した行入力(_行) :- repeat, get_line(_行). 行入力終了条件('0 0'). 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ member([_学籍番号,_成績],_成績ならび),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび) :- once(上位11名を選別する(_成績ならび,_降順に整列した成績鍵ならび,_上位11名)), 上位11名を表示する(_上位11名). 上位11名を選別する(_成績ならび,_降順に整列した成績鍵ならび,_上位11名ならび) :- findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_成績ならび,_降順に整列した成績鍵ならび,_学籍番号,_成績),_上位11名ならび). '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_成績ならび,_降順に整列した成績鍵ならび,_学籍番号,_成績) :- member(_成績,_降順に整列した成績鍵ならび), member([_学籍番号,_成績],_成績ならび). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), get_line(_行), length(Ln,100), 成績データを得る(Ln,_行,_整列鍵ならび,_成績ならび). 成績データを得る(_,'0 0',[]) :- !. 成績データを得る([],_,[]). 成績データを得る([_|Ln],_行,[[_学籍番号,_成績]|R]) :- split(_行,[' '],[_学籍番号,_成績]), get_line(_行_2), 成績データを得る(Ln,_行_2,R). 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ member([_学籍番号,_成績],_成績ならび),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび) :- 上位11名を選別する(_上位11名), 上位11名を表示する(_上位11名). 上位11名を選別する(_降順に整列した成績鍵ならび,_成績ならび,_上位11名ならび) :- once(findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_降順に整列した成績鍵ならび,_成績ならび,_学籍番号,_成績),_上位11名ならび)). '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_降順に整列した成績鍵ならび,_成績ならび,_学籍番号,_成績) :- member(_成績,_降順に整列した成績鍵ならび), member([_学籍番号,_成績],_成績ならび). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 成績データを成績順に並べ直す(_成績ならび,_成績順に整列した成績ならび), 上位11名の選別(_成績順に整列した成績ならび,_上位11名ならび), 上位11名を表示する(_上位11名ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), get_line(_行), 成績データを得る(1,_行,_整列鍵ならび,_成績ならび). 成績データと整列鍵を得る(_,'0 0',[],[]) :- !. 成績データと整列鍵を得る(100,_,[],[]). 成績データと整列鍵を得る(M,_行,[[_成績,M]|R1],[[_学籍番号,_成績]|R2]) :- split(_行,[' '],[_学籍番号,_成績]), succ(M,M_2), get_line(_行_2), 成績データと整列鍵を得る(M_2,_行_2,R1,R2). 成績データを成績順に並べ直す(_整列鍵ならび,_成績ならび,_成績順に整列した成績ならび) :- sort(_整列鍵ならび,_整列した整列鍵ならび), 成績データを大きい順に並べ直す(_整列した整列鍵ならび,_成績ならび,[],_成績順に整列した成績ならび). 成績データを大きい順に並べ直す([],_,_成績順に整列した成績ならび,_成績順に整列した成績ならび). 成績データを大きい順に並べ直す([[_,M]|R1],_成績ならび,L1,_成績順に整列した成績ならび) :- nth1(M,_成績ならび,[_学籍番号,_成績]), 成績データを大きい順に並べ直す(R1,_成績ならび,[[_学籍番号,_成績]|L1],_成績順に整列した成績ならび). 上位11名の選別(L,_上位11名ならび) :- findnsols(11,X,member(X,L),_上位11名ならび),!. 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典 :: どんなプログラム言語でも覚える時にの共通習得仕様:15項目 prologでは(1,'Hello World表示', 'どんな方法でもいいので、その言語を書ける基盤が整っていて、print出来る証 そしてプログラムを実行できる環境構築が出来る証') :- true. prologでは(2,for文, 'プログラムの醍醐味は、繰り返しを端的に行える事にある。 人間が手作業でやると、タイムロスや失敗が生まれるが、バグの無いプログラムは無敵である。 上記、printと組み合われるとアウトプットも可能。') :- fail. prologでは(3,if文, '上記for文と組み合わせると、既に条件分岐による大量処理が可能となる。 先ずは簡単なif文から書いてみよう。 条件演算も、言語により特性が違うので、一通り出来る事。 同じ、異なる、型、文字比較') :- fail. prologでは(4,ファイル読み込み, 'テキストファイルのデータを取得してみよう。 csvデータから、簡単なレポート資料が作れるようになる。 読み込み時の形式は、行単位のレコード方式で行うと汎用性が増す。') :- true. prologでは(5,ファイル書き込み, '行区切りのレコード追記型で、ファイルアクセスして、データ追記を行う。 言語によっては、ファイルを壊してしまう恐れもあるので機能を習得しよう。') :- true. prologでは(6,'ファイル・ディレクトリ操作', 'ディレクトリの作成 ファイル名の変更 新規ファイル作成 これによりOSや他言語(ツール)などとの連携が柔軟にできるようになる。') :- true. prologでは(7,計算における演算, '+ , ? , × , ÷ , 余り、乗算 確率や、合計などが柔軟に出せるようにするのがポイント。') :- true. prologでは(8,文字列操作, 'split、join、文字検索、文字置換、連結、型変換、正規表現対応') :- fail. prologでは(9,配列, '多次元配列、連想配列、配列データの削除、jsonデータの扱い、xmlデータの扱い、csvデータの扱い') :- fail. prologでは(10,正規表現, '行マタギが可能か? どのレベルまでの判定が出来るか確認。 他の言語とコピペ出来るか?') :- fail. prologでは(11,関数, 'class、無名関数、返り値の制限 ライブラリの活用') :- fail. prologでは(12,プログラムのファイル読み込み, 'include,requireが出来るか?上記ライブラリと同じ オブジェクト志向の構成がどのレベルで行えるかを見極められるとベスト') :- true. prologでは(13,他言語連動, 'サーバで実行するのであれば、shellやawkを実行して、返り値を得られるか。 この環境を整えられるとほぼ無敵になる。') :- true. prologでは(14,プログラム負荷計算, '言語を実行する際の負荷を測定する(できれば多言語との比較などができるとベスト) サービスの安定運用など非常に上位の構築を行うことができるようになる。') :- fail. prologでは(15,複数環境における実行環境,'') :- true. % 以下のサイトは # 出典 :: 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). % 以下のサイトは % *** 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(_文字列,_前文字列,_区切り符号,_後文字列), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_先頭からの変位,_,_後方からの変位,_適合文字列), sub_atom(_文字列,0,_先頭からの変位,_,_前文字列), sub_atom(_文字列,_,_後方からの変位,0,_後文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/649 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # ダイエットファイルに # # 20100930,curry and rice # 20101003,kitsune soba # 20101003,rice ball # # のような形で日付とその日食べた昼食が保存されているとする. # コマンド行引数にダイエットファイル名と日付(yyyymmdd 形式) を指定して実行すると, # ファイルの中から指定した日付を含む行を検索し,その日の昼食を出力するプログラムを作成せよ. # また,引数としてファイルと文字列を指定しなかった場合に,使い方を出力して終了するようにせよ. # 日付の検索には,標準関数char *strstr(const char *str1, const char *str2); を使用するのが簡単である. # # 【実行例】 # % ./q3-3 diet.txt 20100929 # date 20100929 was not found in file diet.txt # % ./q3-3 diet.txt 20101003 # 20101003,kitsune soba # 20101003,rice ball # % ./q3-3 # Usage: ./q3-3 filename date(yyyymmdd) # % # # program :- パラメータを得る(_ファイル,_日付), get_split_lines(_ファイル,[','],LL), 日付をキーに検索する(_日付,LL,LL2), 検索した行を表示する(_日付,LL2). halt. パラメータを得る(_ファイル,_日付) :- user_paramaters(L), 診断(L,_ファイル,_日付),!. 診断([_ファイル,_日付],_ファイル,_日付) :- !. 診断(_,_,_) :- write('Usage: ./prolog filename date(yyyymmdd)\n'), halt. 日付をキーに検索する(_,[],[]) :- !. 日付をキーに検索する(_日付,[[_日付,_その日食べた昼食]|R1],[[_日付,_その日食べた昼食]|R2]) :- 日付をキーに検索する(_日付,R1,R2),!. 日付をキーに検索する(_日付,[_|R1],R2) :- 日付をキーに検索する(_日付,R1,R2),!. 検索した行を表示する([]) :- !. 検索した行を表示する([[_,_日付,_その日食べた昼食]|R]) :- write('%t,%t\n',[_日付,_その日食べた昼食]), 検索した行を表示する(R). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/477 # # [1] アルゴリズム論 # [2] Unixコマンドのgrepを実装したmygrepの作成 #   コマンドライン引数で検索文字列とファイル名をもらい、ファイル内に検索文字列が含まれる行があればその行を出力する #   正規表現に対応させる必要はない # [3] # [3.1]windows xp  # [3.2]gcc  # [3.3]c言語 # [4] 無期限 # [5] strstrは使用禁止 # # よろしくおねがいします # program :- user_paramaters([_検索文字列,_ファイル名]), open(_ファイル名,read,Instream), grep_line(Instream,_検索文字列), close(Instream), halt. grep_line(Instream,_検索文字列) :- at_end_of_stream(Instream),!. grep_line(Instream,_検索文字列) :- get_line(Stream,Line), sub_atom(Line,_,_,_,_検索文字列), writef('%t\n',[Line]), fail. grep_line(Instream,_検索文字列) :- grep_line(Instream,_検索文字列). % 以下のサイトは % [1] 授業単元:C言語演習課題 % http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9422.txt % 問題 % 年と月を「YYYY/MM」と入力し、入力された月のカレンダーを表示しなさい。 % % 1752年10月以前、及び10000年1月以降はエラーを返す。 % % 出力形式は以下のとおり % ・1行目は該当月の1日が月曜日でなければ、前月の最終月曜日から表示。 % ・該当月の最終日が日曜日でなければ、翌月の第1日曜日まで表示。 % ・6行目の表示が必要ない場合は表示しない。 % % うるう年判定は以下のとおり % ・年が4で割り切れる年はうるう年。 % ・年が100で割り切れる年はうるう年でない。 % ・年が400で割り切れる年はうるう年である。 % % [出力例] % 年月日を入力:2009/07 % % 月 火 水 木 金 土 日 % 29 30 01 02 03 04 05 % 06 07 08 09 10 11 12 % 13 14 15 16 17 18 19 % 20 21 22 23 24 25 26 % 27 28 29 30 31 01 02 課題のカレンダー(_年/_月) :- not((_年/_月 >= 1752/10,_年/_月 =< 10000/1)), write('エラー: 入力された年月は範囲を逸脱しています\n'),!. 課題のカレンダー(_年/_月) :- _年/_月 @=< 2009/6,!, 曜日検索(_日付,_曜日,2009/6/13,土曜), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー(_年/_月) :- _年/_月 @>= 2009/6,!, 曜日検索(2009/6/13,土曜,_日付,_曜日), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー表示(_年/_月/_日,月曜) :- 日付候補を得る(_年/_月/_日,_年/_月/_日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 課題のカレンダー表示(_年/_月/_日,_曜日) :- not(_曜日=月曜), 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日), 日付候補を得る(_年/_月/_日,_前週の月曜日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日) :- 曜日検索(_前週の月曜日,_前週の曜日,_年/_月/_日,_曜日), _前週の曜日 = 月曜,!. 日付候補を得る(_年/_月/_日,_起点日付,_曜日,_日付整数ならび) :- findall(_日付,( 曜日(_起点日付,_曜日,_日付2,_),(_日付2=_年2/_月2/7,_年2/_月2 @> _年/_月,!,fail;true)),_日付整数ならび). 課題のカレンダー週表示(_日付整数ならび) :- n個組(7,_日付整数ならび,_7個組), 月曜から日曜までヘッドゼロサプライで表示(_7個組). 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t\n',[_日文字列]),!. 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日|R]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t ',[_日付文字列]), 月曜から日曜までヘッドゼロサプライで表示(R). 課題のカレンダー見出し表示 :- write_formatted('月 火 水 木 金 土 日\n'). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_日付,_曜日,_今日,_今日の曜日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_前日,_前日の曜日,_今日,_今日の曜日), 曜日検索(_日付,_曜日,_前日,_前日の曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_日付,_曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), 曜日検索(_翌日,_翌日の曜日,_日付,_曜日). '曜日'(_日付,_曜日,_日付,_曜日) :- ! . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @> _日付2, '前日・今日'(_日付3,_曜日3,_日付1,_曜日1), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @< _日付2, '前日・今日'(_日付1,_曜日1,_日付3,_曜日3), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/550 # # [1] 授業単元: Ruby演習 [2] 問題文、http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9426.txt # Rubyの問題がわかりません 助けてください # # (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい # # p wday["sunday"] #=> "日曜日" # p wday["monday"] #=> "月曜日" # p wday["saturday"] #=> "土曜日" # # (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい # # (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ い。 # 「sunday」は日曜日のことです。 # 「monday」は月曜日のことです。 # # (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行(正 規表現で定義するなら「/\uff3cs+/」)で区切られた文字列をハッシュに変換するメソ ッドstr2hashを定義してください。 # # p str2hash("bule 青 white 白\uff3cnred赤"); # #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"} :- op(450,xfx,(=>)). % (1) wday({ "sunday" => "日曜日","monday" => "月曜日","saturday" #=> "土曜日"}). % (2) hash_count(Hashname,Count) :- functor(P,Hashname,1), call(P), arg(1,P,H), count(H,Count). count(','(A,B),Count) :- count(B,Count2), Count is Count2 + 1. count(A,1). % (3) ?- each(wday.A=>B),write_formatted('「%t」は%tのことです。\n',[A,B]),fail;true. each(Hashname.Key=>Value) :- functor(P,Hashname,1), arg(1,P,V), each(V,Key=>Value). each(','(Key=>Value,B),Key=>Value). each(','(_,B),Key=>Value) :- each(B,Key=>Value). each(Key=>Value,Key=>Value). % (4) str2hash(Atom,Hash) :- split(Atom,[' ','\t','\n'],L), findall(U,n個組(2,L,U),L2), hashを成長させる(L2,Hash). hashを成長させる([A,B],{ A=>B }) :- !. hashを成長させる([[A,B]|R], { (A=>B,R2) }) :- hashを成長させる(R,{ R2 }). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/103 # # 【質問テンプレ】 # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9753.txt # 2.入力された年月の1日が何曜日かを調べる。 #   曜日のチェックはZellerの公式を使用する。Zellerの公式は、 #    #   曜日を表す値=(y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ (( 13 * m ) + 8 ) / 5 ] + d ) % 7 # #           ※ 上記の公式中の y は年、 m は月、 d は日を表し、 #             []はその数を越えない最大の整数を表す。(例: [13.6]は13になる) # #   で、曜日を表す値は次のようになっている。 # #     日曜日 = 0, 月曜日 = 1, 火曜日 = 2, 水曜日 = 3, # # 木曜日 = 4, 金曜日 = 5, 土曜日 = 6, # #   ※但し、1月と2月は前年の13月14月として計算するものとする。 % (1) 年月の入力 年月入力処理(_年,_月) :- 年入力処理(_年), 月入力処理(_月). % (2) 曜日計算 :- op(450,xfx,が),op(500,xfx,であり),op(600,xfx,ならば),op(450,xfx,は). 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は (Y + Y // 4 - Y // 100 + Y // 400 + ((( 13 * M ) + 8 ) // 5 ) + D ) mod 7). 曜日計算処理(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値), 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値を得る'(_年,1,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,13,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,2,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,14,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値) :- _年=Y,_月=M,_日=D, 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は _Zellerの公式), _曜日を表す値 is _Zellerの公式,!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % (3) カレンダー表示 カレンダー表示 :- 年月入力処理(_年,_月), 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,1,_曜日を表す整数値), カレンダー表示データ編集(_年,_月,_曜日を表す整数値,_カレンダー表示文字列ならび), 要素に空白を挿入して全行表示(_カレンダー表示文字列ならび). カレンダー表示データ編集(_年,_月,_各月1日の曜日を表す整数値,_カレンダー表示文字列ならび) :- 年月文字列編集処理(_年,_月,_年月文字列), 月日数(_年,_月,_月日数), findall(S,for(1,N,_月日数),ヘッドゼロサプレス(2,N,S)),_表示日ならび), Length is _月日数 + _各月1日の曜日を表す整数値, M is (7 - (Length mod 7)), '7個組ならび'(Length,M,_表示日ならび,_7個組ならび), 見出しならび(_年月文字列,_見出しならび), append(_見出しならび,_7個組ならび,_カレンダー表示文字列ならび). 見出しならび(_年月文字列,[[_年月文字列],[日,月,火,水,木,金,土]]). '7個組ならび'(Length,0,_表示日ならび,_7個組ならび) :- length(L0,Length), すべての要素が(L0,' '), append(L0,_表示日ならび,L), '7個組'(L,_7個組ならび),!. '7個組ならび'(Length,M,_表示日ならび,_7個組ならび) :- not(M=0), length(L0,Length), すべての要素が(L0,' '), length(L2,M), すべての要素が(L2,' '), append(L0,_表示日ならび,L2,L), '7個組'(L,_7個組ならび),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,28) :- not(うるう年(_年)),!. 月日数(_,_月,30) :- member(_月,[4,6,9,11]). 月日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). % (4) 基礎述語の定義 年入力処理(_年) :- write('表示したいカレンダーは西暦何年 ? '), get_line(_行), 年入力処理の二(_行,_年), 年入力検査(_年),!. 年入力処理(_年) :- 年入力処理(_年). 年入力処理の二(_行,_年) :- atom_to_term(_行,_年), integer(_年),!. 年入力処理の二(_行,_年) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 年入力検査(_年) :- _年 >= 1583, _年 =< 3999,!. 年入力検査(_年) :- write_formatted('この年を表す整数%tは不正です\n',[_年]), fail. 月入力処理(_月) :- write('月は ? '), get_line(_行), 月入力処理の二(_行,_月), 月入力検査(_月),!. 月入力処理(_月) :- 月入力処理(_月). 月入力処理の二(_行,_月) :- atom_to_term(_行,_月,_), integer(_月),!. 月入力処理の二(_行,_月) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 月入力検査(_月) :- _月 >= 1, _月 =< 12,!. 月入力検査(_月) :- write_formatted('この月を表す整数%tは不正です\n',[_月]), fail. 日付文字列編集処理(_年,_月,_日,_日付文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), ヘッドゼロサプライ(2,_日,_日文字列), concat_atom([_年文字列,_月文字列,_日文字列],_日付文字列). 年月文字列編集処理(_年,_月,_年月文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), concat_atom([_年文字列,_月文字列],_年月文字列). ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). ヘッドゼロサプレス(N桁,_整数,_ヘッド空白整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプレス_1(N桁,_数字ならび,_ヘッド空白整数文字ならび), concat_atom(_ヘッド空白整数文字ならび,_ヘッド空白整数文字列),!. ヘッドゼロサプレス_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプレス_1(N桁,L,[' '|R]) :- M桁 is N桁 - 1, ヘッドゼロサプレス_1(M桁,L,R). 要素に空白を挿入して全行表示([]) :- !. 要素に空白を挿入して全行表示([L|R]) :- concat_atom(L,' ',_表示行), write_formatted('%t\n',[_表示行]), 要素に空白を挿入して全行表示(R). すべての要素が([],_). すべての要素が([V|R],V) :- すべての要素が(R,V). '7個組'([],[]) :- !. '7個組'([A,B,C,D,E,F,G|R1]),[[A,B,C,D,E,F,G]|R2]) :- '7個組'(R1,R2). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. not(P) :- \+(P). append([],L1,L2,L) :- append(L1,L2,L) . append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R) . concat_atom([],'') :- !. concat_atom([A],A) :- !. concat_atom([A|R],S) :- concat_atom(R,S1), atom_concat(A,S1,S). concat_atom([],_,'') :- !. concat_atom([A],_,A) :- !. concat_atom([A|R],_区切り文字列,S) :- concat_atom(R,_区切り文字列,S1), atom_concat(A,_区切り文字列,S2), atom_concat(S2,S1,S). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/157 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9762.txt # # 正数による正方行列のうち、全ての行、列、斜め列の合計が同じであり、 # かつ2回以上使用される数字が存在しないものを魔方陣という。 # 下図に示すa,bに数値を設定したときに、1〜9の整数によって構成される魔方陣を # 出力するプログラムを作成せよ。 # 但し、魔方陣が作成不可能な(a,b)の組み合わせが設定された場合は、「Impossible」 # と出力するとする。 # # la_lb_l__l # l__l__l__l # l__l__l__l # 魔方陣(N枡,A,B,_行列) :- 魔方陣のための行列の生成(N枡,_行列), _行列 = [[A,B|_],_,_], 行の合計が全て一致する(_行列,S), 列の合計が全て一致する(_行列,S), 正方行列の斜め要素の合計が一致する(_行列,S). 魔方陣のための行列の生成(N枡,_行列) :- N2 is N枡 ^ 2, findall(M,for(1,M,N2),NL),!, 順列(NL,N2,_順列数字ならび), findall(_N個組,n個組(N枡,_順列数字ならび,_N個組),_行列). 行の合計が全て一致する([],S) :- !. 行の合計が全て一致する([_行|R],S) :- 魔方陣の加算(_行,0,S), 行の合計が全て一致する(R,S). 列の合計が全て一致する(_行列,S) :- 行列の転置(_行列,_転置行列), 列の合計が全て一致する(_転置行列,S),!. 正方行列の斜め要素の合計が一致する(_正方行列,S) :- length(_行列,Len), 左上から右下方向の合計(1,Len,_正方行列,0,S), 右上から左下方向の合計(1,Len,_正方行列,0,S),!. 左上から右下方向の合計(M,N,_,S,S) :- M > N,!. 左上から右下方向の合計(M,N,_行列,S1,S) :- list_nth(M,_行列,_行), list_nth(M,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 左上から右下方向の合計(M2,N,_行列,S2,S),!. 右上から左下方向の合計(M,N,_,S,S) :- M > N,!. 右上から左下方向の合計(M,N,_行列,S1,S) :- M1 is N - M + 1, list_nth(M1,_行列,_行), list_nth(M1,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 右上から左下方向の合計(M2,N,_行列,S2,S),!. n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. 魔方陣の加算([],X,X) :- !. 魔方陣の加算([A|R],Y,X) :- Z is A + Y, 魔方陣の加算(R,Z,X). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/566 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 番号と点数を配列に初期化して、それらを # 5段階にランク付けをして、受験番号・ランクを表示するプログラムを作成。 # ランク付けをする部分を関数Rankとして、番号と評価を表示する部分を関数Outputとすること。 # なお、ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 # 60〜79点をB、80〜100点をAとする。 # ただし、受験者の数は、50人以下とする。 # 番号と点数は、以下の配列を使用すること。 # 番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10}; # 点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100}; # '問題文の5段階にランク付け'('ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 60〜79点をB、80〜100点をAとする。 '). 番号の定義文('番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10};'). 点数の定義文('点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100};'). 'ランクならびの生成'(_ランクならび) :- '問題文の5段階にランク付け'(_ランク定義文), ランクの定義文解析(_ランク定義文,_ランクならび). 番号ならびの生成(_番号ならび) :- 番号の定義文(_番号の定義文), 番号の定義文解析(_番号の定義文,_番号ならび). 点数ならびの生成(_点数ならび) :- 点数の定義文(_点数の定義文), 点数の定義文解析(_点数の定義文,_点数ならび). '5段階にランク付けをして、受験番号・ランクを表示する' :- ランクならびの生成(_ランクならび), 番号ならびの生成(_番号ならび), 点数ならびの生成(_点数ならび), '5段階にランク付けをして、受験番号・ランクを表示する'(_番号ならび,_点数ならび,_ランクならび). '5段階にランク付けをして、受験番号・ランクを表示する'([],[],_). '5段階にランク付けをして、受験番号・ランクを表示する'([_番号|R1],[_点数|R2],_ランクならび) :- append(_,[[_点数下限,_点数上限,_ランク]|_],_ランクならび), _点数 >= _点数下限, _点数 =< _点数上限, writef('受験番号:%t ランク:%t\n',[_番号,_ランク]), '5段階にランク付けをして、受験番号・ランクを表示する'(R1,R2,_ランクならび). ランクの定義文解析(_ランク定義文,_ランクならび) :- 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文), split(_半角数字変換されたランク定義文,[' ','。','、','〜','点を','とする'],L), n個組(3,L,_ランクならび). 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文) :- atom_chars(_ランク定義文,Chars), findall(_文字_1, append(_,[_文字|_],Chars), 全角数字ならば半角数字に変換(_文字,_文字_1)), Chars2), atom_chars(_半角数字変換されたランク定義文,Chars2). 全角数字ならば半角数字に変換([_全角数字|R1],[_半角数字|R2]) :- 全角数字半角数字変換(_全角数字,_半角数字), 全角数字ならば半角数字に変換(R1,R2). 全角数字ならば半角数字に変換([_文字|R1],[_文字|R2]) :- \+(全角数字半角数字変換(_文字,_)), 全角数字ならば半角数字に変換(R1,R2). 全角数字半角数字変換(0,0). 全角数字半角数字変換(1,1). 全角数字半角数字変換(2,2). 全角数字半角数字変換(3,3). 全角数字半角数字変換(4,4). 全角数字半角数字変換(5,5). 全角数字半角数字変換(6,6). 全角数字半角数字変換(7,7). 全角数字半角数字変換(8,8). 全角数字半角数字変換(9,9). 番号の定義文解析(_番号の定義文,_番号ならび) :- split(_番号の定義文,['=',',',';'],[_|_番号ならび]). 点数の定義文解析(_点数の定義文,_点数ならび) :- split(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは % % SWI-Prolog のコマンド引数の内、ユーザパラメータ部分をリストに得る。 % user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/348 # # [1] C言語演習 # # [2] argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 # 但し、第一引数だけは別の配列(ary)に格納はしないこと。 # 例)argv:./test a b c d e f # 例)ary :./test b c d e f # # [3.1] redhat # [3.3] C言語 # [4] 本日中 # [5] 制限:なし # わかる方どうかよろしくお願いします。 # # 'argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 但し、第一引数だけは別の配列(ary)に格納はしないこと'(UserParameterList) :- user_parameters([_|UserParameterList]),!. user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/425 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 与えた文字列を指定した回数繰り返す文字列に変換するプログラムを作成しなさい。 # ただし、main関数を以下のように宣言し、実行時に引数をとれるようにする。 # 第一引数は繰り返し回数とし、第二引数は繰り返される文字列とする。 # すなわち、./prog 3 "ABC"と実行した場合は、ABCABCABCとなる文字列が作られる。 # 作られた文字列は、表示すること。必要に応じて、数字を数値に変換する関数atoi()を使用してもよい。 # その際は、#include<stdlib.h>を加えること。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc,char*argv[]){ # /** argc:引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:引数**/ # x=atoi(argv[1]);/*atoiの使用例*/ # return(0); # } # program :- 与えた文字列を指定した回数繰り返す文字列に変換する. 与えた文字列を指定した回数繰り返す文字列に変換する :- user_parameters([_回数文字列,_文字列]), atom_to_term(_回数文字列,_回数,_), length(Ln,_回数), append(_,[_|R],Ln), write(_文字列), R = []. user_parameters(A) :- current_prolog_flag(argv, B), append(_, [--|A], B). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/639 # # [1] C言語演習 # [2] argvで入力された引数 "123:456:78:90" の様な文字列を ":" 区切りで # 別の配列へ順に格納せよ。(strchr関数を使いなさい) # 上記の例では、[0]=123,[1]=456,[2]=78,[3]=90となる。 # 尚、::の連続もありで、"12:34::90" は [0]=12,[1]=34,[2]=null,[3]=90となる。 # # 下の様に処理しているが、スマートに行きません。。。 # p = NULL; # p = strchr(str, ':'); # while (p != NULL) { # printf("length %d\n", strlen(str)-strlen(p)); # p++; # p = strchr(p, ':'); # } # 'argvで入力された引数 "123:456:78:90" の様な文字列を ":" で区切り、プログラム引数述語のリスト引数とする' :- user_parameters([_引数文字列]), split(_引数文字列,[':'],L), assertz(プログラム引数(L)). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/682 # # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(0,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,1,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,0,1,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,1,0,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,0,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(0,1,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,1,1,'NG') :- !. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/699 # # ../test/read.cgi/tech/1311089619/682について内容が不足していたので再投稿します。 # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # [3] フラグ・判定にビット演算を使用してください。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する。判定はビット演算を使う' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'OK') :- 0 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'NG') :- 1 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/453 # # 【 課題 】コマンドラインから入力された点数を集計するプログラムを作成。 #       ソースファイルにコードを追加して、以下の実行結果になるように。 # # 実行結果  #       java CalcMain 69 88 70 45 95 33 #       高得点順: 95点 , 88点 , 70点 , 69点 , 45点 , 33点 #       科目数:6科目 #       合計点:400点 #       平均点: 66.666664点 #        CalcMainクラスはmain()メソッドを持つ。 #        Calculationクラスは、合計点の計算をするgetTotal()メソッド、平均点の計算をするgetAve()メソッド、並び替え処理を行うsort()メソッドを持つ。 #        コマンドライン引数から受け取った不特定数の数値(点数)について、降順並び替え表示、科目数、合計点、平均点の表示を行う。 #        sort()メソッドの並び替え処理には「バブルソート」を使用する # # #       ソースファイル #       http://ime.nu/www.dotup.org/uploda/www.dotup.org2249012.java.html # # http://ime.nu/www.dotup.org/uploda/www.dotup.org2249060.java # # # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11月14日まで # 【 Ver  】java version "1.6.0_22" # 【 用語 】 # 【 補足 】よろしくお願いします。 # # 'コマンドラインから入力された点数を集計するプログラムを作成。ソースファイルにコードを追加して、以下の実行結果になるように。' :- コマンドラインから入力された点数(_コマンドラインから入力された点数ならび), 高得点順に表示(_コマンドラインから入力された点数ならび), 科目数と合計点と平均点の表示(_コマンドラインから入力された点数ならび). コマンドラインから入力された点数(_コマンドラインから入力された点数ならび) :- current_prolog_flag(argv,_コマンドライン), append(_,['--'|_コマンドラインから入力された点数ならび],_コマンドライン]). 高得点順に表示(L) :- バブルソート降順(L,L2), concat_atom(L2,',',_表示文字列), writef('高得点順: %t\n',[_表示文字列]). 科目数の表示(L,_科目数) :- length(L,_科目数), writef('科目数: %t\n',[_科目数]), 科目数と合計点と平均点の表示(L) :- length(L,_科目数), sum(L,_合計点), _平均点 is _合計点 / _科目数. writef('科目数: %t\n合計点: %t\n平均点: %t\n',[_科目数,_合計点,_平均点]). バブルソート降順(_対象ならび,_整列済みならび) :- 降順交換(_対象ならび,_対象ならびの一), !, バブルソート降順(_対象ならびの一,_整列済みならび). バブルソート降順(_整列済みならび,_整列済みならび). 降順交換([],[]) :- !,fail. 降順交換([A,B|R],[B,A|R]) :- A @< B,!. 降順交換([A|R1],[A|R2]) :- 降順交換(R1,R2). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/670 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # #include<stdio.h> # int main(void) # { # int i=0; # char *ptr; # char str[128]; # # ptr = str; # # scanf("%s",&str); # # while(*ptr++){ # i++; # } # # printf("%d\n",i); # } # # 上記の入力したテキストの文字数を表示するプログラムの読み込み部分をファイル処理に変更せよ。 # fgetc() 関数を使用し、コマンドラインにファイル名が指定できるようにすること。 # ただし、ファイル名を指定しない場合は標準入力とする。 # ファイルが見つからなかった時はエラーメッセージを出し、プログラムを終了する。 # 'length系組込述語を使わず入力したテキストの文字数を表示する' :- get_chars(_文字ならび), ならびの文字数を数える(_文字ならび,_文字数), writef('文字数は %t文字です\n',[_文字数]). ならびの文字数を数える([],0). ならびの文字数を数える([_|R],_文字数) :- ならびの文字数を数える(R,_文字数_1), _文字数 is _文字数_1 + 1. 読み込み部分をファイル処理に変更する :- コマンドラインからファイル名を取り出す(_ファイル名), 読み込み部分をファイル処理に変更する(_ファイル名). 読み込み部分をファイル処理に変更する(user_input,_文字数) :- ファイルから読み出しながら文字数を数える(user_input,_文字数). 読み込み部分をファイル処理に変更する(_ファイル名,_文字数) :- open(_ファイル名,read,Instream), ファイルから読み出しながら文字数を数える(Instream,_文字数), close(Instream). ファイルから読み出しながら文字数を数える(Instream,0) :- at_end_of_stream(Instream),!. ファイルから読み出しながら文字数を数える(Instream,_文字数) :- get_char(Instream,_), ファイルから読み出しながら文字数を数える(Instream,_文字数_1), _文字数 is _文字数_1 + 1. コマンドラインからファイル名を取り出す(_ファイル名) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList), ParameterList = [_ファイル名|_],!. コマンドラインからファイル名を取り出す(user_input). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/613 # # 明日までの課題です。 # まったくわかりません。 # # キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力するプログラムを書きなさい。 # なお、プログラムは次の要件を満たすこと。 # # 1.キーボードからの入力は、Enter(return)キーを2回連続して入力すると終了する # 2.入力終了後、画面に入力した行数を表示する # 3.コマンドラインからプログラムを起動後、入力する文字列に各自の氏名(ローマ字表記)を含めた場合、入力処理終了後、各自の氏名を含む行は何行目にあり、その行の文字列が何であるか表示する。 # 氏名が入力データに含まれていない場合には、含まれていなかったことを表示する # # よろしくお願いします。 # # program :- 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する' :- user_parameters([_ファイル名]), open(_ファイル名,write,Outstream), get_line(Line), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,[]), close(Outstream). 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,'',Ln) :- length(Ln,_行数), writef('行数は %t です\n',[_行数]),!. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,Ln) :- writef(Outstream,'%t\n',[Line]), get_line(Line_2), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line_2,[_|Ln] user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/59 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # main関数を以下のように宣言し、実行時に引数を取れるようにする。 # 引数がすべて得点であるとして、その平均値を # 求めるプログラムを作成しなさい。 # すなわち、 # ./prog 50 70 90 と実行した場合は、70と表示される。 # 必要に応じて、数字を数値に変換する関数atoi()や # atof()を使用してもよい。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc, char *argv[] ) { # /** argc: 引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:実数 **/ # x = atof( argv[1] ); /* atofの使用例 */ # return(0); # } # # ※ 配列のサイズなど、定数は必ず#defineを利用すること. # ※ 表示や入力を目的とする関数以外では、 # 関数の中で標準入力や標準出力への入出力は行わないこと. # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月15日 # よろしくお願いします! # # program :- user_parameters(_ユーザパラメータならび), プログラム引数を整数ならびに変換(_ユーザパラメータならび,_整数ならび), avg(整数ならび,_相加平均), writef('%t\n',[_相加平均]). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). プログラム引数を整数ならびに変換([],[]). プログラム引数を整数ならびに変換([A|R1],[N|R2]) :- atom_to_term(A,N,_), integer(N), プログラム引数を整数ならびに変換(R1,R2). プログラム引数を整数ならびに変換([_|R1],R2) :- プログラム引数を整数ならびに変換(R1,R2). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/642 # # [1] 授業単元:C言語演習 # [2] 問題文: # 実行ファイル名をmultiとして、multiに続いて2つの正の整数を入力すると、小さい方の整数から大きい方の整数までの積を出力するプログラムを作成せよ。 # 但し、入力時には小さい方の整数、大きいほうの整数の順で入力されるものとする。 # <入力例>$./multi 3 6 # <計算結果>360 # program :- user_parameters([_引数1,_引数2]), 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2), user_parameters(ParametersList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2) :- atom_number(_引数1,N1), atom_number(_引数2,N2), 小さい方の整数と大きい方の整数(N1,N2,_小さい方の整数,_大きい方の整数), 小さい方の整数から大きい方の整数までの積を(_小さい方の整数,_大きい方の整数,_積), 出力する(_積). 小さい方の整数と大きい方の整数(N1,N2,N1,N2) :- N1 =< N2. 小さい方の整数と大きい方の整数(N1,N2,N2,N1) :- N1 > N2. 小さい方の整数から大きい方の整数までの積を(N,N,N). 小さい方の整数から大きい方の整数までの積を(N,_大きい方の整数,_積) :- N < _大きい方の整数, N1_2 is N1 + 1, 小さい方の整数から大きい方の整数までの積を(N_2,_大きい方の整数,_積_2), _積 is _積_2 * N. 出力する(_積) :- writef('%t\n',[N]). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/786 # # C言語 # gcc # Linux # 問題:cat関数を作りなさい。ただし、fgets,fputsを用いること。です。 # # 明日のお昼までにお願いします。 # # cat :- user_parameters([]), get_code(user_input,Code), ストリームから読み取り書き出す(user_input,Code),!. cat :- user_parameters(L), append(_,[File|R],L), ファイルを書き出す(File), R = [],!. ファイルを書き出す(File) :- open(File,read,Instream), get_code(Instream,Code), ストリームから読み取り書き出す(Instream,Code), close(Instream). ストリームから読み取り書き出す(_,-1) :- !. ストリームから読み取り書き出す(Instream,Code_1) :- put_code(Code_1), get_code(Instream,Code_2), ストリームから読み取り書き出す(Instream,Code_2). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % % SWI-Prologの起動は % # swipl -t cat -f プログラムファイル名 -- ファイル1 ファイル名2 ... % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/907 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 以下のようにmain関数を定義し、mainの引数を合計するプログラムsumを作成せよ。ただし、引数の数は未定であり、実行時に決定されるものとする。 # int main(int argc, char *argv[]) # main :- 利用者引数ならび(_利用者引数ならび), findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値ならび), sum(_数値ならび,_合計), writef('%t\n',[_合計]). sum([],0). sum([_数値|R],_合計) :- sum(R,_合計_1), _合計 is _数値 + _合計_1. 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). % % # swipl --quiet -f c161_907.html -g main -- 33.0 25.1 38.4 % 96.5 % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/957 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク): # コマンド行から複数の数値を受け取りその平均値を出力するプログラムを # 作成し、プログラムリストと実行結果を示せ。ヒント:受け取った文字列を # double型に変換するには、関数double atof(const char *nPtr)を使う。 # この関数を使うには<stdlib.h>のインクルードが必要である。 # #include <stdio.h> # #include <stdlib.h> # int main(void) # { # char str[]="1.41421356"; # double x; # x = atof(str); # } # 'コマンド行から複数の数値を受け取りその平均値を出力する' :- 利用者引数ならび(_利用者引数ならび), 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび), 相加平均(_数値引数ならび,_相加平均), writef('平均値は %t です\n',[_相加平均]). 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび) :- findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値引数ならび). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0e+00,M). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0.0,200.0,_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), read_term_from_atom(_身長文字列,_身長,[]), read_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重) :- 収束条件を満たす(_体重_下,_体重_上,_体重),!. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下_1,_体重_上_1,_身長,_BMI,_体重) :- '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重). 収束条件を満たす(_体重_下,_体重_上,_体重) :- (_体重_上 - _体重_下) < 0.1, _体重 is (_体重_上 + _体重_下) / 2. '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上) :- '新しい体重とその時のBMIを計算する'(_体重_下_1,_体重_上_1,_身長,_BMI_2,_体重_2), '次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_体重_2,_BMI,_BMI_2,_体重_下,_体重_上). '新しい体重とその時のBMIを計算する'(_体重_下,_体重_上,_身長,_BMI_2,_体重_2) :- _体重_2 is (_体重_下 + _体重_上) / 2, _BMI_2 is _体重_2 / ((_身長 / 100) ^ 2). '次の体重の計算区間を得る'(_体重_下,_,_体重_2,_BMI,_BMI_2,_体重_下,_体重_2) :- _BMI_2 =< _BMI,!. '次の体重の計算区間を得る'(_体重_下,_体重_上,_体重_2,_BMI,_BMI_2,_体重_2,_体重_上). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % これはsplitをわかりやすいように簡略化した定義です。 % より完全なsplit/3の定義はこちらをご覧ください % split(_文,_区切り語ならび,_区切られた語ならび) :- 区切り語ならびの変形(_区切り語ならび,SeparatersL), atom_chars(_文,_文字ならび), split_list_1(_文字ならび,SeparatersL,_区切られた語ならび). sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. 'SPLIT'(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Z), Z = X,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% split_list([],SeparatersL,[]). split_list(L1,SeparatersL,[L2|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), split_list(R2,SeparatersL,R). split_list(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list(R2,SeparatersL,X). split_list_1([],SeparatersL,[]). split_list_1(L1,SeparatersL,[A|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), atom_chars(A,L2), split_list_1(R2,SeparatersL,R). split_list_1(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list_1(R2,SeparatersL,X). split_list_2([],_,[],[]). split_list_2(L1,SeparatersL,[],R) :- member(L2,SeparatersL), append(L2,R,L1). split_list_2([A|R1],SeparatersL,[A|R2],R) :- \+((member(L2,SeparatersL),append(L2,_,[A|R1]))), split_list_2(R1,SeparatersL,R2,R). 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび), atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,NL), catch(atom_chars(C,NL),_,fail),!. split_5(B,C) :- concat_atom(B,C),!. split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42([],[],'',_,[]) :- !. numeric_list([],[]) :- !. numeric_list([A|R],[B|R1]) :- digit(A), char_code(A,B), numeric_list(R,R1),!. numeric_list(['.'|R],[46|R1]) :- numeric_list(R,R1),!. numeric_list([-|R],[45|R1]) :- numeric_list(R,R1),!. number(A,B) :- number_codes(A,B). % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), get_term_from_atom(_身長文字列,_身長,[]), get_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重) :- '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0,_身長,_BMI,_体重_BMIとの差ならび), 'BMIの計算差が最小のものの体重'(_体重_BMIとの差ならび,_体重). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(2000,_身長,_BMI,[]) :- !. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(N,_身長,_BMI,[[N,_BMI_の計算差]|R]) :- '身長、体重から、BMIの計算差を得る'(N,_身長,_BMI,N_2,_体重,_BMIの計算差), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(N_2,_身長,_BMI,R). '身長、体重から、BMIの計算差を得る'(N,_身長,_BMI,N_2,_体重,_BMIの計算差) :- _BMIの計算差 is abs((N / 10) / ((_身長 / 100) ^ 2)) - _BMI), succ(N,N_2), _体重 is N / 10. 'BMIの計算差が最小のものの体重'(_N_BMIとの差ならび,_体重) :- select([_体重,_BMIの差],_N_BMIとの差ならび,R), forall(member([_,_BMIの差_1],R),_BMIの差 =< _BMIの差_1). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), get_term_from_atom(_身長文字列,_身長,[]), get_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重) :- _体重 is _BMI * (_身長 / 100) ^ 2. 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/750 # お題:夏休みの自由研究 # +--------------------+ # |□時間差     X| # +--------------------+ # |start 04:56:34.567 | # |stop 12:40:32.456 | # |          | # |+--+ 07:43:57.389 | # ||−|        | # |+--+   27838389 | # +--------------------+ # stopがstartより小さいときは+24:00:00して考える。 # # 時間差 :- 'startの_時:_分:_秒(1000分の1秒単位)を入力する'(_時_1,_分_1,_秒_1), 'stopの_時:_分:_秒(1000分の1秒単位)を入力する'(_時_2,_分_2,_秒_2), 時間差(_時_1,_分_1,_秒_1,_時_2,_分_2,_秒_2,_ミリ秒単位の時間差,_時間差の時,_時間差の分,_時間差の秒), 表示(_時_1,_分_1,_秒_1,_時_2,_分_2,_秒_2,_ミリ秒単位の時間差,_時間差の時,_時間差の分,_時間差の秒). 'startの_時:_分:_秒(1000分の1秒単位)を入力する'(_時,_分,_秒) :- write('start '), get_split_line([' ',':'],[_時,_分,_秒]). 'stopの_時:_分:_秒(1000分の1秒単位)を入力する'(_時,_分,_秒) :- write('stop '), get_split_line([' ',':'],[_時,_分,_秒]). 時間差(_時_1,_分_1,_秒_1,_時_2,_分_2,_秒_2,_ミリ秒単位の時間差,_時間差の時,_時間差の分,_時間差の秒) :- 二つの時刻をミリ秒単位に変換する(_時_1,_分_1,_秒_1,_時_2,_分_2,_秒_2,_ミリ秒単位_1,_ミリ秒単位_2), ミリ秒単位の時間差(_ミリ秒単位_1,_ミリ秒単位_2,_ミリ秒単位の時間差), ミリ秒単位から_時_分_秒を取り出す'(_ミリ秒単位の時間差,_時間差の時,_時間差の分,_時間差の秒). 二つの時刻をミリ秒単位に変換する(_時_1,_分_1,_秒_1,_時_2,_分_2,_秒_2,_ミリ秒単位_1,_ミリ秒単位_2) :- '_時_分_秒をミリ秒単位に変換する'(_時_1,_分_1,_秒_1,_ミリ秒単位_1), '_時_分_秒をミリ秒単位に変換する'(_時_2,_分_2,_秒_2,_ミリ秒単位_2). '_時_分_秒をミリ秒単位に変換する'(_時,_分,_秒,_ミリ秒単位) :- _ミリ秒単位 is (3600 * _時 + 60 * _分 + _秒) * 1000. ミリ秒単位の時間差(_ミリ秒単位_1,_ミリ秒単位_2,_ミリ秒単位の時間差) :- _ミリ秒単位_1 > _ミリ秒単位_2, _ミリ秒単位の時間差 is (24*3600*1000+_ミリ秒単位_2) - _ミリ秒単位_1. ミリ秒単位の時間差(_ミリ秒単位_1,_ミリ秒単位_2,_ミリ秒単位の時間差) :- _ミリ秒単位_1 =< _ミリ秒単位_2, _ミリ秒単位の時間差 is _ミリ秒単位_2 - _ミリ秒単位_1. ミリ秒単位から_時_分_秒を取り出す(_ミリ秒単位,_時,_分,_秒) :- ミリ秒単位から_時を取り出す(_ミリ秒単位,_時,_余り), ミリ秒単位から_分を取り出す(_ミリ秒単位,_分), ミリ秒単位から_秒を取り出す(_ミリ秒単位,_秒). ミリ秒単位から_時を取り出す(_ミリ秒単位,_時,_余り) :- _時 is _ミリ秒単位 // (3600 * 1000), _余り is _ミリ秒単位 mod (3600 * 1000). ミリ秒単位から_分を取り出す(_ミリ秒単位,_分) :- ミリ秒単位から_時を取り出す(_ミリ秒単位,_時,_余り), _分 is _余り // (60 * 1000). ミリ秒単位から_秒を取り出す(_ミリ秒単位,_時,_余り) :- ミリ秒単位から_時を取り出す(_ミリ秒単位,_時,_余り), _秒 is (_余り mod (60 * 1000)) / 1000. 表示(_時_1,_分_1,_秒_1,_時_2,_分_2,_秒_2,_ミリ秒単位の時間差,_時間差の時,_時間差の分,_時間差の秒) :- write(' +--------------------+ \n |□時間差     X| \n +--------------------+ '), writef(' |start %t:%t:%t | \n |stop %t:%t:%t | \n |          | \n',[_時_1,_分_1,_秒_1,_時_2,_分_2,_秒_2]), writef(' |+--+ %t:%t:%t | \n||−|        | \n |+--+   %t | \n +--------------------+ \n',[_ミリ秒単位時間差,_時間差の時,_時間差の分,_時間差の秒]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/860 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # n個の整数を含む集合Sと、 # q個の異なる整数を含む集合Tを入力とし、 # Tに含まれる整数の中でSに含まれるものの数Cを # 出力するプログラムを作成せよ。 # # 入力 # 1行目にSを表すn個の整数、 # 2行目にTを表すq個の整数が与えられる。 # 出力 # Tに含まれる整数の中でSに含まれるものの数Cを出力せよ。 # 条件 # n : 10以下 # q : 5以下 # 集合に含まれる整数の値 以上、6未満 # # 実行例) # 3 8 4 1 9 2 5 7 6 入力(集合S:n個(9)) # 1 3 5 10 入力(集合T:q個(4)) # 3 出力(C) # 21 30 5 21 10 39 14 入力(集合S:n個(7)) # 1 21 10 入力(集合T:q個(3)) # 2 出力(C) # 'n個の整数を含む集合Sと、 q個の異なる整数を含む集合Tを入力とし、 Tに含まれる整数の中でSに含まれるものの数Cを 出力するプログラムを作成せよ。'(_n,_q) :- 'n個の整数を含む集合Sと、q個の異なる整数を含む集合Tを入力とし、'(_n,_S,_q,_T), 'Tに含まれる整数の中でSに含まれるものの数Cを'(_T,_S,_C), 出力する(_C). 'n個の整数を含む集合Sと、q個の異なる整数を含む集合Tを入力とし、'(_n,_S,_q,_T) :- 'n個の整数を含む集合Sの入力、'(_n,_S), 'q個の異なる整数を含む集合Tの入力'(_q,_T). 'n個の整数を含む集合Sの入力、'(_n,_S) :- writef('集合S 入力する整数は%t個です : ',[_n]), get_split_line([' '],_S). 'q個の異なる整数を含む集合Tの入力'(_q,_T) :- writef('集合T 入力する整数は%t個で、同じ数字であってはいけません : ',[_q]), get_split_line([' '],_T). 'Tに含まれる整数の中でSに含まれるものの数Cを'(_T,_S,_C) :- setof(_整数,member(_整数,_T),_T_1), count((member(_N,_T_1),member(_N,_S)),_C). 出力する(_C) :- writef('%t\n',[_C]). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #674 # あなた(霧島京子) は20万人月の巨大なプロジェクトを一ヶ月で終わらせるために無数の下請け会社から人員をかき集める仕事をすることになりました。 # プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。 # # 各下請け会社の人員は、一部を使うなどは出来ず全員を使わなくてはいけません。 # プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、最も安くすむ合計金額(単位:万円)を出力してください。 # 各下請け会社の人員数の合計はプロジェクトの規模 m 人月以上になるものとします。 # ヒントを見る # ※ 実際のプロジェクトではこの様には行きませんので、人員を増やす場合は慎重に検討する事をお勧めいたします。 # ※この物語はフィクションであり、実在の人物・団体とは一切関係ありません # # # # 入力される値 # 入力は以下のフォーマットで与えられます。 # # m (プロジェクトに必要な人員数) # n (下請け会社の数) # q_1 r_1 (1番目の下請け会社の人員数 発注に必要な費用[単位:万円]) # q_2 r_2 (2番目の下請け会社の人員数 発注に必要な費用[単位:万円]) # ・・・ # q_i r_i (n 番目の下請け会社の人員数 発注に必要な費用[単位:万円]) # 条件 # 1 ≦ m ≦ 200000(プロジェクトに必要な人数:最大20万人) # 1 ≦ n ≦ 50(下請け会社数:最大50社) # 1 ≦ q_i ≦ 10000(各下請け会社の人員数:最大1万人) # 1 ≦ r_i ≦ 5000000(各下請け会社のへの発注費用[単位:万円]:1万円〜最大500億円) # m ≦ q_1 + q_2 + q_3 ... + q_i(各下請け会社の人員数の合計はプロジェクトに必要な人数 m 人以上になる) # 期待する出力 # 最もコストが安くなる組み合わせの総コストを出力して下さい。 # 最後は改行し、余計な文字、空行を含んではいけません。 # 入力例1 # 60 # 3 # 40 4300 # 30 2300 # 20 2400 # # # 出力例1 # 6600 # 入力例2 # 250 # 5 # 35 3640 # 33 2706 # 98 9810 # 57 5472 # 95 7790 # 出力例2 # 23072 'あなた(霧島京子) は20万人月の巨大なプロジェクトを一ヶ月で終わらせるために 無数の下請け会社から人員をかき集める仕事をすることになりました。 プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、 各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。 各下請け会社の人員は、一部を使うなどは出来ず全員を使わなくてはいけません。 プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を出力してください。 各下請け会社の人員数の合計はプロジェクトの規模 m 人月以上になるものとします。' :- 'プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、 各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。'(_m,_n,_下請け人数_費用ならび), findmin(_合計金額,( 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_下請け人数_費用ならび,0,0,_合計人数,_合計金額)),_最も安くすむ合計金額), '出力してください。'(_最も安くすむ合計金額). 'プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、 各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。'(_m,_n,_下請け人数_費用ならび) :- get_split_line([' ',','],[_m,_n]), findall([_下請け人数,_費用],( between(1,_n,_), get_split_line([' ',','],[_下請け人数,_費用])),_下請け人数_費用ならび). 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_下請け人数_費用ならび,_合計人数,_合計金額,_合計人数,_合計金額) :- _合計人数 >= _m,!. 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_下請け人数_費用ならび,_合計人数_1,_合計金額_1,_合計人数,_合計金額) :- ひとつ下請け人数と費用を取り出す(_下請け人数_費用ならび,_合計人数_1,_合計金額_1,_合計人数_2,_合計金額_2,_残りならび), 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_残りならび,_合計人数_2,_合計金額_2,_合計人数,_合計金額). ひとつ下請け人数と費用を取り出す(_下請け人数_費用ならび,_合計人数_1,_合計金額_1,_合計人数_2,_合計金額_2,_残りならび) :- select([_下請け人数_1,_費用_1],_下請け人数_費用ならび,_残りならび), _合計金額_2 is _合計金額_1 + _費用_1, _合計人数_2 is _合計人数_1 + _下請け人数_1. '出力してください。'(_最も安くすむ合計金額) :- writef('%t万円\n',[_最も安くすむ合計金額]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/852 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 2つの数字を入力されるので、 # 左側の数字が大きい場合は、left # 右側の数字が大きい場合は、right # 同じ数字の場合は、equal # と表示すること # # 実行例 # 1 12 # right # 10 19 # left # 5 5 # equal # # '2つの数字を入力されるので、 左側の数字が大きい場合は、left 右側の数字が大きい場合は、right 同じ数字の場合は、equal と表示すること' :- '2つの数字を入力されるので、'(_左側の数字,_右側の数字), '左側の数字が大きい場合は、left 右側の数字が大きい場合は、right 同じ数字の場合は、equal と表示すること'(_左側の数字,_右側の数字). '2つの数字を入力されるので、'(_左側の数字,_右側の数字) :- get_split_line([' ',','],[_左側の数字,_右側の数字]). '左側の数字が大きい場合は、left 右側の数字が大きい場合は、right 同じ数字の場合は、equal と表示すること'(_左側の数字,_右側の数字) :- '左側の数字が大きい場合は、leftと表示すること'(_左側の数字,_右側の数字). '左側の数字が大きい場合は、left 右側の数字が大きい場合は、right 同じ数字の場合は、equal と表示すること'(_左側の数字,_右側の数字) :- '右側の数字が大きい場合は、rightと表示すること'(_左側の数字,_右側の数字). '左側の数字が大きい場合は、left 右側の数字が大きい場合は、right 同じ数字の場合は、equal と表示すること'(_左側の数字,_右側の数字) :- '同じ数字の場合は、equalと表示すること'(_左側の数字,_右側の数字). '左側の数字が大きい場合は、leftと表示すること'(_左側の数字,_右側の数字) :- '左側の数字が大きい場合は、'(_左側の数字,_右側の数字). leftと表示すること. '左側の数字が大きい場合は、'(_左側の数字,_右側の数字) :- _左側の数字 > _右側の数字. leftと表示すること :- write('left\n'). '右側の数字が大きい場合は、rightと表示すること'(_左側の数字,_右側の数字) :- '右側の数字が大きい場合は、'(_左側の数字,_右側の数字), rightと表示すること. '右側の数字が大きい場合は、'(_左側の数字,_右側の数字) :- _左側の数字 < _右側の数字. rightと表示すること :- write('right\n'). '同じ数字の場合は、equalと表示すること'(_同じ数字,_同じ数字) :- equalと表示すること. equalと表示すること :- write('equal\n'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_list(_区切り語彙ならび,_語彙ならび) :- get_line(_文字列), split(_文字列,_区切り語彙ならび,_語彙ならび). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/850 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 2つの入力された数字を使って # 割り算をした結果を表示すること # (整数) # (割る数が0の場合は、NGと表示) # # 実行例 # 5 3 入力 # 1 出力 # 120 60 入力 # 2 出力 # 33 0 入力 # NG 出力 # # '2つの入力された数字を使って 割り算をした結果を表示すること (整数) (割る数が0の場合は、NGと表示)' :- '2つの入力された数字(整数)を使って'(_数字_1,_数字_2), '割り算をした結果を表示すること(割る数が0の場合は、NGと表示)'(_数字_1,_数字_2). '2つの入力された数字(整数)を使って'(_数字_1,_数字_2) :- get_split_line([' ',','],[_数字_1,_数字_2]). '割り算をした結果を表示すること(割る数が0の場合は、NGと表示)'(_数字_1,0) :- write('NG\n'),!. '割り算をした結果を表示すること(割る数が0の場合は、NGと表示)'(_数字_1,_数字_2) :- _割り算の結果 is _数字_1 // _数字_2, writef('%t\n',[_割り算の結果]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/577 # コードゴルフ # # 月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ # 標準入力から以下の形式で与えられる # D W # # '月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ 標準入力から以下の形式で与えられる D W ' :- '標準入力から以下の形式で与えられる D W '(D,W), '月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ'(D,W). '標準入力から以下の形式で与えられる D W '(D,W) :- get_line(_行), split(_行,[' '],[D,W]). '月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ'(D,W) :- sub_atom(土金木水火月日,U,1,_,W), M is ((D + U - 1) mod 7) * 3, sub_atom('SatFriThrWedTueMonSun',M,3,_,X), wirte(X). % コードゴルフ参加 p(W,D):-sub_atom(土金木水火月日,U,1,_,W),M is ((D+U-1) mod 7)*3,sub_atom('SatFriThrWedTueMonSun',M,3,_,X),wirte(X). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/549 # お題:数独の答を表す文字列が与えられたとき、'1'が各列の何行目にあるかを # いちばん左の列から順に調べて表示する。 # 入力 # 145327698 # 839654127 # 672918543 # 496185372 # 218473956 # 753296481 # 367542819 # 984761235 # 521839764 # # 出力 # 159438276 # # '数独の答を表す文字列が与えられたとき、1が各列の何行目にあるかをいちばん左の列から順に調べて表示する。'(_数独文字列,_列目,_行目) :- 数独文字列を数独に変換(_数独文字列,_数独), 転置(_数独,_転置された数独), forall('1が各列の何行目にあるかをいちばん左の列から順に調べて'(_転置された数独,_行目),write(_行目)). 数独文字列を数独に変換(_数独文字列,_数独) :- split(_数独文字列,['\n'],_数独文字列行ならび), findall(_数独行,( findall(_数,( sub_atom(_数独文字列,_,1,_,_文字), 数値に変換(_文字,_数)), _数独行)), _数独). '1が各列の何行目にあるかをいちばん左の列から順に調べて'(_転置された数独,_行目) :- nth1(_列目,_転置された数独,_列), nth1(_行目,_列,'1'). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/737 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成しなさい. # ソートされた2つの数字列を入力 # *0より大きい整数 # *1行に5つの数字(固定) # それらを合わせて、ソートし、 # 大きい数から3つを表示すること # 実行例) # 11 21 23 33 35 入力1 # 24 25 27 32 85 入力2 # 85 35 33 出力 # 5 14 33 302 990 入力1 # 25 31 200 210 500 入力2 # 990 500 302 出力 # 21 43 99 100 902 入力1 # 10 20 30 275 320 入力2 # 902 320 275 出力 # 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定) それらを合わせて、ソートし、 大きい数から3つを表示すること' :- 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1,_数字ならび_2), 'それらを合わせて、ソートし、'(_数字ならび_1,_数字ならび_2,_整列した数字ならび), '大きい数から3つを表示すること'(_整列した数字ならび). 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1,_数字ならび_2) :- 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1), 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_2). 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'([_1,_2,_3,_4,_5]) :- '数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび), ソートされた数字列(_数字ならび),!. 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび) :- 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび). '数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび) :- write('5個の数字をカンマ区切りで入力して下さい : '), get_split_line([',',' '],[_1,_2,_3,_4,_5]). ソートされた数字列([_1,_2,_3,_4,_5]) :- sort([_1,_2,_3,_4,_5],[_1,_2,_3,_4,_5]), forall(member(A,[_1,_2,_3,_4,_5]),number(A)). 'それらを合わせて、ソートし、'(_数字ならび_1,_数字ならび_2,_整列した数字ならび) :- append(_数字ならび_1,_数字ならび_2,_数字ならび), sort(_数字ならび,_整列した数字ならび). '大きい数から3つを表示すること'(_整列した数字ならび) :- append(_,[_3,_2,_1],_整列した数字ならび), writef('%3r%3r%3r\n',[_1,_2,_3]). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/737 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成しなさい. # ソートされた2つの数字列を入力 # *0より大きい整数 # *1行に5つの数字(固定) # それらを合わせて、ソートし、 # 大きい数から3つを表示すること # 実行例) # 11 21 23 33 35 入力1 # 24 25 27 32 85 入力2 # 85 35 33 出力 # 5 14 33 302 990 入力1 # 25 31 200 210 500 入力2 # 990 500 302 出力 # 21 43 99 100 902 入力1 # 10 20 30 275 320 入力2 # 902 320 275 出力 # 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定) それらを合わせて、ソートし、 大きい数から3つを表示すること' :- 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1,_数字ならび_2), 'それらを合わせて、ソートし、'(_数字ならび_1,_数字ならび_2,_整列した数字ならび), '大きい数から3つを表示すること'(_整列した数字ならび). 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1,_数字ならび_2) :- 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1), 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_2). 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'([_1,_2,_3,_4,_5]) :- '数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび), ソートされた数字列(_数字ならび),!. 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび) :- 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび). '数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび) :- write('5個の数字をカンマ区切りで入力して下さい : '), get_split_line([',',' '],[_1,_2,_3,_4,_5]). ソートされた数字列([_1,_2,_3,_4,_5]) :- sort([_1,_2,_3,_4,_5],[_1,_2,_3,_4,_5]), forall(member(A,[_1,_2,_3,_4,_5]),number(A)). 'それらを合わせて、ソートし、'(_数字ならび_1,_数字ならび_2,_整列した数字ならび) :- append(_数字ならび_1,_数字ならび_2,_数字ならび), sort(_数字ならび,_整列した数字ならび). '大きい数から3つを表示すること'(_整列した数字ならび) :- append(_,[_3,_2,_1],_整列した数字ならび), writef('%3r%3r%3r\n',[_1,_2,_3]). % 以下のサイトは # 出典: # C/C++の宿題片付けます 167代目 #716 # [1] 授業単元: プログラミング基礎 # [2] 問題文:10個の整数を入力し配列に保存した後、入力された数字の中に # 5の倍数が含まれているかを調べ、含まれていた時には「5の倍数が含まれています」 # 含まれていない時に「5の倍数が含まれていません」と表示するプログラムを作りなさい。 # # よろしくお願いいたします。 '10個の整数を入力し配列に保存した後、入力された数字の中に 5の倍数が含まれているかを調べ、含まれていた時には「5の倍数が含まれています」 含まれていない時に「5の倍数が含まれていません」と表示する。' :- '10個の整数を入力し配列に保存した後、'(L), '入力された数字の中に 5の倍数が含まれているかを調べ、含まれていた時には「5の倍数が含まれています」 含まれていない時に「5の倍数が含まれていません」と表示する。'(L). '10個の整数を入力し配列に保存した後、'(L) :- write('カンマ区切りで整数を10個入力しなさい : '), get_split_line([','],L). '入力された数字の中に 5の倍数が含まれているかを調べ、含まれていた時には「5の倍数が含まれています」 含まれていない時に「5の倍数が含まれていません」と表示する。'(L) :- '5の倍数が含まれているかを調べ、含まれていた時には'(L), write('5の倍数が含まれています\n'). '入力された数字の中に 5の倍数が含まれているかを調べ、含まれていた時には「5の倍数が含まれています」 含まれていない時に「5の倍数が含まれていません」と表示する。'(L) :- '5の倍数が含まれていない時に'(L), write('5の倍数が含まれていません\n'). '5の倍数が含まれているかを調べ、含まれていた時には'(L) :- member(N,L), 0 is N mod 5,!. '5の倍数が含まれていない時に'(L) :- forall(member(N,L),\+(0 is N mod 5)). % 以下のサイトは # S(1≦S≦10) # L(100≦L≦100) # 標準入力から以下の形式で与えられる # S L # # 例を参考にoとxを配置せよ # # 例 # 3 2 # oooxxx # oooxxx # oooxxx # xxxooo # xxxooo # xxxooo # # 2 3 # ooxxoo # ooxxoo # xxooxx # xxooxx # ooxxoo # ooxxoo # # 1 1 # o # # 2 1 # oo # :- dynamic(行パターン,1). 白(白). 黒(黒). '_行数 is S * L, S(1≦S≦10) L(100≦L≦100) 標準入力から以下の形式で与えられる S L' :- 'S Lを得る'(_s,_l), 表示パターンの形成(_s,_l,LL1), 出力する(LL1). 表示パターンの形成(_s,_l,_表示パターン) :- 行パターンの定義(_s,_l), 表の形成(_s,_l,_表示パターン), 転置して具体値を埋める(_表示パターン). 行パターンの定義(_s,_l) :- 白(_白), 黒(_黒), 行パターンの生成(_白,_黒,_s,_l), 行パターンの生成(_黒,_白,_s,_l). 行パターンの生成(_文字_1,_文字_2,_s,_l) :- length(Ln,_l), findall(文字,( 同一文字列トグル(Ln,_s,_文字_1,_文字_2,_文字)), _行パターン), assertz(行パターン(_行パターン)). 同一文字列トグル([_|_],_s,_文字,_,_文字) :- between(1,_s,_). 同一文字列トグル([_|Ln],_s,_文字_1,_文字_2,_文字) :- 同一文字列トグル(Ln,_s,_文字_2,_文字_1,_文字). 転置して具体値を埋める([L1|R]) :- 転置([L1|R],LL2), findall(L,( member(L,LL2), 行パターン(L)), LL2). 表の形成(_s,_l,[_行パターン|LL]) :- 行パターン(_行パターン),!, findall(L,( between(2,_l,_), length(L,_s)), LL). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 'S Lを得る'(S,L) :- get_line(Line), split(Line,[' '],[S,L]). 出力する(LL) :- flatten(LL,L), forall(member(A,L),format('~w\n',[A])). % 以下のサイトは # S(1≦S≦10) # L(100≦L≦100) # 標準入力から以下の形式で与えられる # S L # # 例を参考にoとxを配置せよ # # 例 # 3 2 # oooxxx # oooxxx # oooxxx # xxxooo # xxxooo # xxxooo # # 2 3 # ooxxoo # ooxxoo # xxooxx # xxooxx # ooxxoo # ooxxoo # # 1 1 # o # # 2 1 # oo # '_行数 is S * L, S(1≦S≦10) L(100≦L≦100) 標準入力から以下の形式で与えられる S L' :- 'S Lを得る'(S,L), 行パターンABを得る(S,L,A,B), findall(AorB,( between(1,L,N), 'AorB'(N,A,B,AorB)), X), 出力する(X). 'S Lを得る'(S,L) :- get_line(Line), split(Line,[' '],[S,L]). 出力する(LL) :- flatten(LL,L), forall(member(A,L),format('~w\n',[A])). 'AorB'(N,A,_,A) :- 1 is N mod 2. 'AorB'(N,_,B,B) :- 0 is N mod 2. 行パターンABを得る(S,L,A,B) :- 合計L行(L,白,黒,S,L,A), 合計L行(L,黒,白,S,L,B). 合計L行(0,_,_,_,_,[]) :- !. 合計L行(L_2,_文字_1,_文字_2,S,L,[_行文字列|R]) :- 行文字列(_文字_1,_文字_2,S,L,_行文字列), succ(L_1,L_2), 合計L行(L_1,_文字_1,_文字_2,S,L,R). 行文字列(_,_,_,0,'') :- !. 行文字列(_文字_1,_文字_2,S,L,_文字列) :- 連続文字列(_文字_1,S,_連続文字列), succ(L_1,L), 行文字列(_文字_2,_文字_1,S,L_1,_連続文字列_1), atom_concat(_連続文字列,_連続文字列_1,_文字列). 連続文字列(_文字,S,_連続文字列) :- findall(_文字,between(1,S,_),L), atom_chars(_連続文字列,L). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #935 # # W=横の長さ、H=縦の長さ # 2<=W<=1000、2<=H<=1000 # 箱の枠は「+」、箱の中は「@」で出力しなさい # # 入力は以下の形式で標準入力から与えられます # W H # # 例 # --------------------- # 2 2 # ++ # ++ # --------------------- # 10 4 # ++++++++++ # +@@@@@@@@+ # +@@@@@@@@+ # ++++++++++ '# W=横の長さ、H=縦の長さ 2<=W<=1000、2<=H<=1000 箱の枠は「+」、箱の中は「@」で出力しなさい 入力は以下の形式で標準入力から与えられます W H' :- 標準入力からWとHを得る(W,H), 描画する(W,H). 標準入力からWとHを得る(W,H) :- get_split_line([' '],[W,Y]). 描画する(W,H) :- between(1,H,N), 一行の像(N,W,H,_一行の像), 描画する(_一行の像), N = H. 一行の像(N,W,H,_一行の像) :- length(L,W), 一行分の文字ならび(N,H,_一行分の文字ならび), atomic_list_concat(_一行分の文字ならび,_一行の像). 一行分の文字ならび(1,H,_一行分の文字ならび) :- '最初と最後の行は行全体が+'(N,_一行分の文字ならび),!. 一行分の文字ならび(N,H,_一行分の文字ならび) :- '最初と最後の行以外は、行の先頭と最後が+,それ以外は@'(N,H,_一行分の文字ならび). '最初と最後の行は行全体が+'(1,_,_一行分の文字ならび) :- all(_一行分の文字ならび,'+'). '最初と最後の行は行全体が+'(H,H,_一行分の文字ならび) :- all(_一行分の文字ならび,'+'). '最初と最後の行以外は、行の先頭と最後が+,それ以外は@'(N,H,_一行分の文字ならび) :- \+(N = H), append(['*'],L2,['*'],_一行分の文字ならび), all(L2,'@'). 描画する(_一行の像) :- writef('%t\n',[_一行の像]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all([]). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([A|L1],L2,L3,[A|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #935 # # W=横の長さ、H=縦の長さ # 2<=W<=1000、2<=H<=1000 # 箱の枠は「+」、箱の中は「@」で出力しなさい # # 入力は以下の形式で標準入力から与えられます # W H # # 例 # --------------------- # 2 2 # ++ # ++ # --------------------- # 10 4 # ++++++++++ # +@@@@@@@@+ # +@@@@@@@@+ # ++++++++++ '# W=横の長さ、H=縦の長さ 2<=W<=1000、2<=H<=1000 箱の枠は「+」、箱の中は「@」で出力しなさい 入力は以下の形式で標準入力から与えられます W H' :- 標準入力からWとHを得る(W,H), split(Line,[' '],[W,H]), 全体像(W,H,_全体像), 全体像を描画する(_全体像). 標準入力からWとHを得る(W,H) :- read_line_to_codes(Codes,[]), 中間の32を一個のの44に置き換える(Codes,Codes2), string_to_atom(Codes2,Atom), read_term_from_atom(Atom,(W,H,[]). 中間の32を一個のカンマに置き換える(Codes,Codes2) :- append(L1,L2,L3,Codes), all(L2,32), \+(member(32,L1)), \+(member(32,L2)), append(L1,[44|L3],Codes2). 全体像(W,H,_全体像) :- findall(L,( between(1,H,_), findall(_,( between(1,W,_)), L)), _全体像), 全体像(_全体像). 全体像(_全体像) :- append([_第一行],_中間行ならび,[_最終行],_全体像), all(_第一行,'+'), all(_最終行,'+'), '内側は先頭要素と最後の要素が+、中間要素は@となる'(_中間行ならび). '内側は先頭要素と最後の要素が+、中間要素は@となる'([]). '内側は先頭要素と最後の要素が+、中間要素は@となる'([L|R]) :- '先頭要素と最後の要素が+、中間要素は@となる'(L), '内側は先頭要素と最後の要素が+、中間要素は@となる'(R). '先頭要素と最後の要素が+、中間要素は@となる'(L) :- append(['+'],L2,['+'],L), all(L2,'@'),!. 全体像を描画する([]). 全体像を描画する([L|R]) :- atom_chars(_行表示,L), writef('%t\n',[_行表示]), 全体像を描画する(R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all([]). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([A|L1],L2,L3,[A|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # このディレクトリの索引 # 出典 :: スレ立てるまでもない質問はここで135代目 #755 # **--* # ***-* # *---* # **-** # **-** # # var a=[ # "**--*", # "***-*", # "*---*", # "**-**", # "**-**", # ]; # ハイフンの位置を取得して連想配列に入れる方法おしえてください # var ithi = [ # [2,3], # [3], # [1,2,3], # [2], # [2], # ] ハイフンの位置を取得して連想配列に入れる方法おしえてください(_文字列,L,LL) :- split(_文字列,['\n'],L), findall(L1,( member(_副文字列,L), findall(_nth0,( sub_abom(_副文字列,_nth0,1,_,'-')), L1)), LL). % 以下のサイトは mecab(文,_文,LL) :- tmpnam(TMPNAM), tell(TMPNAM), writef('%t\n',[_文]), told, mecab(TMPNAM,LL). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,_,_,_,S1,'\t',S3,_,_,_)), LL). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,S1,'\t',S3)), LL). sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y), split(V,[' ',','],U)), X). split(_文字列,_区切り文字ならび,L) :- atom_chars(_文字列,_文字ならび), split_list(_文字ならび,_区切り文字ならび,L). split_list([],_,[]). split_list(L1,_区切り文字ならび,[_文字列|R]) :- split_list_2(_区切り文字ならび,L1,_文字列), split_list(L3,_区切り文字ならび,R),!. split_list(L1,_区切り文字ならび,[_文字列]) :- atom_chars(_文字列,L1). split_list_2(_区切り文字ならび,L,_文字列,L3) :- append(L1,L2,L3,L), member(_区切り文字,_区切り文字ならび), split_list_3(_区切り文字,L1,L2,L3), atom_chars(_文字列,L1),!. split_list_3(_区切り文字,L1,L2,L3) :- all(L2,_区切り文字), \+(append(_,[_区切り文字],L1)), \+(L3 = [_区切り文字|_]),!. tmpnam(TMPNAM) :- 'TMPNAM'(TMPNAM), \+(exist_file(TMPNAM)),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). 'TMPNAM'(TMPNAM) :- '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび), atomic_list_concat(['/tmp/file'|_6要素の文字ならび],TMPNAM). '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび) :- findall(_任意の文字,( between(1,6,_), '英小文字大文字数字から任意の文字'(_任意の文字)), _6要素の文字ならび). '英小文字大文字数字から任意の文字'(_任意の文字) :- _文字コード is random(75) + 48, '文字コード48-122の範囲で記号のコードではない'(_文字コード), char_code(_任意の文字,_文字コード),!. '英小文字大文字数字から任意の文字'(_任意の文字) :- '英小文字大文字数字から任意の文字'(_任意の文字). '文字コード48-122の範囲で記号のコードではない'(_文字コード) :- '文字コード範囲58-64ではない'(_文字コード), '文字コード範囲91-96ではない'(_文字コード). '文字コード範囲58-64ではない'(_文字コード) :- \+((_文字コード>=58,_文字コード=<64)). '文字コード範囲91-96ではない'(_文字コード) :- \+((_文字コード>=91,_文字コード=<96)). sub_atom(A,H,X,T) :- atom(A), sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), sub_atom(A,_,R,0,T). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # # かたやん印刷所では、いまの時代においてもグーテンベルグ印刷にこだわって印刷をしています。 # グーテンベルグ印刷とは、活版(活字を組み合わせて作った版)で印刷する方法です。(Wikipedia) # # かたやん印刷所の所長かたやんは、使った活字を元の場所に戻さないので、 # いつも活字を入れているボックスはぐちゃぐちゃで、 # ほしい活字をすぐに見つけ出すことができません。 # # そこで見かねた印刷所の副所長エミーは、活字を入れているボックスビデオで撮影し、 # 画像解析し、ボックスのどこにどの活字があるかを解析し、 # ほしい文字列の活字がどこにあるか瞬時にみつけだすプログラミングを作ることにしました。 # # 現状の状態のボックスは以下のようになっています。 # # # 6×6のボックスの中から"PRO, PROGRAMMER"という活字を探し出したいです。 # カンマやスペースは1つの活字としてカウントします。 # ですので、今回は文字13個、カンマ1個、スペース1個の合計15個の活字が必要です。 # 一度使った活字は2回使うことはできません。 # # 活字の場所は、(縦番号,横番号)で表すと以下のような順番で活字を取り出すことができます。 # 縦番号は上から下の方向に、横番号は左から右の方向に、1から数えます。 # 1,4 = P # 2,1 = R # 1,6 = O # 5,2 = , # 5,4 = space # 2,2 = P # 3,4 = R # 4,5 = O # 5,1 = G # 4,3 = R # 1,1 = A # 2,5 = M # 6,1 = M # 2,4 = E # 6,6 = R # # # 上記の例では、例えば"P"という文字が2回でてきますが、(1,4)と(2,2)にある"P"はどちらを先につかってもかまいません。 # また場所の特定は1つのみ記述すればよいです。すべての場所番号を書く必要はありません。 # # 画像解析したボックスのデータはCSVで出力されます。 # ボックスのデータを使ってほしい文字列を作るための活字の在り処を探しだしてください。 # # ■資料 # gutenberg.zip # zipファイルを解凍すると以下のファイルが入っています。 # # gutenberg.csv # このボックスから"STAY HUNGRY, STAY FOOLISH"という活字を取り出してください。 # 文字21個、カンマ1個、スペース3個で、合計25個の活字が必要です。 # # answer.txt # 解答用テキストファイルです。 # # ■解答方法 # 解答用テキストファイル(answer.txt)を完成させ、アップロードしてください。 # ※解答用テキストファイル(answer.txt)以外のファイル形式(zipなど)をアップロードした場合は評価対象外となります。 # '20×20のボックスの生成' :- open('gutenberg.csv',read,Instream), '20×20のボックスの生成'(Instream,_20掛ける20のボックス), close(Instream), assertz('20×20のボックス'(_20掛ける20のボックス)). '20×20のボックスの生成'(Instream,[]) :- at_end_of_stream(Instream),!. '20×20のボックスの生成'(Instream,[L|R]) :- get_line(Instream,Line), split(Line,['\t'],L), '20×20のボックスの生成'(Instream,R). '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス) :- atom_chars(_ある文字列,_文字ならび), '20×20のボックスの中からある文字列を取り出す'(_文字ならび,_20掛ける20のボックス,L), 解の表示(L). '20×20のボックスの中からある文字列を取り出す'([],_20掛ける20のボックス,[]) :- !. '20×20のボックスの中からある文字列を取り出す'([_文字|_残り文字ならび],_20掛ける20のボックス_1,[[_文字,_行目,_列目]|R]) :- ある文字を取り出す(_文字,_20掛ける20のボックス_1,1,_列目,_20掛ける20のボックス_2), '20×20のボックスの中からある文字列を取り出す'(_残り文字ならび,_20掛ける20のボックス_2,R). ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行_2|R_1]) :- nth1(_列目,_行,_文字), 行を更新する(_行,_列目,_行_2),!. ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行|R_2]) :- _行目_2 is _行目 + 1, ある文字を取り出す(_文字,R_1,_行目_2,_列目,R_2). 行を更新する(_行,_列目,_行_2) :- length([_|L1],_列目), append(L1,[_|R],_行), append(L1,[''|R],_行_2),!. 解の表示(L) :- tell('ans.txt'), forall(member([_文字,_行目,_列目],L),writef('%t,%t,%t\n',[_文字,_行目,_列目])), told. get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). split('',_,[],[]) :- !. split(_文字列,_区切り文字列ならび,[_区切り文字列|R3],[_副文字列|R4]) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R3,R4). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), atom_length(_区切り文字列,_長さ), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). :- '20×20のボックスの生成'(_CSVファイル). :- '20×20のボックス'(_20掛ける20のボックス), '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス). % 以下のサイトは # 象は鼻が長い(名詞+「は」+名詞+「が」+形容詞)、を一つ登録しておけば・・・ # # 彼は目が大きい # 中国は人口が多い # 俺は成績が悪い # 新幹線は速度が速い # 我が家は金が無い # 東大は試験が難しい # ダチョウは足が長い # 熊は腕力が強い # 彼女は髪が短い # ロシアは国土が広い # ソニーは経営が悪い # 零戦は航続距離が長い # 松屋は牛飯が旨い # 原発はコストが高い # 高速道路は危険が多い # 国道一号線は渋滞が激しい # スピッツは鳴き声がうるさい # 北朝鮮は食糧事情が厳しい # # ・・・このように、同じ構造の文をいつくもいくつも抽出して、まとめて整理することはできないのだろうか。 # 文候補(彼は目が大きい). 文候補(中国は人口が多い). 文候補(俺は成績が悪い). 文候補(新幹線は速度が速い). 文候補(我が家は金が無い). 文候補(東大は試験が難しい). 文候補(ダチョウは足が長い). 文候補(熊は腕力が強い). 文候補(彼女は髪が短い). 文候補(ロシアは国土が広い). 文候補(ソニーは経営が悪い). 文候補(零戦は航続距離が長い). 文候補(松屋は牛飯が旨い). 文候補(原発はコストが高い). 文候補(高速道路は危険が多い). 文候補(国道一号線は渋滞が激しい). 文候補(スピッツは鳴き声がうるさい). 文候補(北朝鮮は食糧事情が厳しい). % sPLIT/3 '名詞+「は」+名詞+「が」+形容詞 形の定義'(_文) :- sPLIT(_文,[は,が],[_名詞1,は,_名詞2,が,_形容詞]), assertz(名詞([_名詞1|R1],名詞,_名詞1,R1)), assertz(名詞([_名詞2|R2],名詞,_名詞2,R2)), assertz(形容詞([_形容詞1|R3],形容詞,形容詞1,R3)). '文候補から 名詞+「は」+名詞+「が」+形容詞 形構文を定義する' :- 文候補(_文), '名詞+「は」+名詞+「が」+形容詞 形の定義'(_文), fail. '文候補から 名詞+「は」+名詞+「が」+形容詞 形構文を定義する'. '名詞+「は」+名詞+「が」+形容詞'(_文,[[名詞,_名詞1],[後置詞,は],[名詞,_名詞2],[後置詞,が],[形容詞,_形容詞1]],_残りの文) :- 名詞(_文,名詞,_名詞1,_残りの文_1), 後置詞(_残りの文_1,後置詞,は,_残りの文_2), 名詞(_残りの文_2,名詞,_名詞2,_残りの文_3), 後置詞(_残りの文_3,後置詞,が,_残りの文_4), 形容詞(_残りの文_4,形容詞,_形容詞1,_残りの文). 名詞句(_文,[名詞句,[[名詞,_名詞1],[後置詞,_後置詞1]]],_残りの文) :- 名詞(_文,名詞,_名詞1,_残りの文_1), 後置詞(_残りの文_1,後置詞,_後置詞1,_残りの文). 後置詞([は|R],後置詞,は,R). 後置詞([が|R],後置詞,が,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/696 # [1] 授業単元: Cプログラミング # [2] 問題文(含コード&amp;リンク): データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が # 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の # 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 # 探索は二分探索法を使いソートにはクイックソートを使うこと。 # # 表示は以下のようにすること。 # Input A Student Number: 14【Enter】 # Ranking : #269 /*最高得点は1位とせよ.*/ # Subject A : 86 # Subject B : 59.1 # Subject C : 220.42 # Total : 365.52 # # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/697 # 【備考】 # 科目 A の得点は int 型,科目 B,C の得点は double 型で扱うこと. # 合計点が同じになる学生はいないということは既知とせよ. # データの人数は 1000 人であることもわかっているとせよ. # 学籍番号には抜けがある.学籍番号が存在しない場合は,”No data”と表示するようにせよ. # 雛型 (121.c) を用いよ.main 関数は完成しているので,main 関数内で呼び出している関数を作成せよ. # 'データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 探索は二分探索法を使いソートにはクイックソートを使うこと。' :- 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび), 合計得点の順位表を作る(_学生成績ならび,_合計得点の順位表), キーボードから入力された学籍番号の(_学籍番号), 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績), '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績). 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび) :- get_lines('rep_data.txt',Lines), findall(L,( member(_行,Lines), split(_行,[','],L)), _学生成績ならび). 合計得点の順位表を作る(_学生成績ならび,_合計得点の重複要素を許す降順ならび) :- findall(_合計,( member([_,A,B,C],_学生成績ならび), _合計 is A + B + C), _合計得点ならび), 重複要素を許す降順整列(_合計得点ならび,_合計得点の重複要素を許す降順ならび). キーボードから入力された学籍番号の(_学籍番号) :- 整数を得る(学籍番号,_学籍番号 >= 0,_学籍番号). キーボードから入力された学籍番号の(_学籍番号) :- キーボードから入力された学籍番号の(_学籍番号). 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績) :- length(Lines,_最大要素位置), 二分探索法を使い学生の成績を得る(1,_最大要素位置,_最大要素位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_要素位置,_要素位置,Lines,_学籍番号,_学生の成績) :- !, nth1(_要素位置,Lines,[_学籍番号|_学生の成績]). 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- succ(_要素位置_1,1,_要素位置_2),!, 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績), 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- _検索位置 is (_要素位置_1 + _要素位置_2) // 2, nth1(_検索位置,Lines,[_学籍番号_1|_学生の成績_1]), 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_学生の成績_1,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績,_学籍番号,_学生の成績) :- !. 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @< _学籍番号, 二分探索法を使い学生の成績を得る(_要素位置_1,_検索位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @> _学籍番号, 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_2,Lines,_学籍番号,_学生の成績). 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_1,Lines,[_学籍番号|_学生の成績]),!. 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_2,Lines,[_学籍番号|_学生の成績]). 重複要素を許す降順整列([],[]). 重複要素を許す降順整列([_軸要素|_残りならび],_合計得点の重複要素を許す降順ならび) :- 重複要素を許す降順分割(_軸要素,_残りならび,_軸要素と等しいか大きいならび,_軸要素より小さいならび), 重複要素を許す降順整列(_軸要素と等しいか大きいならび,_合計得点の重複要素を許す降順ならび_1), 重複要素を許す降順整列(_軸要素より小さいならび,_合計得点の重複要素を許す降順ならび_2), append(_合計得点の重複要素を許す降順ならび_1,[_軸要素|_合計得点の重複要素を許す降順ならび_2],_合計得点の重複要素を許す降順ならび). 重複要素を許す降順分割(_,[],[],[]) :- !. 重複要素を許す降順分割(_軸要素,[A|R],[A|R2],R3) :- A @>= _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). 重複要素を許す降順分割(_軸要素,[A|R],R2,[A|R3]) :- A @< _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績) :- _学生の成績 = [_科目Aの得点,_科目Bの得点,_科目Cの得点], _学生の合計得点 = _科目Aの得点+_科目Bの得点+_科目Cの得点, nth1(_順位,_合計得点の重複を許す降順ならび,_学生の合計得点), writef('学籍番号 :: %t\n順位 :: #%t\n,科目%t :: %t\n科目%t :: %t\n科目%t :: %t\n',[_学籍番号,_順位,'A',_科目Aの得点,'B',_科目Bの得点,'C',_科目Cの得点]). get_lines(Lines) :- get_lines(user_input,Lines). get_lines(Stream,Lines) :- findall(Line,( get_line(Stream,Line), ( Line=end_of_file,!,fail; true)), Lines). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/14 # ●Regular Expressionの使用環境 # Perl # # ●検索か置換か? # 検索 # # ●説明 # ミドルネームを含む名前も、ミドルネームを含まない名前も分解して抽出したい # また、名前の区切りはスペースやドットなど色々なものに対応したい # # ●対象データ # Edward Snowden # Edward.Joseph.Snowden # エドワード・スノーデン # エドワード=ジョセフ=スノーデン # # ●希望する結果 # (値を入れているわけではなく、$1〜$3に入っていて欲しいものです) # $1 = "Edward"   $2 = ""   $3 = "Snowden" # $1 = "Edward"   $2 = "Joseph"   $3 = "Snowden" # $1 = "エドワード"   $2 = ""   $3 = "スノーデン" # $1 = "エドワード"   $2 = "ジョセフ"   $3 = "スノーデン" # # 'ミドルネームを含む名前も、ミドルネームを含まない名前も分解して抽出したい また、名前の区切りはスペースやドットなど色々なものに対応したい'(_名前,_ファーストネーム,_ミドルネーム,_ラストネーム) :- split(_名前,[' ','.','=','・','='],L), 名前の分解(L,_ファーストネーム,_ミドルネーム,_ラストネーム),!. 名前の分解([_ファーストネーム,_ラストネーム],_ファーストネーム,'',_ラストネーム) :- !. 名前の分解([_ファーストネーム,_ミドルネーム,_ラストネーム],_ファーストネーム,_ミドルネーム,_ラストネーム). split(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 区切り文字で区切って行く(_文字列,_区切り文字列ならび,_区切られた文字列ならび). split(_文字列,_,[_文字列]). 区切り文字で区切って行く(_文字列,_区切り文字列ならび,[_前文字列|R]) :- 区切り文字で(_区切り文字列ならび,_区切り文字列), 区切って行く(_文字列,_区切り文字ならび,_前文字列,_区切り文字列,_後文字列,R). 区切り文字で(_区切り文字列ならび,_区切り文字列) :- member(_区切り文字列,_区切り文字列ならび). 区切って行く(_文字列,_区切り文字ならび,_前文字列,_区切り文字列,_後文字列,R) :- sub_atom(_文字列,_前文字列,_区切り文字列,_後文字列), split(_後文字列,_区切り文字列ならび,R). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # wshのjscriptで # abc123def456 # これのcと1の間とfと4の間だけに一致させる方法ないですかね? # "abc123def456".splitに投げたら["abc", "123def", "456"]が返ってくるのが理想です 'wshのjscriptで abc123def456 これのcと1の間とfと4の間だけに一致させる方法ないですかね? "abc123def456".splitに投げたら["abc", "123def", "456"]が返ってくるのが理想です'(_文字列,_区切られた文字列ならび) :- '文字列の_文字1と_文字2の間と_文字3と_文字4の間だけに一致させる方法ないですかね?'('abc123def456',c,'1',f,'4',_区切りられた文字列ならび). '文字列の_文字1と_文字2の間と_文字3と_文字4の間だけに一致させる方法ないですかね?'(_文字列,_文字1,_文字2,_文字3,_文字4,_区切られた文字列ならび) :- sub_atom(_文字列,_,_対象とする副文字列,_), findall(_区切り候補,( 対象とする副文字列_文字1と_文字2の間と_文字3と_文字4の間だけに一致させる(_対象とする副文字列,_区切り候補)), _区切り候補ならび), sPLIT(_文字列,_区切り候補ならび,_区切られた文字列ならび). 対象とする副文字列の_文字1と_文字2の間と_文字3と_文字4の間だけに一致させる(_対象とする副文字列,_文字1,_文字2,_文字3,_文字4,_区切り候補) :- 先頭文字と末尾文字の間の文字列(_対象とする副文字列,_文字1,_文字2,_区切り候補). 対象とする副文字列の_文字1と_文字2の間と_文字3と_文字4の間だけに一致させる(_対象とする副文字列,_文字1,_文字2,_文字3,_文字4,_区切り候補) :- 先頭文字と末尾文字の間の文字列(_対象とする副文字列,_文字3,_文字4,_区切り候補). 先頭文字と末尾文字の間の文字列(_対象とする副文字列,_先頭文字,_末尾文字,_先頭文字と末尾文字の間の文字列) :- sub_atom(_対象とする副文字列,0,1,_,_先頭文字), sub_atom(_対象とする副文字列,_,1,0,_末尾文字), sub_atom(_対象とする副文字列,1,_,1,_先頭文字と末尾文字の間の文字列). % 以下のサイトは # # ●Regular Expressionの使用環境 # Visual C# # # ●検索か置換か? # 検索 # # ●説明 # 同じ文字が5回以上繰り返されている箇所のある行を検索したい # # ●対象データ→結果 # うわあああああい → マッチ # aaaaaaaa      → マッチ # あいあいあい   → マッチせず # 同じ文字が5回以上繰り返されている箇所のある行を検索したい(_文字列,_行) :- split(_文字列,['\n'],_行ならび), 同じ文字が5回以上繰り返されている箇所のある行ならびを検索する(_行ならび,_行). 同じ文字が5回以上繰り返されている箇所のある行ならびを検索する(_行ならび,_行) :- nth1(_,_行ならび,_行), 同じ文字が5回以上繰り返されている箇所のある行(_行). 同じ文字が5回以上繰り返されている箇所のある行(_文字列) :- sub_atom(_文字列,_,5,_,_適合文字列), atom_chars(_適合文字列,[A,A,A,A,A]),!. % 以下のサイトは # # お題:テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示するプログラム # 'テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示する'(_テキストファイル) :- テキストファイルを読み込み(_テキストファイル,_文), 'その中で最もよく使われている単語ベスト3を表示する'(_文). テキストファイルを読み込み(_テキストファイル,_文) :- get_lines(_テキストファイル,_行ならび), atomic_list_concat(_行ならび,_文). 'その中で最もよく使われている単語ベスト3を表示する'(_文) :- 形態素解析(文,_文,_形態素ならび), 最もよく使われている単語ベスト3を(_形態素ならび,_最もよく使われている単語ベスト3), 表示する(_最もよく使われている単語ベスト3). その中で最もよく使われている単語ベスト3を(_形態素ならび,[_単語1,_単語2,_単語3]) :- setof(A,member(A,_形態素ならび),_単語ならぴ), findall([_度数,_単語],( member(_単語,_単語ならび), count(_単語,_形態素ならび,_度数)), LL), sort(LL,_整列したLL), append(_,[[_,_単語3],[_,_単語2],[_,_単語1]],_整列したLL). 表示する([_単語1,_単語2,_単語3]) :- writef('%t %t %t\n',[_単語1,_単語2,_単語3]). count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum_list(_値ならび,_合計値),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 形態素解析サーバー(mecab). 形態素解析([],[]) :-!. 形態素解析([['EOS'|_]|_],[]) :-!. 形態素解析([[A|_],[@,B|_]|R],[R1_1|R3]) :- 形態素解析_2(R,R1,R2), 形態素解析_2_重複削除([A,B|R1],[],R1_1), 形態素解析(R2,R3),!. 形態素解析([[A|_]|R],[B|R2]) :- 形態素解析サーバー(mecab), make_list(A,['\t'],AL), AL = [B|_], 形態素解析(R,R2),!. 形態素解析([[A|_]|R],[A|R2]) :- 形態素解析サーバー(juman), 形態素解析(R,R2),!. 形態素解析_2([],[],[]) :- !. 形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :- \+(A = (@)),!. 形態素解析_2([[@,A|_]|R],[A|R2],R3) :- 形態素解析_2(R,R2,R3),!. 形態素解析_2_重複削除([],L1,L) :- reverse(L1,L),!. 形態素解析_2_重複削除([A|R],Y,X) :- member(A,Y), 形態素解析_2_重複削除(R,Y,X),!. 形態素解析_2_重複削除([A|R],Y,X) :- \+(member(A,Y)), 形態素解析_2_重複削除(R,[A|Y],X). 形態素解析(ファイル,_テキストファイル,L) :- 形態素解析サーバー(_形態素解析サーバー), concat(['cat ',_テキストファイル,' | ',_形態素解析サーバー],S), sh(S,L1), 形態素解析(L1,L2), 形態素解析_3(L2,L). 形態素解析(文,S,L) :- tmpnam(_仮のファイル), tell(_仮のファイル), wr('%t',[S]), told, 形態素解析(ファイル,_仮のファイル,L) . 形態素解析_3([],[]). 形態素解析_3([A|R],[A|R2]) :- \+(list(A)), 形態素解析_3(R,R2) . 形態素解析_3([A|R],[B|R2]) :- list(A), member(B,A), 形態素解析_3(R,R2). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y) , split(V,[' ',','],U)), X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). tmpnam(TMPNAM) :- 乱数からTMPNAMを得る(TMPNAM),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). 乱数からTMPNAMを得る(TMPNAM) :- アルファベットに変換([_1,_2,_3,_4,_5,_6]), atomic_list_concat(['/tmp/file'|[_1,_2,_3,_4,_5,_6]],TMPNAM), \+(exists_file(TMPNAM)). アルファベットに変換([]). アルファベットに変換([A|R]) :- C is random(62), アルファベットに変換の二(C,A), アルファベットに変換(R). アルファベットに変換の二(N,A) :- '基数62のコード・アルファベットコード変換表'(S,E,B), between(S,E,N), C is N - S + B, char_code(A,C). '基数62のコード・アルファベットコード変換表'(0,9,48). '基数62のコード・アルファベットコード変換表'(10,35,65). '基数62のコード・アルファベットコード変換表'(36,60,97). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/676 # # 【 課題 】カンマ区切られているtest.txtのx列のみを取り出し移動平均で値を出しなさい。平均をとる範囲は10とする。 # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】提出期限なし # 【 Ver  】java version "1.7.0_21" # 【 補足 】txtははこちらです。よろしくお願いします。 # www.dotup.org/uploda/www.dotup.org4425870.txt.html # # 'カンマ区切られているtest.txtのx列のみを取り出し移動平均で値を出しなさい。平均をとる範囲は10とする。'(_x列,_x列の移動平均ならび) :- 'カンマ区切られているtest.txtのx列のみを取り出し'(_x列,_x列ならび), '移動平均で値を出しなさい。平均をとる範囲は10とする。'(_x列ならび,_x列の移動平均ならび). 'カンマ区切られているtest.txtのx列のみを取り出し'(_x列,_x列ならび) :- get_split_lines('test.txt',[','],LL), findall(S,( member(L,LL), nth1(_x列,L,S)), _x列ならび). '移動平均で値を出しなさい。平均をとる範囲は10とする。'(_x列ならび,_x列の移動平均ならび) :- findall(_単純移動平均,( 単純移動平均(_x列ならび,10,_単純移動平均)), _x列の移動平均ならび). 単純移動平均(_データならび,_サンプル数,_単純移動平均) :- length(L1,_サンプル数), append(L0,L1,_データならび), 相加平均(L1,_単純移動平均). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/772 # # 今朝急に友人から依頼されたのですが、javaしか経験したことがなく、C++なんて今まで触れたことすらないのでどなたかお助け下さい。 # 一応ウィンドウ画面については作れたのですが・・・。 # # [1] 授業単元: 課題 # [2] 問題文: # 1:数値a,b を入力し,a+b,a−b,a*b,a/b を計算するプログラムを作成して # ください。 #   注:数値は小数点以下を含むものとし,変数の型宣言をDouble としてください。 # # :- op(450,xfy,'+'). :- op(450,xfy,'−'). :- op(450,xfy,'*'). :- op(450,xfy,'/'). '数値a,b を入力し,a+b,a−b,a*b,a/b を計算するプログラムを作成してください。 注:数値は小数点以下を含むものとし,変数の型宣言をDouble としてください。' :- '数値a,b を入力し'(_数値a,_数値b), 'a+b,a−b,a*b,a/b を計算する'(_数値a,_数値b). '数値a,b を入力し'(_数値a,_数値b) :- 数を入力する(数値a,_数値a), 数を入力する(数値b,_数値b). 'a+b,a−b,a*b,a/b を計算する'(_数値a,_数値b) :- 'a+b,a−b,a*b,a/bの計算式を得る'(_数値a,_数値b,R,_式文字列), 計算して表示する(_式文字列,_数値a,_数値b), R = []. 'a+b,a−b,a*b,a/bの計算式を得る'(_数値a,_数値b,R,_式文字列) :- split('a+b,a−b,a*b,a/b',[,],L), append(_,[_式文字列|R],L). 計算して表示する(_式文字列,_数値a,_数値b) :- atom_to_term(_式文字列,_式,_), 計算する(_式,_数値a,_数値b,_計算結果), 表示する(_式文字列,_計算結果). 計算する(_ + _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a + _数値b. 計算する(_ − _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a - _数値b. 計算する(_ * _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a * _数値b. 計算する(_ / _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a / _数値b. 表示する(_式文字列,_計算結果) :- writef('%t = %t\n',[_式文字列,_計算結果]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/767 # # どなたか助けてください。困ってます。 # [1] 授業単元: 課題 # [2] 問題文: テキストファイル test.txtを呼び出し、平滑化したデータを # 違うファイルtest1.txtに出力しなさい。 # 'テキストファイル test.txtを呼び出し、平滑化したデータを違うファイルtest1.txtに出力しなさい。' :- 'テキストファイル test.txtを呼び出し、平滑化したデータを'(_平滑化したデータならび), '違うファイルtest1.txtに出力しなさい。'(_平滑化したデータならび). 'テキストファイル test.txtを呼び出し、平滑化したデータを'(_平滑化したデータならび) :- 'テキストファイル test.txtを呼び出し、'(_データならび), 平滑化したデータを'(_データならび,_平滑化したデータならび). 'テキストファイル test.txtを呼び出し、'(_データならび) :- get_chars('test.txt',Chars), atom_chars(Atom,Chars), split(Atom,[' ','\n','\t'],_データならび). 平滑化したデータを(_データならび,_平滑化したデータならび). 'テキストファイル test.txtを呼び出し、'(_データならび) :- get_chars('test.txt',Chars), atom_chars(Atom,Chars), split(Atom,[' ','\n','\t'],_データならび). 平滑化したデータを(_データならび,_平滑化したデータならび) :- 単純移動平均(_データならび,_平滑化したデータならび). 単純移動平均(_データならび,_平滑化したデータならび) :- length(L2,25), findall(_相加平均,( append(L1,L2,L3,_データならび), 相加平均(L2,_相加平均)), _平滑化したデータならび). '違うファイルtest1.txtに出力しなさい。'(_平滑化したデータならび) :- open('test1.txt',write,Outstream), '違うファイルtest1.txtに出力しなさい。'(Outstream,_平滑化したデータならび), close(Outstream). '違うファイルtest1.txtに出力しなさい。'(Outstream,[]). '違うファイルtest1.txtに出力しなさい。'(Outstream,[V|R]) :- writef('%t ',[V]), '違うファイルtest1.txtに出力しなさい。'(Outstream,R). % 以下のサイトは ある文字数以上の単語をすべて抽出する(_ある文字数以上の単語ならび) :- 形態素解析(_文字列,_形態素ならび), findall(_ある文字数以上の単語,( member(_ある文字数以上の単語,_形態素ならび), atom_length(_ある文字数以上の単語,_文字数), _文字数 >= _ある文字数), _ある文字数以上の単語ならび). 形態素解析(S,L) :- tmpnam(F), tell(F), writef('%t',[S]), told, 形態素解析サーバによる形態素解析(ファイル,F,L) . 形態素解析サーバによる形態素解析(_ファイル名,_形態素ならび) :- 形態素解析サーバー(_形態素解析サーバー), atomic_list_concat(['cat ',_ファイル名,' | ',_形態素解析サーバー],S), sh(S,L1), 形態素解析(L1,L2), 形態素解析_3(L2,L). 形態素解析_1([],[]) :- !. 形態素解析_1([['EOS'|_]|_],[]) :- !. 形態素解析_1([[A|_],[@,B|_]|R],[R1_1|R3]) :- 形態素解析_2(R,R1,R2), 形態素解析_2_重複削除([A,B|R1],[],R1_1), 形態素解析_1(R2,R3),!. 形態素解析_1([[A|_]|R],[B|R2]) :- mecabサーバーによる形態素解析(A,B,R,R2),!. 形態素解析_1([[A|_]|R],[A|R2]) :- jumanサーバーによる形態素解析(A,B,R,R2). mecabサーバーによる形態素解析(A,B,R,R2) :- 形態素解析サーバー(mecab), split(A,['\t'],AL), AL = [B|_], 形態素解析_1(R,R2),!. jumanサーバーによる形態素解析(A,B,R,R2) :- 形態素解析サーバー(juman), 形態素解析_1(R,R2),!. 形態素解析_2([],[],[]) :- !. 形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :- \+(A = (@)),!. 形態素解析_2([[@,A|_]|R],[A|R2],R3) :- 形態素解析_2(R,R2,R3),!. 形態素解析_3([],[]). 形態素解析_3([A|R],[A|R2]) :- \+(list(A)), '形態素解析_3(R,R2) . 形態素解析_3([A|R],[B|R2]) :- list(A), member(B,A), 形態素解析_3(R,R2) . 形態素解析_2_重複削除([],L1,L) :- reverse(L1,L),!. 形態素解析_2_重複削除([A|R],Y,X) :- member(A,Y), 形態素解析_2_重複削除(R,Y,X),!. 形態素解析_2_重複削除([A|R],Y,X) :- \+(member(A,Y)), 形態素解析_2_重複削除(R,[A|Y],X) . sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y), split(V,[' ',','],U)), X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/13 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # 1桁の整数10個をスペース区切りで入力すると,隣り合う2つの整数の和の1の位を表示していき # 1個になるまで繰り返すプログラムを作成せよ. # 【入力例】 # 7 5 6 5 4 5 7 1 3 2 # 【出力例】 # 2 1 1 9 9 2 8 4 5 # 3 2 0 8 1 0 2 9 # 5 2 8 9 1 2 1 # 7 0 7 0 3 3 # 7 7 7 3 6 # 4 4 0 9 # 8 4 9 # 2 3 # 5 # # '1桁の整数10個をスペース区切りで入力すると,隣り合う2つの整数の和の1の位を表示していき1個になるまで繰り返すプログラムを作成せよ.' :- '1桁の整数10個をスペース区切りで入力すると,'(L), '隣り合う2つの整数の和の1の位を表示していき1個になるまで繰り返す'(L),!. '1桁の整数10個をスペース区切りで入力すると,'(L) :- write('1桁の整数10個をスペース区切りで入力しなさい : '), get_split_line([' '],L). get_split_line(_区切りパターン,L) :- get_line(Line), split(Line,_区切りパターン,L). '隣り合う2つの整数の和の1の位を表示していき1個になるまで繰り返す'([_]). '隣り合う2つの整数の和の1の位を表示していき1個になるまで繰り返す'(L) :- '隣り合う2つの整数の和の1の位を表示していき'(L,L1), '隣り合う2つの整数の和の1の位を表示していき1個になるまで繰り返す'(L1). '隣り合う2つの整数の和の1の位を表示していき'([N1,N2],[N3]) :- N3 is (N1 + N2) mod 10, writef('%t\n',[N3]). '隣り合う2つの整数の和の1の位を表示していき'([N1,N2|R1],[N3|R2]) :- N3 is (N1 + N2) mod 10, writef('%t ',[N3]), '隣り合う2つの整数の和の1の位を表示していき'([N2|R1],R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/764 # # 【質問テンプレ】 # ・DBMS名とバージョン # SQLiteバージョン3 # # ・テーブルデータ # ドメインID,ドメイン名 # ------------ # 1,test1.co.jp # 2,test2.co.jp # # ・欲しい結果 # "server1.test1.co.jp"という入力に対し # "test1.co.jp"のドメインIDである1 # # ・説明 # 自分のサイトへのアクセスを行うドメインを管理しています。 # "server1.test1.co.jp"や、"server2.test1.co.jp"等、第4レベルだけが違う同じ業者からのアクセスがあります。 # それらを"test1.co.jp"からのアクセスであると判断し、ドメインIDである1を取得したいのです。 # # 以上、宜しくお願いします。 '・DBMS名とバージョン SQLiteバージョン3 ・テーブルデータ ドメインID,ドメイン名 ------------ 1,test1.co.jp 2,test2.co.jp ・欲しい結果 "server1.test1.co.jp"という入力に対し "test1.co.jp"のドメインIDである1 ・説明 自分のサイトへのアクセスを行うドメインを管理しています。 "server1.test1.co.jp"や、"server2.test1.co.jp"等、第4レベルだけが違う同じ業者からのアクセスがあります。 それらを"test1.co.jp"からのアクセスであると判断し、ドメインIDである1を取得したいのです。'(_URL,_第三レベルドメイン名,_ドメインID) :- 第三ドメイン名を取得する(_URL,_第三レベルドメイン名), ドメインIDを取り出す(_第三レベルドメイン名,_ドメインID). 第三ドメイン名を取得する(_URL,_第三レベルドメイン名) :- split(_URL,['/','ftp://','file:///','http://','mailto://'],[A|_]), '第二・第一レベルドメインを切り捨てる'(A,C), split(C,['.'],L). last(L,_第三レベルドメイン名),!. '第二・第一レベルドメインを切り捨てる'(A,C) :- '第二・第一レベルドメイン'(A), sub_atom(A,St,Len,0,B), sub_atom(A,0,St,Len,C),!. ドメインIDを取り出す(_第三レベルドメイン名,_ドメインID) :- atom_chars(_第三レベルドメイン名,Chars), append(L1,L2,Chars), forall(member(E,L2),数字(E)), atomic_list_concat(L2,_ドメインID),!. 数字(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']). '第二・第一レベルドメイン'(a). '第二・第一レベルドメイン'(ab). '第二・第一レベルドメイン'(abo). '第二・第一レベルドメイン'(abog). '第二・第一レベルドメイン'(aboga). '第二・第一レベルドメイン'(abogad). '第二・第一レベルドメイン'(abogado). '第二・第一レベルドメイン'(ac). '第二・第一レベルドメイン'(ad). '第二・第一レベルドメイン'(adu). '第二・第一レベルドメイン'(adul). '第二・第一レベルドメイン'(adult). '第二・第一レベルドメイン'(ae). '第二・第一レベルドメイン'(aer). '第二・第一レベルドメイン'(aero). '第二・第一レベルドメイン'(af). '第二・第一レベルドメイン'(afr). '第二・第一レベルドメイン'(afri). '第二・第一レベルドメイン'(afric). '第二・第一レベルドメイン'(africa). '第二・第一レベルドメイン'(ag). '第二・第一レベルドメイン'(ai). '第二・第一レベルドメイン'(al). '第二・第一レベルドメイン'(am). '第二・第一レベルドメイン'(ams). '第二・第一レベルドメイン'(amst). '第二・第一レベルドメイン'(amste). '第二・第一レベルドメイン'(amster). '第二・第一レベルドメイン'(amsterd). '第二・第一レベルドメイン'(amsterda). '第二・第一レベルドメイン'(amsterdam). '第二・第一レベルドメイン'(ap). '第二・第一レベルドメイン'(app). '第二・第一レベルドメイン'(as). '第二・第一レベルドメイン'(asi). '第二・第一レベルドメイン'(asia). '第二・第一レベルドメイン'(at). '第二・第一レベルドメイン'(au). '第二・第一レベルドメイン'(auc). '第二・第一レベルドメイン'(auct). '第二・第一レベルドメイン'(aucti). '第二・第一レベルドメイン'(auctio). '第二・第一レベルドメイン'(auction). '第二・第一レベルドメイン'(ax). '第二・第一レベルドメイン'(az). '第二・第一レベルドメイン'(b). '第二・第一レベルドメイン'(ba). '第二・第一レベルドメイン'(bab). '第二・第一レベルドメイン'(baby). '第二・第一レベルドメイン'(ban). '第二・第一レベルドメイン'(bank). '第二・第一レベルドメイン'(bar). '第二・第一レベルドメイン'(barc). '第二・第一レベルドメイン'(barce). '第二・第一レベルドメイン'(barcel). '第二・第一レベルドメイン'(barcelo). '第二・第一レベルドメイン'(barcelon). '第二・第一レベルドメイン'(barcelona). '第二・第一レベルドメイン'(bb). '第二・第一レベルドメイン'(be). '第二・第一レベルドメイン'(bee). '第二・第一レベルドメイン'(beer). '第二・第一レベルドメイン'(ber). '第二・第一レベルドメイン'(berl). '第二・第一レベルドメイン'(berli). '第二・第一レベルドメイン'(berlin). '第二・第一レベルドメイン'(bg). '第二・第一レベルドメイン'(bi). '第二・第一レベルドメイン'(bik). '第二・第一レベルドメイン'(bike). '第二・第一レベルドメイン'(biz). '第二・第一レベルドメイン'(bj). '第二・第一レベルドメイン'(bl). '第二・第一レベルドメイン'(blo). '第二・第一レベルドメイン'(blog). '第二・第一レベルドメイン'(bm). '第二・第一レベルドメイン'(bo). '第二・第一レベルドメイン'(boo). '第二・第一レベルドメイン'(book). '第二・第一レベルドメイン'(booki). '第二・第一レベルドメイン'(bookin). '第二・第一レベルドメイン'(booking). '第二・第一レベルドメイン'(bos). '第二・第一レベルドメイン'(bost). '第二・第一レベルドメイン'(bosto). '第二・第一レベルドメイン'(boston). '第二・第一レベルドメイン'(br). '第二・第一レベルドメイン'(bru). '第二・第一レベルドメイン'(brus). '第二・第一レベルドメイン'(bruss). '第二・第一レベルドメイン'(brusse). '第二・第一レベルドメイン'(brussel). '第二・第一レベルドメイン'(brussels). '第二・第一レベルドメイン'(bs). '第二・第一レベルドメイン'(bu). '第二・第一レベルドメイン'(bud). '第二・第一レベルドメイン'(buda). '第二・第一レベルドメイン'(budap). '第二・第一レベルドメイン'(budape). '第二・第一レベルドメイン'(budapes). '第二・第一レベルドメイン'(budapest). '第二・第一レベルドメイン'(by). '第二・第一レベルドメイン'(bz). '第二・第一レベルドメイン'(c). '第二・第一レベルドメイン'(ca). '第二・第一レベルドメイン'(cap). '第二・第一レベルドメイン'(cape). '第二・第一レベルドメイン'(capet). '第二・第一レベルドメイン'(capeto). '第二・第一レベルドメイン'(capetow). '第二・第一レベルドメイン'(capetown). '第二・第一レベルドメイン'(car). '第二・第一レベルドメイン'(care). '第二・第一レベルドメイン'(caree). '第二・第一レベルドメイン'(career). '第二・第一レベルドメイン'(cas). '第二・第一レベルドメイン'(cash). '第二・第一レベルドメイン'(cat). '第二・第一レベルドメイン'(cc). '第二・第一レベルドメイン'(cd). '第二・第一レベルドメイン'(cf). '第二・第一レベルドメイン'(cg). '第二・第一レベルドメイン'(ch). '第二・第一レベルドメイン'(chr). '第二・第一レベルドメイン'(chri). '第二・第一レベルドメイン'(chris). '第二・第一レベルドメイン'(christ). '第二・第一レベルドメイン'(christm). '第二・第一レベルドメイン'(christma). '第二・第一レベルドメイン'(christmas). '第二・第一レベルドメイン'(ci). '第二・第一レベルドメイン'(cl). '第二・第一レベルドメイン'(cli). '第二・第一レベルドメイン'(clic). '第二・第一レベルドメイン'(click). '第二・第一レベルドメイン'(cm). '第二・第一レベルドメイン'(cn). '第二・第一レベルドメイン'(co). '第二・第一レベルドメイン'('co.'). '第二・第一レベルドメイン'('co.a'). '第二・第一レベルドメイン'('co.ao'). '第二・第一レベルドメイン'('co.at'). '第二・第一レベルドメイン'('co.b'). '第二・第一レベルドメイン'('co.bw'). '第二・第一レベルドメイン'('co.c'). '第二・第一レベルドメイン'('co.ck'). '第二・第一レベルドメイン'('co.cm'). '第二・第一レベルドメイン'('co.cr'). '第二・第一レベルドメイン'('co.f'). '第二・第一レベルドメイン'('co.fk'). '第二・第一レベルドメイン'('co.h'). '第二・第一レベルドメイン'('co.hu'). '第二・第一レベルドメイン'('co.i'). '第二・第一レベルドメイン'('co.id'). '第二・第一レベルドメイン'('co.il'). '第二・第一レベルドメイン'('co.in'). '第二・第一レベルドメイン'('co.ir'). '第二・第一レベルドメイン'('co.j'). '第二・第一レベルドメイン'('co.jp'). '第二・第一レベルドメイン'('co.k'). '第二・第一レベルドメイン'('co.ke'). '第二・第一レベルドメイン'('co.kr'). '第二・第一レベルドメイン'('co.l'). '第二・第一レベルドメイン'('co.ls'). '第二・第一レベルドメイン'('co.m'). '第二・第一レベルドメイン'('co.mz'). '第二・第一レベルドメイン'('co.n'). '第二・第一レベルドメイン'('co.nl'). '第二・第一レベルドメイン'('co.no'). '第二・第一レベルドメイン'('co.nz'). '第二・第一レベルドメイン'('co.r'). '第二・第一レベルドメイン'('co.rs'). '第二・第一レベルドメイン'('co.t'). '第二・第一レベルドメイン'('co.th'). '第二・第一レベルドメイン'('co.tt'). '第二・第一レベルドメイン'('co.tz'). '第二・第一レベルドメイン'('co.u'). '第二・第一レベルドメイン'('co.ug'). '第二・第一レベルドメイン'('co.uk'). '第二・第一レベルドメイン'('co.z'). '第二・第一レベルドメイン'('co.za'). '第二・第一レベルドメイン'('co.zw'). '第二・第一レベルドメイン'(cof). '第二・第一レベルドメイン'(coff). '第二・第一レベルドメイン'(coffe). '第二・第一レベルドメイン'(coffee). '第二・第一レベルドメイン'(com). '第二・第一レベルドメイン'('com.'). '第二・第一レベルドメイン'('com.a'). '第二・第一レベルドメイン'('com.ag'). '第二・第一レベルドメイン'('com.ai'). '第二・第一レベルドメイン'('com.al'). '第二・第一レベルドメイン'('com.an'). '第二・第一レベルドメイン'('com.ar'). '第二・第一レベルドメイン'('com.au'). '第二・第一レベルドメイン'('com.aw'). '第二・第一レベルドメイン'('com.az'). '第二・第一レベルドメイン'('com.b'). '第二・第一レベルドメイン'('com.bd'). '第二・第一レベルドメイン'('com.bh'). '第二・第一レベルドメイン'('com.bn'). '第二・第一レベルドメイン'('com.bo'). '第二・第一レベルドメイン'('com.br'). '第二・第一レベルドメイン'('com.bs'). '第二・第一レベルドメイン'('com.bt'). '第二・第一レベルドメイン'('com.c'). '第二・第一レベルドメイン'('com.cm'). '第二・第一レベルドメイン'('com.cn'). '第二・第一レベルドメイン'('com.co'). '第二・第一レベルドメイン'('com.cy'). '第二・第一レベルドメイン'('com.d'). '第二・第一レベルドメイン'('com.de'). '第二・第一レベルドメイン'('com.dz'). '第二・第一レベルドメイン'('com.e'). '第二・第一レベルドメイン'('com.ec'). '第二・第一レベルドメイン'('com.eg'). '第二・第一レベルドメイン'('com.es'). '第二・第一レベルドメイン'('com.et'). '第二・第一レベルドメイン'('com.f'). '第二・第一レベルドメイン'('com.fj'). '第二・第一レベルドメイン'('com.g'). '第二・第一レベルドメイン'('com.ge'). '第二・第一レベルドメイン'('com.gh'). '第二・第一レベルドメイン'('com.gi'). '第二・第一レベルドメイン'('com.gl'). '第二・第一レベルドメイン'('com.gn'). '第二・第一レベルドメイン'('com.gr'). '第二・第一レベルドメイン'('com.gt'). '第二・第一レベルドメイン'('com.gu'). '第二・第一レベルドメイン'('com.h'). '第二・第一レベルドメイン'('com.hk'). '第二・第一レベルドメイン'('com.hr'). '第二・第一レベルドメイン'('com.j'). '第二・第一レベルドメイン'('com.jm'). '第二・第一レベルドメイン'('com.jo'). '第二・第一レベルドメイン'('com.k'). '第二・第一レベルドメイン'('com.kh'). '第二・第一レベルドメイン'('com.kw'). '第二・第一レベルドメイン'('com.l'). '第二・第一レベルドメイン'('com.lb'). '第二・第一レベルドメイン'('com.lr'). '第二・第一レベルドメイン'('com.lv'). '第二・第一レベルドメイン'('com.ly'). '第二・第一レベルドメイン'('com.m'). '第二・第一レベルドメイン'('com.mg'). '第二・第一レベルドメイン'('com.mk'). '第二・第一レベルドメイン'('com.mo'). '第二・第一レベルドメイン'('com.mt'). '第二・第一レベルドメイン'('com.mx'). '第二・第一レベルドメイン'('com.my'). '第二・第一レベルドメイン'('com.n'). '第二・第一レベルドメイン'('com.na'). '第二・第一レベルドメイン'('com.ng'). '第二・第一レベルドメイン'('com.ni'). '第二・第一レベルドメイン'('com.np'). '第二・第一レベルドメイン'('com.o'). '第二・第一レベルドメイン'('com.om'). '第二・第一レベルドメイン'('com.p'). '第二・第一レベルドメイン'('com.pa'). '第二・第一レベルドメイン'('com.pe'). '第二・第一レベルドメイン'('com.ph'). '第二・第一レベルドメイン'('com.pk'). '第二・第一レベルドメイン'('com.pl'). '第二・第一レベルドメイン'('com.pr'). '第二・第一レベルドメイン'('com.pt'). '第二・第一レベルドメイン'('com.py'). '第二・第一レベルドメイン'('com.q'). '第二・第一レベルドメイン'('com.qa'). '第二・第一レベルドメイン'('com.r'). '第二・第一レベルドメイン'('com.ro'). '第二・第一レベルドメイン'('com.s'). '第二・第一レベルドメイン'('com.sg'). '第二・第一レベルドメイン'('com.sn'). '第二・第一レベルドメイン'('com.sv'). '第二・第一レベルドメイン'('com.sy'). '第二・第一レベルドメイン'('com.t'). '第二・第一レベルドメイン'('com.tn'). '第二・第一レベルドメイン'('com.tr'). '第二・第一レベルドメイン'('com.tw'). '第二・第一レベルドメイン'('com.u'). '第二・第一レベルドメイン'('com.ua'). '第二・第一レベルドメイン'('com.uy'). '第二・第一レベルドメイン'('com.v'). '第二・第一レベルドメイン'('com.ve'). '第二・第一レベルドメイン'('com.vn'). '第二・第一レベルドメイン'(con). '第二・第一レベルドメイン'(cond). '第二・第一レベルドメイン'(condo). '第二・第一レベルドメイン'(condos). '第二・第一レベルドメイン'(cons). '第二・第一レベルドメイン'(consu). '第二・第一レベルドメイン'(consul). '第二・第一レベルドメイン'(consult). '第二・第一レベルドメイン'(consulti). '第二・第一レベルドメイン'(consultin). '第二・第一レベルドメイン'(consulting). '第二・第一レベルドメイン'(coo). '第二・第一レベルドメイン'(coop). '第二・第一レベルドメイン'(cor). '第二・第一レベルドメイン'(cors). '第二・第一レベルドメイン'(corsi). '第二・第一レベルドメイン'(corsic). '第二・第一レベルドメイン'(corsica). '第二・第一レベルドメイン'(cr). '第二・第一レベルドメイン'(cre). '第二・第一レベルドメイン'(cred). '第二・第一レベルドメイン'(credi). '第二・第一レベルドメイン'(credit). '第二・第一レベルドメイン'(cu). '第二・第一レベルドメイン'(cv). '第二・第一レベルドメイン'(cw). '第二・第一レベルドメイン'(cx). '第二・第一レベルドメイン'(cy). '第二・第一レベルドメイン'(cym). '第二・第一レベルドメイン'(cymr). '第二・第一レベルドメイン'(cymru). '第二・第一レベルドメイン'(cz). '第二・第一レベルドメイン'(d). '第二・第一レベルドメイン'(de). '第二・第一レベルドメイン'('de.'). '第二・第一レベルドメイン'('de.c'). '第二・第一レベルドメイン'('de.co'). '第二・第一レベルドメイン'('de.com'). '第二・第一レベルドメイン'(den). '第二・第一レベルドメイン'(dent). '第二・第一レベルドメイン'(denta). '第二・第一レベルドメイン'(dental). '第二・第一レベルドメイン'(dj). '第二・第一レベルドメイン'(dk). '第二・第一レベルドメイン'(dm). '第二・第一レベルドメイン'(do). '第二・第一レベルドメイン'(dow). '第二・第一レベルドメイン'(down). '第二・第一レベルドメイン'(downl). '第二・第一レベルドメイン'(downlo). '第二・第一レベルドメイン'(downloa). '第二・第一レベルドメイン'(download). '第二・第一レベルドメイン'(du). '第二・第一レベルドメイン'(dub). '第二・第一レベルドメイン'(duba). '第二・第一レベルドメイン'(dubai). '第二・第一レベルドメイン'(dz). '第二・第一レベルドメイン'(e). '第二・第一レベルドメイン'(ec). '第二・第一レベルドメイン'(eco). '第二・第一レベルドメイン'(ed). '第二・第一レベルドメイン'(edu). '第二・第一レベルドメイン'(ee). '第二・第一レベルドメイン'(eg). '第二・第一レベルドメイン'(em). '第二・第一レベルドメイン'(ema). '第二・第一レベルドメイン'(emar). '第二・第一レベルドメイン'(emara). '第二・第一レベルドメイン'(emarat). '第二・第一レベルドメイン'(es). '第二・第一レベルドメイン'(eu). '第二・第一レベルドメイン'('eu.'). '第二・第一レベルドメイン'('eu.c'). '第二・第一レベルドメイン'('eu.co'). '第二・第一レベルドメイン'('eu.com'). '第二・第一レベルドメイン'(ev). '第二・第一レベルドメイン'(eve). '第二・第一レベルドメイン'(even). '第二・第一レベルドメイン'(event). '第二・第一レベルドメイン'(events). '第二・第一レベルドメイン'(f). '第二・第一レベルドメイン'(fi). '第二・第一レベルドメイン'(fil). '第二・第一レベルドメイン'(film). '第二・第一レベルドメイン'(fl). '第二・第一レベルドメイン'(fli). '第二・第一レベルドメイン'(flig). '第二・第一レベルドメイン'(fligh). '第二・第一レベルドメイン'(flight). '第二・第一レベルドメイン'(flights). '第二・第一レベルドメイン'(fly). '第二・第一レベルドメイン'(fm). '第二・第一レベルドメイン'(fo). '第二・第一レベルドメイン'(foo). '第二・第一レベルドメイン'(food). '第二・第一レベルドメイン'(foot). '第二・第一レベルドメイン'(footb). '第二・第一レベルドメイン'(footba). '第二・第一レベルドメイン'(footbal). '第二・第一レベルドメイン'(football). '第二・第一レベルドメイン'(for). '第二・第一レベルドメイン'(foru). '第二・第一レベルドメイン'(forum). '第二・第一レベルドメイン'(fr). '第二・第一レベルドメイン'(fre). '第二・第一レベルドメイン'(free). '第二・第一レベルドメイン'(fri). '第二・第一レベルドメイン'(frie). '第二・第一レベルドメイン'(frien). '第二・第一レベルドメイン'(friend). '第二・第一レベルドメイン'(friends). '第二・第一レベルドメイン'(fu). '第二・第一レベルドメイン'(fun). '第二・第一レベルドメイン'(fund). '第二・第一レベルドメイン'(fut). '第二・第一レベルドメイン'(futb). '第二・第一レベルドメイン'(futbo). '第二・第一レベルドメイン'(futbol). '第二・第一レベルドメイン'(g). '第二・第一レベルドメイン'(ga). '第二・第一レベルドメイン'(gam). '第二・第一レベルドメイン'(game). '第二・第一レベルドメイン'(gay). '第二・第一レベルドメイン'(gd). '第二・第一レベルドメイン'(ge). '第二・第一レベルドメイン'(gen). '第二・第一レベルドメイン'(gent). '第二・第一レベルドメイン'(gf). '第二・第一レベルドメイン'(gg). '第二・第一レベルドメイン'(gl). '第二・第一レベルドメイン'(gm). '第二・第一レベルドメイン'(gmb). '第二・第一レベルドメイン'(gmbh). '第二・第一レベルドメイン'(go). '第二・第一レベルドメイン'(gol). '第二・第一レベルドメイン'(gold). '第二・第一レベルドメイン'(gov). '第二・第一レベルドメイン'(gp). '第二・第一レベルドメイン'(gr). '第二・第一レベルドメイン'('gr.'). '第二・第一レベルドメイン'('gr.c'). '第二・第一レベルドメイン'('gr.co'). '第二・第一レベルドメイン'('gr.com'). '第二・第一レベルドメイン'(gs). '第二・第一レベルドメイン'(gt). '第二・第一レベルドメイン'(gy). '第二・第一レベルドメイン'(h). '第二・第一レベルドメイン'(he). '第二・第一レベルドメイン'(hel). '第二・第一レベルドメイン'(hels). '第二・第一レベルドメイン'(helsi). '第二・第一レベルドメイン'(helsin). '第二・第一レベルドメイン'(helsink). '第二・第一レベルドメイン'(helsinki). '第二・第一レベルドメイン'(hi). '第二・第一レベルドメイン'(hiv). '第二・第一レベルドメイン'(hk). '第二・第一レベルドメイン'(hn). '第二・第一レベルドメイン'(ho). '第二・第一レベルドメイン'(hoc). '第二・第一レベルドメイン'(hock). '第二・第一レベルドメイン'(hocke). '第二・第一レベルドメイン'(hockey). '第二・第一レベルドメイン'(hol). '第二・第一レベルドメイン'(holi). '第二・第一レベルドメイン'(holid). '第二・第一レベルドメイン'(holida). '第二・第一レベルドメイン'(holiday). '第二・第一レベルドメイン'(hor). '第二・第一レベルドメイン'(hors). '第二・第一レベルドメイン'(horse). '第二・第一レベルドメイン'(hos). '第二・第一レベルドメイン'(hosp). '第二・第一レベルドメイン'(hospi). '第二・第一レベルドメイン'(hospit). '第二・第一レベルドメイン'(hospita). '第二・第一レベルドメイン'(hospital). '第二・第一レベルドメイン'(hot). '第二・第一レベルドメイン'(hote). '第二・第一レベルドメイン'(hotel). '第二・第一レベルドメイン'(hou). '第二・第一レベルドメイン'(hous). '第二・第一レベルドメイン'(house). '第二・第一レベルドメイン'(hr). '第二・第一レベルドメイン'(ht). '第二・第一レベルドメイン'(hu). '第二・第一レベルドメイン'(i). '第二・第一レベルドメイン'(ie). '第二・第一レベルドメイン'(im). '第二・第一レベルドメイン'(in). '第二・第一レベルドメイン'(inc). '第二・第一レベルドメイン'(inf). '第二・第一レベルドメイン'(info). '第二・第一レベルドメイン'(ins). '第二・第一レベルドメイン'(insu). '第二・第一レベルドメイン'(insur). '第二・第一レベルドメイン'(insure). '第二・第一レベルドメイン'(io). '第二・第一レベルドメイン'(iq). '第二・第一レベルドメイン'(ir). '第二・第一レベルドメイン'(iri). '第二・第一レベルドメイン'(iris). '第二・第一レベルドメイン'(irish). '第二・第一レベルドメイン'(is). '第二・第一レベルドメイン'(isl). '第二・第一レベルドメイン'(isla). '第二・第一レベルドメイン'(islam). '第二・第一レベルドメイン'(ist). '第二・第一レベルドメイン'(ista). '第二・第一レベルドメイン'(istan). '第二・第一レベルドメイン'(istanb). '第二・第一レベルドメイン'(istanbu). '第二・第一レベルドメイン'(istanbul). '第二・第一レベルドメイン'(it). '第二・第一レベルドメイン'(j). '第二・第一レベルドメイン'(je). '第二・第一レベルドメイン'(jo). '第二・第一レベルドメイン'(job). '第二・第一レベルドメイン'(jobs). '第二・第一レベルドメイン'(jp). '第二・第一レベルドメイン'(k). '第二・第一レベルドメイン'(kg). '第二・第一レベルドメイン'(ki). '第二・第一レベルドメイン'(kit). '第二・第一レベルドメイン'(kitc). '第二・第一レベルドメイン'(kitch). '第二・第一レベルドメイン'(kitche). '第二・第一レベルドメイン'(kitchen). '第二・第一レベルドメイン'(kn). '第二・第一レベルドメイン'(ko). '第二・第一レベルドメイン'(koe). '第二・第一レベルドメイン'(koel). '第二・第一レベルドメイン'(koeln). '第二・第一レベルドメイン'(kr). '第二・第一レベルドメイン'(ky). '第二・第一レベルドメイン'(kz). '第二・第一レベルドメイン'(l). '第二・第一レベルドメイン'(la). '第二・第一レベルドメイン'(lat). '第二・第一レベルドメイン'(law). '第二・第一レベルドメイン'(lc). '第二・第一レベルドメイン'(li). '第二・第一レベルドメイン'(lim). '第二・第一レベルドメイン'(limi). '第二・第一レベルドメイン'(limit). '第二・第一レベルドメイン'(limite). '第二・第一レベルドメイン'(limited). '第二・第一レベルドメイン'(lk). '第二・第一レベルドメイン'(lo). '第二・第一レベルドメイン'(lon). '第二・第一レベルドメイン'(lond). '第二・第一レベルドメイン'(londo). '第二・第一レベルドメイン'(london). '第二・第一レベルドメイン'(lot). '第二・第一レベルドメイン'(lott). '第二・第一レベルドメイン'(lotto). '第二・第一レベルドメイン'(lt). '第二・第一レベルドメイン'(lu). '第二・第一レベルドメイン'(lv). '第二・第一レベルドメイン'(ly). '第二・第一レベルドメイン'(m). '第二・第一レベルドメイン'(ma). '第二・第一レベルドメイン'(mc). '第二・第一レベルドメイン'(md). '第二・第一レベルドメイン'(me). '第二・第一レベルドメイン'(med). '第二・第一レベルドメイン'(medi). '第二・第一レベルドメイン'(medic). '第二・第一レベルドメイン'(medica). '第二・第一レベルドメイン'(medical). '第二・第一レベルドメイン'(mel). '第二・第一レベルドメイン'(melb). '第二・第一レベルドメイン'(melbo). '第二・第一レベルドメイン'(melbou). '第二・第一レベルドメイン'(melbour). '第二・第一レベルドメイン'(melbourn). '第二・第一レベルドメイン'(melbourne). '第二・第一レベルドメイン'(men). '第二・第一レベルドメイン'(menu). '第二・第一レベルドメイン'(mg). '第二・第一レベルドメイン'(mi). '第二・第一レベルドメイン'(mia). '第二・第一レベルドメイン'(miam). '第二・第一レベルドメイン'(miami). '第二・第一レベルドメイン'(mk). '第二・第一レベルドメイン'(mn). '第二・第一レベルドメイン'(mo). '第二・第一レベルドメイン'(mob). '第二・第一レベルドメイン'(mobi). '第二・第一レベルドメイン'(mos). '第二・第一レベルドメイン'(mosc). '第二・第一レベルドメイン'(mosco). '第二・第一レベルドメイン'(moscow). '第二・第一レベルドメイン'(mp). '第二・第一レベルドメイン'(ms). '第二・第一レベルドメイン'(mu). '第二・第一レベルドメイン'(mus). '第二・第一レベルドメイン'(musi). '第二・第一レベルドメイン'(music). '第二・第一レベルドメイン'(mv). '第二・第一レベルドメイン'(mw). '第二・第一レベルドメイン'(mx). '第二・第一レベルドメイン'(my). '第二・第一レベルドメイン'(n). '第二・第一レベルドメイン'(na). '第二・第一レベルドメイン'(nam). '第二・第一レベルドメイン'(name). '第二・第一レベルドメイン'(ne). '第二・第一レベルドメイン'(net). '第二・第一レベルドメイン'('net.'). '第二・第一レベルドメイン'('net.a'). '第二・第一レベルドメイン'('net.au'). '第二・第一レベルドメイン'('net.b'). '第二・第一レベルドメイン'('net.bn'). '第二・第一レベルドメイン'('net.br'). '第二・第一レベルドメイン'('net.c'). '第二・第一レベルドメイン'('net.cm'). '第二・第一レベルドメイン'('net.cn'). '第二・第一レベルドメイン'('net.g'). '第二・第一レベルドメイン'('net.gt'). '第二・第一レベルドメイン'('net.h'). '第二・第一レベルドメイン'('net.hk'). '第二・第一レベルドメイン'('net.i'). '第二・第一レベルドメイン'('net.il'). '第二・第一レベルドメイン'('net.m'). '第二・第一レベルドメイン'('net.mx'). '第二・第一レベルドメイン'('net.n'). '第二・第一レベルドメイン'('net.nz'). '第二・第一レベルドメイン'('net.p'). '第二・第一レベルドメイン'('net.ph'). '第二・第一レベルドメイン'('net.u'). '第二・第一レベルドメイン'('net.uk'). '第二・第一レベルドメイン'(new). '第二・第一レベルドメイン'(news). '第二・第一レベルドメイン'(nl). '第二・第一レベルドメイン'(no). '第二・第一レベルドメイン'(nom). '第二・第一レベルドメイン'('nom.'). '第二・第一レベルドメイン'('nom.e'). '第二・第一レベルドメイン'('nom.es'). '第二・第一レベルドメイン'(nr). '第二・第一レベルドメイン'(nu). '第二・第一レベルドメイン'(o). '第二・第一レベルドメイン'(or). '第二・第一レベルドメイン'(org). '第二・第一レベルドメイン'('org.'). '第二・第一レベルドメイン'('org.b'). '第二・第一レベルドメイン'('org.bn'). '第二・第一レベルドメイン'('org.c'). '第二・第一レベルドメイン'('org.cn'). '第二・第一レベルドメイン'('org.e'). '第二・第一レベルドメイン'('org.es'). '第二・第一レベルドメイン'('org.i'). '第二・第一レベルドメイン'('org.il'). '第二・第一レベルドメイン'('org.l'). '第二・第一レベルドメイン'('org.lv'). '第二・第一レベルドメイン'('org.n'). '第二・第一レベルドメイン'('org.nz'). '第二・第一レベルドメイン'('org.p'). '第二・第一レベルドメイン'('org.ph'). '第二・第一レベルドメイン'('org.pl'). '第二・第一レベルドメイン'('org.u'). '第二・第一レベルドメイン'('org.uk'). '第二・第一レベルドメイン'(orga). '第二・第一レベルドメイン'(organ). '第二・第一レベルドメイン'(organi). '第二・第一レベルドメイン'(organic). '第二・第一レベルドメイン'(p). '第二・第一レベルドメイン'(pa). '第二・第一レベルドメイン'(par). '第二・第一レベルドメイン'(pari). '第二・第一レベルドメイン'(paris). '第二・第一レベルドメイン'(pe). '第二・第一レベルドメイン'(ph). '第二・第一レベルドメイン'(pho). '第二・第一レベルドメイン'(phot). '第二・第一レベルドメイン'(photo). '第二・第一レベルドメイン'(pi). '第二・第一レベルドメイン'(pin). '第二・第一レベルドメイン'(pink). '第二・第一レベルドメイン'(piz). '第二・第一レベルドメイン'(pizz). '第二・第一レベルドメイン'(pizza). '第二・第一レベルドメイン'(pk). '第二・第一レベルドメイン'(pl). '第二・第一レベルドメイン'(pm). '第二・第一レベルドメイン'(pn). '第二・第一レベルドメイン'(po). '第二・第一レベルドメイン'(pok). '第二・第一レベルドメイン'(poke). '第二・第一レベルドメイン'(poker). '第二・第一レベルドメイン'(por). '第二・第一レベルドメイン'(porn). '第二・第一レベルドメイン'(pr). '第二・第一レベルドメイン'(pro). '第二・第一レベルドメイン'(ps). '第二・第一レベルドメイン'(pt). '第二・第一レベルドメイン'(pu). '第二・第一レベルドメイン'(pub). '第二・第一レベルドメイン'(pw). '第二・第一レベルドメイン'(q). '第二・第一レベルドメイン'(qa). '第二・第一レベルドメイン'(qu). '第二・第一レベルドメイン'(que). '第二・第一レベルドメイン'(queb). '第二・第一レベルドメイン'(quebe). '第二・第一レベルドメイン'(quebec). '第二・第一レベルドメイン'(r). '第二・第一レベルドメイン'(re). '第二・第一レベルドメイン'(rei). '第二・第一レベルドメイン'(reis). '第二・第一レベルドメイン'(reise). '第二・第一レベルドメイン'(rep). '第二・第一レベルドメイン'(repo). '第二・第一レベルドメイン'(repor). '第二・第一レベルドメイン'(report). '第二・第一レベルドメイン'(res). '第二・第一レベルドメイン'(rest). '第二・第一レベルドメイン'(resta). '第二・第一レベルドメイン'(restau). '第二・第一レベルドメイン'(restaur). '第二・第一レベルドメイン'(restaura). '第二・第一レベルドメイン'(restauran). '第二・第一レベルドメイン'(restaurant). '第二・第一レベルドメイン'(ro). '第二・第一レベルドメイン'(rom). '第二・第一レベルドメイン'(roma). '第二・第一レベルドメイン'(rs). '第二・第一レベルドメイン'(ru). '第二・第一レベルドメイン'(rug). '第二・第一レベルドメイン'(rugb). '第二・第一レベルドメイン'(rugby). '第二・第一レベルドメイン'(ruh). '第二・第一レベルドメイン'(ruhr). '第二・第一レベルドメイン'(rw). '第二・第一レベルドメイン'(s). '第二・第一レベルドメイン'(sa). '第二・第一レベルドメイン'(sc). '第二・第一レベルドメイン'(sco). '第二・第一レベルドメイン'(scot). '第二・第一レベルドメイン'(sd). '第二・第一レベルドメイン'(se). '第二・第一レベルドメイン'(sec). '第二・第一レベルドメイン'(secu). '第二・第一レベルドメイン'(secur). '第二・第一レベルドメイン'(secure). '第二・第一レベルドメイン'(sg). '第二・第一レベルドメイン'(sh). '第二・第一レベルドメイン'(sho). '第二・第一レベルドメイン'(shoe). '第二・第一レベルドメイン'(shoes). '第二・第一レベルドメイン'(shop). '第二・第一レベルドメイン'(si). '第二・第一レベルドメイン'(sk). '第二・第一レベルドメイン'(ska). '第二・第一レベルドメイン'(skat). '第二・第一レベルドメイン'(skate). '第二・第一レベルドメイン'(ski). '第二・第一レベルドメイン'(sl). '第二・第一レベルドメイン'(sm). '第二・第一レベルドメイン'(sn). '第二・第一レベルドメイン'(so). '第二・第一レベルドメイン'(sp). '第二・第一レベルドメイン'(spa). '第二・第一レベルドメイン'(spac). '第二・第一レベルドメイン'(space). '第二・第一レベルドメイン'(spo). '第二・第一レベルドメイン'(spor). '第二・第一レベルドメイン'(sport). '第二・第一レベルドメイン'(sr). '第二・第一レベルドメイン'(st). '第二・第一レベルドメイン'(sto). '第二・第一レベルドメイン'(stoc). '第二・第一レベルドメイン'(stock). '第二・第一レベルドメイン'(stockh). '第二・第一レベルドメイン'(stockho). '第二・第一レベルドメイン'(stockhol). '第二・第一レベルドメイン'(stockholm). '第二・第一レベルドメイン'(su). '第二・第一レベルドメイン'(sup). '第二・第一レベルドメイン'(supp). '第二・第一レベルドメイン'(suppo). '第二・第一レベルドメイン'(suppor). '第二・第一レベルドメイン'(support). '第二・第一レベルドメイン'(sur). '第二・第一レベルドメイン'(surf). '第二・第一レベルドメイン'(sv). '第二・第一レベルドメイン'(sx). '第二・第一レベルドメイン'(sy). '第二・第一レベルドメイン'(syd). '第二・第一レベルドメイン'(sydn). '第二・第一レベルドメイン'(sydne). '第二・第一レベルドメイン'(sydney). '第二・第一レベルドメイン'(t). '第二・第一レベルドメイン'(ta). '第二・第一レベルドメイン'(tat). '第二・第一レベルドメイン'(tatt). '第二・第一レベルドメイン'(tatto). '第二・第一レベルドメイン'(tattoo). '第二・第一レベルドメイン'(tc). '第二・第一レベルドメイン'(td). '第二・第一レベルドメイン'(te). '第二・第一レベルドメイン'(tel). '第二・第一レベルドメイン'(ten). '第二・第一レベルドメイン'(tenn). '第二・第一レベルドメイン'(tenni). '第二・第一レベルドメイン'(tennis). '第二・第一レベルドメイン'(tf). '第二・第一レベルドメイン'(tg). '第二・第一レベルドメイン'(th). '第二・第一レベルドメイン'(tha). '第二・第一レベルドメイン'(thai). '第二・第一レベルドメイン'(ti). '第二・第一レベルドメイン'(tir). '第二・第一レベルドメイン'(tiro). '第二・第一レベルドメイン'(tirol). '第二・第一レベルドメイン'(tj). '第二・第一レベルドメイン'(tk). '第二・第一レベルドメイン'(tl). '第二・第一レベルドメイン'(tm). '第二・第一レベルドメイン'(tn). '第二・第一レベルドメイン'(to). '第二・第一レベルドメイン'(tok). '第二・第一レベルドメイン'(toky). '第二・第一レベルドメイン'(tokyo). '第二・第一レベルドメイン'(tr). '第二・第一レベルドメイン'(tra). '第二・第一レベルドメイン'(trai). '第二・第一レベルドメイン'(train). '第二・第一レベルドメイン'(traini). '第二・第一レベルドメイン'(trainin). '第二・第一レベルドメイン'(training). '第二・第一レベルドメイン'(trav). '第二・第一レベルドメイン'(trave). '第二・第一レベルドメイン'(travel). '第二・第一レベルドメイン'(tv). '第二・第一レベルドメイン'(tw). '第二・第一レベルドメイン'(u). '第二・第一レベルドメイン'(ua). '第二・第一レベルドメイン'(ug). '第二・第一レベルドメイン'(uk). '第二・第一レベルドメイン'('uk.'). '第二・第一レベルドメイン'('uk.c'). '第二・第一レベルドメイン'('uk.co'). '第二・第一レベルドメイン'('uk.com'). '第二・第一レベルドメイン'(us). '第二・第一レベルドメイン'('us.'). '第二・第一レベルドメイン'('us.c'). '第二・第一レベルドメイン'('us.co'). '第二・第一レベルドメイン'('us.com'). '第二・第一レベルドメイン'('us.o'). '第二・第一レベルドメイン'('us.or'). '第二・第一レベルドメイン'('us.org'). '第二・第一レベルドメイン'(uy). '第二・第一レベルドメイン'(uz). '第二・第一レベルドメイン'(v). '第二・第一レベルドメイン'(vc). '第二・第一レベルドメイン'(vg). '第二・第一レベルドメイン'(vi). '第二・第一レベルドメイン'(via). '第二・第一レベルドメイン'(viaj). '第二・第一レベルドメイン'(viaje). '第二・第一レベルドメイン'(viajes). '第二・第一レベルドメイン'(vn). '第二・第一レベルドメイン'(vo). '第二・第一レベルドメイン'(voy). '第二・第一レベルドメイン'(voya). '第二・第一レベルドメイン'(voyag). '第二・第一レベルドメイン'(voyage). '第二・第一レベルドメイン'(w). '第二・第一レベルドメイン'(wa). '第二・第一レベルドメイン'(wal). '第二・第一レベルドメイン'(wale). '第二・第一レベルドメイン'(wales). '第二・第一レベルドメイン'(we). '第二・第一レベルドメイン'(web). '第二・第一レベルドメイン'('web.'). '第二・第一レベルドメイン'('web.d'). '第二・第一レベルドメイン'('web.do'). '第二・第一レベルドメイン'(wf). '第二・第一レベルドメイン'(wi). '第二・第一レベルドメイン'(wie). '第二・第一レベルドメイン'(wien). '第二・第一レベルドメイン'(win). '第二・第一レベルドメイン'(wine). '第二・第一レベルドメイン'(ws). '第二・第一レベルドメイン'(x). '第二・第一レベルドメイン'(xx). '第二・第一レベルドメイン'(xxx). '第二・第一レベルドメイン'(y). '第二・第一レベルドメイン'(yt). '第二・第一レベルドメイン'('м'). '第二・第一レベルドメイン'('мо'). '第二・第一レベルドメイン'('мос'). '第二・第一レベルドメイン'('моск'). '第二・第一レベルドメイン'('москв'). '第二・第一レベルドメイン'('москва'). '第二・第一レベルドメイン'('р'). '第二・第一レベルドメイン'('рф'). '第二・第一レベルドメイン'('с'). '第二・第一レベルドメイン'('ср'). '第二・第一レベルドメイン'('срб'). '第二・第一レベルドメイン'('香'). '第二・第一レベルドメイン'('香港'). '第二・第一レベルドメイン'('中'). '第二・第一レベルドメイン'('中国'). % 以下のサイトは タブ区切りのn列のm字目からn字目までを切り出す(_n列,_m字目,_n字目,_文字列,_副文字列) :- nth1_split(_n列,_文字列,['\t'],_副文字列_1), _n_1 is _n - 1, sub_atom(_副文字列_1,_m字目,_n_1,_,_副文字列). タブ区切りのn列を切り出す(_n列,_m字目,_n字目,_文字列,_副文字列) :- nth1_split(_n列,_文字列,['\t'],_副文字列),!. nth1_split(_nth1,_文字列,_区切り文字ならび,_副文字列) :- split(_文字列,_区切り文字ならび,1,_nth1,_区切り文字列,_副文字列,_残り文字列). split('',_,_,_,_,_,_) :- !,fail. split(_文字列,_区切り文字列ならび,_nth1_1,_nth1,_区切り文字列,_副文字列,_残り文字列) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列_1,_副文字列_1,_残り文字列_1), split_1(_区切り文字列ならび,_nth1_1,_区切り文字列_1,_副文字列_1,_残り文字列_1,_nth1,_区切り文字列,_副文字列,_残り文字列). split_1(_区切り文字列ならび,_nth1,_区切り文字列,_副文字列,_残り文字列,_nth1,_区切り文字列,_副文字列,_残り文字列). split_1(_区切り文字列ならび,_nth1_1,_,_,_残り文字列_1,_nth1,_区切り文字列,_副文字列,_残り文字列) :- _nth1_2 is _nth1_1 + 1, split(_残り文字列_1,_区切り文字列ならび,_nth1_2,_nth1,_区切り文字列,_副文字列,_残り文字列). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), sub_atom(_区切り文字列,_,_長さ,_,_区切り文字列), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). % 以下のサイトは nth1_split(_nth1,_文字列,_区切り文字,_副文字列) :- split(_文字列,[_区切り文字],_,L2), nth1(_nth1,L2,_副文字列). split('',_,[],[]) :- !. split(_文字列,_区切り文字列ならび,[_区切り文字列|R3],[_副文字列|R4]) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R3,R4). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), atom_length(_区切り文字列,_長さ), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). % 以下のサイトは split(_文字列,_区切り文字列ならび,[_区切り文字までの文字列|R2]) :- 区切り文字までの文字列を得る(_文字列,_区切り文字列ならび,_区切り文字までの文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R2). split(_文字列,_区切り文字列ならび,[_文字列]) :- 区切り文字までの文字列に区切り文字を含まない(_文字列,_区切り文字列ならび). 区切り文字までの文字列を得る(_文字列,_区切り文字列ならび,_区切り文字までの文字列,_残り文字列) :- 先頭から区切り文字を捕まえる(_文字列,_区切り文字列ならび,_区切り文字列までの文字列,_残り文字列), 区切り文字までの文字列に区切り文字を含まない(_区切り文字までの文字列,_区切り文字列ならび). 先頭から区切り文字を捕まえる(_文字列,_区切り文字列ならび,_区切り文字列までの文字列,_残り文字列) :- sub_atom(_文字列,_発見した位置,_,_残り文字数,_区切り文字列), member(_区切り文字列,_区切り文字列ならび), sub_atom(_文字列,0,_発見した位置,_,_区切り文字列までの文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列). 区切り文字までの文字列に区切り文字を含まない(_区切り文字までの文字列,_区切り文字列ならび) :- member(_区切り文字列,_区切り文字列ならび), sub_atom(_区切り文字までの文字列,_,_,_,_区切り文字列), !, fail. 区切り文字までの文字列に区切り文字を含まない(_,_). % 以下のサイトは # [1] 授業単元:Python # [2] 問題文(含コード&リンク): 課題2 # http://pc12.2ch.net/test/read.cgi/tech/1153585095/789 [1] 授業単元:Python [2] 問題文(含コード&リンク): 下の例参照 与えられた数字のみからなる文字列から各桁の数字に分割し、 隣り合う数字の合計の下一桁の値を並べたものを次の文字列とし、 結果が一桁になるまで繰り返しそれぞれの過程の文字列を出力する。 [3] 環境:特になし [4] 期限: 明日まで [5] その他の制限: 例 # 525123214112431 # 77635535523674 # 4398088075931 # 727886872424 # 99564459666 # 8410894522 # 251873974 # 76950261 # 3545287 # 899705 # 78675 # 5432 # 95 # 4 # # 上から2段目から最後の段までに現れる0から9数字の # 総出現数と各数字毎の出現比率を出力する。 # [3] 環境:特になし # [4] 期限: 明日まで # [5] その他の制限: # # 129個 # 0: 10回 3% # 1: 43回 20% # 2: 8回 2% # ... # 9: 18回 6% # のように出力してください。 対象となる文字列('525123214112431 77635535523674 4398088075931 727886872424 99564459666 8410894522 251873974 76950261 3545287 899705 78675 5432 95 4'). '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を出力する。' :- 対象となる文字列(_対象となる文字列), split(_対象となる文字列,['\n'],_行ならび), '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率), 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率). '上から2段目から最後の段までに現れる0から9数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率) :- '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで), '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数), '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率). '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで) :- _行ならび = [_|_上から2段目から最後の段まで]. '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数) :- atomic_list_concat(_上から2段目から最後の段まで,_文字列), findall(_度数,( member(_数字文字,['0','1','2','3','4','5','6','7','8','9']), count(sub_atom(_文字列,_,1,_,_数字文字),_度数)), _0から9までの数字の出現ならび), sum(_0から9までの数字の出現ならび,_総出現数). '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率) :- findall(_出現比率,( member(_度数,_0から9までの数字の出現数ならび), _出現比率 is _度数 / _総出現数 * 100.0)), _各数字毎の出現比率). 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率) :- write('数: 出現数 出現比率\n'), '数字の出現数・出現比率を一行で出力する'(_0から9までの数字の出現数ならび,_各数字毎の出現比率,N), N = 9. '数字の出現数・出現比率を一行で出力する'(N,_0から9までの数字の出現数ならび,_各数字毎の出現比率,N) :- nth0(N,_0から9までの数字の出現数ならび,_出現数), nth0(N,_各数字毎の出現比率,_出現比率), writef(' %t: %t回 ',[N,_出現数]), format('~1f%\n',[_出現比率]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/591 # # ●正規表現の使用環境 # Perl # # ●検索か置換か? # 検索 # # ●説明 # トップから第三レベルドメインまでをマッチさせたい。 # www.(mydomain.co.jp)※括弧の中 # サブドメインが無い場合も想定されます。 # mydomain.com # www.aaa.mydomain.com # aaa.bbb.mydomain.com # # ●対象データ # www.mydomain.co.jp # mydomain.co.jp # mydomain.com # www.aaa.mydomain.com # aaa.bbb.mydomain.com # # ●希望する結果 # mydomain.co.jp # mydomain.com # # よろしくお願いします。 # # 'トップから第三レベルドメインまでをマッチさせたい。'(_文字列,_第三レベルドメインまでの文字列) :- '第二・第一レベルドメインと第三以上レベルドメイン文字列を得る'(_文字列,_第二第一レベルドメイン,_第三以上レベルドメイン文字列), '第三レベルドメインを切り出す'(_第三以上レベルドメイン文字列,_第三レベルドメイン), atomic_list_concat([_第三レベルドメイン,_第二第一レベルドメイン],_第三レベルドメインまでの文字列]). '第二・第一レベルドメインと第三以上レベルドメイン文字列を得る'(_文字列,_第二第一レベルドメイン,_第三以上レベル文字列) :- '第二・第一レベルドメイン'(_第二第一レベルドメイン), sub_atom(_文字列,S,Len,R,_第二第一レベルドメイン), sub_atom(_文字列,0,S,_,_第三以上レベル文字列). '第三レベルドメインを切り出す'(_第三以上レベルドメイン文字列,_第三レベルドメイン) :- split(_第三以上レベルドメイン文字列,['.'],L), last(L,_第三レベルドメイン),!. '第二・第一レベルドメイン'(a). '第二・第一レベルドメイン'(ab). '第二・第一レベルドメイン'(abo). '第二・第一レベルドメイン'(abog). '第二・第一レベルドメイン'(aboga). '第二・第一レベルドメイン'(abogad). '第二・第一レベルドメイン'(abogado). '第二・第一レベルドメイン'(ac). '第二・第一レベルドメイン'(ad). '第二・第一レベルドメイン'(adu). '第二・第一レベルドメイン'(adul). '第二・第一レベルドメイン'(adult). '第二・第一レベルドメイン'(ae). '第二・第一レベルドメイン'(aer). '第二・第一レベルドメイン'(aero). '第二・第一レベルドメイン'(af). '第二・第一レベルドメイン'(afr). '第二・第一レベルドメイン'(afri). '第二・第一レベルドメイン'(afric). '第二・第一レベルドメイン'(africa). '第二・第一レベルドメイン'(ag). '第二・第一レベルドメイン'(ai). '第二・第一レベルドメイン'(al). '第二・第一レベルドメイン'(am). '第二・第一レベルドメイン'(ams). '第二・第一レベルドメイン'(amst). '第二・第一レベルドメイン'(amste). '第二・第一レベルドメイン'(amster). '第二・第一レベルドメイン'(amsterd). '第二・第一レベルドメイン'(amsterda). '第二・第一レベルドメイン'(amsterdam). '第二・第一レベルドメイン'(ap). '第二・第一レベルドメイン'(app). '第二・第一レベルドメイン'(as). '第二・第一レベルドメイン'(asi). '第二・第一レベルドメイン'(asia). '第二・第一レベルドメイン'(at). '第二・第一レベルドメイン'(au). '第二・第一レベルドメイン'(auc). '第二・第一レベルドメイン'(auct). '第二・第一レベルドメイン'(aucti). '第二・第一レベルドメイン'(auctio). '第二・第一レベルドメイン'(auction). '第二・第一レベルドメイン'(ax). '第二・第一レベルドメイン'(az). '第二・第一レベルドメイン'(b). '第二・第一レベルドメイン'(ba). '第二・第一レベルドメイン'(bab). '第二・第一レベルドメイン'(baby). '第二・第一レベルドメイン'(ban). '第二・第一レベルドメイン'(bank). '第二・第一レベルドメイン'(bar). '第二・第一レベルドメイン'(barc). '第二・第一レベルドメイン'(barce). '第二・第一レベルドメイン'(barcel). '第二・第一レベルドメイン'(barcelo). '第二・第一レベルドメイン'(barcelon). '第二・第一レベルドメイン'(barcelona). '第二・第一レベルドメイン'(bb). '第二・第一レベルドメイン'(be). '第二・第一レベルドメイン'(bee). '第二・第一レベルドメイン'(beer). '第二・第一レベルドメイン'(ber). '第二・第一レベルドメイン'(berl). '第二・第一レベルドメイン'(berli). '第二・第一レベルドメイン'(berlin). '第二・第一レベルドメイン'(bg). '第二・第一レベルドメイン'(bi). '第二・第一レベルドメイン'(bik). '第二・第一レベルドメイン'(bike). '第二・第一レベルドメイン'(biz). '第二・第一レベルドメイン'(bj). '第二・第一レベルドメイン'(bl). '第二・第一レベルドメイン'(blo). '第二・第一レベルドメイン'(blog). '第二・第一レベルドメイン'(bm). '第二・第一レベルドメイン'(bo). '第二・第一レベルドメイン'(boo). '第二・第一レベルドメイン'(book). '第二・第一レベルドメイン'(booki). '第二・第一レベルドメイン'(bookin). '第二・第一レベルドメイン'(booking). '第二・第一レベルドメイン'(bos). '第二・第一レベルドメイン'(bost). '第二・第一レベルドメイン'(bosto). '第二・第一レベルドメイン'(boston). '第二・第一レベルドメイン'(br). '第二・第一レベルドメイン'(bru). '第二・第一レベルドメイン'(brus). '第二・第一レベルドメイン'(bruss). '第二・第一レベルドメイン'(brusse). '第二・第一レベルドメイン'(brussel). '第二・第一レベルドメイン'(brussels). '第二・第一レベルドメイン'(bs). '第二・第一レベルドメイン'(bu). '第二・第一レベルドメイン'(bud). '第二・第一レベルドメイン'(buda). '第二・第一レベルドメイン'(budap). '第二・第一レベルドメイン'(budape). '第二・第一レベルドメイン'(budapes). '第二・第一レベルドメイン'(budapest). '第二・第一レベルドメイン'(by). '第二・第一レベルドメイン'(bz). '第二・第一レベルドメイン'(c). '第二・第一レベルドメイン'(ca). '第二・第一レベルドメイン'(cap). '第二・第一レベルドメイン'(cape). '第二・第一レベルドメイン'(capet). '第二・第一レベルドメイン'(capeto). '第二・第一レベルドメイン'(capetow). '第二・第一レベルドメイン'(capetown). '第二・第一レベルドメイン'(car). '第二・第一レベルドメイン'(care). '第二・第一レベルドメイン'(caree). '第二・第一レベルドメイン'(career). '第二・第一レベルドメイン'(cas). '第二・第一レベルドメイン'(cash). '第二・第一レベルドメイン'(cat). '第二・第一レベルドメイン'(cc). '第二・第一レベルドメイン'(cd). '第二・第一レベルドメイン'(cf). '第二・第一レベルドメイン'(cg). '第二・第一レベルドメイン'(ch). '第二・第一レベルドメイン'(chr). '第二・第一レベルドメイン'(chri). '第二・第一レベルドメイン'(chris). '第二・第一レベルドメイン'(christ). '第二・第一レベルドメイン'(christm). '第二・第一レベルドメイン'(christma). '第二・第一レベルドメイン'(christmas). '第二・第一レベルドメイン'(ci). '第二・第一レベルドメイン'(cl). '第二・第一レベルドメイン'(cli). '第二・第一レベルドメイン'(clic). '第二・第一レベルドメイン'(click). '第二・第一レベルドメイン'(cm). '第二・第一レベルドメイン'(cn). '第二・第一レベルドメイン'(co). '第二・第一レベルドメイン'('co.'). '第二・第一レベルドメイン'('co.a'). '第二・第一レベルドメイン'('co.ao'). '第二・第一レベルドメイン'('co.at'). '第二・第一レベルドメイン'('co.b'). '第二・第一レベルドメイン'('co.bw'). '第二・第一レベルドメイン'('co.c'). '第二・第一レベルドメイン'('co.ck'). '第二・第一レベルドメイン'('co.cm'). '第二・第一レベルドメイン'('co.cr'). '第二・第一レベルドメイン'('co.f'). '第二・第一レベルドメイン'('co.fk'). '第二・第一レベルドメイン'('co.h'). '第二・第一レベルドメイン'('co.hu'). '第二・第一レベルドメイン'('co.i'). '第二・第一レベルドメイン'('co.id'). '第二・第一レベルドメイン'('co.il'). '第二・第一レベルドメイン'('co.in'). '第二・第一レベルドメイン'('co.ir'). '第二・第一レベルドメイン'('co.j'). '第二・第一レベルドメイン'('co.jp'). '第二・第一レベルドメイン'('co.k'). '第二・第一レベルドメイン'('co.ke'). '第二・第一レベルドメイン'('co.kr'). '第二・第一レベルドメイン'('co.l'). '第二・第一レベルドメイン'('co.ls'). '第二・第一レベルドメイン'('co.m'). '第二・第一レベルドメイン'('co.mz'). '第二・第一レベルドメイン'('co.n'). '第二・第一レベルドメイン'('co.nl'). '第二・第一レベルドメイン'('co.no'). '第二・第一レベルドメイン'('co.nz'). '第二・第一レベルドメイン'('co.r'). '第二・第一レベルドメイン'('co.rs'). '第二・第一レベルドメイン'('co.t'). '第二・第一レベルドメイン'('co.th'). '第二・第一レベルドメイン'('co.tt'). '第二・第一レベルドメイン'('co.tz'). '第二・第一レベルドメイン'('co.u'). '第二・第一レベルドメイン'('co.ug'). '第二・第一レベルドメイン'('co.uk'). '第二・第一レベルドメイン'('co.z'). '第二・第一レベルドメイン'('co.za'). '第二・第一レベルドメイン'('co.zw'). '第二・第一レベルドメイン'(cof). '第二・第一レベルドメイン'(coff). '第二・第一レベルドメイン'(coffe). '第二・第一レベルドメイン'(coffee). '第二・第一レベルドメイン'(com). '第二・第一レベルドメイン'('com.'). '第二・第一レベルドメイン'('com.a'). '第二・第一レベルドメイン'('com.ag'). '第二・第一レベルドメイン'('com.ai'). '第二・第一レベルドメイン'('com.al'). '第二・第一レベルドメイン'('com.an'). '第二・第一レベルドメイン'('com.ar'). '第二・第一レベルドメイン'('com.au'). '第二・第一レベルドメイン'('com.aw'). '第二・第一レベルドメイン'('com.az'). '第二・第一レベルドメイン'('com.b'). '第二・第一レベルドメイン'('com.bd'). '第二・第一レベルドメイン'('com.bh'). '第二・第一レベルドメイン'('com.bn'). '第二・第一レベルドメイン'('com.bo'). '第二・第一レベルドメイン'('com.br'). '第二・第一レベルドメイン'('com.bs'). '第二・第一レベルドメイン'('com.bt'). '第二・第一レベルドメイン'('com.c'). '第二・第一レベルドメイン'('com.cm'). '第二・第一レベルドメイン'('com.cn'). '第二・第一レベルドメイン'('com.co'). '第二・第一レベルドメイン'('com.cy'). '第二・第一レベルドメイン'('com.d'). '第二・第一レベルドメイン'('com.de'). '第二・第一レベルドメイン'('com.dz'). '第二・第一レベルドメイン'('com.e'). '第二・第一レベルドメイン'('com.ec'). '第二・第一レベルドメイン'('com.eg'). '第二・第一レベルドメイン'('com.es'). '第二・第一レベルドメイン'('com.et'). '第二・第一レベルドメイン'('com.f'). '第二・第一レベルドメイン'('com.fj'). '第二・第一レベルドメイン'('com.g'). '第二・第一レベルドメイン'('com.ge'). '第二・第一レベルドメイン'('com.gh'). '第二・第一レベルドメイン'('com.gi'). '第二・第一レベルドメイン'('com.gl'). '第二・第一レベルドメイン'('com.gn'). '第二・第一レベルドメイン'('com.gr'). '第二・第一レベルドメイン'('com.gt'). '第二・第一レベルドメイン'('com.gu'). '第二・第一レベルドメイン'('com.h'). '第二・第一レベルドメイン'('com.hk'). '第二・第一レベルドメイン'('com.hr'). '第二・第一レベルドメイン'('com.j'). '第二・第一レベルドメイン'('com.jm'). '第二・第一レベルドメイン'('com.jo'). '第二・第一レベルドメイン'('com.k'). '第二・第一レベルドメイン'('com.kh'). '第二・第一レベルドメイン'('com.kw'). '第二・第一レベルドメイン'('com.l'). '第二・第一レベルドメイン'('com.lb'). '第二・第一レベルドメイン'('com.lr'). '第二・第一レベルドメイン'('com.lv'). '第二・第一レベルドメイン'('com.ly'). '第二・第一レベルドメイン'('com.m'). '第二・第一レベルドメイン'('com.mg'). '第二・第一レベルドメイン'('com.mk'). '第二・第一レベルドメイン'('com.mo'). '第二・第一レベルドメイン'('com.mt'). '第二・第一レベルドメイン'('com.mx'). '第二・第一レベルドメイン'('com.my'). '第二・第一レベルドメイン'('com.n'). '第二・第一レベルドメイン'('com.na'). '第二・第一レベルドメイン'('com.ng'). '第二・第一レベルドメイン'('com.ni'). '第二・第一レベルドメイン'('com.np'). '第二・第一レベルドメイン'('com.o'). '第二・第一レベルドメイン'('com.om'). '第二・第一レベルドメイン'('com.p'). '第二・第一レベルドメイン'('com.pa'). '第二・第一レベルドメイン'('com.pe'). '第二・第一レベルドメイン'('com.ph'). '第二・第一レベルドメイン'('com.pk'). '第二・第一レベルドメイン'('com.pl'). '第二・第一レベルドメイン'('com.pr'). '第二・第一レベルドメイン'('com.pt'). '第二・第一レベルドメイン'('com.py'). '第二・第一レベルドメイン'('com.q'). '第二・第一レベルドメイン'('com.qa'). '第二・第一レベルドメイン'('com.r'). '第二・第一レベルドメイン'('com.ro'). '第二・第一レベルドメイン'('com.s'). '第二・第一レベルドメイン'('com.sg'). '第二・第一レベルドメイン'('com.sn'). '第二・第一レベルドメイン'('com.sv'). '第二・第一レベルドメイン'('com.sy'). '第二・第一レベルドメイン'('com.t'). '第二・第一レベルドメイン'('com.tn'). '第二・第一レベルドメイン'('com.tr'). '第二・第一レベルドメイン'('com.tw'). '第二・第一レベルドメイン'('com.u'). '第二・第一レベルドメイン'('com.ua'). '第二・第一レベルドメイン'('com.uy'). '第二・第一レベルドメイン'('com.v'). '第二・第一レベルドメイン'('com.ve'). '第二・第一レベルドメイン'('com.vn'). '第二・第一レベルドメイン'(con). '第二・第一レベルドメイン'(cond). '第二・第一レベルドメイン'(condo). '第二・第一レベルドメイン'(condos). '第二・第一レベルドメイン'(cons). '第二・第一レベルドメイン'(consu). '第二・第一レベルドメイン'(consul). '第二・第一レベルドメイン'(consult). '第二・第一レベルドメイン'(consulti). '第二・第一レベルドメイン'(consultin). '第二・第一レベルドメイン'(consulting). '第二・第一レベルドメイン'(coo). '第二・第一レベルドメイン'(coop). '第二・第一レベルドメイン'(cor). '第二・第一レベルドメイン'(cors). '第二・第一レベルドメイン'(corsi). '第二・第一レベルドメイン'(corsic). '第二・第一レベルドメイン'(corsica). '第二・第一レベルドメイン'(cr). '第二・第一レベルドメイン'(cre). '第二・第一レベルドメイン'(cred). '第二・第一レベルドメイン'(credi). '第二・第一レベルドメイン'(credit). '第二・第一レベルドメイン'(cu). '第二・第一レベルドメイン'(cv). '第二・第一レベルドメイン'(cw). '第二・第一レベルドメイン'(cx). '第二・第一レベルドメイン'(cy). '第二・第一レベルドメイン'(cym). '第二・第一レベルドメイン'(cymr). '第二・第一レベルドメイン'(cymru). '第二・第一レベルドメイン'(cz). '第二・第一レベルドメイン'(d). '第二・第一レベルドメイン'(de). '第二・第一レベルドメイン'('de.'). '第二・第一レベルドメイン'('de.c'). '第二・第一レベルドメイン'('de.co'). '第二・第一レベルドメイン'('de.com'). '第二・第一レベルドメイン'(den). '第二・第一レベルドメイン'(dent). '第二・第一レベルドメイン'(denta). '第二・第一レベルドメイン'(dental). '第二・第一レベルドメイン'(dj). '第二・第一レベルドメイン'(dk). '第二・第一レベルドメイン'(dm). '第二・第一レベルドメイン'(do). '第二・第一レベルドメイン'(dow). '第二・第一レベルドメイン'(down). '第二・第一レベルドメイン'(downl). '第二・第一レベルドメイン'(downlo). '第二・第一レベルドメイン'(downloa). '第二・第一レベルドメイン'(download). '第二・第一レベルドメイン'(du). '第二・第一レベルドメイン'(dub). '第二・第一レベルドメイン'(duba). '第二・第一レベルドメイン'(dubai). '第二・第一レベルドメイン'(dz). '第二・第一レベルドメイン'(e). '第二・第一レベルドメイン'(ec). '第二・第一レベルドメイン'(eco). '第二・第一レベルドメイン'(ed). '第二・第一レベルドメイン'(edu). '第二・第一レベルドメイン'(ee). '第二・第一レベルドメイン'(eg). '第二・第一レベルドメイン'(em). '第二・第一レベルドメイン'(ema). '第二・第一レベルドメイン'(emar). '第二・第一レベルドメイン'(emara). '第二・第一レベルドメイン'(emarat). '第二・第一レベルドメイン'(es). '第二・第一レベルドメイン'(eu). '第二・第一レベルドメイン'('eu.'). '第二・第一レベルドメイン'('eu.c'). '第二・第一レベルドメイン'('eu.co'). '第二・第一レベルドメイン'('eu.com'). '第二・第一レベルドメイン'(ev). '第二・第一レベルドメイン'(eve). '第二・第一レベルドメイン'(even). '第二・第一レベルドメイン'(event). '第二・第一レベルドメイン'(events). '第二・第一レベルドメイン'(f). '第二・第一レベルドメイン'(fi). '第二・第一レベルドメイン'(fil). '第二・第一レベルドメイン'(film). '第二・第一レベルドメイン'(fl). '第二・第一レベルドメイン'(fli). '第二・第一レベルドメイン'(flig). '第二・第一レベルドメイン'(fligh). '第二・第一レベルドメイン'(flight). '第二・第一レベルドメイン'(flights). '第二・第一レベルドメイン'(fly). '第二・第一レベルドメイン'(fm). '第二・第一レベルドメイン'(fo). '第二・第一レベルドメイン'(foo). '第二・第一レベルドメイン'(food). '第二・第一レベルドメイン'(foot). '第二・第一レベルドメイン'(footb). '第二・第一レベルドメイン'(footba). '第二・第一レベルドメイン'(footbal). '第二・第一レベルドメイン'(football). '第二・第一レベルドメイン'(for). '第二・第一レベルドメイン'(foru). '第二・第一レベルドメイン'(forum). '第二・第一レベルドメイン'(fr). '第二・第一レベルドメイン'(fre). '第二・第一レベルドメイン'(free). '第二・第一レベルドメイン'(fri). '第二・第一レベルドメイン'(frie). '第二・第一レベルドメイン'(frien). '第二・第一レベルドメイン'(friend). '第二・第一レベルドメイン'(friends). '第二・第一レベルドメイン'(fu). '第二・第一レベルドメイン'(fun). '第二・第一レベルドメイン'(fund). '第二・第一レベルドメイン'(fut). '第二・第一レベルドメイン'(futb). '第二・第一レベルドメイン'(futbo). '第二・第一レベルドメイン'(futbol). '第二・第一レベルドメイン'(g). '第二・第一レベルドメイン'(ga). '第二・第一レベルドメイン'(gam). '第二・第一レベルドメイン'(game). '第二・第一レベルドメイン'(gay). '第二・第一レベルドメイン'(gd). '第二・第一レベルドメイン'(ge). '第二・第一レベルドメイン'(gen). '第二・第一レベルドメイン'(gent). '第二・第一レベルドメイン'(gf). '第二・第一レベルドメイン'(gg). '第二・第一レベルドメイン'(gl). '第二・第一レベルドメイン'(gm). '第二・第一レベルドメイン'(gmb). '第二・第一レベルドメイン'(gmbh). '第二・第一レベルドメイン'(go). '第二・第一レベルドメイン'(gol). '第二・第一レベルドメイン'(gold). '第二・第一レベルドメイン'(gov). '第二・第一レベルドメイン'(gp). '第二・第一レベルドメイン'(gr). '第二・第一レベルドメイン'('gr.'). '第二・第一レベルドメイン'('gr.c'). '第二・第一レベルドメイン'('gr.co'). '第二・第一レベルドメイン'('gr.com'). '第二・第一レベルドメイン'(gs). '第二・第一レベルドメイン'(gt). '第二・第一レベルドメイン'(gy). '第二・第一レベルドメイン'(h). '第二・第一レベルドメイン'(he). '第二・第一レベルドメイン'(hel). '第二・第一レベルドメイン'(hels). '第二・第一レベルドメイン'(helsi). '第二・第一レベルドメイン'(helsin). '第二・第一レベルドメイン'(helsink). '第二・第一レベルドメイン'(helsinki). '第二・第一レベルドメイン'(hi). '第二・第一レベルドメイン'(hiv). '第二・第一レベルドメイン'(hk). '第二・第一レベルドメイン'(hn). '第二・第一レベルドメイン'(ho). '第二・第一レベルドメイン'(hoc). '第二・第一レベルドメイン'(hock). '第二・第一レベルドメイン'(hocke). '第二・第一レベルドメイン'(hockey). '第二・第一レベルドメイン'(hol). '第二・第一レベルドメイン'(holi). '第二・第一レベルドメイン'(holid). '第二・第一レベルドメイン'(holida). '第二・第一レベルドメイン'(holiday). '第二・第一レベルドメイン'(hor). '第二・第一レベルドメイン'(hors). '第二・第一レベルドメイン'(horse). '第二・第一レベルドメイン'(hos). '第二・第一レベルドメイン'(hosp). '第二・第一レベルドメイン'(hospi). '第二・第一レベルドメイン'(hospit). '第二・第一レベルドメイン'(hospita). '第二・第一レベルドメイン'(hospital). '第二・第一レベルドメイン'(hot). '第二・第一レベルドメイン'(hote). '第二・第一レベルドメイン'(hotel). '第二・第一レベルドメイン'(hou). '第二・第一レベルドメイン'(hous). '第二・第一レベルドメイン'(house). '第二・第一レベルドメイン'(hr). '第二・第一レベルドメイン'(ht). '第二・第一レベルドメイン'(hu). '第二・第一レベルドメイン'(i). '第二・第一レベルドメイン'(ie). '第二・第一レベルドメイン'(im). '第二・第一レベルドメイン'(in). '第二・第一レベルドメイン'(inc). '第二・第一レベルドメイン'(inf). '第二・第一レベルドメイン'(info). '第二・第一レベルドメイン'(ins). '第二・第一レベルドメイン'(insu). '第二・第一レベルドメイン'(insur). '第二・第一レベルドメイン'(insure). '第二・第一レベルドメイン'(io). '第二・第一レベルドメイン'(iq). '第二・第一レベルドメイン'(ir). '第二・第一レベルドメイン'(iri). '第二・第一レベルドメイン'(iris). '第二・第一レベルドメイン'(irish). '第二・第一レベルドメイン'(is). '第二・第一レベルドメイン'(isl). '第二・第一レベルドメイン'(isla). '第二・第一レベルドメイン'(islam). '第二・第一レベルドメイン'(ist). '第二・第一レベルドメイン'(ista). '第二・第一レベルドメイン'(istan). '第二・第一レベルドメイン'(istanb). '第二・第一レベルドメイン'(istanbu). '第二・第一レベルドメイン'(istanbul). '第二・第一レベルドメイン'(it). '第二・第一レベルドメイン'(j). '第二・第一レベルドメイン'(je). '第二・第一レベルドメイン'(jo). '第二・第一レベルドメイン'(job). '第二・第一レベルドメイン'(jobs). '第二・第一レベルドメイン'(jp). '第二・第一レベルドメイン'(k). '第二・第一レベルドメイン'(kg). '第二・第一レベルドメイン'(ki). '第二・第一レベルドメイン'(kit). '第二・第一レベルドメイン'(kitc). '第二・第一レベルドメイン'(kitch). '第二・第一レベルドメイン'(kitche). '第二・第一レベルドメイン'(kitchen). '第二・第一レベルドメイン'(kn). '第二・第一レベルドメイン'(ko). '第二・第一レベルドメイン'(koe). '第二・第一レベルドメイン'(koel). '第二・第一レベルドメイン'(koeln). '第二・第一レベルドメイン'(kr). '第二・第一レベルドメイン'(ky). '第二・第一レベルドメイン'(kz). '第二・第一レベルドメイン'(l). '第二・第一レベルドメイン'(la). '第二・第一レベルドメイン'(lat). '第二・第一レベルドメイン'(law). '第二・第一レベルドメイン'(lc). '第二・第一レベルドメイン'(li). '第二・第一レベルドメイン'(lim). '第二・第一レベルドメイン'(limi). '第二・第一レベルドメイン'(limit). '第二・第一レベルドメイン'(limite). '第二・第一レベルドメイン'(limited). '第二・第一レベルドメイン'(lk). '第二・第一レベルドメイン'(lo). '第二・第一レベルドメイン'(lon). '第二・第一レベルドメイン'(lond). '第二・第一レベルドメイン'(londo). '第二・第一レベルドメイン'(london). '第二・第一レベルドメイン'(lot). '第二・第一レベルドメイン'(lott). '第二・第一レベルドメイン'(lotto). '第二・第一レベルドメイン'(lt). '第二・第一レベルドメイン'(lu). '第二・第一レベルドメイン'(lv). '第二・第一レベルドメイン'(ly). '第二・第一レベルドメイン'(m). '第二・第一レベルドメイン'(ma). '第二・第一レベルドメイン'(mc). '第二・第一レベルドメイン'(md). '第二・第一レベルドメイン'(me). '第二・第一レベルドメイン'(med). '第二・第一レベルドメイン'(medi). '第二・第一レベルドメイン'(medic). '第二・第一レベルドメイン'(medica). '第二・第一レベルドメイン'(medical). '第二・第一レベルドメイン'(mel). '第二・第一レベルドメイン'(melb). '第二・第一レベルドメイン'(melbo). '第二・第一レベルドメイン'(melbou). '第二・第一レベルドメイン'(melbour). '第二・第一レベルドメイン'(melbourn). '第二・第一レベルドメイン'(melbourne). '第二・第一レベルドメイン'(men). '第二・第一レベルドメイン'(menu). '第二・第一レベルドメイン'(mg). '第二・第一レベルドメイン'(mi). '第二・第一レベルドメイン'(mia). '第二・第一レベルドメイン'(miam). '第二・第一レベルドメイン'(miami). '第二・第一レベルドメイン'(mk). '第二・第一レベルドメイン'(mn). '第二・第一レベルドメイン'(mo). '第二・第一レベルドメイン'(mob). '第二・第一レベルドメイン'(mobi). '第二・第一レベルドメイン'(mos). '第二・第一レベルドメイン'(mosc). '第二・第一レベルドメイン'(mosco). '第二・第一レベルドメイン'(moscow). '第二・第一レベルドメイン'(mp). '第二・第一レベルドメイン'(ms). '第二・第一レベルドメイン'(mu). '第二・第一レベルドメイン'(mus). '第二・第一レベルドメイン'(musi). '第二・第一レベルドメイン'(music). '第二・第一レベルドメイン'(mv). '第二・第一レベルドメイン'(mw). '第二・第一レベルドメイン'(mx). '第二・第一レベルドメイン'(my). '第二・第一レベルドメイン'(n). '第二・第一レベルドメイン'(na). '第二・第一レベルドメイン'(nam). '第二・第一レベルドメイン'(name). '第二・第一レベルドメイン'(ne). '第二・第一レベルドメイン'(net). '第二・第一レベルドメイン'('net.'). '第二・第一レベルドメイン'('net.a'). '第二・第一レベルドメイン'('net.au'). '第二・第一レベルドメイン'('net.b'). '第二・第一レベルドメイン'('net.bn'). '第二・第一レベルドメイン'('net.br'). '第二・第一レベルドメイン'('net.c'). '第二・第一レベルドメイン'('net.cm'). '第二・第一レベルドメイン'('net.cn'). '第二・第一レベルドメイン'('net.g'). '第二・第一レベルドメイン'('net.gt'). '第二・第一レベルドメイン'('net.h'). '第二・第一レベルドメイン'('net.hk'). '第二・第一レベルドメイン'('net.i'). '第二・第一レベルドメイン'('net.il'). '第二・第一レベルドメイン'('net.m'). '第二・第一レベルドメイン'('net.mx'). '第二・第一レベルドメイン'('net.n'). '第二・第一レベルドメイン'('net.nz'). '第二・第一レベルドメイン'('net.p'). '第二・第一レベルドメイン'('net.ph'). '第二・第一レベルドメイン'('net.u'). '第二・第一レベルドメイン'('net.uk'). '第二・第一レベルドメイン'(new). '第二・第一レベルドメイン'(news). '第二・第一レベルドメイン'(nl). '第二・第一レベルドメイン'(no). '第二・第一レベルドメイン'(nom). '第二・第一レベルドメイン'('nom.'). '第二・第一レベルドメイン'('nom.e'). '第二・第一レベルドメイン'('nom.es'). '第二・第一レベルドメイン'(nr). '第二・第一レベルドメイン'(nu). '第二・第一レベルドメイン'(o). '第二・第一レベルドメイン'(or). '第二・第一レベルドメイン'(org). '第二・第一レベルドメイン'('org.'). '第二・第一レベルドメイン'('org.b'). '第二・第一レベルドメイン'('org.bn'). '第二・第一レベルドメイン'('org.c'). '第二・第一レベルドメイン'('org.cn'). '第二・第一レベルドメイン'('org.e'). '第二・第一レベルドメイン'('org.es'). '第二・第一レベルドメイン'('org.i'). '第二・第一レベルドメイン'('org.il'). '第二・第一レベルドメイン'('org.l'). '第二・第一レベルドメイン'('org.lv'). '第二・第一レベルドメイン'('org.n'). '第二・第一レベルドメイン'('org.nz'). '第二・第一レベルドメイン'('org.p'). '第二・第一レベルドメイン'('org.ph'). '第二・第一レベルドメイン'('org.pl'). '第二・第一レベルドメイン'('org.u'). '第二・第一レベルドメイン'('org.uk'). '第二・第一レベルドメイン'(orga). '第二・第一レベルドメイン'(organ). '第二・第一レベルドメイン'(organi). '第二・第一レベルドメイン'(organic). '第二・第一レベルドメイン'(p). '第二・第一レベルドメイン'(pa). '第二・第一レベルドメイン'(par). '第二・第一レベルドメイン'(pari). '第二・第一レベルドメイン'(paris). '第二・第一レベルドメイン'(pe). '第二・第一レベルドメイン'(ph). '第二・第一レベルドメイン'(pho). '第二・第一レベルドメイン'(phot). '第二・第一レベルドメイン'(photo). '第二・第一レベルドメイン'(pi). '第二・第一レベルドメイン'(pin). '第二・第一レベルドメイン'(pink). '第二・第一レベルドメイン'(piz). '第二・第一レベルドメイン'(pizz). '第二・第一レベルドメイン'(pizza). '第二・第一レベルドメイン'(pk). '第二・第一レベルドメイン'(pl). '第二・第一レベルドメイン'(pm). '第二・第一レベルドメイン'(pn). '第二・第一レベルドメイン'(po). '第二・第一レベルドメイン'(pok). '第二・第一レベルドメイン'(poke). '第二・第一レベルドメイン'(poker). '第二・第一レベルドメイン'(por). '第二・第一レベルドメイン'(porn). '第二・第一レベルドメイン'(pr). '第二・第一レベルドメイン'(pro). '第二・第一レベルドメイン'(ps). '第二・第一レベルドメイン'(pt). '第二・第一レベルドメイン'(pu). '第二・第一レベルドメイン'(pub). '第二・第一レベルドメイン'(pw). '第二・第一レベルドメイン'(q). '第二・第一レベルドメイン'(qa). '第二・第一レベルドメイン'(qu). '第二・第一レベルドメイン'(que). '第二・第一レベルドメイン'(queb). '第二・第一レベルドメイン'(quebe). '第二・第一レベルドメイン'(quebec). '第二・第一レベルドメイン'(r). '第二・第一レベルドメイン'(re). '第二・第一レベルドメイン'(rei). '第二・第一レベルドメイン'(reis). '第二・第一レベルドメイン'(reise). '第二・第一レベルドメイン'(rep). '第二・第一レベルドメイン'(repo). '第二・第一レベルドメイン'(repor). '第二・第一レベルドメイン'(report). '第二・第一レベルドメイン'(res). '第二・第一レベルドメイン'(rest). '第二・第一レベルドメイン'(resta). '第二・第一レベルドメイン'(restau). '第二・第一レベルドメイン'(restaur). '第二・第一レベルドメイン'(restaura). '第二・第一レベルドメイン'(restauran). '第二・第一レベルドメイン'(restaurant). '第二・第一レベルドメイン'(ro). '第二・第一レベルドメイン'(rom). '第二・第一レベルドメイン'(roma). '第二・第一レベルドメイン'(rs). '第二・第一レベルドメイン'(ru). '第二・第一レベルドメイン'(rug). '第二・第一レベルドメイン'(rugb). '第二・第一レベルドメイン'(rugby). '第二・第一レベルドメイン'(ruh). '第二・第一レベルドメイン'(ruhr). '第二・第一レベルドメイン'(rw). '第二・第一レベルドメイン'(s). '第二・第一レベルドメイン'(sa). '第二・第一レベルドメイン'(sc). '第二・第一レベルドメイン'(sco). '第二・第一レベルドメイン'(scot). '第二・第一レベルドメイン'(sd). '第二・第一レベルドメイン'(se). '第二・第一レベルドメイン'(sec). '第二・第一レベルドメイン'(secu). '第二・第一レベルドメイン'(secur). '第二・第一レベルドメイン'(secure). '第二・第一レベルドメイン'(sg). '第二・第一レベルドメイン'(sh). '第二・第一レベルドメイン'(sho). '第二・第一レベルドメイン'(shoe). '第二・第一レベルドメイン'(shoes). '第二・第一レベルドメイン'(shop). '第二・第一レベルドメイン'(si). '第二・第一レベルドメイン'(sk). '第二・第一レベルドメイン'(ska). '第二・第一レベルドメイン'(skat). '第二・第一レベルドメイン'(skate). '第二・第一レベルドメイン'(ski). '第二・第一レベルドメイン'(sl). '第二・第一レベルドメイン'(sm). '第二・第一レベルドメイン'(sn). '第二・第一レベルドメイン'(so). '第二・第一レベルドメイン'(sp). '第二・第一レベルドメイン'(spa). '第二・第一レベルドメイン'(spac). '第二・第一レベルドメイン'(space). '第二・第一レベルドメイン'(spo). '第二・第一レベルドメイン'(spor). '第二・第一レベルドメイン'(sport). '第二・第一レベルドメイン'(sr). '第二・第一レベルドメイン'(st). '第二・第一レベルドメイン'(sto). '第二・第一レベルドメイン'(stoc). '第二・第一レベルドメイン'(stock). '第二・第一レベルドメイン'(stockh). '第二・第一レベルドメイン'(stockho). '第二・第一レベルドメイン'(stockhol). '第二・第一レベルドメイン'(stockholm). '第二・第一レベルドメイン'(su). '第二・第一レベルドメイン'(sup). '第二・第一レベルドメイン'(supp). '第二・第一レベルドメイン'(suppo). '第二・第一レベルドメイン'(suppor). '第二・第一レベルドメイン'(support). '第二・第一レベルドメイン'(sur). '第二・第一レベルドメイン'(surf). '第二・第一レベルドメイン'(sv). '第二・第一レベルドメイン'(sx). '第二・第一レベルドメイン'(sy). '第二・第一レベルドメイン'(syd). '第二・第一レベルドメイン'(sydn). '第二・第一レベルドメイン'(sydne). '第二・第一レベルドメイン'(sydney). '第二・第一レベルドメイン'(t). '第二・第一レベルドメイン'(ta). '第二・第一レベルドメイン'(tat). '第二・第一レベルドメイン'(tatt). '第二・第一レベルドメイン'(tatto). '第二・第一レベルドメイン'(tattoo). '第二・第一レベルドメイン'(tc). '第二・第一レベルドメイン'(td). '第二・第一レベルドメイン'(te). '第二・第一レベルドメイン'(tel). '第二・第一レベルドメイン'(ten). '第二・第一レベルドメイン'(tenn). '第二・第一レベルドメイン'(tenni). '第二・第一レベルドメイン'(tennis). '第二・第一レベルドメイン'(tf). '第二・第一レベルドメイン'(tg). '第二・第一レベルドメイン'(th). '第二・第一レベルドメイン'(tha). '第二・第一レベルドメイン'(thai). '第二・第一レベルドメイン'(ti). '第二・第一レベルドメイン'(tir). '第二・第一レベルドメイン'(tiro). '第二・第一レベルドメイン'(tirol). '第二・第一レベルドメイン'(tj). '第二・第一レベルドメイン'(tk). '第二・第一レベルドメイン'(tl). '第二・第一レベルドメイン'(tm). '第二・第一レベルドメイン'(tn). '第二・第一レベルドメイン'(to). '第二・第一レベルドメイン'(tok). '第二・第一レベルドメイン'(toky). '第二・第一レベルドメイン'(tokyo). '第二・第一レベルドメイン'(tr). '第二・第一レベルドメイン'(tra). '第二・第一レベルドメイン'(trai). '第二・第一レベルドメイン'(train). '第二・第一レベルドメイン'(traini). '第二・第一レベルドメイン'(trainin). '第二・第一レベルドメイン'(training). '第二・第一レベルドメイン'(trav). '第二・第一レベルドメイン'(trave). '第二・第一レベルドメイン'(travel). '第二・第一レベルドメイン'(tv). '第二・第一レベルドメイン'(tw). '第二・第一レベルドメイン'(u). '第二・第一レベルドメイン'(ua). '第二・第一レベルドメイン'(ug). '第二・第一レベルドメイン'(uk). '第二・第一レベルドメイン'('uk.'). '第二・第一レベルドメイン'('uk.c'). '第二・第一レベルドメイン'('uk.co'). '第二・第一レベルドメイン'('uk.com'). '第二・第一レベルドメイン'(us). '第二・第一レベルドメイン'('us.'). '第二・第一レベルドメイン'('us.c'). '第二・第一レベルドメイン'('us.co'). '第二・第一レベルドメイン'('us.com'). '第二・第一レベルドメイン'('us.o'). '第二・第一レベルドメイン'('us.or'). '第二・第一レベルドメイン'('us.org'). '第二・第一レベルドメイン'(uy). '第二・第一レベルドメイン'(uz). '第二・第一レベルドメイン'(v). '第二・第一レベルドメイン'(vc). '第二・第一レベルドメイン'(vg). '第二・第一レベルドメイン'(vi). '第二・第一レベルドメイン'(via). '第二・第一レベルドメイン'(viaj). '第二・第一レベルドメイン'(viaje). '第二・第一レベルドメイン'(viajes). '第二・第一レベルドメイン'(vn). '第二・第一レベルドメイン'(vo). '第二・第一レベルドメイン'(voy). '第二・第一レベルドメイン'(voya). '第二・第一レベルドメイン'(voyag). '第二・第一レベルドメイン'(voyage). '第二・第一レベルドメイン'(w). '第二・第一レベルドメイン'(wa). '第二・第一レベルドメイン'(wal). '第二・第一レベルドメイン'(wale). '第二・第一レベルドメイン'(wales). '第二・第一レベルドメイン'(we). '第二・第一レベルドメイン'(web). '第二・第一レベルドメイン'('web.'). '第二・第一レベルドメイン'('web.d'). '第二・第一レベルドメイン'('web.do'). '第二・第一レベルドメイン'(wf). '第二・第一レベルドメイン'(wi). '第二・第一レベルドメイン'(wie). '第二・第一レベルドメイン'(wien). '第二・第一レベルドメイン'(win). '第二・第一レベルドメイン'(wine). '第二・第一レベルドメイン'(ws). '第二・第一レベルドメイン'(x). '第二・第一レベルドメイン'(xx). '第二・第一レベルドメイン'(xxx). '第二・第一レベルドメイン'(y). '第二・第一レベルドメイン'(yt). '第二・第一レベルドメイン'('м'). '第二・第一レベルドメイン'('мо'). '第二・第一レベルドメイン'('мос'). '第二・第一レベルドメイン'('моск'). '第二・第一レベルドメイン'('москв'). '第二・第一レベルドメイン'('москва'). '第二・第一レベルドメイン'('р'). '第二・第一レベルドメイン'('рф'). '第二・第一レベルドメイン'('с'). '第二・第一レベルドメイン'('ср'). '第二・第一レベルドメイン'('срб'). '第二・第一レベルドメイン'('香'). '第二・第一レベルドメイン'('香港'). '第二・第一レベルドメイン'('中'). '第二・第一レベルドメイン'('中国'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/10 # # RegularExpressionでIPアドレスが正しいかどうか判断するのは無理かね? # 無理なら各オクテット切り出して0〜255の範囲にあるか地道にチェックするけど 'RegularExpressionでIPアドレスが正しいかどうか判断するのは無理かね? 無理なら各オクテット切り出して0〜255の範囲にあるか地道にチェックするけど'(_IPアドレス文字列) :- split(_IPアドレス文字列,['.'],L), count((member(N,L),integer(N),between(0,255,N)),4). % 以下のサイトは # [1] 授業単元: プログラミング  # [2] 問題文(含コード&リンク):入力仕様を、入力座標は最大2桁までの整数を # 最大10件までとし、入力範囲のチェックと、最大件数のチェックを行うプログラムの # 作成。 # [3] 環境 #  [3.1] OS: xp #  [3.2] コンパイラ名とバージョン: MSC Ver.5.1 #  [3.3] 言語: C # [4] 期限: 今週中 # [5] その他の制限: 出来れば、各所にコメントを入れて下さい。 # どういうプログラムなのか自分でも把握したいのと、コードの勉強も兼ねて。 # # よろしくお願いします。 '入力仕様を、入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'(_入力座標ならび,_桁数最大件数範囲で修正した入力座標ならび) :- '座標をX,Y最大2桁、(X,Y) の空白区切り形式で最大10件まで一行で入力する'(_座標ならび文字列), split(_座標ならび文字列,[' '],L1), 座標ならびに変換(L,_入力座標ならび), 最大件数のチェック(_入力座標ならび,_最大件数を超えた部分を除外した入力座標ならび), 入力範囲のチェック(_最大件数を超えた部分を除外した入力座標ならび,_桁数最大件数範囲で修正した入力座標ならび). '座標をX,Y最大2桁、(X,Y) の空白区切り形式で最大10件まで一行で入力する'(_座標ならび文字列) :- write('座標をX,Y最大2桁、(X,Y) の空白区切り形式で最大10件まで一行で入力する : '), get_line(_座標ならび文字列). 最大件数のチェック(L,L) :- length(L,_要素数), _要素数 =< 10,!. 最大件数のチェック(L1,L) :- length(L1,_要素数), length(L,10), append(L,_,L1), writef('要素数が%tで最大件数10件を超えています。\n',[_要素数]). 座標ならびに変換([],[]). 座標ならびに変換([_座標ならび文字列|R1],[[X,Y]|R2]) :- atom_to_term(_座標ならび文字列,(X,Y),_), 座標ならびに変換(R1,R2). 入力範囲のチェック([],[]). 入力範囲のチェック([[X,Y]|R1],[[X,Y]|R2]) :- 'X,Yが2桁の範囲'(X,Y), 入力範囲のチェック(R1,R2),!. 入力範囲のチェック([[X,Y]|R1],R2) :- writef('入力範囲にエラーがありました (%t,%t) \n',[X,Y]), 入力範囲のチェック(R1,R2). 'X,Yが2桁の範囲'(X,Y) :- '2桁の範囲'(X), '2桁の範囲'(Y). '2桁の範囲'(X) :- X < 100,!. '2桁の範囲'(X) :- X < 100.0. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1359210850/199 # # テキストで # 11111 # 22222 # 33333 # 44444 # 55555 # # というのを # # 12345 # 12345 # 12345 # 12345 # 12345 # # という風に90度変更したようにする方法を教えてください # # 'テキストで 11111 22222 33333 44444 55555 というのを 12345 12345 12345 12345 12345 という風に90度変更したようにする方法を教えてください' :- 'テキストで 11111 22222 33333 44444 55555 というのを'(LL1), '12345 12345 12345 12345 12345 という風に90度変更する'(LL1,_転置された文字列). 'テキストで 11111 22222 33333 44444 55555 というのを'(LL) :- split('11111 22222 33333 44444 55555',['\n'],L1), findall(L,( member(_文字列,L1), atom_chars(_文字列,L)), LL). '12345 12345 12345 12345 12345 という風に90度変更する'(LL1,_転置された文字列) :- 転置(LL1,LL2), findall(S,( member(L,LL2), atomic_list_concat(L,S)), L4), atomic_list_concat(L4,'\n',_転置された文字列). % 以下のサイトは # http://toro.2ch.net/test/read.cgi/tech/1357748713/477 # [1] 授業単元:c++ # [2] 問題文(含コード&リンク):不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、ローマ字名を入力してデータファイル内の情報を検索するプログラムを作成してください。 # 検索の結果として、該当者が居る場合画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。また、該当者が居ない場合はその旨を表示するようにしてください。 # [3] 環境 #  [3.1] OS: windows7 #  [3.2] コンパイラ名とバージョン: Borland C++ 5.5.1 #  [3.3] 言語:C++ # [4] 期限: 2013/2/1 # [5] その他の制限: 入出力の方法、変数、四則演算、分岐、繰り返し、関数、文字の出入力、文字列、構造体、ファイル処理の範囲内でお願い致します。 '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力してデータファイル内の情報を検索するプログラムを作成してください。 検索の結果として、該当者が居る場合画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示するようにしてください。' :- '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_検索結果,_ローマ字名,_漢字名,_番号,_得点), '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(_検索結果,_ローマ字名,_漢字名,_番号,_得点). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_検索結果,_入力されたローマ字名,_漢字名,_番号,_得点) :- ローマ字名を入力して(_入力されたローマ字名), '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_入力されたローマ字名,_検索結果,_漢字名,_番号,_得点). ローマ字名を入力して(_ローマ字名) :- write('検索するローマ字名を入力してください : '), get_line(_ローマ字名). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_入力されたローマ字名,該当者が居る,_漢字名,_番号,_得点) :- get_split_lines('seiseki.txt',[' ',','],LL), member([_入力されたローマ字名,_漢字名,_番号,_得点],LL). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_,該当者が居ない,_,_,_). '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(該当者が居る,_ローマ字名,_漢字名,_番号,_得点) :- '画面にその情報(ローマ字名、漢字名、番号、得点)を表示し'(_ローマ字名,_漢字名,_番号,_得点), 'なおかつその情報が記載された新しいファイル(kekka.txt)が生成される'(_ローマ字名,_漢字名,_番号,_得点). '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(該当者が居ない,_,_,_,_) :- write('該当者はいません\n'). '画面にその情報(ローマ字名、漢字名、番号、得点)を表示し'(_ローマ字名,_漢字名,_番号,_得点) :- writef('%t %t %t %t\n',[_ローマ字名,_漢字名,_番号,_得点]). 'なおかつその情報が記載された新しいファイル(kekka.txt)が生成される'(_ローマ字名,_漢字名,_番号,_得点) :- '新しいファイル(kekka.txt)が生成される'(Outstream), writef(Outstream,'%t %t %t %t\n',[_ローマ字名,_漢字名,_番号,_得点]), close(Outstream). '新しいファイル(kekka.txt)が生成される'(Outstream) :- open('kekka.txt',write,Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/281 # # [1] 授業単元: プログラミング論 # [2] 問題文(含コード&リンク): # # 次のA・Bの行列をA×Bの計算をして、その結果を表示するプログラムを作成しなさい。 # # A=[5 3] B=[7 1 5 4] #   [3 8]     [1 9 2 8] #   [1 6] #   [9 1] # # 解の表示) [38 32 31 44] #       [29 75 31 76] #       [13 55 17 52] #       [64 18 47 44] # # '次のA・Bの行列をA×Bの計算をして、その結果を表示するプログラムを作成しなさい。 A=[5 3]   [3 8]   [1 6]   [9 1] B=[7 1 5 4]   [1 9 2 8] 解の表示) [38 32 31 44]       [29 75 31 76]       [13 55 17 52]       [64 18 47 44]'(_A, _B,_その結果) :- '次のA・Bの行列をA×Bの計算をして、'('A=[5 3]   [3 8]   [1 6]   [9 1] B=[7 1 5 4]   [1 9 2 8] ',_その結果), その結果を表示する(_その結果). '次のA・Bの行列をA×Bの計算をして、'(_文字列,_その結果) :- '次のA・Bの行列を'(_文字列,_A,_B), 転置(_B,_B_2), 行列の掛け算_1(_A,_B_2,_その結果). '次のA・Bの行列を'(_文字列,_A,_B) :- split(_文字列,[' ',' ','[',']'],L), '次のA・Bの行列を'(L,_A,_B). '次のA・Bの行列を'([A,=|R1],L2,L3) :- 'Aの行列'(R1,L2,R), 'Bの行列'(R,L3). 'Aの行列'([B,=|R1],[],[B,=|R1]) :- !. 'Aの行列'(L1,[L|R2],R) :- 'Aの行'(L,L1,R1), 'Aの行列'(R1,R2,R). 'Aの行'(['\n'|R],[],R). 'Aの行'([N|R1],[N|R2],R) :- 'Aの行'(R1,R2,R). 'Bの行列を'([B,=|R1],LL) :- 'Bの行列'(R1,LL). 'Bの行列'([],[]) :- !. 'Bの行列'(L1,[L|R2]) :- 'Bの行'(L1,L,R1), 'Bの行列'(R1,R2). 'Bの行'(['\n'|R],[],R). 'Bの行'([N|R1],[N|R2],R) :- 'Bの行'(R1,R2,R). その結果を表示する(_その結果) :- append(_,[L|R],_その結果), atomic_list_concat(L,' ',_行表示), writef('\t[%t]\n',[_行表示]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/227 # # [1] 授業単元: 配列の整列 # [2] 問題文(含コード&リンク):字数超えてしまったのでリンク張ります。 # [ http://ime.nu/codepad.org/YCoV3saL ] # # /* # # 2次元配列の整列 # # ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 # # | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | # # これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) # 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合計点で照準に整列して表示する(整列後)。 # # 【実行例】 # # 整列前 # 番号 問1  問2 問3 問4 問5 合計 # 1001 20 30 49 41 90 230 # 1002 50 30 24 0 95 199 # 1003 20 33 55 35 90 233 # 1004 93 55 56 61 90 355 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1025 80 90 52 50 91 363 # 合計 1145 1015 1297 978 2292 # # 整列後 # 番号 問5  問3 問1 問2 問4 合計 # 1025 91 52 80 90 50 363 # 1004 90 56 93 55 61 355 # 1003 90 50 94 50 49 233 # 1004 100 49 70 30 62 311 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1015 90 53 20 20 0 183 # 合計 2292 1297 1145 1015 978 # # ※実行例が長くなってしまうので途中省略しています。 # # */ 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。' :- 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1), '学生ごとの合格点と、問ごと合計点を求めて表示する'(LL1,LL2), '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(LL2). 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1) :- get_split_lines('seiseki.dat',[' '],LL1). '学生ごとの合格点と、問ごと合計点を求めて表示する'(LL1,LL2) :- '行列を列の合計で降順に整列して列位置を交換し(LL1,LL2), 問いごとの合計を表示する(LL2). 列の合計で降順に整列して列位置を交換し(LL,LL1) :- 転置(LL,_転置されたLL), findall([_合計,_nth1|L],( nth1(_nth1,_転置されたLL,L), sum(L,_合計)), _転置され合計を付加されたLL), 降順バブルソート(_転置され合計と列位置が付加されたLL,_降順に整列された転置され合計と列位置が付加されたLL), 転置(_降順に整列された転置され合計と列位置が付加されたLL,LL1). 問いごとの合計を表示する(LL2) :- between(1,6,_nth), nth0(_nth,LL2,[_合計|_]), atomic_list_concat([問,_nth,' = ',_合計],S), writef(' %t,',[S]), _nth = 6, write('\n'). '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(LL1) :- 列の合計で降順に整列して列位置を交換し(LL1,LL2), 行合計で降順に整列する(LL2,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL), 表示する(_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL). 行合計で降順に整列する(LL1,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL) :- findall([_合計|L2],( member(L,LL1), 要素の合計を最終要素に付加(L,_合計,L2)), LL2), 降順バブルソート(LL2,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL). 要素の合計を最終要素に付加(L1,_合計,L2) :- 要素の合計を最終要素に付加(L1,0,_合計,L2). 要素の合計を最終要素に付加([],_合計,_合計,[_合計]). 要素の合計を最終要素に付加([N|R1],_合計_1,_合計,[N|R2]) :- _合計_2 is _合計 + N, 要素の合計を最終要素に付加(R1,_合計_2,_合計,R2). 表示する(LL2) :- 最終見出しを得る(LL2,_見出し), writef('%t\n',[_見出し]), 行列部分の表示(LL2), 最終合計の表示(LL2). 行列部分の表示(LL) :- append(_,[[_|L]|R],LL), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = []. 最終合計の表示([_最終合計ならび|_]) :- writef(' %5r%5r%5r%5r%5r%5r\n',_最終合計ならび). 合計点の表示(_順位づけられた合計点ならび) :- findall(_合計点,( member([_合計点,_],_順位づけられた合計点ならび)), _合計点ならび), writef(' %5r%5r%5r%5r%5r%5r\n',_合計点ならび). 最終見出しを得る([_,L|_],_最終見出し) :- findall(S,( member(N,L), atomic_list_concat(['問',_nth1,' '],S)), L), atomic_list_concat(['番号 '|L],_最終見出し). 降順バブルソート(L1,L2) :- append(L0,[A,B|R],L1), A @< B, append(L0,[B,A|R],L3), 降順バブルソート(L3,L2),!. 降順バブルソート(L,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/227 # # [1] 授業単元: 配列の整列 # [2] 問題文(含コード&リンク):字数超えてしまったのでリンク張ります。 # [ http://ime.nu/codepad.org/YCoV3saL ] # # /* # # 2次元配列の整列 # # ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 # # | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | # # これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) # 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合計点で照準に整列して表示する(整列後)。 # # 【実行例】 # # 整列前 # 番号 問1  問2 問3 問4 問5 合計 # 1001 20 30 49 41 90 230 # 1002 50 30 24 0 95 199 # 1003 20 33 55 35 90 233 # 1004 93 55 56 61 90 355 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1025 80 90 52 50 91 363 # 合計 1145 1015 1297 978 2292 # # 整列後 # 番号 問5  問3 問1 問2 問4 合計 # 1025 91 52 80 90 50 363 # 1004 90 56 93 55 61 355 # 1003 90 50 94 50 49 233 # 1004 100 49 70 30 62 311 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1015 90 53 20 20 0 183 # 合計 2292 1297 1145 1015 978 # # ※実行例が長くなってしまうので途中省略しています。 # # */ 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。' :- 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1), '学生ごとの合格点と、問ごと合計点を求めて表示する(整列前)'(LL1,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列), 'さらに、学生の合格点で照準に整列して表示する(整列後)。'(_問いごとの合計点ならび,転置された学生の合格点付き点数行列). 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1) :- get_split_lines('seiseki.dat',[' '],LL1). '学生ごとの合格点と、問ごと合計点を求めて表示する(整列前)'(LL1,LL4,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列) :- '学生ごとの合格点と、'(LL1,_学生の合格点付き点数行列), '問ごと合計点を求めて'(_学生の合格点付き点数行列,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列), 表示する(_学生の合格点付き点数行列,_問いごとの合計点ならび). '学生ごとの合格点と、'([],[]). '学生ごとの合格点と、'([[_学生番号|L1]|R1],[[_学生番号|L2]|R2]) :- sum(L1,_sum), 学生ごとの合格点(L1,0,L2), '学生ごとの合格点と、'(R1,R2). 学生ごとの合格点([],_合計点,[_合計点]). 学生ごとの合格点([A|R1],_合計点_1,[A|R2]) :- _合計点2 is A + _合計点_1, 学生ごとの合格点(R1,R2). 問ごと合計点を求めて(_学生の合格点付き点数行列,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列) :- 転置(_学生の合格点付き点数行列,_転置された学生の合格点付き点数行列), 問ごと合計点(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび). 問ごと合計点([],[]). 問ごと合計点([L1|R1],[S|R2]) :- sum(L1,S), 問ごと合計点(R1,R2). 表示する(_学生の合格点付き点数行列,_問いごとの合計点ならび) :- write('番号 問1  問2 問3 問4 問5 合計\n'), append(_,[L|R],_学生の合格点付き点数行列), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = [], writef(' %5r%5r%5r%5r%5r%5r\n',_問いごとの合計点ならび). '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび) :- '次に、問の合計点の降順に左から右に向かって整列し、'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび,LL_1), 'さらに、学生の合格点で照準に整列して'(LL_1,LL_2), 表示する_2(_問いごとの合計点ならび,LL_2). '次に、問の合計点の降順に左から右に向かって整列し、'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび) :- 順位づけする(_問いごとの合計点ならび,_順位づけされた合計点ならび), findall(L,( between(1,5,N), nth1(N,_順位づけされた合計点ならび,[_,_項目番号]), nth1(_項目番号,_転置された学生の合格点付き点数行列,L)), LL_1), 転置([_学生番号ならび|LL_1],LL_2). 'さらに、学生の合格点で照準に整列して'(LL1,LL2) :- findall([A|L],( member(L,LL1), last(L,A)), LL3), 整列(LL3,LL4), 鍵を切り離して逆順にならび替え(LL4,[],LL2). 鍵を切り離して逆順にならび替え([],LL,LL). 鍵を切り離して逆順にならび替え([[A|L]|R1],L_1,LL) :- 鍵を切り離して逆順にならび替え(R1,[L|L_1],LL). 順位づけする(_問いごとの合計点ならび,_順位づけされた合計点ならび) :- findall([_合計点,_nth1],( between(1,5,_nth1), nth1(_nth1,_問いごとの合計点ならび,_合計点)), LL1), 降順整列(LL1,_順位づけされた合計点ならび). 降順整列(LL1,_順位づけされた合計点ならび) :- 整列(LL1,LL2), reverse(LL2,_順位づけされた合計点ならび). 表示する_2(LL_2,_順位づけられた合計点ならび) :- 見出し表示(_順位づけられた合計点ならび), 行列部分の表示(LL_2), 合計点の表示(_順位づけられた合計点ならび). 見出し表示(_順位づけられた合計点ならび) :- findall(_項目番号,( member([_,_項目番号],_順位づけられた合計点ならび)), _項目番号ならび), writef('番号 %5r%5r%5r%5r%5r%5r合計\n',_項目番号ならび). 行列部分の表示(LL) :- append(_,[L|R],LL), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = []. 合計点の表示(_順位づけられた合計点ならび) :- findall(_合計点,( member([_合計点,_],_順位づけられた合計点ならび)), _合計点ならび), writef(' %5r%5r%5r%5r%5r%5r\n',_合計点ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/176 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 下記の文字列を2次元配列に入力する。 # LISP # C++ # Ada # 次に配列の2列の文字 # S+a # を表示する。 # '下記の文字列を2次元配列に入力する。 LISP C++ Ada 次に配列の2列の文字 S+a を表示する。' :- '下記の文字列を2次元配列に入力する。'('LISP C++ Ada',_二次元配列), '次に配列の2列の文字 S+a を表示する。'(_二次元配列). '下記の文字列を2次元配列に入力する。'('LISP C++ Ada',_二次元配列) :- split('LISP C++ Ada',['\n'],L), findall(Chars,( member(A,L), atom_chars(A,Chars)), _二次元配列). '次に配列の2列の文字 S+a を表示する。'(_二次元配列) :- append(_,[[_,_,_文字|_]|R],_二次元配列), writef('%t',[_文字]), R = [], write('\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元: リスト処理 # [2] 問題文(含コード&) http://codepad.org/3DdhcBUM # # /* # # seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 # また、整列する際に要素どうしを比較した回数も表示しなさい。 # # 【実行例】 # # 番号 氏名      得点 # 1021 Machida Masato 100 # 1017 Nonaka Fujio 98 # 1011 Suzuki kenichi 93 # 1019 Fujimoto Kaoru 92 # 1006 kato Ichiro 91 # ・ ・     ・ # ・ ・     ・ # ・ ・     ・ # 1020 Hoshi Izumi 32 # 整列の為の比較回数=132回 # # ※長いので実行結果は途中省略しています。 # ※比較回数はコードによって異なる場合があります。 # # */ 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 また、整列する際に要素どうしを比較した回数も表示しなさい。' :- 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび), リスト処理による挿入法で得点の降順に整列して(_生徒ならび,[],_整列済み生徒ならび,0,_比較回数), 表示しなさい(_整列済み生徒ならび,_比較回数). 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび) :- get_split_lines('seito.dat',[' '],_生徒ならび). リスト処理による挿入法で得点の降順に整列して([[_学籍番号,_姓,_名,_得点]|R1],L1,_整列済み生徒ならび,_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,L1,L2,_比較回数_1,_比較回数_2), リスト処理による挿入法で得点の降順に整列して(R1,L2,_整列済み生徒ならび,_比較回数_2,_比較回数),!. リスト処理による挿入法で得点の降順に整列して([],_整列済み生徒ならび,_整列済み生徒ならび,_比較回数,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],[[_学籍番号,_名,_名,_得点],[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],_比較回数_1,_比較回数) :- 比較回数 is _比較回数_1 + 1, _得点 >= _得点_1,!. 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R1],[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R2],_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,R1,R2,_比較回数_1,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[],[[_学籍番号,_名,_名,_得点]],_比較回数,_比較回数) :- !. 表示しなさい(_整列済み生徒ならび,_比較回数) :- 見出しの表示, append(_,[[_学籍番号,_姓,_名,_得点]|R],_整列済み生徒ならび), 整形して表示する(_学籍番号,_姓,_名,_得点), R = [], writef('整列の為の比較回数=%t回\n',[_比較回数]). 見出しの表示 :- write('番号 氏名      得点\n'). 整形して表示する(_学籍番号,_姓,_名,_得点) :- 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列), 得点を頭部空白3桁に(_得点,_得点文字列), atomic_list_concat([_学籍番号,_姓文字列,_名文字列,_得点文字列],' ',_表示文字列), writef('%t\n',[_表示文字列]). 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列) :- '8桁に'(_姓,_姓文字列), '8桁に'(_名,_名文字列). '8桁に'(_項,_8桁文字列) :- atom_chars(_項,Chars_1), length(L,8), append(L1,L2,L), all(L2,' '), atom_chars(_8桁文字列,L). 得点を頭部空白3桁に(_得点,_得点文字列) :- number_chars(_得点,Chars), length(L,3), append(L0,Chars,L), all(L0,' '), atom_chars(_得点文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,( member(A,Lines1), split(A,Sep,Line)), Lines). get_lines(Instream,end_of_file,_,_,[]) :-!. get_lines(Instream,S,[],_終了検索対象ならび,[S]) :- member(A,_終了検索対象ならび), 検索(S,A),!. get_lines(Instream,S,[],[],[S|R]) :- get_line(Instream,S2), get_lines(Instream,S2,[],[],R),!. get_lines(Instream,S,[],_終了検索対象ならび,[S|R]) :- member(A,_終了検索対象ならび), \+(検索(S,A)), get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), member(B,_終了検索対象ならび), 検索(S,B),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S|R]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), !, get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,_,_開始検索対象ならび,_終了検索対象ならび,X) :- get_line(Instream,S2), get_lines(Instream,S2,_開始検索対象ならび,_終了検索対象ならび,X),!. get_lines(_ファイル,_スタート行,_最終行,X) :- integer(_スタート行), integer(_最終行), 行位置指定選択(_ファイル,_スタート行,_最終行,X). get_lines(_ファイル,_開始検索対象ならび,_終了検索対象ならび,X) :- \+(integer(_開始検索対象ならび)), \+(integer(_終了検索対象ならび)), open(_ファイル,read,Instream), get_line(Instream,S), get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,X), close(Instream),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat, get_line(user_input,Line), (Line = end_of_file , (!) , fail ; true)), Lines). get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_chars(Instream,end_of_file,[]) :- !. get_chars(Instream,_,[]) :- at_end_of_stream(Instream),!. get_chars(Instream,X,[X|R]) :- get_char(Instream,Y), get_chars(Instream,Y,R) . get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists_file(File_1), open(File_1,read,Instream), get_char(Instream,X), get_chars(Instream,X,L), close(Instream),!. get_chars(Instream,L) :- is_stream(_,Instream,_), get_char(Instream,X), get_chars(Instream,X,L),!. get_chars(L) :- findall(U,( repeat, get_char(U), (U = end_of_file , (!) , fail ; true)), L). get_line(X) :- get_line(user_input,X). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,_,[]) :- at_end_of_stream(Instream),!. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), atomic_list_concat(U,A), chars_lines(R,R2). split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y) , \+(member(U,_区切り符号ならび))), Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), C number Nl,!. split_5(B,C) :- atomic_list_concat(B,C),!. all([],_). all([V|R],V) :- all(R,V). 検索(_文字列,_副文字列) :- atom_length(_文字列,_文字列の文字数), atom_length(_副文字列,_副文字列の文字数), Max is _文字列の文字数 - _副文字列の文字数, between(0,Max,N), sub_atom(_文字列,N,_副文字列の文字数,_副文字列),!. 行位置指定選択(_ファイル,_選択先頭行,_選択最終行,X) :- wc(_ファイル,[[_行,_,_,_]]), _行数_1 is _行 - _選択先頭行 + 1, _行数_2 is _選択最終行 - _選択先頭行, atomic_list_concat(['tail -',_行数_1,' ',_ファイル,' | head -',_行数_2],S), shs(S,X). wc(F,X) :- exists_file(F1), atomic_list_concat(['wc ',F1],S), sh(S,X),!. wc(F,X) :- atomic_list_concat([F,' | wc'],S), sh(S,X),!. sh(Command,X) :- shs(Command,Y), findall(U,(member(V,Y) , make_list(V,[' ',','],U)),X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,_,[]) :- at_end_of_stream(Instream),!. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/717 # # [1] 授業単元: C演習 # [2] 問題文(含コード&リンク): # (問題文)http://imgur.com/bAeG1 # (途中まで書いたコード)://codepad.org/nwwt2hgU # (使用するテキストファイル、結果含む) # http://s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/joyful.cgi? のNo.396 # :- dynamic(転置索引/2). テキストのダウンロード(_サイトファイル名,_出力ファイル名) :- atomic_list_concat(['w3m -dump ',_サイトのファイル名],S), popen(S,Chars), open(_出力ファイル名,write,Outstream), ファイルに書き込む(Outstream,Chars), close(Outstream). ファイルに書き込む(Outstream,[]). ファイルに書き込む(Outstream,[C|R]) :- put_char(Outstream,C), ファイルに書き込む(Outstream,R). 転置索引を作る(_ファイル名) :- open(_ファイル名,read,Instream), ストリームから転置索引を作る(Instream,0), close(Instream). ストリームから転置索引を作る(Instream,_) :- at_end_of_stream(Instream),!. ストリームから転置索引を作る(Instream,N) :- get_line(Instream,Line), N_2 is N + 1, 語彙を転置索引に登録する(Line,N), ストリームから転置索引を作る(Instream,N_2). 語彙を転置索引に登録する(Line,N) :- split(Line,[' ',',','.',':','(',')'],L), member(_語彙,L), \+(転置索引(_語彙,N)), assertz(転置索引(_語彙,N)), fail. 語彙を転置索引に登録する(_,_). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/551 # # こんにちは。 # 早速ですがtxtファイルに書いてある下記の数値を取り込んで平均点の大きい順に # 上から並び替え、別のtxtファイルに出力するプログラムを作りたいのですが # どうすればいいんでしょうか。 # # ご回答お願いします。 # # 14 # 1001 90 80 70 67 # 1002 60 50 40 60 # 1003 55 30 56 65 # 1004 88 70 77 20 # 1005 60 30 90 30 # 1006 100 0 100 100 # 1007 23 33 21 50 # 1008 65 66 46 98 # 1009 58 87 88 64 # 1010 30 55 63 32 # 1011 65 54 70 77 # 1013 98 89 79 90 # 1014 100 60 95 68 # 1016 30 22 56 30 # # 'txtファイルに書いてある下記の数値を取り込んで平均点の大きい順に上から並び替え、別のtxtファイルに出力する'(_txtファイル,_別のtxtファイル) :- 'txtファイルに書いてある下記の数値を取り込んで'(_txtファイル,LL1), 平均点の大きい順に上から並び替え(LL1,LL2), 別のtxtファイルに出力する(LL2,_別のtxtファイル). 'txtファイルに書いてある下記の数値を取り込んで'(_txtファイル,LL1) :- get_split_lines(_txtファイル,[' '],[_|LL1]). 平均点の大きい順に上から並び替え(LL1,LL2) :- 平均点の(LL1,LL3), 大きい順に上からならび替え(LL3,LL2). 平均点の([],[]). 平均点の([[A|L1]|R1],[[_平均点,A|L1]|R2]) :- 相加平均(L1,_平均点), 平均点の(R1,R2). 大きい順に上からならび替え(LL3,LL2) :- 整列(LL3,LL4), reverse(LL4,LL2). 別のtxtファイルに出力する(_別のtxtファイル,LL2) :- length(LL2,Len), open(_別のtxtファイル,write,Outstream), 出力する(Outstream,[[Len]|LL2]), close(Outstream). 出力する(Outstream,[]). 出力する(Outstream,[[_|L]|R]) :- atomic_list_concat(L,' ',S), writef(Outstream,'%t\n',[S]), 出力する(Outstream,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1355011916/198 # # phpですがwebじゃないので、こちらで質問させて下さい # 趣味でプログラムをはじめて半年程度です # # 競馬のデータ処理をやっています # 数字と記号の混ざった文字列の数字部分を置き換えたいのですが # どうすればいいでしょうか? # # 具体的には、各馬の各コーナーの通過順位を以下のように馬番から着順に置き換えたいのです # (2,*15,14,5)(9,12,16)(8,3,6)-(10,13)(11,4)(7,1) *各馬の各コーナー通過順位 馬番表示 ←コレを # (10,*16,1,2)(8,4,6)(9,3,7)-(15,14)(11,13)(5,12) *各馬の各コーナー通過順位 着順表示 こうしたい # # # 現在データは、以下のようになっています # # 各馬の各コーナー通過順位 馬番表示は $corner *先週の朝日杯の3コーナー # (2,*15,14,5)(9,12,16)(8,3,6)-(10,13)(11,4)(7,1) # # 馬番は $umban # Array ( [0] => 14 [1] => 15 [2] => 2 [3] => 5 [4] => 9 [5] => 12 [6] => 16 [7] => 3 [8] => 8 [9] => 6 [10] => 10 [11] => 13 [12] => 4 [13] => 11 [14] => 7 [15] => 1 ) # # 着順は $tyaku # Array ( [0] => 1 [1] => 16 [2] => 10 [3] => 2 [4] => 8 [5] => 4 [6] => 6 [7] => 3 [8] => 9 [9] => 7 [10] => 15 [11] => 14 [12] => 13 [13] => 11 [14] => 5 [15] => 12 ) # # $umbanと$tyakuの相関性は、[0]は14番で1着、[1]は15番で16着、[2]は2番で10着、、etcとなっています # # phpです、宜しくお願いします *分割で見にくくなってしまいすいません # # # 11R 第64回 朝日杯フューチュリティステークス(GI)成績 # # サラ系2歳,1600m,芝・右 外 # (国際)牡・牝(指定)オープン,馬齢 # 本,賞,金,:,7000,、,2800,、,1800,、,1100,、,700,万円 # 付加賞金,:,121.8,、,34.8,、,17.4,万円 # 発走 15:25 # 天候:晴   芝:良 # :- op(400,xfx,':'). コーナー通過時の先頭からの各馬の最終到達順位(_レース,_通過時文字列,_到達順位に置換した通過時文字列) :- sPLIT(_通過時文字列,['(','-','=','*',')'],L1), 馬番を最終到達順位に変換(_レース,L1,L2), atomic_list_concat(L2,_到達順に置換した通過時順位). 馬番を最終到達順位に変換(_レース,[],[]). 馬番を最終到達順位に変換(_レース,[_馬番|R1],[_着順|R2]) :- integer(_馬番), レース成績(_レース,_着順,_馬番,_馬名,_性齢,_負担重量,_騎手,_タイム,_着差,_推定上り,_馬体重,_調教師,_単勝人気), 馬番を最終到達順位に変換(_レース,R1,R2). 馬番を最終到達順位に変換(_レース,[A|R1],[A|R2]) :- \+(integer(A)), 馬番を最終到達順位に変換(_レース,R1,R2). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',1,14, ロゴタイプ,牡2,55.0, M.デムーロ,1:33.4,'',36.1,482,-4, 田中剛,7). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',2,5, コディーノ,牡2,55.0, 横山典弘,1:33.4,クビ,36.0,476,+2, 藤沢和雄,1). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',3,3, ゴットフリート,牡2,55.0, C.スミヨン,1:33.8,2+1/2,36.0,470,+2, 斎藤誠,3). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',4,12, フラムドグロワール,牡2,55.0, C.ウィリアムズ,1:33.9,3/4,36.3,490, 0, 藤沢和雄,5). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',5,7, ティーハーフ,牡2,55.0, 武豊,1:33.9,クビ,35.5,436,-2, 西浦勝一,6). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',6,16, ノウレッジ,牡2,55.0, 蛯名正義,1:34.0,クビ,36.4,490,+2, 二ノ宮敬宇,10). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',7,6, ラブリーデイ,牡2,55.0, C.ルメール,1:34.0,クビ,36.2,472,-2, 池江泰寿,4). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',8,9,エーシントップ,牡2,55.0, 浜中俊,1:34.1,クビ,36.6,532,-2, 西園正都,2). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',9,8, クラウンレガーロ,牡2,55.0, 幸英明,1:34.1,ハナ,36.3,456,+12, 日吉正和,8). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',10, 2, ネオウィズダム,牡2,55.0, 柴田善臣,1:34.2,1/2,36.8,484,+2, 矢作芳人,12). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',11, 11, アットウィル,牡2,55.0, 岩田康誠,1:34.2,クビ,36.0,482,-2, 領家政蔵,13). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',12, 1, ザラストロ,牡2,55.0, 松岡正海,1:34.3,クビ,35.8,492,+4, 武藤善則,11). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',13, 4, テイエムイナズマ,牡2,55.0, 池添謙一,1:34.5,1+1/2,36.3,510,+10, 福島信晴,9). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',14, 13, ディアセルヴィス,牡2,55.0, 勝浦正樹,1:34.6,3/4,36.5,454,+4, 高橋裕,16). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',15, 10, ワキノブレイブ,牡2,55.0, 福永祐一,1:34.7,クビ,36.6,468,+6, 清水久詞,15). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',16, 15,マイネルエテルネル,牡2,55.0, 柴田大知,1:34.9,1+1/4,37.6,470,-2, 西園正都,14). %%%%% 実行例 %%%% ?- コーナー通過時の先頭からの各馬の最終到達順位('11R 第64回 朝日杯フューチュリティステークス(GI)','(2,*15,14,5)(9,12,16)(8,3,6)-(10,13)(11,4)(7,1)',_到達順位に置換した通過時文字列). _到達順位に置換した通過時文字列 = '(10,*16,1,2)(8,4,6)(9,3,7)-(15,14)(11,13)(5,12)' % 以下のサイトは # 出典:: http://anago.2ch.net/test/read.cgi/software/1348064199/191 # # aaa,b # 0.1,44 # 0.2,23.1 # 0.5,777.4 # 0.6,-10 # 0.7,999 # 0.8,-496.3 # 0.9,37 # 1.1,0 # 1.2,865 # 1.3,-5 # 1.4,-5955 # 1.6,0 # 1.8,594.3 # 2.1,-459 # # 上記のようなcsvファイルがあります。 # aaaの値がx刻みのbの平均値を出したいのです。 # # たとえばxを0.5とした場合、以下のように平均値を自動的に。 # (xの値は自由に変更できるものでお願いします) # # aaaが0超0.5以下(0.1と0.2と0.5)のbの平均値((44+23.1+777.4)/3=281.5) # aaaが0.5超1以下(0.6と0.7と0.8と0.9)のbの平均値(132.425) # aaaが1超1.5以下(1.1と1.2と1.3と1.4)のbの平均値(-1273.75) # aaaが1.5超2以下(1.6と1.8)のbの平均値(297.15) # aaaが2超2.5以下(2.1)の平均値(-459) # # 'aaa,b 0.1,44 0.2,23.1 0.5,777.4 0.6,-10 0.7,999 0.8,-496.3 0.9,37 1.1,0 1.2,865 1.3,-5 1.4,-5955 1.6,0 1.8,594.3 2.1,-459 上記のようなcsvファイルがあります。 aaaの値がx刻みのbの平均値を出したいのです。 たとえばxを0.5とした場合、以下のように平均値を自動的に。 (xの値は自由に変更できるものでお願いします) aaaが0超0.5以下(0.1と0.2と0.5)のbの平均値((44+23.1+777.4)/3=281.5) aaaが0.5超1以下(0.6と0.7と0.8と0.9)のbの平均値(132.425) aaaが1超1.5以下(1.1と1.2と1.3と1.4)のbの平均値(-1273.75) aaaが1.5超2以下(1.6と1.8)のbの平均値(297.15) aaaが2超2.5以下(2.1)の平均値(-459)'(CSVFILE,_x,_平均値ならび) :- get_split_lines(CSVFILE,[','],LL), 最大値(LL,[_最大値_1,_]), 刻みながら平均値を取る(0,_最大値,_n,_平均値ならび). 刻みながら平均を取る(N,_最大値,_n,_,[]) :- N > _最大値,!. 刻みながら平均を取る(N,_最大値,_n,LL,[[N,N2,_平均]|R]) :- N2 is N + _n, findavg(_bbb,( 刻み範囲のbbbの値を選択する(N,N2,LL,_bbb)), _平均), 刻みながら平均を取る(N2,_最大値,_n,LL,R). 刻み範囲のbbbの値を選択する(N,N2,LL,_bbb) :- member([_aaa,_bbb],LL), _aaa > N, _aaa =< N2. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/102 # # [1] 授業単元:言語処理 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/0VyMr7kt # 上記のプログラムを変更して、逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み,計算結果を出力するプログラムを作成せよ. # さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示するプログラムを作成せよ. # '逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み,計算結果を出力する.さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル) :- 逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み(_テキストファイル,_逆ポーランド式ならび), 計算結果を出力する(_逆ポーランド式ならび), 'さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル). 逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み(_テキストファイル,_逆ポーランド式ならび) :- get_chars(_テキストファイル,_文字ならび), 数字を値に変換する(_文字ならび,_文字ならび_1), 空白を除去する(_文字ならび_1,_逆ポーランド式ならび). 数字を値に変換する([],[]). 数字を値に変換する([A|R1],[B|R1]) :- 数字ならば数に変換(A,B), 数字を値に変換する(R1,R2),!. 数字を値に変換する([A|R1],[A|R2]) :- 数字を値に変換する(R1,R2). 空白改行などを除去する([],[]). 空白改行などを除去する([A|R1],[A|R1]) :- member(A,[+,-,*,/,0,1,2,3,4,5,6,7,8,9]), 空白改行などを除去する(R1,R2),!. 空白改行などを除去する([_|R1],[_|R2]) :- 空白改行などを除去する(R1,R2). 数字ならば数に変換(A,B) :- A @>= '0', A @=< '9', atom_number(A,B). 計算結果を出力する(_逆ポーランド式ならび) :- 計算結果(_逆ポーランド式ならび,[],_値), writef('%t\n',[_値]). 計算結果([],[_値],_値). 計算結果([N|R1],L1,_値) :- number(N), 計算結果(R1,[N|L1],_値),!. 計算結果([_演算子|R1],[N1,N2|R2],_値) :- 演算(_演算子,N1,N2,N3), 計算結果(R1,[N3|R2],_値). 演算(_演算子,N1,N2,N3) :- F =.. [_演算子,N1,N2], N3 is F. 'さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル) :- get_lines(_テキストファイル,Lines), '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(Lines). '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(Lines) :- append(_,[_行|R],Lines), '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を'(_行), 表示する(_頻度ならび), R = []. '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を'(_行,_頻度ならび) :- '各行の内容を字句解析(トークンに分解)し'(_行,_字句ならび), 各要素の個数をカウントした結果を(_字句ならび,_頻度ならび). '各行の内容を字句解析(トークンに分解)し'(_行,_字句ならび) :- sPLIT(_行,[' ','+','-','*','/','1','2','3','4','5','6','7','8','9','0'],L_1), 空白を取り除く(L_1,_字句ならび). 各要素の個数をカウントした結果を(_字句ならび,_頻度ならび) :- setof(_要素,[_要素] ^ member(_要素,_字句ならび),L_1), findall([_頻度,_字句],( member(_字句,L_1), count(member(_字句,_字句ならび),_頻度)),_頻度ならび). 表示する(_頻度ならび) :- append(_,[[_頻度,_字句]|R],_頻度ならび), writef('%t,%t回 ',[_字句,_頻度]), R = [], write('\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/693 # # [1]C/C++プログラミング実習 まとめ  # [2]問題 http://ime.nu/codepad.org/CfJninhf #   問題文中に出てくる histograms.txt # [3]visual studio 2010 # [4]11月19日 10時 # [5]前にここのスレでお世話になりました../test/read.cgi/tech/1349527750/603です。 #   この前の課題を提出した所、今度はまとめとして前の問題の発展問題がだされました。 #   前に頂いたプログラムを改変してみようと思ったのですが、今回の問題が複雑になりすぎてて #   お手上げ状態です。どなたか助けていただけると幸いに思います。 # # /* # histograms.txtという文章ファイルがある。 # このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が # 並んでいて、それらの数字は水平TAB文字によって区切られている。 # このhistograms.txtを自動的に以下の条件のもとに改変して # train.datというファイルとして出力をするプログラムを作れ。 # # 条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。 #     (例 image/0-21C5N550AVL.jpg → 0 #        image/1-19690369.jpg  → 1 #        image/2-24891960.jpg  → 2 #        image/3-12725422.jpg  → 3) # # 条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。 # # 条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、 #     番号:数値?番号:数値?番号:数値?…という形に書き換える #     (例 0  0.0309051 0 0   0.00496689 #      → 2:0.0309051 5:0.00496689 …… ) # # 条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き #              指定した方の名前で出力を行う。 # # */ 'histograms.txtという文章ファイルがある。 このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が 並んでいて、それらの数字は水平TAB文字によって区切られている。 このhistograms.txtを自動的に以下の条件のもとに改変して train.datというファイルとして出力をするプログラムを作れ。 条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。     (例 image/0-21C5N550AVL.jpg → 0        image/1-19690369.jpg  → 1        image/2-24891960.jpg  → 2        image/3-12725422.jpg  → 3) 条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。 条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、     番号:数値?番号:数値?番号:数値?…という形に書き換える     (例 0  0.0309051 0 0   0.00496689      → 2:0.0309051 5:0.00496689 …… ) 条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き              指定した方の名前で出力を行う。' :- get_lines('histograms.txt',Lines), sPLIT(Lines,['\t'],LL0), findall(L1,( 自動的に以下の条件のもとに改変して(LL0,L1)), LL), 'train.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(LL). 自動的に以下の条件のもとに改変して(LL0,L1) :- member([File|R],LL0), '行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える'(File,N), 左から順に番号を振った上で要素が0のものを削除し(0,R,L), 水平TAB文字をすべて空白文字に変える([N|L],L1). '行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える'(File,N) :- split(File,['/','-'],[_,N|_]). 左から順に番号を振った上で要素が0のものを削除し(_,[],[]). 左から順に番号を振った上で要素が0のものを削除し(N_0,[A|R1],[N:A|R2]) :- \+(A = '\t'), \+(A = 0), N is N_0 + 1, 左から順に番号を振った上で要素が0のものを削除し(N,R1,R2). 左から順に番号を振った上で要素が0のものを削除し(N,[A|R1],[A|R2]) :- A = '\t', 左から順に番号を振った上で要素が0のものを削除し(N,R1,R2). 左から順に番号を振った上で要素が0のものを削除し(N,[A|R1],R2) :- A = 0, 左から順に番号を振った上で要素が0のものを削除し(N,R1,R2). 水平TAB文字をすべて空白文字に変える(L,S) :- findall(B,( member(A,L), 水平TAB文字を空白文字に(A,B)), L2), atomic_list_concat(L2,S). 水平TAB文字を空白文字に('\t',' ') :- !. 水平TAB文字を空白文字に(A,A). 'train.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(LL) :- 'train.datかtest.datのどちらのファイル名で出力するかを聞き', 指定した方の名前で出力を行う(LL). 'train.datかtest.datのどちらのファイル名で出力するかを聞き' :- write('ファイル名を選択します。\n1.. train.dat 2.. test.dat \n'). 指定した方の名前で出力を行う(LL) :- 指定した方の名前で(_指定した方の名前), 出力を行う(_指定して方の名前,LL). 指定した方の名前で(_指定した方の名前) :- 整数を得る('1または2',(N == 1;N == 2),N), 指定した方の名前で(N,_指定した方の名前). 指定した方の名前(1,'train.dat'). 指定した方の名前(2,'test.dat'). 出力を行う(_指定した方の名前,LL) :- open(_指定した方の名前,write,Outstream), ストリーム出力を行う(Outstream,LL), close(Outstream). ストリーム出力を出力を行う(Outstream,LL) :- append(_,[L|R],LL), atomic_list_concat(L,S), writef(Outstream,'%t\n',[S]), R = [], % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/693 # # [1]C/C++プログラミング実習 まとめ  # [2]問題 http://ime.nu/codepad.org/CfJninhf #   問題文中に出てくる histograms.txt # [3]visual studio 2010 # [4]11月19日 10時 # [5]前にここのスレでお世話になりました../test/read.cgi/tech/1349527750/603です。 #   この前の課題を提出した所、今度はまとめとして前の問題の発展問題がだされました。 #   前に頂いたプログラムを改変してみようと思ったのですが、今回の問題が複雑になりすぎてて #   お手上げ状態です。どなたか助けていただけると幸いに思います。 # # /* # histograms.txtという文章ファイルがある。 # このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が # 並んでいて、それらの数字は水平TAB文字によって区切られている。 # このhistograms.txtを自動的に以下の条件のもとに改変して # train.datというファイルとして出力をするプログラムを作れ。 # # 条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。 #     (例 image/0-21C5N550AVL.jpg → 0 #        image/1-19690369.jpg  → 1 #        image/2-24891960.jpg  → 2 #        image/3-12725422.jpg  → 3) # # 条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。 # # 条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、 #     番号:数値?番号:数値?番号:数値?…という形に書き換える #     (例 0  0.0309051 0 0   0.00496689 #      → 2:0.0309051 5:0.00496689 …… ) # # 条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き #              指定した方の名前で出力を行う。 # # */ 'histograms.txtという文章ファイルがある。 このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が 並んでいて、それらの数字は水平TAB文字によって区切られている。 このhistograms.txtを自動的に以下の条件のもとに改変して train.datというファイルとして出力をするプログラムを作れ。 条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。     (例 image/0-21C5N550AVL.jpg → 0        image/1-19690369.jpg  → 1        image/2-24891960.jpg  → 2        image/3-12725422.jpg  → 3) 条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。 条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、     番号:数値?番号:数値?番号:数値?…という形に書き換える     (例 0  0.0309051 0 0   0.00496689      → 2:0.0309051 5:0.00496689 …… ) 条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き              指定した方の名前で出力を行う。' :- 'histograms.txtという文章ファイルがある。このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が並んでいて、それらの数字は水平TAB文字によって区切られている。このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする'. 'histograms.txtという文章ファイルがある。このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が並んでいて、それらの数字は水平TAB文字によって区切られている。このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする' :- 'このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする'. 'このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする' :- 'histograms.txtを項区切りの情報に変換する'(LL0), '条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。'(LL0,LL1), '条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、'(LL1,LL3), '条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。'(LL3,_行ならび), '条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(LL3). 'histograms.txtを項区切りの情報に変換する'(LL0) :- get_split_lines('histograms.txt',['\t'],LL0). '条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。'(LL0,LL1) :- findall([N|R],( member([File|R],LL0), split(File,['/','-'],[_,N|_])), LL1). '条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、'(LL2,LL3) :- findall([N|L],( member([N|R],LL2), 左から順に番号を振った上で要素が0のものを削除し(R,L)), LL3). 左から順に番号を振った上で要素が0のものを削除し(L1,L) :- findall(Nth:A,( append(L0,[A|_],L1), \+(A = 0), length([_|L0],Nth)), L). '条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。'(LL1,L) :- findall(S,( member(L,LL1), atomic_list_concat(LL1,' ',S)), L). '条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(_行ならび) :- 'train.datかtest.datのどちらのファイル名で出力するかを聞き', 整数を得る('1または2のどちらかの数字',(N>=1,N=<2),N), 指定した方の名前で出力を行う(N,_指定した方の名前). 'train.datかtest.datのどちらのファイル名で出力するかを聞き' :- write('ファイル名を選択します。\n1.. train.dat 2.. test.dat \n'). 指定した方の名前で出力を行う :- 指定した方の名前で(_指定した方の名前), 出力を行う(_指定して方の名前,_行ならび). 指定した方の名前で(_指定した方の名前) :- 整数を得る('1または2',(N == 1;N == 2),N), 指定した方の名前で(N,_指定した方の名前). 指定した方の名前(1,'train.dat'). 指定した方の名前(2,'test.dat'). 出力を行う(_指定した方の名前,_行ならび) :- put_lines(_指定した方の名前,_行ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/603 # # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 lこのtxtファイルを読み取って ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), open('書き換え.txt',write,Outstream), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,LL), close(Outstream). ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,[]) :- !. ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,[[_|L]|R) :- 一行出力する(Outstream,L), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,R). 一行出力する(Outstream,L) :- append(L0,[N|R1],L), 要素が0のものを削除し出力する(Outstream,L0,N), R1 = [], write('\n'). 要素が0のものを削除し出力する(Outstream,L0,0) :- !. 要素が0のものを削除し出力する(Outstream,L0,A) :- length([_|L0],Nth), writef(Outstream,'%t:%t ',[Nth,A]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/603 # # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 lこのtxtファイルを読み取って ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), open('書き換え.txt',write,Outstream), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し(Outstream,LL), close(Outstream). ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し(Outstream,LL) :- append(_,[[_|L]|R],LL), append(L0,[N|R1],L), 要素が0のものを削除し表示する(Outstream,Nth,N), R1 = [], write('\n'), R = []. 要素が0のものを削除し表示する(Outstream,Nth,0) :- !. 要素が0のものを削除し表示する(Outstream,Nth,A) :- writef(Outstream,'%t:%t ',[Nth,A]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/603 # # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 lこのtxtファイルを読み取って ファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), ファイル名を削除し(LL,LL1), 右から順に番号を振った上で(LL1,LL2), 要素が0のものを削除し書き換え(LL2,LL3), 書き換えtxtファイルに出力する(LL3). ファイル名を削除し([],[]). ファイル名を削除し([[_|L1]|R1],[L1|R2]) :- ファイル名を削除し(R1,R2). 右から順に番号を振った上で([],[]). 右から順に番号を振った上で([L1|R1],[L2|R2]) :- findall(N-A,( append(_,[A|R],L1), length([_|R],N)), L2), 右から順に番号を振った上で(R1,R2). 要素が0のものを削除し書き換え([],[]). 要素が0のものを削除し書き換え([N-0|R1],R2) :- 要素が0のものを削除し書き換え(R1,R2). 要素が0のものを削除し書き換え([N:A|R1],[N-A|R2]) :- \+(A = 0), 要素が0のものを削除し書き換え(R1,R2). 書き換えtxtファイルに出力する(LL3) :- open('書き換え.txt',write,Outstream), append(_,[L|R],LL3), 行要素を出力する(Ountstream,L), R = [], close(Outstream). 行要素を出力する(Outstream,[]) :- writef(Outstream,'\n'). 行要素を出力する(Outstream,[N:A|R]) :- writef(Outstream,'%t:%t ',[N,A]), 行要素を出力する(Outstream,R). % 以下のサイトは # [1]プログラム演習 # [2] # 一定の文字からなる列sを読み込み、以下の条件を満たす同じ個数の文字からなる列tを出力するプログラムを作りなさい。 # ただし、以下での単語とは空白以外の文字からなる列のこととする。 # 1,s中の単語は同じ順番で t に現われる # 2,t中では単語は一つの空白に区切られる # 3,t中に最初の単語の最初の文字から最後の単語の文字までは列全体のちゅうおうに位置し、前後は空白である # 例えば文字の列 # _This___is__a____good___program___ # を入力すると # ______This_is_a_good_program______ # が出力される。ここで、_は空白を表すものとする。 # [3]C言語 # [4]12/7 # [5]for,while,if文 ポインター 文字列 1,2次配列 関数の書き方 '一定の文字からなる列sを読み込み、以下の条件を満たす同じ個数の文字からなる列tを出力するプログラムを作りなさい。 ただし、以下での単語とは空白以外の文字からなる列のこととする。 1,s中の単語は同じ順番で t に現われる 2,t中では単語は一つの空白に区切られる 3,t中に最初の単語の最初の文字から最後の単語の文字までは列全体のちゅうおうに位置し、前後は空白である' :- '一定の文字からなる列sを読み込み、上記条件を満たす同じ個数の文字からなる列tを出力する'. '一定の文字からなる列sを読み込み、上記条件を満たす同じ個数の文字からなる列tを出力する' :- '一定の文字からなる列sを読み込み'(_s), tの語彙部を確定する(_s,_sの文字列長,_tの語彙部), tの語彙部の前後の文字列を確定する(_tの語彙部,_sの文字列長,_前の空白列,_後の空白列), tを出力する(_前の空白列,_空白を挟んだ連結した語彙,_後の空白列). tの語彙部を確定する(_s,_tの語彙部) :- atom_chars(_s,L_1), length(L_1,_sの文字列長), split(_s,[' '],_語彙ならび),  atomic_list_concat(_語彙ならび,' ',_tの語彙部). tの語彙部の前後の文字列を確定する(_tの語彙部,_sの文字列長,_前の空白列,_後の空白列) :- atom_length(_tの語彙部,_tの語彙部の長さ), _前後の空白合計 is _sの文字列長さ - _tの語彙部の長さ, length(_空白ならび,_前後の空白合計), all(_空白ならび,' '), 空白を割り振る(_空白ならび,_前の空白列,_後の空白列). 空白を割り振る(L,S,S) :- append(L1,L1,L), atomic_list_concat(L1,S),!. 空白を割り振る(L,S1,S2) :- append([_|L1],L1,L), atomic_list_concat(L1,S2), atom_concat(' ',S2,S1). tを出力する(_前の空白列,_空白を挟んだ連結した語彙,_後の空白列) :- atomic_list_concat([_前の空白列,_空白を挟んだ連結した語彙,_後の空白列],_t), writef('%t\n',[_t]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/357 # # ●正規表現の使用環境 # MSVC2012 / .NET Framework 4.5 # # ●検索か置換か? # 検索 # # ●説明 # 「|」「(」「)」が文字として入っているデータから、特定の文字列を抜き出したい。 # # ●対象データ # area|name (value) # # tokyo|yamada benzo (123) # kyoto|namae tarou (21) # saga|shitemo mitukaranai you (7) # # ●希望する結果 # area, name, value # # "tokyo", "yamada benzo", "123" # "kyoto", "namae tarou", "21" # "saga", "shitemo mitukaranai you", "7" # # このように取り出したいのですが、どのように書くとよいでしょうか # # 文字列の整形(_文字列,_整形された文字列) :- split(_文字列,['|','(',')'],L_1), 各要素の末尾の空白を取り除く(L_1,L_2), 文字列に整形する(L_2,'',_整形された文字列). 各要素の末尾の空白を取り除く([],[]). 各要素の末尾の空白を取り除く([A|R1],[B|R2]) :- 末尾の空白を取り除く(A,B), 各要素の末尾の空白を取り除く(R1,R2). 末尾の空白を取り除く(A,B) :- atom_cahrs(A,Chars), append(L1,L2,Chars), all(L2,' '), atomic_list_concat(L1,B),!. 末尾の空白を取り除く(A,A). 文字列に整形する([A],S_1,S) :- atomic_list_concat([S_1,'"',A,'"'],S),!. 文字列に整形する([A|R],S_1,S) :- atomic_list_concat([S_1,'"',A,'", '],S_2), 文字列に整形する(R,S_2,S). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/793 # # [1] 授業単元:プログラミング # [2] 問題文: # http://ime.nu/codepad.org/3HrmfsVo # http://ime.nu/codepad.org/InxgbSAZ # http://ime.nu/codepad.org/99RFoVNY # # /* # プログラムの引数に書籍データのファイルと列数(a) を与える。書籍データのファイルは # c2md.csv である。 # # 各行が1つの書籍データを表している。書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち、 # それらをカンマ(,)で区切って表している。ただし書名にカンマ(,)が含まれる場合には、書名は二重引用符 # (”)で囲まれている。発行年、本体価格は正の整数値で記述されており、情報がない不明の場合は記述がない。 # # a で指定された列だけを表示せよ。 # ただし1行を出版社出版社名を表す文字の配列、書名を表す文字の配列、発行年を表す整数、本体価格 # を表す整数に分解する関数bunkatu を実装することで実現せよ。 # # */ # /* # プログラムの引数に書籍データのファイル(c2md.csv) を与える。各出版社が2000 年から2012 年ま # でに出版した本の冊数を求め、その冊数の多い順に表示せよ。 # ただし出版社名(name)とその出版社が2000 年から2012 年までに出版した本の冊数(pub)を表す以 # 下の構造体bkcmpy を用意する。 # struct bkcmpy { # char name[100]; # int pub; # }; # 各出版社に対して、このbkcmpy を作成し、この構造体の情報を出力することでプログラムを作成せよ。 # # プログラムでは、出版社が全部で150 社以下であることは仮定し、bkcmpy のポインターの配列 # bkcmpydb[150] を用意する。関数touroku ではbkcmpydb と読み込んだ出版社名cname を与える。 # cname が既にbkcmpydb に登録されていたら、その構造体のpub を1 増やし、登録されていなかった # ら、bkcmpy を1つ作成してbkcmpydb に登録する。 # /* # プログラムの引数に書籍データのファイル(c2md.csv) を与える。各出版社が2000 年から2012 年ま # でに出版した本の中で最高価格の本の情報を表示せよ。 # ただし出版社名(name)、書名(book)、発行年(year)、最高価格(price)を表す以下の構造体bkcmpy # を用意する。 # # struct bkcmpy { # char name[100]; # char book[420]; # int year; # int price; # }; # # 各出版社に対して、このbkcmpy を作成し、この構造体の情報を出力することでプログラムを作成せよ。 # # */ 'プログラムの引数に書籍データのファイルと列数(a) を与える。書籍データのファイルはc2md.csv である。各行が1つの書籍データを表している。書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち、それらをカンマ(,)で区切って表している。ただし書名にカンマ(,)が含まれる場合には、書名は二重引用符(”)で囲まれている。発行年、本体価格は正の整数値で記述されており、情報がない不明の場合は記述がない。a で指定された列だけを表示せよ。'(_ファイル名,_列数a) :- get_lines(_ファイル名,_行ならび), 書籍データならびに変換する(_行ならび,_書籍データならび), 空文字でないデータの列数が列数aと一致する情報だけ表示する(_列数a,_書籍データならび). 書籍データならびに変換する([],[]). 書籍データならびに変換する([_行|R1],[[_出版社名,_書名,_発行年,_本体価格]|R2]) :- '書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち'(_行,_出版社名,_書名,_発行年,_本体価格), 書籍データならびに変換する(R1,R2). '書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち'(_書籍データ,_出版社名,_書名,_発行年,_本体価格) :- 二重引用符をエスケープに使ったsplit(_書籍データ,[_出版社名,_書名,_発行年,本体価格]). 二重引用符をエスケープに使ったsplit(_書籍データ,L) :- atom_chars(_書籍データ,_書籍データ文字ならび), 二重引用符をエスケープに使った文字ならびを区切る(_書籍データ文字ならび,L). 二重引用符をエスケープに使った文字ならびを区切る([],[]). 二重引用符をエスケープに使った文字ならびを区切る(L1,[A|R2]) :- 二重引用符にぶつかった(L1,A,R1_2), 二重引用符をエスケープに使った文字ならびを区切る(R1_2,R2),!. 二重引用符をエスケープに使った文字ならびを区切る(L1,[A|R2]) :- カンマ区切りを切り取る(L1,A,R1), 二重引用符をエスケープに使った文字ならびを区切る(R1,R2). 二重引用符にぶつかった(L1,A,R1_2) :- append(L0,['"'|R1],L1), \+(member('''',L0)), append(L1_1,['"'|R1_2],R1), atom_chars(A,L1_1),!. カンマ区切りを切り取る(L1,A,R1) :- append(L0,[','|R1],L1), atom_chars(A,L0),!. 空文字でないデータの列数が列数aと一致する情報だけ表示する(_列数a,_書籍データならび) :- member(L,_書籍データならび), count((member(A,L),\+(A='')),_列数a), writef('%t,%t,%t,%t\n',L), fail. 空文字でないデータの列数が列数aと一致する情報だけ表示する(_列数a,_書籍データならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/70 # # 使用DB:postgresql # # DBにこんなテーブルがあり # name price # りんご 100 # バナナ 200 # みかん 150 # # 手元にこんなCSVデータがあって # りんご,150 # みかん,100 # # CSVのデータを元に一括でUPDATEしたいです。 # name price # りんご 150 # バナナ 200 # みかん 100 # # CSVデータの文字列加工はPHP使うので大体のことは出来ます。 # 最悪1行ずつUPDATEでいいのですが、行数が多いので出来ればSQL発行を1回にしたいです。お願いします。 # # :- dynamic(テーブル/1). 'CSVデータによってテーブルを更新する'(_CSVファイル) :- get_split_lines(_CSVファイル,[','],LL), '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'(LL). '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'([]). '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'([L|R]) :- テーブルを更新する(L), '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'(R). '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'([L|R]) :- テーブルに追加する(L), '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'(R). テーブルを更新する([_1,_2]) :- retract(テーブル(_1,_)), assertz(テーブル(_1,_2)), fail. テーブルを更新する(_). テーブルに追加する([_1,_2]) :- \+(テーブル(_1,_)), assertz(テーブル(_1,_2)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/473 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/rlR3n # # (問題文)ファイルgifts.datからデータを読み込み、 # 構造体のポインタ配列にデータを格納する。この際、利用する分だけ動的に # メモリを確保する。読み込んだ結果は、gifts.datとは別のファイルに出力せよ。 # (ファイル名は自由)また、入力ファイル名を標準入力から指定できるようにせよ。 # # gifts.dat # # JZK-30 jizake_tsumeawase 4500 # BSP-15 Body_soap_set 3000 # BT-200 Bath_towel_set 2500 # TEA-20 koutya_tsumeawase 5000 # # 実行例: # データ数を入力してください:4 # ファイル名を入力してください:gifts.dat # 表示形式変換後ファイルに出力しました 'ファイルgifts.datからデータを読み込む。読み込んだ結果は、表示形式変換後、gifts.datとは別のファイルに出力する' :- データ数を入力してください(_データ数), ファイル名を入力してください(_ファイル名), 'ファイルgifts.datからデータを読み込む。'(_データ数,LL), 表示形式変換後(LL,_項ならび), '読み込んだ結果は、gifts.datとは別のファイルに出力する'(_ファイル名,_項ならび). ファイル名を入力してください(_ファイル名) :- write('出力ファイル名を入力してください: '), get_line(_ファイル名). データ数を入力してください(_データ数) :- 数を得る(データ数,_データ数). 'ファイルgifts.datからデータを読み込む。'(_データ数,LL) :- open('gifts.dat',read,Instream), 'Instreamからデータを読み込む。'(Instream,_データ数,LL), close(Instream). 'Instreamからデータを読み込む。'(Instream,_データ数,[]) :- at_end_of_stream(Instream),!. 'Instreamからデータを読み込む。'(Instream,0,[]) :- !. 'Instreamからデータを読み込む。'(Instream,N,[L|R]) :- get_split_line(Instream,[' '],L), N_1 is N - 1, 'Instreamからデータを読み込む。'(Instream,N_1,R). 表示形式変換後([],[]). 表示形式変換後([L|R1],[P|R2]) :- P =.. [gifts|L], 表示形式変換後(R1,R2). 'gifts.datとは別のファイルに出力する'(_ファイル名,L) :- open(_ファイル名,write,Outstream), 'gifts.datとは別のOustreamに出力する'(Outstream,L), close(Oustream), write('表示形式変換後ファイルに出力しました\n'). 'gifts.datとは別のOustreamに出力する'(Outstream,L) :- append(_,[P|R],L), writef(Outstream,'%t.\n',[P]), R = []. % 以下のサイトは # 出典:: 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/1276873238/829 # # 問題 # 数独の解答が9行9列の文字列で与えられたとき正しいかどうか判定せよ。 # # '数独の解答が9行9列の文字列で与えられたとき正しいかどうか'(_文字列) :- '数独の解答が9行9列の文字列で与えられたとき'(_文字列,LL), 数独の回答が正しい(LL). '数独の解答が9行9列の文字列で与えられたとき'(_9行9列の文字列,LL) :- split(9行9列の文字列,['\n'],_行ならび), '9行9列の行ならびを行列に変換'(_行ならび,LL). '9行9列の行ならびを行列に変換'([],[]). '9行9列の行ならびを行列に変換'([_行|R1],[L|R2]) :- findall(N,( sub_atom(_行,_,1,_,A), atom_number(A,N)), L), '9行9列の行ならびを行列に変換'(R1,R2). 数独の回答が正しい(LL) :- '行・列要素の数独の解答は正しい'(LL), 矩形要素の数独の解答も正しい(LL). '行・列要素の数独の解答は正しい'(LL) :- 行要素の数独診断(LL), 転置(LL,LL2), 行要素の数独診断(LL2). 行要素の数独診断([]). 行要素の数独診断([L1|R]) :- 一意の数が9個(L1), 行要素の数独診断(R). 矩形要素の数独の解答も正しい([]). 矩形要素の数独の解答も正しい([L1,L2,L3|R1],L) :- 転置([L1,L2,L3],LL1), 矩形要素診断(LL1), 矩形要素の数独の解答も正しい(R1,R2). 矩形要素診断([]). 矩形要素診断([L1,L2,L3|R]) :- append(L1,L2,L3,L), 一意の数が9個(L), 矩形要素診断(R). 一意の数が9個(L1) :- sort(L1,L2), length(L2,9). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/238 # # [1] 授業単元:C言語プログラム # [2] 問題文: # http://ime.nu/codepad.org/yL0GUnrC # \\次のような家計簿データkakeibo.datがテキストでかかれてあり、中身を見ると \\meat 125 1 \\rice 2000 1 \\juice 110 10 \\となっているものとする。このうち右端は商品名、真ん中は単価、左端は数量を表して \\いる。このようなデータを読み取って使用金額の合計を計算するプログラミングを作り \\たい。以下のプログラムをコンパイルがとおり、目的の動作をするように直接書き込み \\なさい。(どこを補うべきかも考えること)ただし商品名は空欄を含まない文字列とする。 # # #include # #include # # #define FILENAME "kakeibo.dat" # # int goukei(FILE *fp); # # # int main(){ # FILE *fp; # # fp = fopen(FILENAME,"r"); # if(fp==NULL){ # fprintf(stderr,"%s is not found!\n",FILENAME); # exit(1); # } # # printf("goukei = %d\n",goukei(fp)); # } # # int goukei(FILE *fp){ # int sum =0, tanka, suryou, # char str[50]; # while (fscanf()!=EOF){ # } # return ; # } '次のような家計簿データkakeibo.datがテキストでかかれてあり、中身を見ると meat 125 1\\nrice 2000 1\\njuice 110 10\\n となっているものとする。このうち右端は商品名、真ん中は単価、左端は数量を表している。このようなデータを読み取って使用金額の合計を計算する'(_使用金額の合計) :- '家計簿データkakeibo.dat(各行の右端は商品名、真ん中は単価、左端は数量を表している)を読み取って使用金額の合計を計算する'(_使用金額の合計). '家計簿データkakeibo.dat(各行の右端は商品名、真ん中は単価、左端は数量を表している)を読み取って使用金額の合計を計算する'(_使用金額の合計) :- findsum(_使用金額,( '家計簿データkakeibo.dat(各行の右端は商品名、真ん中は単価、左端は数量を表している)を読み取って使用金額の'(_使用金額)), _使用金額の合計). '家計簿データkakeibo.dat(各行の右端は商品名、真ん中は単価、左端は数量を表している)を読み取って使用金額の'(_金額) :- get_split_lines('kakeibo.dat',[' ',','],LL), member([_品物,_単価,_数量],LL), _金額 is _単価 * _数量. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/965 # # 休憩時間が設定されているときに、指定日時より'HH:MM'後の時刻を求めたいです。 # # ・データベース:PostgreSQL 8.4 # ・テーブル: # 休憩時間 # 開始時刻 終了時刻 # 08:00 08:30 # 19:00 19:30 # 22:00 22:30 # # 使うかどうかわかりませんが、次のマスタもあります。 # カレンダー # 日付 # ... # 2012-07-26 # 2012-07-27 # 2012-07-28 # ... # # ・説明 # 指定した日時から休憩時間を除いた'HH:MM'後を計算します。 # 計算結果が休憩時間内(開始終了時刻を含む)の場合は、休憩時間終了時刻を結果とします。 # # ・欲しい結果 # '2012-07-27 09:00'の'09:00'後 => '2012-07-27 18:00'(休憩時間がないのでそのまま足す) # '2012-07-27 09:00'の'10:00'後 => '2012-07-27 19:30'(10時間後は19:00の休憩と重なるので、19:30が答え) # '2012-07-27 09:00'の'11:00'後 => '2012-07-27 20:30' # '2012-07-27 09:00'の'13:00'後 => '2012-07-27 23:00'(19:00〜と22:00〜の二回の休憩を挟む) # # '指定した日時から休憩時間を除いたHH:MM後を計算します。計算結果が休憩時間内(開始終了時刻を含む)の場合は、休憩時間終了時刻を結果とします。'(_起点時刻,_時間後,_時間後の時刻) :- 休憩時間ならびと就業時間ならびを生成する(_休憩時間ならび,_就業時間ならび), 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす(_休憩時間ならび,_起点時刻,_時間後,_更新された起点時刻,_更新された時間後), 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_更新された起点時刻,_最後の休憩終了時刻,_更新された時間後,_就業時間ならび,_時間後の時刻). 休憩時間ならびと就業時間ならびを生成する(_就業時間ならび) :- findall([_開始時刻,_終了時刻],( 休憩時間(_開始時刻,_終了時刻)), _休憩時間ならび), 就業時間ならびを生成する(L,_就業時間ならび). 就業時間ならびを生成する([],[]). 就業時間ならびを生成する([[A,B],[C,D]|R1],[[B,C]|R2]) :- 就業時間ならびを生成する([[C,D]|R1],R2). 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([],_起点時刻,_時間後,0,_時間後の時刻) :- _時間後の時刻 is _起点時刻 + _時間後,!. 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([[_休憩起点時刻,_休憩終了時刻]|R1],_起点時刻,0,_時間後の時刻) :- _休憩起点時刻 @>= _起点時刻, 時間の引き算(_休憩起点時刻,_起点時刻,_休憩起点時刻までの時間), _休憩起点時刻までの時間 @>= _時間後, 時間の足し算(_起点時刻,_時間後,_時間後の時刻),!. 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([[_休憩起点時刻,_休憩終了時刻]|R1],_起点時刻,_更新された時間後,_休憩終了時刻) :- _休憩起点時刻 @>= _起点時刻, 時間の引き算(_休憩起点時刻,_起点時刻,_休憩起点時刻までの時間), _休憩起点時刻までの時間 @< _時間後, 時間の引き算(_時間後,_休憩起点時刻までの時間,_更新された時間後),!. 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([[_休憩起点時刻,_休憩終了時刻]|R1],_起点時刻,_時間後,_更新された時間後,_更新された時間後時刻) :- \+(_休憩起点時刻 @>= _起点時刻), 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす(R1,_起点時刻,_時間後,_更新された時間後,_更新された時間後時刻). 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_時間後の時刻,_,0,_,_時間後の時刻) :- !. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_,_時間後,[],_時間後の時刻) :- 時間の足し算(_起点時刻,_時間後,_時間後の時刻),!. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_,_時間後,[[A,B]|R1],_時間後の時刻) :- 時間の引き算(B,A,_次の就業時間枠), _時間後 @=< _次の就業時間枠, 時間の足し算(A,_時間後,_時間後の時刻),!. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_最後の休憩終了時刻,_時間後,[[A,B]],_時間後の時刻) :- 時間の引き算(B,A,_次の就業時間枠), 時間の引き算(_時間後,_次の就業時間枠,_更新された時間後), 時間の足し算(_最後の休憩終了時刻 +_時間後,_時間後の時刻),!. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_最後の休憩終了時刻,_時間後,[[A,B],[C,D]|R1],_時間後の時刻) :- 時間の引き算(B,A,_次の就業時間枠), 時間の引き算(_時間後,_次の就業時間枠,_更新された時間後), 時間の足し算(C,_時間後,_時間後の時刻),!. 時間の引き算(_時刻_1,_時刻_2,_時刻_3) :- '時刻から年・月・日・時・分を得る'(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1), '時刻から年・月・日・時・分を得る'(_時刻_2,_年_2,_月_2,_日_2,_時_2,_分_2), 時間の引き算(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1,_年_2,_月_2,_日_2,_時_2,_分_2,_年,_月,_日,_時,_分), atomic_list_concat([_年,-,_月,-,_日,' ',_時,':',_分],_時刻_3). 時間の足し算(_時刻_1,_時刻_2,_時刻_3) :- '時刻から年・月・日・時・分を得る'(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1), '時刻から年・月・日・時・分を得る'(_時刻_2,_年_2,_月_2,_日_2,_時_2,_分_2), 時間の足し算(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1,_年_2,_月_2,_日_2,_時_2,_分_2,_年,_月,_日,_時,_分), atomic_list_concat([_年,-,_月,-,_日,' ',_時,':',_分],_時刻_3). '時刻から年・月・日・時・分を得る'(_時刻,_年,_月,_日,_時,_分) :- split(_時刻,['-',':',' '],[_年,_月,_日,_時,_分]),!. 時間の足し算(_年_1,_月_1,_日_1,_時_1,_分_1,_年_2,_月_2,_日_2,_時_2,_分_2,_年,_月,_日,_時,_分) :- _年_3 is _年_1 + _年_2, _月_3 is _月_1 + _月_2, _日_3 is _日_1 + _日_2, _時_3 is _時_1 + _時_2, _分_3 is _分_1 + _分_2, 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分). 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- _分_3 >= 60, _分_4 is _分_3 - 60, _時_4 is _時_3 + 1, 時間の補正(_年_3,_月_3,_日_3,_時_4,_分_4,_年,_月,_日,_時,_分),!. 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- _時_3 >= 24, _時_4 is _時_3 - 24, _日_4 is _日_3 + 1, 時間の補正(_年_3,_月_3,_日_4,_時_4,_分_3,_年,_月,_日,_時,_分),!. 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- 月末補正(_年_3,_月_3,_日_3,_月_4,_日_4), 時間の補正(_年_3,_月_4,_日_4,_時_3,_分_3,_年,_月,_日,_時,_分). 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- _月_3 > 12, _年_4 is _年_3 + 1, 時間の補正(_年_4,1,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分),!. 時間の補正(_年,_月,_日,_時,_分,_年,_月,_日,_時,_分). 月末補正(_年_3,_月_3,_日_3,_月_4,_日_4) :- % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/107 # # [1] 授業単元:C言語プログラム # [2] 問題文: # 以下のファイルsdata.txtに入っている商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、 # それらの結果を画面表示するとともに、ファイルodata2.txtに書き込むプログラムを作成せよ。 # 但し、以下の内容のデータファイルsdata.txtをemacsであらかじめ作成しておくこと。 # [sdata.txtの内容](商品名、単価、売り上げ個数) # coffee 250 75 # tea 270 52 # milk 300 22 # juice 350 54 # coke 300 36 # 'ファイルsdata.txtに入っている商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、ファイルodata2.txtに書き込む' :- open('sdata.txt',read,Instream), open('odata2.txt',write,Outstream), 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream), close(Outstream), close(Instream). 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream) :- at_end_of_stream(Instream). 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream) :- '商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め'(Instream,_商品名,_単価,_売り上げ個数,_商品別の売上高), 'それらの結果を画面表示するとともに、Outstreamに書き込む'(Outstream,_商品名,_単価,_売り上げ個数,_商品別の売上高), 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream). '商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め'(Instream,_商品名,_単価,_売り上げ個数,_商品別の売上高) :- get_line(Instream,Line), split(Line,[' '],[_商品名,_単価,_売り上げ個数]), _商品別の売上高 is _単価 * _売上個数. 'それらの結果を画面表示するとともに、Outstreamに書き込む'(Outstream,_商品名,_単価,_売り上げ個数,_商品別の売上高) :- writef('%t %t %t %t\n',[_商品名,_単価,_売り上げ個数,_商品別の売上高]), writef(Outstream,'%t %t %t %t\n',[_商品名,_単価,_売り上げ個数,_商品別の売上高]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/71 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/TO8Kg 問題です。 # http://ime.nu/ideone.com/ZvUuR 課題を提出したら関数の定義 #              をしろといわれました。 # http://ime.nu/ideone.com/Nd5ir 自分なりにやったのですが #              ここからができませんでしたので #              よろしくお願いします。 # # 生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙するプログラムkadai12.c を書きなさい。ただしファイル名は画面から入力されるものとする(scanf()を使う)。 # ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分からないものとする。 # # ヒント: # ○何をしなければならないかを大まかに書き下してみよう。 #  1. ファイルのオープン(これに先立ってファイル名を取得する必要がある) #  2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう) #  3.データの読み込み #  4.BMIの算出 #  5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい) #  6. 画面表示 # # ○BMIとは? # BMIは次のようにして計算されるものとする。 # BMI値=体重(キログラム)/(身長(メートル))^2 # '^2'は二乗を意味する。 # このBMI値が25を越えると、肥満とみなされる。 # # ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。 '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。ただしファイル名は画面から入力されるものとする。' :- '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL), 'BMI値を計算し'(LL,LL1), 'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1). '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL) :- write('データファイル名を入力してください : '), get_line(_データファイル名), get_split_lines(_データファイル名,[' ',','],LL). 'BMI値を計算し'(LL1,LL2) :- findall([_BMI値,_氏名],( member([_氏名,_身長,_体重],LL1), 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値)), LL2). /* 'BMI値を計算し'([],[]). 'BMI値を計算し'([[_氏名,_身長,_体重]|R1],[[_BMI値,_氏名]|R2]) :- 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値), 'BMI値を計算し'(R1,R2). */ 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値) :- _BMI値 is _体重 / _身長 ^ 2. 'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1) :- 'BMI値が大きいもの順に'(LL1,LL3), その人のBMI値および肥満か否かを列挙する(LL3). 'BMI値が大きいもの順に'(LL1,LL3) :- sort(LL1,LL2), reverse(LL2,LL3). その人のBMI値および肥満か否かを列挙する(LL3) :- append(_,[[_BMI値,_氏名]|R],LL3), 'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,_肥満判定), writef('%t は %t。\n',[_氏名,_肥満判定]), R = []. 'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,肥満です) :- _BMI値 > 25.0,!. 'このBMI値が25を越えると、肥満とみなされる。'(_,肥満ではない). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/945 # # ・DBMS名とバージョン MySQL 5.1 # ・テーブルデータ # CSVファイル # "犬","シベリアンハスキー" # "猫","マンチカン" # "熊猫","レッサーパンダ" # ・欲しい結果 # インポートして、次のようにしたい、要するに連番をつけたい # ID 動物 種類 # 1 犬 シベリアンハスキー # 2 猫 マンチカン # 3 熊猫 レッサーパンダ # ・説明 # インポートするときにdefaultをつければいいのですが、SQL文で書けないでしょうか。 # 'CSVファイルを連番をつけてインポートする'(_CSVファイル) :- 'CSVファイルを'(_CSVファイル,LL), 連番をつけてインポートする(LL). 'CSVファイルを'(_CSVファイル,LL) :- get_split_lines(_csvファイル,[','],LL). 連番をつけてインポートする(LL) :- append(L0,[L|R],LL), 連番をつけて(L0,L,P), assertz(P), R = []. 連番をつけて(L0,L,P) :- length([_|L0],N), P =.. [テーブル,N|L]. % 課題の文("インポートして、次のようにしたい、要するに連番をつけたい")を % 若干組み替えて、"CSVファイルを連番をつけてインポートする"とした。 % 一般論としては好ましいことではないが、述語定義をしていくうちに、これは % 課題の文に問題があるということになって遡って定義を書き換えることはある。 % Prologは国語だの所以か。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/23 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/jE2IX # # あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示するプログラムkadai10-1.cを作ってみよう。 # kadai10-1.cでは次のようなmain()を定義したとする。 # # #include # #include # # void display_file(FILE *fp); # # int main() { # char INFILENAME[100]; //ファイル名を格納する文字列 # FILE *in_fp; # scanf("%s", INFILENAME); //ファイル名をキーボード入力 # in_fp = fopen(INFILENAME, "r"); //ファイルを開く # if (in_fp == NULL) {//ファイルが開けない場合はin_fpがNULLになる。(ファイルが見付からない時等) # fprintf(stderr, "I cannot open %s\n", INFILENAME);//標準エラー出力にエラーメッセージを出力 # exit(1); # } # # display_file(in_fp); //ファイルの中身を全部画面表示する関数 # fclose(in_fp); //ファイルを閉じる # } # # ○ 上記main関数の中の void display_file(FILE *fp)を以下の仕様を満たすように定義し、kadai10-1.cを完成させなさい。 # 読み込むファイルはscanfにてキーボード入力するが、このとき、 /usr4/yamauchi/yamauchi/data/test.dat を指定する。これを表示すると、 # 1.000000 1.136735 # 1.010000 1.137647 # 1.020000 1.137143 # 1.030000 1.137957 # 1.040000 1.142641 # 1.050000 1.153101 # ..... # と数値が1行に2個ずつ列挙されている。これらのデータを読み取って # # 1.000000 # 1.136735 # 1.010000 # 1.137647 # ... # のように1行に1つずつ数値を列挙するように定義しなさい。但し、ファイルポインターがファイルの最後か否かを判定する関数として # int feof(FILE *fp)が準備されている。この使いかたは次で調べよ。 # man feof # すると、使用方法が表示される。 display_file(Instream) :- get_split_lines(Instream,[' '],LL), flat(LL,L), append(_,[V|R],L), writef('%t\n',[V]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/930 # # ・DBMS名とバージョン # SQLite3 # ・テーブルデータ # tbl1 tid(auto), name(text) # tbl2 tid(int), sid(int) # tbl3 sid(auto), tag(text),type(int) # # ざっとこんな感じでnameに対して複数のタグを持っている # といった感じのテーブルに対して、データを入れたいと思っています。 # で、バックアップがCSVで「name,tag...」という形式で大量にあるのですが、 # タグテーブルに無ければ追加、名前テーブルに追記、連結データを追加、 # と手数が思ってた以上に多いので、 # 挿入の手数をもう少し減らせる手段とかありませんか? # 'バックアップがCSV(「name,tag...」)の情報を追加する'(_バックアップCSVファイル) :- open(_バックアップCSVファイル,read,Instream), 'Instreamの情報を追加する'(Instream), close(Instream). 'Instreamの情報を追加する'(Instream) :- at_end_of_stream(Instream). 'Instreamの情報を追加する'(Instream) :- get_line(Instream,Line), split(Line,[','],[_name|_tagならび]), テーブルに追加する(_name,_tagならび), 'Instreamの情報を追加する'(Instream). テーブルに追加する(_name,_tagならび) :- tbl1(_tid,_name), 'tag情報をtbl3とtbl2に追加する'(_tid,_tagならび),!. テーブルに追加する(_name,_tagならび) :- \+(tbl1(_tid,_name)), 新しいtidを取得する(_tid), assertz(tbl1(_tid,_name)), 'tag情報をtbl3とtbl2に追加する'(_tid,_tagならび). 'tag情報をtbl3とtbl2に追加する'(_tid,_tagならび) :- append(_,[_tag|R],_tagならび), 新しいsidを取得する(_sid), assertz(tbl3(_sid,_tag)), assertz(tbl2(_tid,_sid)), R = [],!. 新しいtidを取得する(_tid) :- repeat, _tid is random(99999999) + 1, \+(tbl1(_tid,_)),!. 新しいsidを取得する(_sid) :- repeat, _sid is random(99999999) + 1, \+(tbl3(_sid,_)),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/978 # # [1] 授業単元:C言語演習 # [2] 問題文: # ../test/read.cgi/tech/1339338438/976のプログラムを修正して、メッセージ転送時間の平均値を計算するaverage関数を追加し、main関数側で平均メッセージ転送時間も出力するようにせよ。 # '実験データは、あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージの転送時間の平均値を出力する'(_実験データファイル) :- 実験データは(_実験データファイル,_実験データ行ならび), 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データ行ならび). 実験データは(_実験データファイル,_実験データ行ならび) :- get_split_lines(_実験データファイル,_実験データ行ならび). 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージの転送時間の平均値を出力する'(_実験データ行ならび) :- findavg(_転送時間,( member(_行文字列,_実験データ行ならび), メッセージ毎の転送時間(_行文字列,_メッセージの転送時間)), _転送時間の平均値), writef('転送時間の平均値は %t 秒です\n',[_転送時間の平均値]). メッセージ毎の転送時間(_行文字列,_メッセージの転送時間) :- split(_行文字列,[' '],[_メッセージ番号,_メッセージの発生時刻,_メッセージの到達時刻]), _メッセージの転送時間 is _メッセージの到達時刻 - _メッセージの発生時刻. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/976 # # [1] 授業単元:C言語演習 # [2] 問題文: # 以下の実験データは、あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。 # 以下のリストの< >の処理をコメントに従って埋め、メッセージ毎の転送時間を出力するプログラムを作成せよ。 # 但し、メッセージ転送時間は、メッセージ発生時刻との差である。 # <実験データ> # メッセージ番号 発生時刻[ミリ秒] 到着時刻[ミリ秒] # 0        0         25 # 1        5         30 # 2        10         38 # 3        15         50 # 4        20         52 # 5        25         55 # 6        30         57 # 7        35         60 # 8        40         65 # 9        45         70 # <リスト> # http://ime.nu/codepad.org/PW5VddGM # #include # struct MESSAGE # { # int gene; # int end; # int delay; # }; # # void delay(struct MESSAGE data[], int i); # # int main(void) # { # struct MESSAGE data[10]; int i; # //<メッセージの発生時刻と到着時刻の値の代入> # for (i=0; i<=9; i++) # { # delay(data, i); # prinff("メッセージ%dの転送時間は%dミリ秒 \n",i, data[i].delay); # } # } # # void delay(struct MESSAGE data[], int i) # { # //<メッセージiの転送時間の計算> # } # '実験データは、あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データファイル) :- 実験データは(_実験データファイル,_実験データ行ならび), 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データ行ならび). 実験データは(_実験データファイル,_実験データ行ならび) :- get_split_lines(_実験データファイル,_実験データ行ならび). 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データ行ならび) :- append(_,[_行文字列|R],_実験データ行ならび), メッセージ毎の転送時間を(_行文字列,_メッセージ番号,_メッセージの転送時間), writef('%t %t\n',[_メッセージ番号,_転送時間]), R = []. メッセージ毎の転送時間を(_行文字列,_メッセージ番号,_メッセージの転送時間) :- split(_行文字列,[' '],[_メッセージ番号,_メッセージの発生時刻,_メッセージの到達時刻]), _メッセージの転送時間 is _メッセージの到達時刻 - _メッセージの発生時刻. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/817 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # # the fox jumps over the dogs backというアルファベット文字列があるとする。 # 最後は"."で仕切られているかどうかは問わない. # 文字列には数字は含まないことにする. # 大文字は小文字に変換する. # そしてこれらを単語ごとに分解してその文字列を保持しなさい. # そのとき構造体をつかい単語の文字数、対応する文字のASCIIコードを納める配列を作りデータを入れなさい. # つまり構造体は以下のような形に例えば設定する; # # struct dict {char word[NMOJI]; int nchar; int asciiword[NMOJI]; int order; } ; # # ここでNMOJIは単語のことを考慮した一般的な数を想定してこの定義の前で#defineで設定しておく.orderは次で使う. # 1、すべての単語を整列させなさい.並び順は辞書にしたがう.順位をorderにしまいなさい. # 2、すべての単語を辞書整列分に並べなさい.これはorderに従う. # 3、単語を文字数の少ない分に並べなさい.これはncharに従う. # まず上の例文で試しなさい.続いてWebで適当に集めた文書で独自に試しなさい. # # 文字列データの取り扱いでは、ポインタを使ってプログラムを作りなさい. # # # 'the fox jumps over the dogs backというアルファベット文字列があるとする。最後は"."で仕切られているかどうかは問わない.文字列には数字は含まないことにする.大文字は小文字に変換する.そしてこれらを単語ごとに分解してその文字列を保持しなさい.' 大文字は小文字に変換する('the fox jumps over the dogs back',_大文字を小文字に変換した文字列), 単語ごとに分解して(_大文字を小文字に変換した文字列,_単語ならび), assertz(単語ならび(_単語ならび)). 大文字は小文字に変換する(_文字列,_大文字を小文字に変換した文字列) :- to_lower(_文字列,_大文字を小文字に変換した文字列). 単語ごとに分解して(_大文字を小文字に変換した文字列,_単語ならび) :- split(_大文字を小文字に変換した文字列,[' '],_単語ならび). 'すべての単語を整列させなさい.並び順は辞書にしたがう.順位をorderにしまいなさい'(_整列し順位付けられた単語ならび) :- 単語ならび(_単語ならび), すべての単語を整列させて順位付けする(_単語ならび,_整列し順位付けられた単語ならび). すべての単語を整列させて順位付けする(_単語ならび,_整列し順位付けられた単語ならび) :- sort(_単語ならび,_整列した単語ならび), findall([_順位,_単語],( nth1(_順位,_整列した単語ならび,_単語)), _整列し順位付けられた単語ならび). '単語を文字数の少ない分に並べなさい'(_文字数の少ない順の単語ならび) :- 単語ならび(_単語ならび), findall([_文字数,_単語],( member(_単語,_単語ならび), atom_length(_単語,_文字数)), L), sort(L,L2), findall(_単語,( member([_,_単語],L2)), _文字数の少ない順の単語ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/817 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # # the fox jumps over the dogs backというアルファベット文字列があるとする。 # 最後は"."で仕切られているかどうかは問わない. # 文字列には数字は含まないことにする. # 大文字は小文字に変換する. # そしてこれらを単語ごとに分解してその文字列を保持しなさい. # そのとき構造体をつかい単語の文字数、対応する文字のASCIIコードを納める配列を作りデータを入れなさい. # つまり構造体は以下のような形に例えば設定する; # # struct dict {char word[NMOJI]; int nchar; int asciiword[NMOJI]; int order; } ; # # ここでNMOJIは単語のことを考慮した一般的な数を想定してこの定義の前で#defineで設定しておく.orderは次で使う. # 1、すべての単語を整列させなさい.並び順は辞書にしたがう.順位をorderにしまいなさい. # 2、すべての単語を辞書整列分に並べなさい.これはorderに従う. # 3、単語を文字数の少ない分に並べなさい.これはncharに従う. # まず上の例文で試しなさい.続いてWebで適当に集めた文書で独自に試しなさい. # # 文字列データの取り扱いでは、ポインタを使ってプログラムを作りなさい. # # # 'the fox jumps over the dogs backというアルファベット文字列があるとする。最後は"."で仕切られているかどうかは問わない.文字列には数字は含まないことにする.大文字は小文字に変換する.そしてこれらを単語ごとに分解してその文字列を保持しなさい.' 大文字は小文字に変換する('the fox jumps over the dogs back',_大文字を小文字に変換した文字列), 単語ごとに分解して(_大文字を小文字に変換した文字列,_単語ならび), assertz(単語ならび(_単語ならび)). 大文字は小文字に変換する(_文字列,_大文字を小文字に変換した文字列) :- to_lower(_文字列,_大文字を小文字に変換した文字列). 単語ごとに分解して(_大文字を小文字に変換した文字列,_単語ならび) :- split(_大文字を小文字に変換した文字列,[' '],_単語ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/918 # # ・DBMS名とバージョン # MySQL5 # ・テーブルデータ # name (verchar) # # abc040 # abc100 # abc90 # abc20 # abc1000 # # ・欲しい結果 # nameはユニーク # abcは固定、そのあとに数値文字列 # ソートして、数値文字列の大きい順に抽出したい # # abc1000 # abc100 # abc90 # abc040 # abc20 # # ・説明 # '欲しい結果 nameはユニーク abcは固定、そのあとに数値文字列 ソートして、数値文字列の大きい順に抽出したい'(_name) :- findall([N,_name], テーブルデータ(_name), sPLIT(_name,[abc],[_,N])), L), 降順にソートする(L1,L3), member([_,_name],L3). 降順にソートする(L1,L3) :- sort(L1,L2), reverse(L2,L3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/791 # # [1] 授業単元:C言語演習 # [2] 問題文: # ある教科の5人の得点の入った整数型配列 x[5] および2つの整数型変数max,minを引数とし # 最高点と最低点を計算する関数maxminを作成せよ。 # そして5人の数学、英語、国語の得点をキーボードからそれぞれ配列m[5], e[5], j[5]に入力すると # 各教科の最高点と最低点を計算して表示するプログラムをmaxmin関数を利用して作成せよ。 # <条件> # 引数maxおよびminは、参照によるアドレス渡しで受け取る。maxmin関数はvoid型となる。 # 'ある教科の5人の得点の入った ならび _x および2つの整数型変数_max,_minを引数とし最高点と最低点を計算する'([_得点],_得点,_得点) :- !. 'ある教科の5人の得点の入った ならび _x および2つの整数型変数_max,_minを引数とし最高点と最低点を計算する'([_得点|R],_max,_min) :- 'ある教科の5人の得点の入った ならび _x および2つの整数型変数_max,_minを引数とし最高点と最低点を計算する'(R,_max,_min), 'max,minの更新'(_得点,_max_1,_min_1,_max,_min). 'max,minの更新'(_得点,_max_1,_min_1,_max,_min) :- maxの更新(_得点,_max_1,_max), minの更新(_得点,_min_1,_min). maxの更新(_得点,_max_1,得点) :- _得点 > _max_1,!. maxの更新(_得点,_max_1,_max_1). minの更新(_得点,_min_1,得点) :- _得点 < _max_1,!. minの更新(_得点,_min_1,_min_1). '5人の数学、英語、国語の得点をキーボードから入力すると各教科の最高点と最低点を計算して表示する' :- '5人の数学、英語、国語の得点をキーボードから入力すると'(LL), '各教科の最高点と最低点を計算して表示する'(LL). '5人の数学、英語、国語の得点をキーボードから入力すると'(LL) :- '5人の'(LL), '数学、英語、国語の得点をキーボードから入力すると'(LL). '5人の'(LL) :- length(LL,5). '数学、英語、国語の得点をキーボードから入力すると'(LL) :- findall([_数学,_英語,_国語],( nth1(_,LL,_), get_split_line([',',' '],[_数学,_英語,_国語])), LL). '各教科の最高点と最低点を計算して表示する'(LL) :- nth(N,[数学,英語,国語],_教科), 教科の得点ならび(N,LL,_教科の得点ならび), 'ある教科の5人の得点の入った ならび _x および2つの整数型変数_max,_minを引数とし最高点と最低点を計算する'(L,_最高点,_最低点), writef('教科: %t 最高点: %t 最低点: %t\n',[_教科,_最高点,_最低点]), N = 3. 教科の得点ならび(N,LL,_教科の得点ならび) :- findall(_得点,( member([_数学,_英語,_国語],LL), nth1(N,[_数学,_英語,_国語],_得点)), _教科の得点ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/784 # # [1] 授業単元:C 言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/JrW6n1Q3 # 上記プログラムで作成したファイルを読み込んで中身を次のフォーマットで表示する関数 # void display_b(FILE *in_fp); # を作成し、その動作を確認するプログラムkadai11-2.cを作りなさい。 # ただし、ファイル名はプロトタイプ宣言で指定すること。 # また、出力は以下の出力例に示すフォーマットで画面出力されるものとする。 # # gcc kadai11-2.c # ./a.out # 1.000000 1.292166 # 1.010000 1.294241 # 1.020000 1.293094 # 1.030000 1.294946 # 1.040000 1.305628 # 1.050000 1.329642 # 1.060000 1.368... # 'ファイルを読み込んで中身を整形したフォーマットで表示する' :- フォーマットを推測する(' 1.000000 1.292166',_表示フォーマット), ファイルを読み込んで(LL), get_split_lines('test_bin.dat',LL), 整形したフォーマットで表示する(_表示フォーマット,LL). ファイルを読み込んで(LL) :- get_split_lines('test_bin.dat',[' '],LL). 整形したフォーマットで表示する(_表示フォーマット,[]). 整形したフォーマットで表示する(_表示フォーマット,[_要素ならび|R]) :- writef(_表示フォーマット,_要素ならび), 整形したフォーマットで表示する(_表示フォーマット,R). フォーマットを推測する(_文字列,_表示フォーマット) :- 要素ならびとして取り出す(_文字列,_要素ならび), フォーマット要素を推測する(_要素ならび,_表示フォーマットならび), atomic_list_concat(_表示フォーマットならび,_表示フォーマット). フォーマット要素を推測する([],['\n']) :- !. フォーマット要素を推測する([''|R1],R2) :- フォーマット要素を推測する(R1,R2),!. フォーマット要素を推測する([_要素|R1],[F|R2]) :- 要素は浮動小数点数(_要素,F), フォーマット要素を推測する(R1,R2),!. フォーマット要素を推測する([S|R1],[S|R2]) :- sub_atom(S,0,1,_,' '), フォーマットを推測する(R1,R2),!. フォーマット要素を推測する([S|R1],['%t'|R2]) :- フォーマットを推測する(R1,R2). 要素は浮動小数点数(_要素,F) :- sub_atom(_要素,S,1,_残り文字数,'.'), sub_atom(_要素,0,S,_,_小数点以上文字列), atomic_list_concat(['~',_残り文字数,f],F),!. 要素ならびとして取り出す(_文字列,[S1,S2|R1]) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 'S2は空白に挟まれている'(L1,L2,L3), 要素ならびとして取り出す(S3,R1),!. 要素ならびとして取り出す(_,[]) :- !. 'S2は空白に挟まれている'(L1,L2,L3) :- all(L1,' '), \+(member(' ',L2)), \+((L3 = [A|_],\+(A=' '))),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/188 # # 【課題】以下のようなクラス(名前は各自決める)を定義せよ。 # mainメソッドを呼び出すと、別のスレッドthを生成し、スタートさせる。 # mainメソッドは、プロンプトとして”Command> “を印字し、キーボードからの入力を待つ。 # 入力は、以下のようなadd, removeなどを先頭とするいくつかの文字列で、 # それを何らかの方法でスレッドthに渡し、ふたたび “Command> “を印字して次の入力を待つ。 # Command> add <文字列> # スレッドthでは、mainから受け取った<文字列>の部分を取り出し、 # thの中で管理するLinkedListの要素に加える(add)。一方、 # Command> remove <文字列> とすると該当する文字列をLinkedListから消す。そのほか、 # Command> print とでき、printはLinkedListにある要素をすべて印字し # Command> exit exitはスレッドを停止し、それを待ってmainメソッドを終了する # ものである。 # 上記以外の入力は無視する。 # (ヒント:書き方はたくさんありますが、たとえば前回のProducer Consumerの例を考えてください。 # 片方が生成(入力された文字列をMqueueに格納)、他方がそれを読み出すと考えます。 # もちろんもっと簡単な方法もあると思います。上記の仕様通りに動いていれば正解です。 # 【 形態 】1. Javaアプリケーション(main()で開始) # 【GUI】4.制限なし # 【 期限 】 今日(7/14)中 # 【 Ver  】 1.7.0_03 # 【 補足 】宜しくお願いします! # # 影を用いて情報を管理する :- 取り次ぎ(_取り次ぎ), コマンドを得る(_コマンド行), 影を生み出す(影(_取り次ぎ),_影,[]), 影を用いて情報を管理する(_取り次ぎ,_命令). 影を用いて情報を管理する(_取り次ぎ,exit). 影を用いて情報を管理する(_取り次ぎ,コマンド行) :- コマンドを得る(_コマンド_2), thread_send_message(_取り次ぎ,コマンド_2), 影を用いて情報を管理する(_取り次ぎ,コマンド行_2). コマンドを得る(_コマンド行) :- write('コマンド>> '), get_line(_コマンド行). 影(_取り次ぎ) :- 言伝からコマンドを得る(_取り次ぎ,_命令,R), 影(_取り次ぎ,_命令,R,[],L). 影(_取り次ぎ,_命令,_付加情報,L_1,L) :- コマンドの実行(_取り次ぎ,_コマンド,L_1,L_2), 言伝を送る(_取り次ぎ,ok), 言伝からコマンドを得る(_取り次ぎ,_命令_2,_付加情報_2), 影(_取り次ぎ,_命令_2,_付加情報_2,L_2,L). 言伝からコマンドを得る(_取り次ぎ,_命令,R) :- 言伝を取り出す(_取り次ぎ,_言伝,[]), split(_言伝,[' '],[_命令|R]). コマンドの実行(add,[_情報],L_1,[_情報|L_1]). コマンドの実行(delete,[_情報],L_1,L_2) :- ならびから削除(_情報,L_1,L_2). コマンドの実行(print,[],L_1,L_1) :- writef('%t\n',[L_1]). コマンドの実行(_コマンド,_,L_1,L_1) :- writef('%tコマンドは存在しません。\n',[_コマンド]). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. キューを保存する(L) :- tell('キュー保存.pro'), write(L), write('.\n'), told. 影を生み出す(Term,_影,Option) :- thread_create(Term,_影,Option). 影を終わる :- thread_self(_番号), thread_detach(_番号). 取り次ぎ(_取り次ぎ) :- message_queue_create(_取り次ぎ). 言伝を取り出す(_取り次ぎ,_言伝,_限界時間) :- thread_get_message(_取り次ぎ,_言伝,[timeout(_限界時間)]). 言伝を取り出す(_言伝) :- thread_get_message(_言伝). 言伝を送る(_番号,_言伝) :- thread_send_message(_番号,_言伝). 取り次ぎを立てる(_取り次ぎ) :- message_queue_create(_取り次ぎ,[]). 取り次ぎを解消する(_取り次ぎ) :- message_queue_destroy(_取り次ぎ). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/768 # # 数字が並んだテキストファイルからいくつかの数字だけを取り出して # 表示したいです. # 例:hoge.txt # 78 3 44 89 # 22 31 44 88 99 53 # 3 4 7 9 9 7 6 # 例えば上記のテキストデータですと, # 各行の最初の2つの数字以降の数字を取り出して # 表示したいです. # なお,読み込むテキストデータは行も列も不定になっています. # 上記のテキストデータは1行目は4列ですが,他の行は4列とは限りません. # なるべく簡単な関数で書けるとありがたいです. # 環境はvisual studio2010で書いてます. # # 初心者ですみません.よろしくお願いします. # '数字が並んだテキストファイルからいくつかの数字だけを取り出して表示する。各行の最初の2つの数字以降の数字を取り出して表示したい'(_テキストファイル) :- get_split_lines(_テキストファイル,[' '],LL), 各行の最初の2つの数字以降の数字を取り出して表示したい(LL,R), R = []. 各行の最初の2つの数字以降の数字を取り出して表示したい(LL,R) :- 各行の最初の2つの数字以降の数字を取り出して(LL,L,R), 表示したい(L). 各行の最初の2つの数字以降の数字を取り出して(LL,L,R) :- append(_,[[_,_|L]|R],LL). 表示したい(L) :- length(L,_要素数), length(L1,_要素数), all(L1,'%t'), atomic_list_concat(L1,' ',_表示パターン), writef(_表示パターン,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/737 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/hx5VH # # 試験の各科目の点数を、受験者ごとに「出席番号 体育 美術 英語 数学 社会」の順番でテキストファイルに記録する。なお、出席番号は数字4桁、科目の点数は100点を満点とする。 # #  例: #    0001 55 66 66 77 77 # 0002 44 55 33 44 33 # 0003 33 43 53 53 53 # . # . # # 1,出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をファイルに記録するプログラムの作成。 # なお出力ファイル名はコマンドライン引数で与えることとし、出席番号に数字以外の文字が入力された場合にデータの入力を終了せよ。 # # 2,作成したファイルを読み込み、受験者ごとの合計点、順位を求め「出席番号 合計点 順位」 # の順にファイルに出力するプログラムを作成せよ。出力は成績順に並び替えなくとも良い。ただし、 # 入力ファイル名と出力ファイル名はコマンドライン引数で与えるものとする。 # # ファイル処理について習いました。stdin やFILE構造体、書式付き入出力、 # ブロック単位の入出力(size_t fwrite(const void *ptr, size_t size,size_t nmemb,FILE *stream) ) # などを習いました '作成したファイルを読み込み、受験者ごとの合計点、順位を求め「出席番号 合計点 順位」の順にファイルに出力する'(_入力ファイル,_出力ファイル) :- '作成したファイルを読み込み'(LL), '受験者ごとの合計点、順位を求め'(LL,LL3), '「出席番号 合計点 順位」の順にファイルに出力する'(_出力ファイル,LL3),!. '作成したファイルを読み込み'(LL) :- get_split_lines(_入力ファイル,[' '],LL). '受験者ごとの合計点、順位を求め'(LL,LL3) :- findall([_合計点,_出席番号],( 受験者ごとの(LL,_出席番号,_体育,_美術,_英語,_数学,_社会), 合計点(_体育,_美術,_英語,_数学,_社会,_合計点)), LL1), 順位を求め(LL1,LL3). 受験者ごとの(LL,_出席番号,_体育,_美術,_英語,_数学,_社会) :- member([_出席番号,_体育,_美術,_英語,_数学,_社会],LL). 合計点(_体育,_美術,_英語,_数学,_社会,_合計点) :- _合計点 is _体育 + _美術 + _英語 + _数学 + _社会. 順位を求め(LL1,LL3) :- 合計点の大きい順に(LL1,LL2), 順位を張る(1,LL2,LL3). 合計点の大きい順に(LL1,LL2) :- sort(LL1,LL3), reverse(LL3,LL2). 順位を張る([],[]). 順位を張る(_順位,[[_合計点,_出席番号_1],[_合計点,_出席番号_2]|R1],[[_出席番号_1,_合計点,_順位]|R2]) :- 順位を張る(_順位,[[_合計点,_出席番号_2]|R1],R2),!. 順位を張る(_順位,[[_合計点,_出席番号]|R1],[[_出席番号,_合計点,_順位]|R2]) :- _順位_2 is _順位 + 1, 順位を張る(_順位_2,R1,R2). '「出席番号 合計点 順位」の順にファイルに出力する'(_出力ファイル,LL) :- open(_出力ファイル,write,Outstream), append(_,[[_出席番号,_合計点,_順位]|R],LL), writef(Outstream,'%t %t %t\n',[_出席番号,_合計点,_順位]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/583 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # ttp://codepad.org/HyKUuIuz 課題1 # [問1] あるファイルtest.datの中にテキストで実数が羅列されている。 # この実数を読み込んで表示するプログラムkadai10-1.cを作ってみよう。 # kadai10-1.cでは次のようなmain()を定義したとする # # ttp://codepad.org/kp0BBQjU  課題2 # [問2] 上記プログラムを拡張して、読み込んだデータにある変換を施して # 別のファイルに保存するプログラムkadai10-2.cを作ろう。\ # kadai10-1.cで読み込んだファイルを改めて眺めると、1行に2つの数値が書いてある。 # この各行の2番め(右端)の数値を「2乗したもの」に置き換えて別のファイルに # 保存する関数 void convert_data(FILE *in_fp, FILE *out_fp)を定義し、 # この動作を確認するプログラムkadai10-2.cを作りなさい。 # ただし、void convert_data(FILE *in_fp, FILE *out_fp)はin_fpからデータを読み取って、 # out_fpに書き込むものとする。 # # cat /usr4/yamauchi/yamauchi/data/test.dat # 1.000000 1.136735 # 1.010000 1.137647 # 1.020000 1.137143 # 1.030000 1.137957 # 1.040000 1.142641 # 1.050000 1.153101 # ..... # # ヒント: kadai10-2.cのmain()の例:みどりの文字がkadai10-1に新しく加えた部分 'ファイルtest.datを読み込み各行の2番め(右端)の数値を「2乗したもの」に置き換えて別のファイルtest2.datに保存する' :- get_split_lines('test.dat',[' ',','],LL_1), findall([_第一項,_第二項の二乗],( append(_,[[_第一項,_第二項]|R],LL_1), _第二項の二乗 is _第二項 ^ 2), LL_2), '別のファイルtest2.datに保存する'('test2.dat',LL_2). '別のファイルtest2.datに保存する'('test2.dat',LL) :- open('test2.dat',write,Outstream), append([A,B],LL), writef(Outsteam,'%t %t\n',[A,B]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/583 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # ttp://codepad.org/HyKUuIuz 課題1 # [問1] あるファイルtest.datの中にテキストで実数が羅列されている。 # この実数を読み込んで表示するプログラムkadai10-1.cを作ってみよう。 # kadai10-1.cでは次のようなmain()を定義したとする # # ttp://codepad.org/kp0BBQjU  課題2 # [問2] 上記プログラムを拡張して、読み込んだデータにある変換を施して # 別のファイルに保存するプログラムkadai10-2.cを作ろう。\ # kadai10-1.cで読み込んだファイルを改めて眺めると、1行に2つの数値が書いてある。 # この各行の2番め(右端)の数値を「2乗したもの」に置き換えて別のファイルに # 保存する関数 void convert_data(FILE *in_fp, FILE *out_fp)を定義し、 # この動作を確認するプログラムkadai10-2.cを作りなさい。 # ただし、void convert_data(FILE *in_fp, FILE *out_fp)はin_fpからデータを読み取って、 # out_fpに書き込むものとする。 # # cat /usr4/yamauchi/yamauchi/data/test.dat # 1.000000 1.136735 # 1.010000 1.137647 # 1.020000 1.137143 # 1.030000 1.137957 # 1.040000 1.142641 # 1.050000 1.153101 # ..... # # ヒント: kadai10-2.cのmain()の例:みどりの文字がkadai10-1に新しく加えた部分 'あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示する' :- 'あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで'(_実数ならび), 表示する(_実数ならび). 'あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで'(_実数ならび) :- get_split_lines('test.dat',[' ',','],_実数ならびのならび), 平坦化(_実数ならびのならび,_実数ならび). 表示する(_実数ならび) :- append(_,[_実数|R],_実数ならび), writef('%t\n',[_実数]), R = []. % get_split_lines/3 % 平坦化/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/455 # # [1] 授業単元: C言語 # [2] 質問: # datファイルから行列A,ベクトルx,bを読み込みAx=bを解く問題です。 # 以下のようにコードを書いてみたのですが問題が多くコンパイルできません。 # おかしなところが多いと思いますがアドバイスいただけると助かります # http://ime.nu/ideone.com/V7ztM # # input_sp.dat # # 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 # 1.000000 3.000000 3.000000 3.000000 3.000000 3.000000 3.000000 3.000000 3.000000 3.000000 # 1.000000 3.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 # 1.000000 3.000000 5.000000 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 # 1.000000 3.000000 5.000000 7.000000 9.000000 9.000000 9.000000 9.000000 9.000000 9.000000 # 1.000000 3.000000 5.000000 7.000000 9.000000 11.000000 11.000000 11.000000 11.000000 11.000000 # 1.000000 3.000000 5.000000 7.000000 9.000000 11.000000 13.000000 13.000000 13.000000 13.000000 # 1.000000 3.000000 5.000000 7.000000 9.000000 11.000000 13.000000 15.000000 15.000000 15.000000 # 1.000000 3.000000 5.000000 7.000000 9.000000 11.000000 13.000000 15.000000 17.000000 17.000000 # 1.000000 3.000000 5.000000 7.000000 9.000000 11.000000 13.000000 15.000000 17.000000 19.000000 # # 10.000000 28.000000 44.000000 58.000000 70.000000 80.000000 88.000000 94.000000 98.000000 100.000000 # # 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 # 'datファイルから行列A,ベクトルx,bを読み込みAx=bを解く'(_x) :- get_split_lines('input_sp.dat',[' '],LL), append(LL0,[[]|R],LL), '行列Aを得る'(LL0,_A), 'ベクトルbを得る'(R,_b), 'Ax=bを解く'(_A,_b,_x). '行列Aを得る'(LL0,_A) :- findall(L2,( member(L1,LL0), 全要素を数値に変換(L1,L2)), member(_項,L1), _A). 'ベクトルbを得る'([L|_],_b) :- 全要素を数値に変換(L,L1), ベクトルに変換(L1,_b). 全要素を数値に変換([],[]). 全要素を数値に変換([A|R1],[N|R2]) :- atom_number(A,N), 全要素を数値に変換(R1,R2),!. 全要素を数値に変換([A|R1],[N|R2]) :- atom_to_term(A,N,_), 全要素を数値に変換(R1,R2). ベクトルに変換([],[]).) ベクトルに変換([V|R1],[[V]|R2]) :- ベクトルに変換(R1,R2). 'Ax=bを解く'(_A,_b,_x) :- 逆行列(_A,_A_1), '行列の掛算'(_A_1,_b,_x). % 行列の掛算/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/413 # # [1] 授業単元: C言語 # [2] 問題文:http://ime.nu/codepad.org/je2akZ6u # #include # # int main(){ # int num[100]; # int data, i, j; # FILE* FP; # # //データの個数を入力 # printf("データの個数を入力してください。"); # scanf("%d", &data); # # //読み込み # FP = fopen("readFile.txt","r"); # # for(i=0; i&nplt;dat&npgta; i++){ # fscanf(FP,"%d", &num[i]); # } # fclose(FP); # # //書き込み # FP = fopen("writeFile.txt","w"); # for(i=0; i&nplt;data; i++){ # fprintf(FP,"%d ", num[i]); # } # fclose(FP); # return(0); # } # writeFile.txtの表示を # 11 22 33 44 55 # 66 77 88 99 00 # にするにはどうすればいい? # 'データの個数を入力し、readFile.txtを読み、昇順にデータを並べ替えて、writeFile.txtに一行5データずつ出力する' :- 'まずデータの個数を入力し'(_データの個数), 'readFile.txtを読み'(_データの個数,_データならび), '昇順にデータを並べ替えて'(_データならび,_昇順に整列したデータならび), 'ファイルwriteFile.txtに5データ毎に改行して書き込む'(_昇順に整列したデータならび). 'まずデータの個数を入力し'(_学生の人数) :- 整数を得る(データの個数,_データの個数). 'readFile.txtを読み'(_データの個数,_データならび) :- get_split_lines('readFile.txt',[' '],LL), 平坦化(LL,_データならび_1), データの個数分を切り取る(_データの個数,_データならび_1,_データならび). データの個数分を切り取る(_データの個数,_データならび_1,_データならび) :- length(_データならび_1,_要素数), _要素数 >= _データの個数, length(_データならび,_データの個数), append(_データならび,_,_データならび_1),!. データの個数分を切り取る(_,_データならび,_データならび). '昇順にデータを並べ替えて'(_データならび,_昇順に整列したデータならび) :- 整列(_データならび,_昇順に整列したデータならび). 整列([],[]). 整列([_軸要素|_着目した科目の成績ならび],_昇順に整列した着目した科目の成績ならび) :- 分割(_軸要素,_着目した科目の成績ならび,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび), 整列(_軸要素より小さい成績ならび,_整列した軸要素より小さい成績ならび), 整列(_軸要素より大きい成績ならび,_整列した軸要素より大きい成績ならび), append(_整列した軸要素より小さい成績ならび,[_軸要素|_整列した軸要素より大きい成績ならび],_昇順に整列した着目した科目の成績ならび). 分割(_,[],[],[]). 分割(_軸要素,[[_成績,_No]|R1],[[_成績,_No]|_軸要素より小さい成績ならび],_軸要素と等しいか大きい成績ならび) :- _成績 @<_軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 分割(_軸要素,[[_成績,_No]|R1],_軸要素より小さい成績ならび,[[_成績,_No]|_軸要素と等しいか大きい成績ならび]) :- _成績 @>= _軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 'ファイルwriteFile.txtに5データ毎に改行して書き込む'(_整列した得点ならび) :- '得点ならびを頭部零文字列ならびに変換'(_整列した得点ならび,_頭部零文字列ならび), open('writeFile.txt',write,Outstream), 'Outstreamに書き込む'(Outstream,_頭部零文字列ならび), close(Outstream). '5データ毎にOutstreamに書き込む'(_,[]) :- !. '5データ毎にOutstreamに書き込む'(Outstream,_頭部零文字列ならび) :- '5データ毎に'(_得点ならび,A,B,C,D,E,_残りならび), writef(Outstream,'%t %t %t %t %t\n',[A,B,C,D,E]), '5データ毎にOutstreamに書き込む'(Outstream,_残りならび). '5データ毎に'([A,B,C,D,E|_残りならび],A,B,C,D,E,_残りならび) :- !. '5データ毎に'(_得点ならび,A,B,C,D,E,[]) :- append(_得点ならび,L1,[A,B,C,D,E]), all(L1,'00'). '得点ならびを頭部零文字列ならびに変換'([],[]) :- !. '得点ならびを頭部零文字列ならびに変換'([N|R1],[A|R2]) :- 頭部零文字列(2,N,A), '得点ならびを頭部零文字列ならびに変換'(R1,R2). 頭部零文字列(_N桁,_整数,_頭部零文字列) :- length(L,_N桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,'0'), atomic_list_concat(L,_頭部零文字列),!. 頭部零文字列(_N桁,_整数,_頭部零文字列) :- number_chars(_整数,Chars), atomic_list_concat(Chars,_頭部零文字列). % 平坦化/2 % ここでは使っていない'N個組'/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/399 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # まず学生の人数(100人以下)を入力し、成績結果のファイルseiseki.txtを読み、 # それから国語または数学、英語の点数のどれかに注目した小から大への順番に従ってデータを並べ替えて、 # write.txtに出力するプログラムを作成しなさい。 # 例 # seiseki.txt # No. 国語 数学 英語 # 1  90 80 70 # 2   85 75 65 # 3   80 70 60 # 4   75 65 55 # 5   70 60 50 # # 学生の人数を入力してください。6 # 科目番号を入力してください。 # 1:国語、2:数学、3:英語 # 2 # # write.txt # 5 70 60 50 # 4 75 65 55 # 3 80 70 60 # 2 85 75 65 # 1 90 80 70 # 'まず学生の人数(100人以下)を入力し、成績結果のファイルseiseki.txtを読み、それから国語または数学、英語の点数のどれかに注目した小から大への順番に従ってデータを並べ替えて、write.txtに出力する' :- 'まず学生の人数(100人以下)を入力し'(_学生の人数), '成績結果のファイルseiseki.txtを読み'(_学生の人数,_成績ならび), 'それから国語または数学、英語の点数のどれかに注目'(_注目した科目,_成績ならび,_着目した科目の成績ならび), '小から大への順番に従ってデータを並べ替えて'(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび), 'write.txtに出力する'(_昇順に整列した着目した科目の成績ならび,_成績ならび). 'まず学生の人数(100人以下)を入力し'(_学生の人数) :- 整数を得る(学生の人数,_学生の人数 =< 100,_学生の人数). '成績結果のファイルseiseki.txtを読み'(_学生の人数,_成績ならび) :- get_split_lines('seiseki.txt',[' '],LL), 平坦化(LL,_成績ならび_1), 学生の人数分を切り取る(_学生の人数,_成績ならび_1,_成績ならび). 学生の人数分を切り取る(_学生の人数,_成績ならび_1,_成績ならび) :- length(_成績ならび_1,_要素数), _要素数 >= _学生の人数, length(_成績ならび,_学生の人数), append(_成績ならび,_,_成績ならび_1),!. 学生の人数分を切り取る(_学生の人数,_成績ならび,_成績ならび). 'それから国語または数学、英語の点数のどれかに注目'(_注目した科目,_成績ならび,_注目した科目の成績ならび) :- 注目した科目を選択する(_注目した科目), findall([_注目した科目の成績,_No],( member([_No,_国語,_数学,_英語],_成績ならび), 注目した科目成績を選択する(_注目した科目,[_国語,_数学,_英語],_注目した科目の成績)), _注目した科目の成績ならび). 注目した科目を選択する(_注目した科目) :- write('国語、数学、英語のうち、注目した科目を入力してください : '), get_line(Line), '診断: 注目した科目を選択する'(Line,_注目した科目),!. 注目した科目を選択する(_注目した科目) :- 注目した科目を選択する(_注目した科目). '診断: 注目した科目を選択する'(_注目した科目,_注目した科目) :- member(_注目した科目,[国語,数学,英語]),!. '診断: 注目した科目を選択する'(Line,_注目した科目) :- write('入力された %t は国語、数学、英語のいずれでもありません。再入力をお願いします。\n',[Line]), fail. 注目した科目成績を選択する(国語,[_国語,_数学,_英語],_国語). 注目した科目成績を選択する(数学,[_国語,_数学,_英語],_数学). 注目した科目成績を選択する(英語,[_国語,_数学,_英語],_英語). '小から大への順番に従ってデータを並べ替えて'(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび) :- 整列(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび). 整列([],[]). 整列([_軸要素|_着目した科目の成績ならび],_昇順に整列した着目した科目の成績ならび) :- 分割(_軸要素,_着目した科目の成績ならび,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび), 整列(_軸要素より小さい成績ならび,_整列した軸要素より小さい成績ならび), 整列(_軸要素より大きい成績ならび,_整列した軸要素より大きい成績ならび), append(_整列した軸要素より小さい成績ならび,[_軸要素|_整列した軸要素より大きい成績ならび],_昇順に整列した着目した科目の成績ならび). 分割(_,[],[],[]). 分割(_軸要素,[[_成績,_No]|R1],[[_成績,_No]|_軸要素より小さい成績ならび],_軸要素と等しいか大きい成績ならび) :- _成績 @<_軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 分割(_軸要素,[[_成績,_No]|R1],_軸要素より小さい成績ならび,[[_成績,_No]|_軸要素と等しいか大きい成績ならび]) :- _成績 @>= _軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 'write.txtに出力する'(_昇順に整列した着目した科目の成績ならび,_成績ならび) :- open('write.txt',write,Outstream), 'Outstreamへ出力'(Outstream,_昇順に整列した着目した科目の成績ならび,_成績ならび), close(Outstream). 'Outstreamへ出力'(Outstream,_昇順に整列した着目した科目の成績ならび,_成績ならび) :- append(_,[[_成績,_No]|R],_昇順に整列した着目した科目の成績ならび), member([_No,_国語,_数学,_英語],_成績ならび), writef(Outstream,'%t %t %t %t\n',[_No,_国語,_数学,_英語]), R = []. % 平坦化/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/375 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # ファイル double.txt に複数個の実数が記されている。 # この実数の個数を入力し、それからファイル double.txt に記されている実数を読み込み、 # それらを小さい物から大きい物の順番に並び替えて、ファイル sort.txt に書き出すプログラムを作成しなさい。 # ただしファイル double.txt に記されている実数の個数は50個以下とする # 'ファイル double.txt に複数個の実数が記されている。この実数の個数を入力し、それからファイル double.txt に記されている実数を読み込み、それらを小さい物から大きい物の順番に並び替えて、ファイル sort.txt に書き出す' :- 実数の個数を入力する(_実数の個数), get_split_lines('double.txt',[' ','\n',','],L1), それらを小さい物から大きい物の順番に並び替えて(L1,L2), 'ファイル sort.txt に書き出す'(_実数の個数,L2). 実数の個数を入力する(_実数の個数) :- 整数を得る(実数の個数,_実数の個数). それらを小さい物から大きい物の順番に並び替えて([],[]). それらを小さい物から大きい物の順番に並び替えて([_軸要素|R1],L2) :- 分割(_軸要素,R1,_軸要素より小さい要素ならび,_軸要素と等しいか大きい要素ならび), それらを小さい物から大きい物の順番に並び替えて(_軸要素より小さい要素ならび,_整列した軸要素より小さい要素ならび), それらを小さい物から大きい物の順番に並び替えて(_軸要素と等しいか大きい要素ならび,_整列した軸要素と等しいか大きい要素ならび), append(_整列した軸要素より小さい要素ならび,[_軸要素|_整列した軸要素と等しいか大きい要素ならび],L2). 分割(_,[],[],[]). 分割(_軸要素,[_要素|R1],[_要素|R2],R3) :- _要素 @< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[_要素|R1],R2,[_要素|R3]) :- _要素 @>= _軸要素, 分割(_軸要素,R1,R2,R3). 'ファイル sort.txt に書き出す'(_実数の個数,L) :- length(L0,_実数の個数), append(L0,_,L). open('sort.txt',write,Outstream), 'Outstreamに書き出す'(Outstream,L0), close(Outstream). 'Outstreamに書き出す'(_,[]). 'Outstreamに書き出す'(Outstream,[_要素|R]) :- writef(Outstream,'%t\n',[_要素]), 'Outstreamに書き出す'(Outstream,R). % 整数を得る/2 % get_split_lines/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/28 # # ../test/read.cgi/tech/1340383120/27 # うあ!早々にありがとうございます。 # あまえついでに検索対象が「単語」になった場合はどうしたら良いでしょうか? # # # ●正規表現の使用環境 # Java7 # # ●検索か置換か? # 検索 # # ●説明 # # 複数ある文字行からの検索で【単語A】【単語B】をand/or検出 # # ●対象データ # # むかしむかし、おじいさんは山に芝刈りに、おばあさんは川に洗濯に行きました(改行)浦島太郎はかめにのって海に出て行きました(改行) # そうすると、おじいさんは「わたしは小さなつづらでよい」といいました(改行) # # ●希望する結果 # # 「おじいさん」and「おばあさん」 # むかしむかし、おじいさんは山に芝刈りに、おばあさんは川に洗濯に行きました(改行) # 「おじいさん」or 「おばあさん」 # むかしむかし、おじいさんは山に芝刈りに、おばあさんは川に洗濯に行きました(改行)そうすると、おじいさんは「わたしは小さなつづらでよい」といいました(改行) # '複数ある文字行からの検索で一行中に「おじいさん」and 「おばあさん」を含む行を抽出する方法'(_複数ある文字行,_適合行) :- split(_複数ある文字列,['\n'],_文字行ならび), member(_適合行,_文字行ならび), '一行中に「おじいさん」and 「おばあさん」を含む行を'(_適合行). '一行中に「おじいさん」and 「おばあさん」を含む行を'(_文字行) :- sub_atom(_文字行,_,_,_,'おじいさん'), sub_atom(_文字行,_,_,_,'おばあさん'),!. '複数ある文字行からの検索で一行中に「おじいさん」or 「おばあさん」を含む行を抽出する方法'(_複数ある文字行,_適合行) :- split(_複数ある文字列,['\n'],_文字行ならび), member(_適合行,_文字行ならび), '一行中に「おじいさん」or 「おばあさん」を含む行を'(_適合行). '一行中に「おじいさん」or 「おばあさん」を含む行を'(_文字行) :- sub_atom(_文字行,_,_,_,おじいさん),!, '一行中に「おじいさん」or 「おばあさん」を含む行を'(_文字行) :- sub_atom(_文字行,_,_,_,おばあさん),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/26 # # 教えてください。複数行からのある文字列を含んだ # 行の検索の記述方法です # # ●正規表現の使用環境 # Java7 # # ●検索か置換か? # 検索 # # ●説明 # 複数ある文字行からの検索で # 一行中に[A]and[C]を含む行を抽出する方法 # 一行中に[K]or[S]を含む行を抽出する方法 # # # ●対象データ # ABCDEFG # HIJKLMN # OPQRSTU # # ●希望する結果 # ABCDEFG (A and C) # HIJKLMN と OPQRSTU  (K or S) # # # # '複数ある文字行からの検索で一行中に[A]and[C]を含む行を抽出する方法'(_複数ある文字行,_適合行) :- split(_複数ある文字列,['\n'],_文字行ならび), member(_適合行,_文字行ならび), '一行中に[A]and[C]を含む行を'(_適合行). '一行中に[A]and[C]を含む行を'(_文字行) :- sub_atom(_文字行,_,1,_,'A'), sub_atom(_文字行,_,1,_,'C'),!. '複数ある文字行からの検索で一行中に[K]or[S]を含む行を抽出する方法'(_複数ある文字行,_適合行) :- split(_複数ある文字列,['\n'],_文字行ならび), member(_適合行,_文字行ならび), '一行中に[K]or[S]を含む行を'(_適合行). '一行中に[K]or[S]を含む行を'(_文字行) :- sub_atom(_文字行,_,1,_,'K'),!, '一行中に[K]or[S]を含む行を'(_文字行) :- sub_atom(_文字行,_,1,_,'S'),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/61 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク):違うPCからテキストファイルをダウンロードするプログラムを作れ。 #               サーバでファイルを一行ずつ読み込み送信する。クライアントでは受信をしてファイルに書き込む。 # server :- open_server(Socket,NewSocket), open_server_stream(NewSocket,Instream,Outstream), server_to_client(Insteam,Outstream,Instream_2), close_server_stream(Instream,Outstream), close_server_socket(Socket,NewSocket). open_server(Port,Socket,NewSocket) :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket). open_server_stream(Newsocket,Instream,Outstream) :- open(NewSocket,read,Instream), open(NewSocket,write,Outstream). server_to_client(Insteam,Outstream,Instream_2) :- get_file_name(Instream,File), open(File,read,Instream_2), server_to_client(Instream_2,Outstream), close(Instream_2). get_file_name(Instream,File,Outstream) :- get_line(Instream,Line), sub_atom(Line,0,4,_,'GET '), split(Line,['"'],[_,File|_]), write(Outstream,'OK filename\n\n'). server_to_client(Instream_2,Outstream) :- at_end_of_stream(Instream_2),!. server_to_client(Instream_2,Outstream) :- get_char(Instream_2,Char), put_char(Outstream,Char), server_to_client(Instream_2,Outstream). close_server_stream(Instream,Outstream) :- close(Instream), close(Outstream). close_server_socket(Socket,NewSocket) :- socket_shutdown(Socket), socket_shutdown(NewSocket). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% client(Host,Port,File) :- open_client(Host,Port,Socket), client_server_to_client(Socket,File), close_client(Socket,Instream,Outstream). open_client(Host,Port,Socket,Instream,Outstream) :- socket(internet,stream,Socket), socket_connect(Socket, Host : Port), open(Socket,read,Instream), open(Socket,write,Outstream). client_server_to_clieint(Socket,File,Instream,Outstream) :- writef(Outstream,'%t\n',[File]), clieint_server_to_client(Instream,Outstream,Outstream_2). client_server_to_client(Instream,Outstream,File,Outstream_2) :- open(File,write,Outstream_2), client_セッション_1(Instream,Outstream), client_セッション_2(Instream,Outstream,Outstream_2), close(Outstream_2). client_セッション_2(Instream,Outstream_2) :- at_end_of_stream(Instream),!. client_セッション_2(Instream,Outstream_2) :- get_line(Instream,Line), writef(Outstream_2'%t\n',[Line]), client_セッション_2(Instream,Outstream_2). clieint_セッション_1(Instream,Outstream) :- writef('GET %t\n\n',[File]), get_line(Instream,Line_1), get_line(Instream,''), sub_atom(Line_1,0,4,_,'GET '). close_client(Socket,Instream,Outstream) :- close(Instream), close(Outstream), socket_shutdown(Socket). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/61 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク):違うPCからテキストファイルをダウンロードするプログラムを作れ。 #               サーバでファイルを一行ずつ読み込み送信する。クライアントでは受信をしてファイルに書き込む。 # server :- open_server(Socket,NewSocket), open_server_stream(NewSocket,Instream,Outstream), server_to_client(Insteam,Outstream,Instream_2), close_server_stream(Instream,Outstream), close_server_socket(Socket,NewSocket). open_server(Port,Socket,NewSocket) :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket). open_server_stream(Newsocket,Instream,Outstream) :- open(NewSocket,read,Instream), open(NewSocket,write,Outstream). server_to_client(Insteam,Outstream,Instream_2) :- get_file_name(Instream,File), open(File,read,Instream_2), server_to_client(Instream_2,Outstream), close(Instream_2). get_file_name(Instream,File,Outstream) :- get_line(Instream,Line), sub_atom(Line,0,4,_,'GET '), split(Line,['"'],[_,File|_]), write(Outstream,'OK filename\n\n'). server_to_client(Instream_2,Outstream) :- at_end_of_stream(Instream_2),!. server_to_client(Instream_2,Outstream) :- get_char(Instream_2,Char), put_char(Outstream,Char), server_to_client(Instream_2,Outstream). close_server_stream(Instream,Outstream) :- close(Instream), close(Outstream). close_server_socket(Socket,NewSocket) :- socket_shutdown(Socket), socket_shutdown(NewSocket). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% client(Host,Port,File) :- open_client(Host,Port,Socket), client_server_to_client(Socket,File), close_client(Socket,Instream,Outstream). open_client(Host,Port,Socket,Instream,Outstream) :- socket(internet,stream,Socket), socket_connect(Socket, Host : Port), open(Socket,read,Instream), open(Socket,write,Outstream). client_server_to_clieint(Socket,File,Instream,Outstream) :- writef(Outstream,'%t\n',[File]), clieint_server_to_client(Instream,Outstream,Outstream_2). client_server_to_client(Instream,Outstream,File,Outstream_2) :- open(File,write,Outstream_2), client_セッション_1(Instream,Outstream), client_セッション_2(Instream,Outstream,Outstream_2), close(Outstream_2). client_セッション_2(Instream,Outstream_2) :- at_end_of_stream(Instream),!. client_セッション_2(Instream,Outstream_2) :- get_line(Instream,Line), writef(Outstream_2'%t\n',[Line]), client_セッション_2(Instream,Outstream_2). clieint_セッション_1(Instream,Outstream) :- writef('GET %t\n\n',[File]), get_line(Instream,Line_1), get_line(Instream,''), sub_atom(Line_1,0,4,_,'GET '). close_client(Socket,Instream,Outstream) :- close(Instream), close(Outstream), socket_shutdown(Socket). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/54 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/Q5HCQPvq # 上記のプログラムを参考にしてa君、b君、c君の5教科(英語、数学、国語、理科、社会)の試験の得点をそれぞれ # a[5]={55,32,67,61,77};,b[5]={74,80,56,78,42};,c[5]={38,67,78,62,82}; と初期化する。 # 但し上記の3つの配列の要素番号0,1,2,3,4の得点は、それぞれ英語、数学、国語、理科、社会の得点に対応する。 # このとき、教科別の3人の平均点を求めるプログラムをポインタ配列を用いて作成せよ。 # 'a君、b君、c君の5教科(英語、数学、国語、理科、社会)の試験の得点をそれぞれ a[5]={55,32,67,61,77};,b[5]={74,80,56,78,42};,c[5]={38,67,78,62,82}; と初期化する。' :- split(_文字列,[';','=[5]','{','}'],L), 定義情報の選択(L,_君,_英語,_数学,_国語,_理科,_社会,R), 得点を定義する(_君,[英語,数学,国語,理科,社会],[_英語,_数学,_国語,_理科,_社会]), R = []. 定義情報の選択(L,_君,_英語,_数学,_国語,_理科,_社会,R) :- append(Ln,[_君,_英語,_数学,_国語,_理科,_社会|R],L), length(Ln,Len), 0 is Len mod 6. 得点を定義する(_,[],[]). 得点を定義する(_君,[_科目|R1],[_得点|R2]) :- assertz(得点(_君,_科目,_得点)), 得点を定義する(_君,R1,R2). 教科別の3人の平均点を求める(_科目,_相加平均) :- 教科別の3人の平均点を求める(_科目別相加平均ならび), member([_科目,_相加平均],_科目別相加平均ならび). 教科別の3人の平均点を求める(_科目別相加平均ならび) :- finsetof(_科目,( 得点(_,_科目,_)), _教科ならび), findall([_科目,_相加平均],( member(_科目,_教科ならび), findavg(_得点,( 得点(_,_科目,_得点)), _相加平均)), _科目別相加平均ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/994 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # まずテストを受けた生徒の人数を入力し、 # それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して # 2次元の配列に格納したうえで、生徒別の合計点・平均点と科目別の合計点・平均点とを # 小数点以下まで計算して表示するプログラムを作成しなさい。 # ただしテストを受ける生徒の人数は20人以下とする。 # 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)、それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して2次元の配列に格納したうえで、生徒別の合計点・平均点と科目別の合計点・平均点とを小数点以下まで計算して表示する。' :- 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数), 'それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して2次元の配列に格納したうえで'(_生徒の人数,_生徒の二次元得点ならび), '生徒別の合計点・平均点と科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび). 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数) :- get_line(Line), '診断: 生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(Line,_生徒の人数),!. 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数) :- 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数). '診断: 生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(Line,_生徒の人数) :- atom_to_term(Line,_生徒の人数), ただしテストを受ける生徒の人数は20人以下(_生徒の人数),!. '診断: 生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(Line,_生徒の人数) :- writef('入力された %t からは20人以下の生徒数が得られません。再入力をお願いします。\n',[Line]), fail. ただしテストを受ける生徒の人数は20人以下(_生徒の人数) :- integer(_生徒の人数), _生徒の人数 > 0, _生徒の人数 =< 20. 'それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して2次元の配列に格納したうえで'(_生徒の人数,_生徒の二次元得点ならび) :- length(_生徒の二次元得点ならび,_生徒の人数), findall([_国語の点数,_数学の点数,_英語の点数],( append(Ln,[_|_],_生徒の二次元得点ならび), '国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数)), _生徒の二次元得点ならび). '国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数) :- length([_|Ln],_何番目), writef('%t番目の生徒の国語・数学・英語の点数をカンマ区切りで入力してください : ',[_何番目]), get_line(Line), '診断: 国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,Line,_国語の点数,_数学の点数,_英語の点数),!. '国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数) :- '国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数). '診断: 国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,Line,_国語の点数,_数学の点数,_英語の点数) :- split(Line,[',',' '],[_国語の点数,_数学の点数,_英語の点数]), '0〜100点の整数値'(_国語の点数), '0〜100点の整数値'(_数学の点数), '0〜100点の整数値'(_英語の点数),!. '0〜100点の整数値'(_国語の点数) :- integer(_点数), _点数 >= 0, _点数 =< 100. '生徒別の合計点・平均点と科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび) :- '生徒別の合計点・平均点を小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび), '科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび), '生徒別の合計点・平均点を小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび) :- append(Ln,[_生徒の得点ならび|R],_生徒の二次元得点ならび), length([_|Ln],_何番目), sum(_生徒の得点ならび,_生徒の合計点), _生徒の平均点 is _生徒の合計点 / 3, writef('%t番目の生徒の合計点は %t, 平均点は %t です。\n',[_生徒の合計点,_生徒の平均点]), R = []. '科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび) :- 転置(_生徒の二次元得点ならび,[_国語の得点ならび,_数学の得点ならび,_英語の得点ならび]), 国語の合計点と平均点を表示する(_生徒の人数,_国語の得点ならび), 数学の合計点と平均点を表示する(_生徒の人数,_数学の得点ならび), 英語の合計点と平均点を表示する(_生徒の人数,_英語の得点ならび). 国語の合計点と平均点を表示する(_生徒の人数,_国語の得点ならび) :- sum(_国語の得点ならび,_国語の合計点), _国語の平均点 is _国語の合計点 / _生徒の人数, writef('国語の合計点は %t, 国語の平均点は %t です\n',[_国語の合計点,_国語の平均点]). 数学の合計点と平均点を表示する(_生徒の人数,_数学の得点ならび) :- sum(_数学の得点ならび,_数学の合計点), _数学の平均点 is _数学の合計点 / _生徒の人数, writef('数学の合計点は %t, 数学の平均点は %t です\n',[_数学の合計点,_数学の平均点]). 英語の合計点と平均点を表示する(_生徒の人数,_英語の得点ならび) :- sum(_英語の得点ならび,_英語の合計点), _英語の平均点 is _英語の合計点 / _生徒の人数, writef('英語の合計点は %t, 英語の平均点は %t です\n',[_英語の合計点,_英語の平均点]). % sum/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/978 # # [1] 授業単元:2次元配列 # [2] 問題文(含コード&リンク): # 新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。 # 出発駅と到着駅をそれぞれ駅番号で入力し,料金を表示するプログラムを作成しなさい。 # なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする。 # 但し、料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了するものとする。 #       新大阪  京都 名古屋 新横浜  # 東京 14,920 14,390 11,540 3,180 # 新横浜 14,600 13,660 10,910 # 名古屋 6,840 6,100 # 京都 3,240 # # 'のぞみ料金表を"http://nojiriko.asia/prolog/nozomi_ryoukinhyo.txt"から読み取り、述語 料金表/1 を定義する' :- get_www_lines('http://nojiriko.asia/prolog/nozomi_ryoukinhyo.txt',Lines), カンマを取り除く(Lines,_カンマを取り除いたLines), '述語 料金表/1 を定義する'(_カンマを取り除いたLines,_料金表), assertz(料金表(_料金表)). カンマを取り除く([],[]). カンマを取り除く([_行|R1],[_カンマを取り除いた行|R2]) :- 行の中のカンマを取り除く(_行,_カンマを取り除いた行), カンマを取り除く(R1,R2). 行の中のカンマを取り除く(_行,_カンマを取り除いた行) :- findall(_文字,( カンマ以外の文字(_行,_文字)),_カンマ以外の文字ならび), atom_chars(_カンマを取り除いた行,_カンマ以外の文字ならび). カンマ以外の文字(_行,_文字) :- sub_atom(_行,_,1,_,_文字), \+(_文字=','). '述語 料金表/1 を定義する'(_カンマを取り除いたLines,_料金表) :- findall(L,( member(Line,Lines), split(Line,[' '],L)),LL), LL = [L1|R], _料金表 = [[''|L1]|R]. get_www_lines(URL,Lines) :- atomic_list_concat(['w3m -dump ',URL],S), shs(S,Lines). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). %split/3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 料金表([['',新大阪,京都,名古屋,新横浜], [東京,14920,14390,11540,3180], [新横浜,14600,13660,10910], [名古屋,6840,6100], [京都,3240]]). 料金表からのぞみ料金述語を定義する :- 料金表(_料金表), 料金表からのぞみ料金述語を定義する(_料金表). 料金表からのぞみ料金述語を定義する([[_|_行き先ならび]|_出発点付き料金表]) :- 新幹線のぞみ料金述語の定義する(_行き先ならび,_出発点付き料金表). 新幹線のぞみ料金述語を定義する(_,[]). 新幹線のぞみ料金述語を定義する(_行き先ならび,[[_出発点|_料金ならび]|R]) :- 出発点からの料金を定義する(_出発点,_行き先ならび,_料金ならび), 新幹線のぞみ料金述語を定義する(_行き先ならび,R). 出発点からの料金を定義する(_,_,[]). 出発点からの料金を定義する(_出発点,[_行き先|R1],[_料金|R2]) :- assertz(新幹線のぞみ料金(_出発点,_行き先,_料金)), 出発点からの料金を定義する(_出発点,R1,R2). 'なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする' :- split('なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする',[が,と,','],L), append(_,[',',_駅名,'が,N|_],L). assertz(駅番号(_駅名,N)), fail. 'なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/517 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/www1.axfc.net/uploader/Sc/so/347163 # # 学生番号 1 2 3 4 5 6 # グループA 35 63 25 62 73 53 # グループB 45 53 81 53 34 45 # グループC 56 76 34 45 67 65 # # 上記のグループ別学生毎の得点データを適当な整数型配列data[4][7]に読み込み、グループ別及び全体の平均点を計算せよ。 # '上記のグループ別学生毎の得点データを読み込み、グループ別及び全体の平均点を計算する' :- '上記のグループ別学生毎の得点データを読み込み'(LL), グループ別及び全体の平均点を計算する(LL,_グループ別平均点ならび,_全体の平均点), グループ別平均点を表示する(_グループ別平均点ならび), 全体の平均点を表示する(_全体の平均点). '上記のグループ別学生毎の得点データを読み込み'([]) :- at_end_of_stream(user_input),!. '上記のグループ別学生毎の得点データを読み込み'([L|R]) :- get_line(Line), split(Line,[' ','\t'],L), '上記のグループ別学生毎の得点データを読み込み'(R). グループ別及び全体の平均点を計算する(LL,_グループ別平均点ならび,_全体の平均点) :- グループ別平均点を計算する(LL,_グループ別平均点ならび), 全体の平均点を計算する(LL,_全体の平均点). グループ別平均点を計算する([_見出し部分|_グループ名付き得点表],_グループ別平均点ならび) :- findall([_グループ,_平均点],( member([_グループ|_得点ならび],_グループ名付き得点表), 相加平均(_得点ならび,_平均点)), _グループ別平均点ならび). 全体の平均点を計算する([_見出し部分|_グループ名付き得点表],_全体の平均点) :- findsum(_得点,( member([_グループ名|_得点ならび],_グループ名付き得点表]), member(_得点,_得点ならび)), _全体の平均点). グループ別平均点を表示する(_グループ別平均点ならび) :- append(_,[[_グループ,_平均点]|R],_グループ別平均点ならび), writef('%t の平均点: %t点\n',[_グループ,_平均点]), R = []. 全体の平均点を表示する(_全体の平均点) :- writef(' 全体の平均点: %t点\n',[_全体の平均点]). % 以下のサイトは # I'm trying to figure out how to generate a list of sets, where each set has a length of N and the sum of each set is X. # # I found this code: # # num_split(0,[]). # num_split(N, [X | List]):- # between(1,N,X), # plus(X,Y,N), # num_split(Y,List). # And I can use that to get a list of sets with sum X: # # num_split(6,List),length(List,5). # List = [1, 1, 1, 1, 2] ; # List = [1, 1, 1, 2, 1] ; # List = [1, 1, 2, 1, 1] ; # List = [1, 2, 1, 1, 1] ; # List = [2, 1, 1, 1, 1] ; # false. # The problem is that those are all permutations, and I'm looking for combinations. The output I'm looking for should be something like get_combos(Sum,Length,List): # # get_combos(6,2,List). # List = [5,1]; # List = [4,2]; # List = [3,3]; # false. # Any pointers? # 重複組み合わせの合計(_重複組み合わせの合計,_要素数,_重複組み合わせ) :- _出現する最大数 is _重複組み合わせの合計 - _要素数 + 1, findall(N,( between(1,_出現する最大数,N)), _1から出現する最大数までのならび), 重複組合せ(_1から出現する最大数までのならび,_要素数,_重複組み合わせ), sum(_重複組み合わせ,_重複組み合わせの合計). % 重複組合せ/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/343 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # ピリオドの後に拡張子が付いているファイル名file.docが 与えられたとき, # 拡張子の無いファイル名部分(file)と, 拡張子(doc)に分け, # 文字列の配列 fname[][]に代入するプログラムを 作成しなさい. # 結果も表示すること. # ただし、文字列のループ文は文字列の長さを使わないで作り、 # ポインタ、無限ループなどは使用してはいけない. # 'ピリオドの後に拡張子が付いているファイル名(ファイル名部分にはピリオドを含まない)が与えられたとき,拡張子の無いファイル名部分と, 拡張子に分ける'(_ピリオドの後に拡張子が付いているファイル名,_拡張子の無いファイル名部分,_拡張子) :- split(_ピリオドの後に拡張子が付いているファイル名,['.'],[_拡張子の無いファイル名部分,_拡張子]). % split/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/343 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # ピリオドの後に拡張子が付いているファイル名file.docが 与えられたとき, # 拡張子の無いファイル名部分(file)と, 拡張子(doc)に分け, # 文字列の配列 fname[][]に代入するプログラムを 作成しなさい. # 結果も表示すること. # ただし、文字列のループ文は文字列の長さを使わないで作り、 # ポインタ、無限ループなどは使用してはいけない. # 'ピリオドの後に拡張子が付いているファイル名が与えられたとき,拡張子の無いファイル名部分と, 拡張子に分ける'(_ピリオドの後に拡張子が付いているファイル名,_拡張子の無いファイル名部分,_拡張子) :- split(_ピリオドの後に拡張子が付いているファイル名,['.'],L), append(L1,[_拡張子],L), atomic_list_concat(L1,'.',_拡張子の無いファイル名部分). % split/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/758 # # ●正規表現の使用環境 # Firefox 3.6.28の*.uc.js # # ●検索か置換か? # 検索?置換? # # ●説明 # ・以前、別のスレでAのURLをBのように、v=以外のパラメータを消すものを書いてもらいました。 #  A: http://ime.nu/www.youtube.com/watch?v=abcdef123456&feature=related&etc=sexample #  B: http://ime.nu/www.youtube.com/watch?v=abcdef123456 # ・正規表現 #  [/^(http:\/\/(\w+\.)?youtube\.com\/watch).*[?&](v=[^&#]+).*/, '$1?$3'] # # 今回は別のURLからパラメータを消したいです。 # # ●対象データ # http://ime.nu/www.forest.impress.co.jp/docs/news/20120418_527251.html?ref=rss # # ●希望する結果 # http://ime.nu/www.forest.impress.co.jp/docs/news/20120418_527251.html # # # ※このようにしてみたのですが、上手くいきませんでした。 # var patterns = [ # //置換したいURLパターンを記述 # [/^(http:\/\/(\w+\.)?youtube\.com\/watch).*[?&](v=[^&#]+).*/, '$1?$3'], # [/^(http:\/\/www\.forest\.impress\.co\.jp\/docs\/news\/)[0-9]_[0-9]\.html\?ref=rss, '$1'] # ]; # # 'URLからパラメータを消したい'(_URL文字列,_パラメータの消されたURL文字列) :- split(_URL文字列,['?'],[_パラメータの消されたURL文字列|_]). % 以下のサイトは # 出典:: 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/1323566370/646 # # 質問です # # phpのpreg_replaceで文字列を入れ替えたいのですが # # <a href="mailto:example@example.com">問い合せ</a> # # のexample@example.comのみを入れ替えるにはどのような正規表現を使えば出来るでしょうか? # # よろしくお願いします # 'example@example.comのみを入れ替える'(_文字列,_入れ替える文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), メールアドレス部分(S2,L2), 'example@example.comのみを入れ替える'(S3,_入れ替える文字列,_置換されたS3), concat_atom([S1,'"mailto:',_入れ替える文字列,'"',_置換されたS3],_置換された文字列),!. 'example@example.comのみを入れ替える'(_文字列,_,_文字列). メールアドレス部分(S2,L2) :- L2 = ['"',m,a,i,l,t,o,:|R2], append(L2_1,['"'],R2), \+(member('"',L2_1)), atom_chars(S2_2,R2), メールアドレスとして可能な文字文字列(S2_2),!. メールアドレスとして可能な文字列(_文字列) :- split(_文字列,['@'],[A,B]), メールに使用できるアルファベット(A), メールに使用できるアルファベット(B). メールに使用できるアルファベット(_文字) :- char_code(_文字,_文字コード), メールに使用できる文字コード(_文字コード),!. メールに使用できるアルファベット(_文字) :- member(_文字,['_','-','~']). メールに使用できる文字コード(_文字コード) :- _文字コード >= 65, _文字コード =< 90,!. メールに使用できる文字コード(_文字コード) :- _文字コード >= 97, _文字コード =< 122,!. メールに使用できる文字コード(_文字コード) :- _文字コード >= 48, _文字コード =< 57,!. % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/606 # # 問い合せフォームから来たメールアドレスを正規表現を用いて抽出したいのですが # 秀丸メールを使っておりメール全文をテキスト化したものの中に以下の文章が含まれています # # ▼メールアドレス # aaaaaaaaaa@aaaaaaaaa.com # # ▼メールアドレスという文字列の下にある行だけを検索することは可能でしょうか? # # メールアドレスにマッチする正規表現を使用するとヘッダー内のよくわからないアドレスまで抽出されてしまい # とても面倒くさいのでどうにか文章の下にある行のみを抽出という手段を取りたいのです # # どうか解決策をご教授ください # '▼メールアドレスという文字列の下にある行だけを検索する'(_文字列,_前文字列,_下にある行,_後文字列,_メールアドレスならび) :- sPLIT(_文字列,['\n'],L), '▼メールアドレスという文字列の下にある行'(L,_前文字列,_下にある行,_後文字列), メールアドレスを検索(_下にある行,_メールアドレスならび). '▼メールアドレスという文字列の下にある行'(L,_前文字列,_下にある行,_後文字列) :- append(L0,[A,'\n',_下にある行,'\n'|R],L), sub_atom(A,_,8,_,'▼メールアドレス'), concat_atom(L0,S1), concat_atom([S1,A,'\n'],_前文字列), concat_atom(R,_後文字列). メールアドレスを検索(_行,_メールアドレスならび) :- findall(S2,( sub_atom(_行,_,_,_,S1,S2,S3,L1,L2,L3), メールアドレス形式(S2), 前後がアルファベットでない(S1,S3)), _メールアドレスならび). メールアドレス形式(S) :- split(S2,['@'],[U1,U2]), アルファベット(A), アルファベット(B). 前後がアルファベットでない(S1,S3) :- \+((last(S1,A),アルファベット(A))), \+((sub_atom(S3,0,1,_,B),アルファベット(B))). アルファベット('-') :- !. アルファベット('_') :- !. アルファベット('~') :- !. アルファベット(A) :- A @>= '0', A @=< '9',!. アルファベット(A) :- A @>= 'A', A @=< 'Z',!. アルファベット(A) :- A @>= 'a', A @=< 'z',!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/855 # # 【課題】無題.txtの中の一行に格納されている「浮動小数点型<tab>整数」を使用して「(浮動小数点×整数+.....+最後の行)/(各行の整数値を合計したもの)」を出力するプログラムを作成せよ # 【形態】1. Javaアプリケーション(main()で開始) # 【GUI】4. 制限なし # 【期限】2月9日1時まで # 【Ver】java version "1.6.0_20" # 【 補足 】かなり急な話ですみません。宜しくお願いします。 # 無題.txt # http://ime.nu/www.dotup.org/uploda/www.dotup.org2612395.txt.html # # '無題.txtの中の一行に格納されている「浮動小数点型<tab>整数」を使用して「(浮動小数点×整数+.....+最後の行)/(各行の整数値を合計したもの)」を出力する' :- get_split_lines('無題.txt',['\t',' '],LL), 集計する(LL,0,0,_値), writef('%t / %t = %t\n',[_合計_1,_合計_2,_値]). 集計する([],_合計_1,_合計_2,_値) :- _値 is _合計_1 / _合計_2,!. 集計する([[_浮動小数点数,_整数]|R],_合計_1,_合計_2,_値) :- _合計_1_2 is _合計_1 + _浮動小数点数 * _整数, _合計_2_2 is _合計_2 + _整数, 集計する(R,_合計_1_2,_合計_2_2,_値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/146 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/gcasKWhG # ハッシュ表を用いて単語とその出現回数を登録し、 # さらに単語の出現回数順にソートするソート関数を作成せよ。 # [3.1] OS:Mac # [3.2] コンパイラ名とバージョン:gcc # [3.3] 言語:C # [4] 期限:2月11日まで # # 基本的な骨格は出来ましたが、ソートの関数が作れませんでした。 # よろしくお願いします。 # # Macのターミナルを利用してテキストファイルを読み込み、単語(基本的に英単語)を登録します。 # # :- dynamic(ハッシュ表/2). 'ハッシュ表を用いて単語とその出現回数を登録し、さらに単語の出現回数順にソートする'(_テキストファイル) :- abolish(ハッシュ表/2), get_split_lines(_テキストファイル,[' ','\n',',','.',':',';'],LL), 平坦化(LL,_語彙ならび), 'ハッシュ表を用いて単語とその出現回数を登録し'(_語彙ならび), 'さらに単語の出現回数順にソートする'(_出現回数順にソートした単語ならび). 'ハッシュ表を用いて単語とその出現回数を登録し'([]). 'ハッシュ表を用いて単語とその出現回数を登録し'([_語彙|R]) :- retract(ハッシュ表(_語彙,_回数)), _更新された回数 is _回数 + 1, asserta(ハッシュ表(_語彙,_更新された回数)), 'ハッシュ表を用いて単語とその出現回数を登録し'(R),!. 'ハッシュ表を用いて単語とその出現回数を登録し'([_語彙|R]) :- asserta(ハッシュ表,_語彙,1), 'ハッシュ表を用いて単語とその出現回数を登録し'(R),!. 'さらに単語の出現回数順にソートする'(_出現回数順にソートした単語ならび) :- findall([_回数,_語彙],( ハッシュ表(_語彙,_回数)), L1), 降順整列(L1,L2), findall(_語彙,( member([_,_語彙],L2)), _出現回数順にソートした単語ならび). 降順整列([],[]). 降順整列([_軸要素|R1],L2) :- 降順分割(_軸要素,R1,_より大きい要素ならび,_等しいかより小さい要素ならび), 降順整列(_より大きい要素ならび,_整列したより大きい要素ならび), 降順整列(_等しいかより小さい要素ならび,_整列した等しいかより小さい要素ならび), append(_整列したより大きい要素ならび,[_軸要素|_整列した等しいかより小さい要素ならび],L2). 降順分割(_,[],[],[]). 降順分割(_軸要素,[_要素|R1],[_要素|R2],R3) :- _要素 @> _軸要素, 降順分割(_軸要素,R1,R2,R3). 降順分割(_軸要素,[_要素|R1],R2,[_要素|R3]) :- _要素 @=< _軸要素, 降順分割(_軸要素,R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/461 # # ●正規表現の使用環境 # linux 2.6系 grep / Scientific Linux 6.1 # # ●検索か置換か? # 検索 # # ●説明 # IPアドレス(xxx.xxx.xxx.xxx IPv4)にヒットさせたい # # ●対象データ # 192.168.0.1 # 255.255.255.0 # 999.999.999.999(注:IPアドレスとして許容されていない) # # ●試した正規表現 # "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" # # 今回の検索では目視で判別できましたが、 # 999.999.999.999←これにヒットしてしまう等、致命的な部分があります。 # # ご教示いただければ幸いです。 # # # 'IPアドレス(xxx.xxx.xxx.xxx IPv4)にヒットさせたい'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), 数字とピリオドのみ(L2), \+((last(L1,A),数字(A))), \+((L3=[B|_],数字(B))), split(_適合文字列,['.'],[N1,N2,N3]), 'IPアドレス範囲'([N1,N2,N3]). 数字とピリオドのみ([]). 数字とピリオドのみ([A|R]) :- member(A,['.','0','1','2','3','4','5','6','7','8','9']), 数字とピリオドのみ(R). 'IPアドレス範囲'([]). 'IPアドレス範囲'([N|R]) :- N >= 0, N =< 255, 'IPアドレス範囲'(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/829 # # プログラムに以下の機能を追加したプログラムを作成する. # (1) 各行ごとに1バイト空白 ' ',または,タブ '\t' で区切られた部分文字列が何個あるかカウントする関数を作成し, #   出力の際に,行番号の右側に表示する.(画面表示の例) # (2) 結果を画面表示すると共に,同等の内容をファイルに書き出す. #   ファイル形式は HTML ファイル(.html)とすること. #   ・ただし,HTMLファイルに用いるタグは FireFox や Safari などで,それなりの表示が得られる程度で良い # # #include <stdio.h> # #include <stdlib.h> # int main (void){ char fileName[] = "14-1.c"; # FILE *f; # f=fopen(fileName, "r"); # if(f==NULL){ # printf("ファイルが開けませんでした\n"); # exit(EXIT_FAILURE);} # int lineNum=1; # char str[256]; # while(fgets(str,255,f) !=NULL){ # printf("%03d :%s",lineNum,str); # lineNum++;} # printf("\n"); # char* line = "--------------------------------\n"; # printf("%s",line); # printf("lines: %d\n",lineNum-1); # printf("%s",line); # fclose(f); # return 0;} # [3]c言語 # [4]1/31 よろしくお願いします # # '(1) 各行ごとに1バイト空白または,タブで区切られた部分文字列が何個あるかカウントする関数を作成し,出力の際に,行番号の右側に表示する.'(_ファイル) :- 各行ごとに(_ファイル,Line,_行番号,R), '1バイト空白または,タブで区切られた部分文字列が何個あるかカウントする'(Line,_何個), '出力の際に,行番号の右側に表示する'(_行番号,_何個,Line), R = []. 各行ごとに(_ファイル,Line,_行番号,R) :- get_lines(_ファイル,Lines), append(L0,[Line|R],Lines), length([_|L0],_行番号). '1バイト空白または,タブで区切られた部分文字列が何個あるかカウントする'(Line,_何個) :- split(Line,[' ','\t'],L), length(L,_何個). '出力の際に,行番号の右側に表示する'(_行番号,_何個,Line) :- writef('%t:%t %t\n',[_行番号,_何個,Line]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/668 # # [1] 授業単元:ソート # [2] 問題文(含コード&リンク): # 1. savadata.txt内にあるデータを読み取り、名前順にソートして # 全員分のLEVEL、PLAYER NAME、POINTを表示するプログラムを # 作成せよ. # # 2. savadata.txt内にあるデータを読み取り、レベル別にPOINTが上位3人までのPlayerNameとそのPOINTおよび # レベル別の全体の平均点(Average)を表示させるプログラムを作成せよ. # # 出力例) # ■EASY # Rank1 : Tanaka 1000 POINT # Rank2 : Onishi 875 POINT # Rank3 : KItano 685 POINT # Average : 256 POINT # # ■Normal # Rank1 : Kuriyama 900 POINT # Rank2 : Onishi 775 POINT # Rank3 : KItano 605 POINT # Average : 232 POINT # # savedata.txt # http://ime.nu/www.kent-web.com/pubc/book/test/uploader/uploader.cgi?mode=downld&no=5099 # # HARD Ichihashi 230 # HARD Tanaka 170 # HELL Nakamura 10 # EASY kanzaki 130 # HARD Ichihashi 20 # VERY HARD Tamura 570 # HELL Ishii 1000 # EASY kanagawa 200 # HARD Kuriyama 250 # DETH Takeda 180 # HELL Nakanishi 10 # NORMAL kamida 450 # HARD Iguchi 290 # VERY HARD Tanaka 370 # DETH Murata 800 # VERY HARD THirano 290 # HARD Kanemoto 230 # NORNAL Yano 110 # HELL Kuji 10 # EASY Arai 130 # EASY Hamada 20 # VERY HARD Satoh 120 # NORNAL ishimura 900 # EASY Ushijima 200 # HARD Kumada 230 # NORNAL Nasuno 820 # HELL Hashimoto 0 # EASY Kim 130 # HARD John 20 # VERY HARD Kimura 170 # HARD Nishioka 470 # NORNAL Honda 400 # 'savadata.txt内にあるデータを読み取り、名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する' :- 'savadata.txt内にあるデータを読み取り'(LL), '名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL). 'savadata.txt内にあるデータを読み取り'(LL) :- get_lines('savadata.txt',Lines), Lines = [_見出し|_実データならび], '各行をLEVEL,PLAYER NAME,POINTに分割する'(1,_実データならび,LL). '各行をLEVEL,PLAYER NAME,POINTに分割する'(_,[],[]). '各行をLEVEL,PLAYER NAME,POINTに分割する'(N,[_行|R1],[[N,_LEVEL,_PLAYER_NAME,_POINT]|R2]) :- split(_行,[' ','\t'],L), 'LEVEL,PLAYER NAME,POINTに分割する'(L,_LEVEL,_PLAYER_NAME,_POINT), N2 is N + 1, '各行をLEVEL,PLAYER NAME,POINTに分割する'(N2,R1,R2). 'LEVEL,PLAYER NAME,POINTに分割する'(['VERY','HARD',_PLAYER_NAME,_POINT],'VERY HARD',_PLAYER_NAME,_POINT). 'LEVEL,PLAYER NAME,POINTに分割する'([_LEVEL,_PLAYER_NAME,_POINT],_LEVEL,_PLAYER_NAME,_POINT). '名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL) :- 名前を順に(LL,LL1), ソートして(LL1,LL2), '全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL2,LL). 名前を順に(LL,LL1) :- '鍵(名前)と行番号の対を作る'(LL,LL1). '鍵(名前)と行番号の対を作る'(LL,LL1) :- findall([_NAME,_行位置],( member([_行位置,_LEVEL,_PLAYER_NAME,_POINT],LL)), LL1). ソートして(LL1,LL2) :- 整列(LL1,LL2). '全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL1,LL) :- append(_,[[_,_行番号]|R],LL1), nth1(_行番号_1,LL,[_,_LEVEL,_PLAYER_NAME,_POINT]), writef('%t %t %t\n',[_LEVEL,_PLAYER_NAME,_POINT]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/650 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 出席番号、算数、国語、社会の点数(適当で)からできている成績データを # 読み込み、各生徒の3科目の平均点と最高点を算出して、それを各生徒の # データとして加え、3科目の平均点の順番にソートするプログラムを # 選択ソートでかきなさい。 # '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み、各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え、3科目の平均点の順番にソートする'(_成績データファイル,_3科目の平均点の順ならび) :- '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み'(LL), '各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え'(LL,LL2), '3科目の平均点の順番にソートする'(LL2,_3科目の平均点の順ならび). '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み'(LL) :- get_split_lines(_成績データファイル,[','],LL). '各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え'(LL,LL2) :- findall(L2,( member([_出席番号|L],LL), 平均(L,_平均点), 最大値(L,_最高点), append([_出席番号|L],[_平均点,_最高点],L2)), LL2). '3科目の平均点の順番にソートする'(LL2,_3科目の平均点の順ならび) :- '3科目の平均点を鍵として行頭に付加する'(LL2,LL3), 逆順整列(LL3,LL4), '付加した整列鍵を削除する'(LL4,_3科目の平均点の順ならび). '3科目の平均点を鍵として行頭に付加する'(LL2,LL3) :- findall([_平均点|L],( member(L,LL2), append(_,[_平均点,_],L)), LL3). '付加した整列鍵を削除する'(LL4,_3科目の平均点の順ならび) :- findall(L,( member([_|L],LL4)), _3科目の平均点の順ならび). 逆順整列(L1,L2) :- sort(L1,L3), reverse(L3,L2). 平均(L,_平均) :- length(L,Len), sum(L,_合計), _平均 is _合計 / Len. 最大値([A|R],_最大値) :- append(_,[B|R2],R), B @> A, 最大値([B|R2],_最大値),!. 最大値([_最大値|_],_最大値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/581 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):ttp://www1.axfc.net/uploader/Sc/so/312148 # # データ例のように名前,性別, 5教科(国語,算数,理科,社会,英語)の試験の # 得点を格納したファイルがある.このデータを用いて実行例のような操作を行うことが # できるプログラムを作成せよ.ただし、構造体を用いてプログラム作成を行うこと # ※データは読み込み毎に上書きされる仕様でかまわない(保存する必要は無い) # # 【データ例】 # データファイル名は classA.txt # Andrew M 92 63 85 71 81 # Helen F 81 89 83 79 51 # Jane F 65 75 59 81 69 # John M 85 98 95 81 91 # Susan F 60 50 53 69 43 # Thomas M 72 62 79 66 72 # # # データファイル名は classB.txt # Ichiro M 82 65 75 81 41 # Jiro M 61 72 51 41 69 # Sabu M 55 68 85 81 81 # Hanako F 90 80 93 89 93 # # # 【実行例】 # ./a.out? # ----------------------- Menu -------------------------- # 1.データ読込 # 2.一覧表示 # 0.終了 # --------------------------------------------------------------- # コマンド >> 1 # [データ読込] # ファイル名を入力してください >> classA.txt # ファイル classA.txtからデータを読み込みました. # ----------------------- Menu -------------------------- # 1.データ読込 # 2.一覧表示 # 0.終了 # --------------------------------------------------------------- # コマンド >> 2 # [一覧表示 ] # 名前 性別 国語 数学 理科 社会 英語 平均点 # Andrew M 92 63 85 71 81 78.4 # Helen F 81 89 83 79 51 76.6 # Jane F 65 75 59 81 69 69.8 # John M 85 98 95 81 91 90.0 # Susan F 60 50 53 69 43 55.0 # Thomas M 72 62 79 66 72 70.2 # # ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ Menu ‐‐‐‐‐‐‐‐‐‐‐‐‐‐ # 1.データ読込 # 2.一覧表示 # 0.終了 # ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ # コマンド >> 0 # プログラムを終了します 操作の選択 :- repeat, メニュー表示, 操作の選択(_コマンド). メニュー表示 :- write('----------------------- Menu --------------------------\n1.データ読込\n2.一覧表示\n0.終了\n----------------------------------------------\n'), 操作の選択(0). 操作の選択(1) :- データの読み込み, fail. 操作の選択(2) :- 一覧表示, fail. コマンドの入力(_コマンド) :- write('コマンド >> '), get_line(_コマンド). 'データ読込' :- write('ファイル名を入力してください : '), get_line(_ファイル名), split(_ファイル名,['Class','.txt'],[_クラス名]), 既存データの削除(_クラス名), 'データ読込'(_ファイル名,_クラス名). 'データ読込'(_ファイル名,_クラス名) :- get_split_lines(_ファイル名,[' '],LL1), append(_,[L|R],LL1), P =.. [試験の得点,_クラス名|L], assertz(P), R = []. 既存データの削除(_クラス名) :- P =.. [試験の得点,_クラス名,_,_,_,_,_,_,_,_], retract(P), fail. 既存データの削除(_). 一覧表示 :- write('名前 性別 国語 数学 理科 社会 英語 平均点\n'), 試験の得点(_クラス,_名前,_性別,_国語,_数学,_理科,_社会,_英語,_平均点), writef('%10l %t %4r %4r %4r %4r %4r',[_名前,_性別,_国語,_数学,_理科,_社会,_英語]), format(' ~1f\n',[_平均点]), fail. 一覧表示. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/732 # # 【 課題 】超初心者なので理解できない点がありましたらすみません。 # 以下のイベント処理を行うアプレット作成をしたいと思っています。 # (インターフェースは無題.jpgを参照) # # 1、アプレットを起動すると「単語<tab>数字列」の組み合わせが # 格納されているテキストindex.txtを読み込み # 数字列の長さが最長〜9位までの単語(二字熟語〜四字熟語に限定する) # をコンポーネントのボタンのラベルに格納していき表示させる。 # (どのボタンのラベルに単語を格納するかは自由) #                                                                                             # 2、ボタンを押すとラベル(単語)に # 対応した数列をindex.txtから検索して見つけ # その数列をテキストファイルに出力する。  #                                                                                                             # 【 形態 】Applet # 【 GUI  】AWTのみ # 【 期限 】1月22日 # 【 Ver  】java version "1.7.0_02" # 【 補足 】なし # 無題.jpg(現在のアプレット) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2542721.jpg.html # index.txt(「単語<tab>数字列」の組み合わせが入っているテキストファイル) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2542722.txt.html # NounFreq.java(現在のアプレットを表示させているソースコード) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2542718.java.html # よろしくお願いします。 # # # # '「単語<tab>数字列」の組み合わせが格納されているテキストindex.txtを読み込み数字列の長さが最長〜9位までの単語(二字熟語〜四字熟語に限定する)を表示する' :- '「単語<tab>数字列」の組み合わせが格納されているテキストindex.txtを読み込み'(LL), '数字列の長さが最長〜9位までの単語(二字熟語〜四字熟語に限定する)を'(_単語ならび), 表示する(_単語ならび). '「単語<tab>数字列」の組み合わせが格納されているテキストindex.txtを読み込み'(LL) :- get_split_lines('index.txt',[','],LL). '最長〜9位までの単語(二字熟語〜四字熟語に限定する)を'(LL,_単語ならび) :- 要素数で逆順に整列して(LL,LL4), '最長〜9位までの'(LL4,_単語ならび), 単語を表示する(_単語ならび). 要素数で逆順に整列して(LL,LL4) :- findall([_要素数,_単語],( member([_単語|R],LL), length(R,_要素数)), LL2), sort(LL2,LL3), reverse(LL3,LL4). '最長〜9位までの'(LL4,_単語ならび) :- length(L0,9), append(L0,_,LL4). '単語を表示する'(_単語ならび) :- append(_,[[_,_単語]|R],_単語ならび), writef('%t\n',[_単語]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/729 # # 【 課題 】<プログラムの仕様> # ・N人の、M科目の成績が書かれたCSVファイルを読み込む # ・平均点、最高点、最低点、度数分布を各科目毎に出力する # ・各科目、総合点のランキングリストを出力する # ・成績の処理結果をテキストファイルに出力する # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】4. 制限なし # 【 期限 】1/26(木) 20:00 # 【 Ver  】java version "1.7.0" # 【 補足 】http://ime.nu/www1.axfc.net/uploader/Sc/so/311237.zip #       上記のリンクが、課題のCSVファイルと、 #       参考資料としてあげられていたCSVファイルの読み込み・書き込みを行うプログラムです。 #       CSVファイルは編集してはならないとのことです。 #       CSVファイルは、左から順番に、 #       「国語」「数学」「英語」「社会」「理科」「美術」「工芸」「書道」「音楽」「体育」の科目で、 #       上から順番に「生徒1」「生徒2」・・・「生徒100」となっております。 #       よろしくお願いいたします。 # '・N人の、M科目の成績が書かれたCSVファイルを読み込む ・平均点、最高点、最低点、度数分布を各科目毎に出力する ・各科目、総合点のランキングリストを出力する ・成績の処理結果をテキストファイルに出力する'(_CSVファイル,_書き込みテキストファイル) :- get_split_lines(_CSVファイル,[','],LL), 転置(LL,_転置LL), '平均点、最高点、最低点、度数分布を各科目毎に集約する'([国語,数学,英語,社会,理科,美術,工芸,書道,音楽,体育],_転置LL,_集約リスト), 総合点のランキングリスト(LL,_総合点のランキングリスト), 出力する(_書き込みテキストファイル,_集約リスト,_総合点のランキングリスト). '平均点、最高点、最低点、度数分布を各科目毎に集約する'([],[],[]). '平均点、最高点、最低点、度数分布を各科目毎に集約する'([_科目|R1],[_列|R2],[[_科目,_平均点,_最高点,_最低点,_度数分布,_ランキングリスト]|R3]) :- 最高点(_列,_最高点), 最低点(_列,_最低点), 平均点(_列,_平均点), 度数分布(_列,_度数分布), 科目毎のランキングリスト(_列,_ランキングリスト), '平均点、最高点、最低点、度数分布を各科目毎に集約する'(R1,R2,R3). 総合点のランキングリスト(LL,_ランキングリスト) :- 総合点集約(1,LL,LL1), sort(LL1,LL2), reverse(LL3,_ランキングリスト). 総合点集約(_,[],[]). 総合点集約(N,[_行|R1],[[_合計点,N]|R2]) :- sum(_行,_合計点), N2 is N + 1, 集合点集約(N2,R1,R2). 度数分布(_列,_度数分布) :- findall(_度数,( member([_点数下限,_点数上限],[[0,19],[20,39],[40,59],[60,79],[80,100]]), count(( member(_点数,_列), _点数 >= _点数下限, _点数 =< _点数上限), _度数分布). 科目毎のランキングリスト(_列,_ランキングリスト), 整列用ランキングリスト(1,_列,_整列用ランキングリスト), sort(_整列用ランキングリスト,_整列済みランキングリスト), reverse(_整列済みランキングリスト,_ランキングリスト). 整列用ランキングリスト(_,[],[]). 整列用ランキングリスト(N,[_得点|R1],[[_得点,N]|R2]) :- N2 is N + 1, 整列用ランキングリスト(N2,R1,R2). 出力する(_書き込みテキストファイル,_集約リスト,_総合点のランキングリスト) :- open(_書き込みテキストファイル,write,Outstream), 科目別項目の書き込み(Outstream,_集約リスト), 総合点のランキングの書き込み(Outstream,_総合点ランキングリスト), close(Outstream). 科目別項目の書き込み(Outstream,_集約リスト) :- append(_,[[_科目,_平均点,_最高点,_最低点,_度数分布,_ランキングリスト]|R],_集約リスト), writef(Outstream,'科目 %t\n',[_科目]), writef(Outstream,'平均点 %4r\n最高点 %4r\n最低点 %4r\n',[_平均点,_最高点,_最低点]), writef(Outstream,'0~19点 %4r\n20~39点 %4r\n40~59点 %4r\n60~79点 %4r\n80~100点 %4r\n',_度数分布), write('%tランキングリスト\n',[_科目]), ランキングリストの書き込み(Outstream,_ランキングリスト), R = []. ランキングリストの書き込み(Outstream,_ランキングリスト) :- ランキングリストの書き込み(Outstream,1,1,_ランキングリスト). ランキングリストの書き込み(Outstream,_,_,[]) :- !. ランキングリストの書き込み(Outstream,_順位,_順位_1,[[_得点,_生徒番号_1],[_得点,_生徒番号_2]|R]) :- writef(Outstream,'%4r 生徒%2l %4r\n',[_順位,_生徒番号_1,_得点]), _順位_2 is _順位_1 + 1, ランキングリストの書き込み(Outstream,_順位,_順位_2,[[_得点,_生徒番号_2]|R]). ランキングリストの書き込み(Outstream,_順位,_順位_1,[[_得点,_生徒番号]|R]) :- write(Outstream,N1,N2,'科目毎ランキング\n'), writef(Outstream,'%4r 生徒%2l %4r\n',[_順位,_生徒番号,_得点]), _順位_2 is _順位_1 + 1, ランキングリストの書き込み(Outstream,_順位_2,_順位_2,R). 総合点のランキングの書き込み(Outstream,_総合点ランキングリスト) :- write('総合点ランキング\n'), ランキングリストの書き込み(Outstream,_総合点ランキングリスト). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/727 # # 【 課題 】 名前、生年月日、電話番号、メールアドレスと入った一文が複数あるファイルがある。 # このファイルを読み込み生年月日順にソートして表示せよ。 # ただし生年月日は和暦に変換して表示する。 # 【 形態 】1. Javaアプリケーション(main()で開始 # 【 GUI  】4. 制限なし # 【 期限 】1月23日 《必須》 # 【 Ver  】java version "1.6.0_21" # 【 用語 】数学用語、専門用語の意味、説明を書きます。 《あれば必須》 # 【 補足 】ファイルは各自で用意します。 # 例 田中一郎、1887/05/08、123-456-789、tanaka_ichiro@aa.jp # よろしくお願いします。 # # ' 名前、生年月日、電話番号、メールアドレスと入った一文が複数あるファイルがある。このファイルを読み込み生年月日順にソートして表示せよ。ただし生年月日は和暦に変換して表示する。'(_ファイル) :- get_split_lines(_ファイル,['、'],LL), 整列鍵を先頭に付加する(LL,LL1), 整列(LL1,LL2), 西暦和暦変換をしながら表示する(LL2). 整列鍵を先頭に付加する(LL,LL1) :- findall([_生年月日,_名前,_生年月日,_電話番号,_メールアドレス],LL), member([_名前,_生年月日,_電話番号,_メールアドレス],LL)), LL1). 西暦和暦変換をしながら表示する(LL) :- append(_,[[_,_生年月日,_名前,_生年月日,_電話番号,_メールアドレス]|R],LL), 西暦を和暦に変換する(_生年月日,_和暦表示生年月日), concat_atom([_生年月日,_名前,_生年月日,_電話番号,_メールアドレス],'、',_表示行), writef('%t\n',[_表示行]), R = []. 西暦を和暦に変換する(_生年月日,_和暦表示生年月日) :- split(_生年月日,[/],[_年,_月,_日]), 西暦年を和暦年に変換する(_年,_和暦年表示), concat_atom([_和暦年表示,_月,月,_日,_日],_和暦表示生年月日). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1867, _年 < 1912, _和暦年 is 1867 + _年, concat_atom([明治,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1911, _年 < 1926, _和暦年 is 1911 + _年, concat_atom([大正,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1925, _年 < 1989, _和暦年 is 1926 + _年, concat_atom([昭和,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1988, _和暦年 is 1988 + _年, concat_atom([平成,_和暦年,年],_和暦年表示). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/688 # # 【 課題 】 # 1、 # data.txt→2chの1スレッドのデータが入っている。 # http://ime.nu/www.dotup.org/uploda/www.dotup.org2512848.txt.html # # dataExtraction.java→data.txtの1レスを読み込んで一枚のテキストファイルに出力していくプログラム(例:レス1はres1.txtに.......レス200はres200.txtに出力) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2512850.txt.html # # このdataExtraction.javaがdata.txtの1レスを読み込んだ際に # もしURLやアンカを表す文字列(例:<a href="../test/read.cgi/bizplus/1326413757/3" target="_blank">../test/read.cgi/tech/1309076891/3</a>)があった場合 # それを削除してテキストファイルに出力する機能を追加してください。 'data.txtには2chの1スレッドのデータが入っている。1レスをずつ読み込んでレス番号をファイル名に含む一枚のテキストファイルに出力していく' :- get_chars('data.txt',Chars), 'data.txtには2chの1スレッドのデータが入っている。1レスをずつ読み込んでレス番号をファイル名に含む一枚のテキストファイルに出力していく'(Chars). 'data.txtには2chの1スレッドのデータが入っている。1レスをずつ読み込んでレス番号をファイル名に含む一枚のテキストファイルに出力していく'(Chars) :- append(_,[<,d,t,>|R1],[<,/,d,t,>|R2],Chars), append(L1,[<,d,d,>|R3],[<,/,d,d,>|R4],R2), 一枚のテキストファイルに保存(R1,L1,R3),), 'data.txtには2chの1スレッドのデータが入っている。1レスをずつ読み込んでレス番号をファイル名に含む一枚のテキストファイルに出力していく'(R4), 'data.txtには2chの1スレッドのデータが入っている。1レスをずつ読み込んでレス番号をファイル名に含む一枚のテキストファイルに出力していく'(_). 一枚のテキストファイルに保存(R1,L1,R3) :- レス番号を得る(R1,_レス番号), concat_atom(['res',_レス番号,'.txt'],_ファイル名), open(_ファイル名,write,Outstream), テキスト部分の保存(Outstream,R1,L1,R3), close(Outstream),!. レス番号を得る(R1,_レス番号) :- concat_atom(R1,S), split(S,[' '],[_レス番号|_]). テキスト部分の保存(Outstream,R1,L1,R3) :- put_chars(Outstream,[<,d,t,>|R1]), put_chars(Outstream,L1), put_chars(Outstream,[<,d,d,>|R3]), put_chars(Outstream,[<,/,d,d,>]). put_chars(_,[]). put_chars(Stream,[_文字|R]) :- put_char(Stream,_文字), put_chars(Stream,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/204 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # ttp://www.dotup.org/uploda/www.dotup.org2509145.txt.html # # # 設問1 # 構造体を使って、各自の所有している本のうち5点を textbook[5] で宣言せよ。 # メンバーは少なくとも次のものを含んでいるとする。それぞれのメンバーの型は各自で決めること。 # # ・著者 ・書名 ・出版社 ・発行年 ・定価 # # 設問1-1 # 次の(?)、(?)の機能をもった1つのプログラムを作成せよ。 # (?)5冊の本のメンバーをすべて書き出す機能 # (?)5冊の本の定価の合計を求める機能 # # 但し、あらかじめプログラム「メモ帳」等で作成したファイル「info.txt」から、 # 著者、書名、出版社、発行年、定価を読み込むものとする。 # ファイル「info.txt」には下記のように著者、書名、出版社、発行年、定価が # 記述されているものとする。 # # ファイル「info.txt」の記述例: # 森泰親 制御工学(大学講義シリーズ) コロナ社 2001 2800 # 木村英紀 制御工学の考え方(ブルーバックス) 講談社 2002 880 # … # # ファイルinfo.txt # ttp://www.dotup.org/uploda/www.dotup.org2509138.txt.html # '各自の所有している本のうち5点をで宣言する' :- get_split_lines('info.txt',[' '],LL), append(_,[[_著者,_書名,_出版社,_発行年,_定価]|R],LL), assertz(本(_著者,_書名,_出版社,_発行年,_定価)), R = []. '5冊の本のメンバーをすべて書き出す' :- 本(_著者,_書名,_出版社,_発行年,_定価), writef('%t %t %t %t %t\n',[_著者,_書名,_出版社,_発行年,_定価]), fail. '5冊の本のメンバーをすべて書き出す'. '5冊の本の定価の合計を求める' :- findsum(_定価,( 本(_著者,_書名,_出版社,_発行年,_定価)), _定価の合計), writef('定価の合計は %t です\n',[_定価の合計]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/159 # # [1] 授業単元:計算機実習 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/nbsATV4X # # 課題: # ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を # 読み込み、A+〜Dの成績評価を行い、下記の項目を計算して表示するプログラムを # 作成せよ。 # # 表示項目: # 1.全履修者の平均点 # 2.評価の分布(A+〜D評価のそれぞれの人数) # # データファイルの説明: # 学籍番号と試験の点数(100点満点)が、スペース区切りで格納されている # # 要求仕様: # ファイルの行数(=履修者数)が変わっても動作するようにすること。 # ただし配列を使う場合は、履修者数の上限値は150名とする # 補足: # 1.試験の点数は、今回の場合は0.5点刻みである。fscanfなどで得点を読み込む # 際は、整数型でなく実数型(double または float)で処理する必要がある # 2.評価は、A+が90点〜100点、Aが80点以上90点未満(今回は89.5点まで)、Bが # 70点以上80点未満、Cが60点以上70点未満、Dが0点〜60点未満とする # 3.0点は未受験を表すが、今回の課題では受験して0点を取ったとみなす。 # つまり、E評価は行わない # 4.配列や構造体は、使っても使わなくてもよい # # 追加課題: # ・最終評価の平均点で、0点の者を除外して計算したものも表示 # score.txtの内容  # 12X1102 20.5 # 12X1115 85 # 12X1117 90.5 # 12X1117 75.5 # 12X1118 79.5 # 12X1120 68.5 # 12X1121 75 # 12X1303 0 # 12X1304 54.5 # 12X1309 95.5 # 12X1310 65.5 # 12X1311 78.5 # 12X1313 0 # 12X1313 40 # 12X1314 83 # 12X1315 0 # 12X1321 0 # 12X1321 81 # 12X1324 77.5 # 12X1324 90.5 # 12X1326 80 # 12X1601 56 # 12X1604 79.5 # 12X1611 68.5 # 12X1703 61 # 12X1808 0 # 12X1808 74.5 # 12X1811 68.5 # 12X1813 87 # 12X1814 85.5 # 12X1815 74.5 # 12X1816 92.5 # 12X1901 82 # 12X1903 88.5 # 12X1906 91 # 12X1911 84.5 # 12X1912 93.5 # 12X1913 86.5 # 12X1916 73.5 # 12X3117 82 # 12X3118 65.5 # 12X3123 0 # 12X3141 77 # 12X3151 74.5 # 12X3152 80.5 # 12X3159 0 # 12X3164 0 # 12X3167 70 # 12X3305 80 # 12X3315 68 # 12X3326 0 # 12X3326 78 # 12X3328 83 # 12X3329 71.5 # 12X3333 0 # 12X3334 85 # 12X3336 78 # 12X3338 88 # 12X3339 79.5 # 12X3342 88.5 # 12X3345 73.5 # 12X3346 84.5 # 12X3347 81.5 # 12X3353 90.5 # 12X3359 83 # 12X3362 70.5 # 12X3365 82.5 # 12X3368 78 # 12X3372 72.5 # 12X3379 84.5 # 12X3383 88.5 # 12X3384 68 # 12X3387 86.5 # 12X3390 78 # 12X3399 78 # 12X3400 74.5 # 12X3403 87 # 12X3404 79 # 12X3407 64.5 # 12X3604 67.5 # 12X3608 85.5 # 12X3619 75 # 12X3621 61.5 # 12X3628 89 # 12X3703 89 # 12X3707 61 # 12X3708 88 # 12X3731 95 # 12X3733 78 # 12X3739 87 # 12X3807 0 # 12X3809 63.5 # 12X3813 81.5 # 12X3814 0 # 12X3832 89 # 12X3838 82 # 12X3909 85 # 12X3918 87.5 # 12X3920 60 # 12X3922 73.5 # 12X3923 62.5 # 'ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を読み込み、A+〜Dの成績評価を行い、1.全履修者の平均点 2.評価の分布(A+〜D評価のそれぞれの人数)を計算して表示する' :- 'ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を読み込み'(LL1), 'A+〜Dの成績評価を行い'(LL1,LL2), '1.全履修者の平均点 2.評価の分布(A+〜D評価のそれぞれの人数)を計算して'(LL2,_全履修者の平均,_評価の分布), 表示する(_全履修者の平均,_評価の分布). 'ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を読み込み'(LL1) :- get_split_lines('score.txt',[' '],LL1). 'A+〜Dの成績評価を行い'([],[]). 'A+〜Dの成績評価を行い'([[_学籍番号,_履修者の点数]|R1],[[_学籍番号,_履修者の点数,_評価]|R2]) :- 評価表(_履修者の点数,_評価), 'A+〜Dの成績評価を行い'(R1,R2). 評価表(_履修者の点数,'A+') :- _履修者の点数 >= 90.0. 評価表(_履修者の点数,'A+') :- _履修者の点数 >= 80.0, _履修者の点数 < 90.0. 評価表(_履修者の点数,'A') :- _履修者の点数 >= 80.0, _履修者の点数 < 90.0. 評価表(_履修者の点数,'B') :- _履修者の点数 >= 70.0, _履修者の点数 < 80.0. 評価表(_履修者の点数,'C') :- _履修者の点数 >= 60.0, _履修者の点数 < 70.0. 評価表(_履修者の点数,'D') :- _履修者の点数 < 60.0. '1.全履修者の平均点 2.評価の分布(A+〜D評価のそれぞれの人数)を計算して'(LL2,_全履修者の平均,_評価の分布) :- 全履修者の平均点(LL2,_全履修者の平均), 評価の分布(LL2,_評価の分布), 全履修者の平均点(LL2,_全履修者の平均) :- findavg(_履修者の試験の点数,( append(_,[[_,_履修者の試験の点数,_]|_],LL2)), _全履修者の平均). 評価の分布(LL2,[_Ap,_A,_B,_C,_D]) :- 評価の分布(LL2,[[],[],[],[],[]],_Ap,_A,_B,_C,_D). 評価の分布([],[L1,L2,L3,L4,L5],_評価の分布) :- ならびの要素数を整数に変換([L1,L2,L3,L4,L5],_評価の分布),!. 評価の分布([[_,_,_評価]|R1],[L1,L2,L3,L4,L5],_評価の分布) :- 分布に加算(_評価,L1,L2,L3,L4,L5,L1_2,L2_2,L3_2,L4_2,L5_2), 評価の分布(R1,[L1_2,L2_2,L3_2,L4_2,L5_2],_評価の分布). ならびの要素数を整数に変換([],[]). ならびの要素数を整数に変換([L|R1],[Len|R2]) :- length(L,Len), ならびの要素数を整数に変換(R1,R2). 分布に加算('A+',L1,L2,L3,L4,L5,[_|L1],L2,L3,L4,L5). 分布に加算('A',L1,L2,L3,L4,L5,L1,[_|L2],L3,L4,L5). 分布に加算('B',L1,L2,L3,L4,L5,L1,L2,[_|L3],L4,L5). 分布に加算('C',L1,L2,L3,L4,L5,L1,L2,L3,[_|L4],L5). 分布に加算('D',L1,L2,L3,L4,L5,L1,L2,L3,L4,[_|L5]). 表示する(_全履修者の平均,_評価の分布) :- writef('全履修者の平均は %t です\n評価の分布\n',[_全履修者の平均]), 評価と分布数(_評価の分布,_評価,_評価の分布数,R), writef('%4r, %4r\n',[_評価,_評価の分布数]), R = []. 評価と分布数(_評価の分布,_評価,_評価の分布数,R) :- append(L0,[_評価|R],['A+','A','B','C','D']), length(L0,Len), length(L0_1,Len), append(L0_1,[_評価の分布数|_],_評価の分布). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/87 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク): # 次のように1行に氏名、科目ごとの成績が記録されたファイル # (ファイル名:result.dat)があるとする。 # Name English Science Math Sociology # Ichiro 100 30 40 90 # Jiro 100 80 70 100 # Saburo 80 90 100 60 # Shiro 95 90 95 80 # Goro 73 85 90 98 # このファイルを読み込んで各生徒の平均点を求め、平均点の高い順に行を並べ替えて表示するプログラムを作成せよ。 # (表示には平均点を含む) # '1行に氏名、科目ごとの成績が記録されたファイル(ファイル名:result.dat)があるとする。このファイルを読み込んで各生徒の平均点を求め、平均点の高い順に行を並べ替えて表示する' :- get_lines('result.dat',[_第一行|LL]), findall([_平均点,_氏名],( member(Line,LL), split(Line,[' '],[_|_得点ならび]), avg(_得点ならび,_平均点)), _平均点ならび), 平均点の高い順に行をならび替えて表示する(_第一行,LL,_平均点ならび). 平均点の高い順に行をならび替えて表示する(_第一行,LL,_平均点ならび) :- 平均点の高い順に(_平均点ならび,_平均点の高い順の氏名ならび), 行をならび替えて(_第一行,LL,_平均点の高い順の氏名ならび,_表示行ならび), 表示する(_表示行ならび). 平均点の高い順に(_平均点ならび,LL,_行のならび) :- sort(_平均点ならび,_整列した平均点), reverse(_整列した平均点,_平均点の高い順にならび替えた行), findall(_氏名,( member([_,_氏名],_平均点の高い順にならび替えた行)), _平均点の高い順の氏名ならび). 行をならび替えて(_第一行,LL,_平均点の高い順の氏名ならび,[_第一行|_表示行ならび]) :- findall([_氏名,Line],( member(Line,LL), split(Line,[' '],[_氏名|_])), LL1), findall(L,( member(_氏名,_平均点の高い順の氏名ならび), member([_氏名,Line],LL1)), _表示行ならび). 表示する(_表示行ならび) :- append(_,[_表示行|R],_表示行ならび), writef('%t\n',[_表示行]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/968 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # y=2x2乗+3(-10≦x≦10)を刻み幅1で計算し、x、yの組を1行ごとにファイルに書き込むプログラムを作成しなさい。 # # 設問1-2 # 上記設問1-1のプログラムが作成したファイルを読み込んで xとyの値をprintf文で表示するプログラムを作成しなさい。 # 'ファイルを読み込んで xとyの値をprintf文で表示する'(_ファイル) :- get_split_lines(_ファイル,[','],LL), append(_,[[_x,_y]|R],LL), writef('%t,%t\n',[_x,_y]), R = []. 'y=2x2乗+3(-10≦x≦10)を刻み幅1で計算し、x、yの組を1行ごとにファイルに書き込む'(_ファイル) :- 'y=2x2乗+3(-10≦x≦10)を刻み幅1で計算し'(LL), 'x、yの組を1行ごとにファイルに書き込む'(_ファイル,LL). 'y=2x2乗+3(-10≦x≦10)を刻み幅1で計算し'(LL) :- findall([_x,_y],( for(-10,_x,10), _y is 2 * _x * _x + 3), LL). 'x、yの組を1行ごとにファイルに書き込む'(_ファイル,LL) :- open(_ファイル,write,Outstream), 'x、yの組を1行ごとに書きこむ'(Outstream,LL), close(Outstream). 'x、yの組を1行ごとに書きこむ'(Outstream,LL) :- append(_,[[_x,_y]|R],LL), writef(Outstream,'%t,%t\n',[_x,_y]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/351 # # 解決気味です。 # # 上記を諦め、 # # T1 マスタテーブル # ID | DATE    | DATA |ckbox # --+----------+----- |------ # 1 | 2007-11-11 | aaa | 201,202,205,401,403,404 # 2 | 2007-11-11 | bbb | 202,203 # 3 | 2007-11-10 | ccc | 203,204,403,404,405 # # 上記の形式にして # select ID,DATE,DATA from `T1` # where # CONCAT(',',chkbox,',') like '%,201,%' # and # CONCAT(',',chkbox,',') like '%,202,%' # and # CONCAT(',',chkbox,',') like '%,403,%' # # こういった形で取得。 # # チェックボックスは計300個程ありそれぞれユニークを振っています。 # チェックされている数は平均50個程。 # レコード数は約1万程なのですがこの方法で大丈夫かどうか心配です。 # 'チェックボックスならびを指定してT1の組を検索'(_チェックボックスならび,_ID,_DATE,_DATA,_ckbox) :- 'T1'(_ID,_DATE,_DATA,_ckbox), split(_ckbox,[','],L), 'チェックボックスならびの要素はすべてLの中にある'(_チェックボックスならび,L). 'チェックボックスならびの要素はすべてLの中にある'([],_). 'チェックボックスならびの要素はすべてLの中にある'([_要素|R],L) :- member(_要素,L), 'チェックボックスならびの要素はすべてLの中にある'(R,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/700 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # (1)20個の適当な整数が空白で区切られて保存されているファイルを作成せよ。 # このファイルに含まれる整数のうち最大のものを出力せよ。 # # (2)15個の適当な整数が空白で区切られて保存されているファイルを作成せよ。 # このファイルに含まれる整数を,その保存されている順とは逆順に”result.txt”というファイルに出力せよ。 # # '15個の適当な整数が空白で区切られて保存されているファイルを作成せよ'(_ファイル) :- '15個の適当な整数'(_15個の適当な整数), 空白で区切られて(_15個の適当な整数,_空白で区切られた文字列), open(_ファイル,write,Outstream), writef(Outstream,'%t\n',[_空白で区切られた文字列]), close(Outstream). '15個の適当な整数'(_15個の適当な整数) :- length(_15個の適当な整数), findall(V,( append(_,[V|_],_15個の適当な整数), V is random(10001) - 500), _15個の適当な整数). 空白で区切られて(_15個の適当な整数,_空白で区切られた文字列) :- concat_atom(_15個の適当な整数,' ',_空白で区切られた文字列). このファイルに含まれる整数を,その保存されている順とは逆順に”result.txt”というファイルに出力せよ このファイルに含まれる整数のうち最大のものを出力せよ(_ファイル) :- open(_ファイル,read,Instream), get_lines(Instream,Lines), close(Instream), '整数を逆順に"result.txt"というファイルに出力せよ'(Lines). '整数を逆順に"result.txt"というファイルに出力せよ'(Lines) :- 整数を逆順に(Lines,_逆順整数表示文字列), open('result.txt',write,Outstream), writef(Outstream,'%t\n',[_表示文字列]), close(Outstream). 行ならびを整数ならびに変換(Lines,_整数ならび) :- findall(_要素ならび,( append(_,[_行|_],Lines), split(_行,[' '],_要素ならび)), LL), flat(LL,L), 整数を選別する(L,_整数ならび). 整数を選別する(_要素ならび,_整数ならび) :- findall(_整数,( append(_,[_要素|_],_要素ならび), integer(_要素)), _整数ならび). 整数を逆順に(Lines,_逆順整数表示文字列) :- 行ならびを整数ならびに変換(Lines,_整数ならび), reverse(_整数ならび,_逆順の整数ならび), concat_atom(_逆順の整数ならび,' ',_逆順整数表示文字列). % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/700 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # (1)20個の適当な整数が空白で区切られて保存されているファイルを作成せよ。 # このファイルに含まれる整数のうち最大のものを出力せよ。 # # (2)15個の適当な整数が空白で区切られて保存されているファイルを作成せよ。 # このファイルに含まれる整数を,その保存されている順とは逆順に”result.txt”というファイルに出力せよ。 # # '20個の適当な整数が空白で区切られて保存されているファイルを作成せよ'(_ファイル) :- '20個の適当な整数'(_20個の適当な整数), 空白で区切られて(_20個の適当な整数,_空白で区切られた文字列), open(_ファイル,write,Outstream), writef(Outstream,'%t\n',[_空白で区切られた文字列]), close(Outstream). '20個の適当な整数'(_20個の適当な整数) :- length(_20個の適当な整数), findall(V,( append(_,[V|_],_20個の適当な整数), V is random(10001) - 500), _20個の適当な整数). 空白で区切られて(_20個の適当な整数,_空白で区切られた文字列) :- concat_atom(_20個の適当な整数,' ',_空白で区切られた文字列). このファイルに含まれる整数のうち最大のものを出力せよ(_ファイル) :- open(_ファイル,read,Instream), get_lines(Instream,Lines), close(Instream), 整数のうち最大のものを出力せよ(Lines). 整数のうち最大のものを出力せよ(Lines) :- 行ならびを整数ならびに変換(Lines,_整数ならび), max(_整数ならび,_最大値), writef('%t\n',[_最大値]). 行ならびを整数ならびに変換(Lines,_整数ならび) :- findall(_要素ならび,( append(_,[_行|_],Lines), split(_行,[' '],_要素ならび)), LL), flat(LL,L), 整数を選別する(L,_整数ならび). 整数を選別する(_要素ならび,_整数ならび) :- findall(_整数,( append(_,[_要素|_],_要素ならび), integer(_要素)), _整数ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/594 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):0.123,1,12,150...と続く「1.txt」と6,13,25,10...と続く「2.txt」がある。 # 1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし、3.txtに結果を書き込むプログラムを作りなさい。 # '0.123,1,12,150...と続く「1.txt」と6,13,25,10...と続く「2.txt」がある。1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし、3.txtに結果を書き込む' :- '0.123,1,12,150...と続く「1.txt」と'(L1), '6,13,25,10...と続く「2.txt」がある'(L2), '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし、3.txtに結果を書き込む'(L2,L2). '0.123,1,12,150...と続く「1.txt」と'(L1) :- get_split_lines('1.txt',LL1), flat(LL1,L1). '6,13,25,10...と続く「2.txt」がある'(L2) :- get_split_lines('2.txt',LL2), flat(LL2,L2). '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし、3.txtに結果を書き込む'(LL1_2,LL2_2) :- '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'(LL1_2,LL2_2,L3), '3.txtに結果を書き込む'(L3),!. '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'([],[],[]). '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'([V1|R1],[0|R2],[∞|R3]) :- '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'(R1,R2,R3). '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'([V1|R1],[0.0|R2],[∞|R3]) :- '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'(R1,R2,R3). '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'([V1|R1],[V2|R2],[V3|R3]) :- V3 is floor((V1 / V2) * 10) / 10, '1.txtの数値を2.txtの数値で割り、小数点第一位で切り捨てし'(R1,R2,R3). '3.txtに結果を書き込む'(L3) :- open('3.txt',write,Outstream), append(_,[Term|R],L3), 書く(Outstream,Term,R), writef(Outstream,'%t,',[Term]), close(Outstream). 書く(Outstream,Term,[]) :- writef(Outstrem,'%t\n',[Term]),!. 書く(Outstream,Term,_) :- writef(Outstream,'%t,',[Term]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/323 # # 【質問テンプレ】 # ・DBMS名とバージョン MySQL 5.1 # ・テーブルデータ # ・欲しい結果 # ・説明 # # テーブル「カート」 # カラム 「セッションID」「商品種別」「カートに入れた時刻」 # # テーブル「カート詳細」 # カラム 「セッションID」「商品コード」 # # テーブル「商品リスト」 # カラム「商品コード」「商品種別」 # # というテーブルがあります。 # # 最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して、 # そのセッションIDを持つレコードを「カート」「カート詳細」の両方から # 全て削除したいのです。 # # 同じセッションIDを持つレコードは、両方のテーブルに複数あります。 # 「注文」テーブルで「セッションID」「商品種別」の組合せはユニークで、 # 「注文詳細」テーブルでは「セッションID」「商品コード」の組合せにユニークです。 # # 結合や副問い合わせを試してみましたが、うまいこと抽出できません。 # SQLで書くやり方があれば教えてください。よろしくお願いします。 # # '最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して、そのセッションIDを持つレコードを「カート」「カート詳細」の両方から全て削除する' :- '最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して'(_セッションID,R), 'そのセッションIDを持つレコードを「カート」「カート詳細」の両方から全て削除する'(_セッションID), R = []. '最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して'(_セッションID,R) :- findsetof(_セッションID,( カート(_セッションID,_商品種別,_カートに入れた時刻)), _セッションIDならび), append(_,[_セッションID|R],_セッションIDならび), findmax(_カートに入れた時刻,( カート(_セッションID,_商品種別,_カートに入れた時刻)), _最後にカートに入れた時刻), 最後にカートに入れた時刻から12時間以上経過している(_セッションID,_最後にカートに入れた時刻). 'そのセッションIDを持つレコードを「カート」「カート詳細」の両方から全て削除する'(_セッションID) :- retractall(カート(_セッションID,_,_)), retractall(カート詳細(_セッションID,_)). 最後にカートに入れた時刻から12時間以上経過している(_セッションID,_最後にカートに入れた時刻) :- split(_最後に入れた時刻,['/',' ',':'],[_年,_月,_日,_時,_分]), 現在の時刻(_年_1,_月_1,_日_1,_時_1,_分_1), '12時間後の日時'(_年,_月,_日,_時,_分,_年_2,_月_2,_日_2,_時_2,_分_2), [_年_1,_月_1,_日_1,_時_1,_分_1] @>= [_年_2,_月_2,_日_2,_時_2,_分_2],!. '12時間後の日時'(_年,_月,_日,_時,_分,_年,_月,_日,_時_2,_分) :- _時_2 is _時 + 12, _時_2 < 24,!. '12時間後の日時'(_年,_月,_日,_時,_分,_年,_月,_日_2,_時_2,_分) :- _時_1 is _時 + 12, _時_2 is _時_1 - 24, _日_2 is _日 + 1,!. retractall(P) :- retract(P), fail. retractall(_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/526 # # [1] 授業単元:プログラミング言語 # [2] 問題文(含コード&リンク):m行n列のテキストファイル(1.txt)をそれぞれ二次元配列に入れ、その配列から新しいテキストファイル(2.txt)に1.txtと同じ内容を出力するようなプログラムを作成せよ。 # 'm行n列のテキストファイル(1.txt)をそれぞれ二次元配列に入れ、その配列から新しいテキストファイル(2.txt)に1.txtと同じ内容を出力する'(_m行,_n列,LL) :- get_lines('1.txt',Lines), length(Lines,_m行), 区切り要素のスパイ(Lines,_n列,_区切り要素), 配列に入れる(Lines,_区切り要素,LL), '配列から新しいテキストファイル(2.txt)に1.txtと同じ内容を出力する'(LL). 区切り要素のスパイ([Line|_],_n列,',') :- length(L,_n列), split(Line,',',L),!. 区切り要素のスパイ([Line|_],_n列,' ') :- length(L,_n列), split(Line,' ',L),!. '配列から新しいテキストファイル(2.txt)に1.txtと同じ内容を出力する'(LL,_区切り要素) :- open('2.txt',write,Outstream), 出力する(Outstream,LL,_区切り要素), close(Outstream). 出力する(Outstream,LL,_区切り要素) :- append(_,[L|R],LL), concat_atom(L,_区切り要素,Line), writef(Outstream,'%t\n',[Line]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/458 # # [1] 授業単元:配列とポインタ # [2] 問題文(含コード&リンク):1,2,3,4,5,6...と続くテキストファイルを読み込み、 # 8×8の2次元配列で表し、別のテキストファイルに結果を書き込みなさい。ただし、読み込むファイルのデータの数が64個に満たない場合は、0を代入しなさい。 # '1,2,3,4,5,6...と続くテキストファイルを読み込み、8×8の2次元配列で表し、別のテキストファイルに結果を書き込みなさい。ただし、読み込ファイルのデータの数が64個に満たない場合は、0を代入しなさい。'(_テキストファイル,_別のテキストファイル) :- '1,2,3,4,5,6...と続くテキストファイルを読み込み'(_テキストファイル,_文字列), '8×8の2次元配列で表し'(_文字列,LL), 別のテキストファイルに結果を書き込む(_別のテキストファイル,LL). '1,2,3,4,5,6...と続くテキストファイルを読み込み'(_テキストファイル,_文字列) :- get_lines(_テキストファイル,Lines), concat_atom(Lines,_文字列). '8×8の2次元配列で表し'(_文字列,LL) :- split(_文字列,[','],_数字ならび), length(LL,8), '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'(_数字ならび,LL). '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'(_,[]) :- !. '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'(L1,[L2|R2]) :- \+(L1 = [_,_,_,_,_,_,_,_|_]), length(L2,8), append(L0,L1,L2), all(L0,0), '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'([],R2). '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'([A,B,C,D,E,F,G,H|R1],[[A,B,C,D,E,F,G,H]|R2]) :- '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/441 # # [1] 数値解析 # [2] # 123   456   789.012   345.678 # 901   234   567.890   123.456 # 789   12    345.678   901.234 # 567   890   123.456   789.012 # ・・・ # のような適当な値のテキストファイル(q.txt)があり(50×4)、これらのうち3列目と4列目でそれぞれの差を取り、 # 以下のような新しいテキストファイル(a.txt)に出力せよ。 # -221.122   -222.222 # -222.212   777.778 # -222.222   -112.222 # ・・・ # 'テキストファイル(q.txt)があり(50×4)、これらのうち3列目と4列目でそれぞれの差を取り、以下のような新しいテキストファイル(a.txt)に出力せよ。' get_split_lines('q.txt',[' ','\t'],LL), これらのうち3列目と4列目でそれぞれの差を取り(LL,LL1), '新しいテキスト(a.txt)に出力する'(LL1). これらのうち3列目と4列目でそれぞれの差を取り(LL,LL1) :- findall([_差1,_差2],( append(_,[[_,_,A1,B1|_],[_,_,A2,B2|_]|_],LL), _差1 is abs(A2 - A1), _差2 is abs(B2 - B1)), LL1). '新しいテキスト(a.txt)に出力する'(LL1) :- open('a.txt',write,Outstream), append(_,[[A,B]|R],LL1), writef(Outstream,'%8l %8l\n',[A,B]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/378 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):↓ # # 文字列操作のライブラリ関数を使用して、指定したファイルで、 # 最も辞書順(ASCIIコード順)で最初に出てくる単語と、最後に出てくる単語を見つけて表示せよ。また、最も長い単語も表示せよ。 # ・同じ長さの単語が複数ある場合には、最初に見つけたものだけ表示するだけでよい。 # ・ただし,ここでいう単語とは、スペースや改行、タブで区切られる文字の列で必ずしも、英数字とはかぎらない。(このような区切りで、ファイルから文字列を読むために%sを用いる) # ・単語の長さは100文字以内と考えてよい。 # ・標準文字列関数を利用すること。 # # (指定されたファイルとは普通の英文が書かれた.txtファイルです) # 実行例 # $./quiz10-2 # Input file name!:sample.txt # file1 open Error sample.txt # $ # $./quiz10-2 # Input file name!:English.txt # The First word = 's # The Last word = yokozuna # The Longest word = accomplishment. # # '指定したファイルで、最も辞書順(ASCIIコード順)で最初に出てくる単語と、最後に出てくる単語を見つけて表示せよ。また、最も長い単語も表示せよ'(_ファイル) :- get_lines(_ファイル,Lines), concat_atom(Lines,' ',_文字列), split(_文字列,[' ','\t'],L1), sort(L1,L), '最初に出てくる単語と、最後に出てくる単語を見つけて表示せよ。また、最も長い単語も表示せよ'(L). '最初に出てくる単語と、最後に出てくる単語を見つけて表示せよ。また、最も長い単語も表示せよ'(L) :- 最初に出てくる単語(L,_最初に出てくる単語), 最後に出てくる単語(L,_最後に出てくる単語), 最も長い単語も表示せよ'(L,_最も長い単語), 表示する(_最初に出てくる単語,_最後に出てくる単語,_最も長い単語). 最初に出てくる単語([_最初に出てくる単語|_],_最初に出てくる単語). 最後に出てくる単語(L,_最後に出て切る単語) :- append(_,[_最後に出てくる単語],L). 最も長い単語も表示せよ(L,_最も長い単語) :- 最も長い単語も表示せよ(L,0,'',_最も長い単語). 最も長い単語も表示せよ([],_,_最も長い単語,_最も長い単語) :- !. 最も長い単語も表示せよ([_単語|R],_これまでの最長文字数,_これまでの最長文字列,_最も長い単語) :- atom_length(_単語,_文字数), _文字数 > _これまでの最長文字数, 最も長い単語も表示せよ(R,_文字数,_単語,_最も長い単語),!. 最も長い単語も表示せよ([_|R],_これまでの最長文字数,_これまでの最長文字列,_最も長い単語) :- 最も長い単語も表示せよ(R,_これまでの最長文字数,_これまでの最長文字列,_最も長い単語). 表示する(_最初に出てくる単語,_最後に出てくる単語,_最も長い単語) :- writef('最初に出てくる単語 = %t\n最後に出てくる単語 = %t\n_最も長い単語 = %t\n',[_最初に出てくる単語,_最後に出てくる単語,_最も長い単語]). 辞書順序(1,ァ). 辞書順序(2,ア). 辞書順序(3,ぁ). 辞書順序(4,あ). 辞書順序(5,ィ). 辞書順序(6,イ). 辞書順序(7,ぃ). 辞書順序(8,い). 辞書順に整列(_語彙ならび,_辞書順語彙ならび) :- 辞書順序コードならびに変換(_語彙ならび,_辞書順序コードならび), sort(_辞書順序コードならび,_整列済み辞書順序コードならび), 辞書順語彙ならびに変換(_整列済み辞書順序コードならび,_辞書順語彙ならび). 辞書順序コードならびに変換(_語彙ならび,_辞書順序コードならび) :- findall(_辞書順序語彙コード,( member(_語彙,_語彙ならび), % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/280 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/www1.axfc.net/uploader/Sc/so/298224 # # 以下に与えるファイルdata.datを作業ディレクトリ内に作成し、data.datからデータを読み込み、 # BMIを計算しBMI値を判定し、全員のデータを標準出力に出力し、更に男性のデータをdata2.txtという # 名前のファイルに出力するプログラムを作成せよ。BMI判定は18.5未満なら1、18.5以上25未満なら2、 # 25以上30未満なら3、30以上なら4とする。BMIの計算では関数calc_bmiを各自作成して計算を行うこと。 # 尚、data.dat内のデータは左から名前、性別(M=男性、F=女性)、身長[cm]、体重[kg]を表す # ※data2.datへの出力の際は性別の記入は必要ない # # # data.dat # Andrew M 38 180.5 105.2 # Helen F 23 171.9 65.1 # Jane F 31 172.4 75.4 # John M 19 186.6 78.3 # Susan F 27 168.1 62.7 # Thomas M 43 189.2 65.1 # # # <作成したプログラムの実行結果> # 『標準出力への出力結果』 # 名前 性別 年齢 身長[m] 体重[kg] BMI BMI 判定 # Andrew M 38 1.805000 105.200000 32.289501 4 # Helen F 23 1.719000 65.100000 22.030748 2 # Jane F 31 1.724000 75.400000 25.368619 3 # John M 19 1.866000 78.300000 22.487361 2 # Susan F 27 1.681000 62.700000 22.188713 2 # Thomas M 43 1.892000 65.100000 18.186064 1 # # 『data2.txtへの出力結果』 # Andrew 38 1.805000 105.200000 32.289501 4 # John 19 1.866000 78.300000 22.487361 2 # Thomas 43 1.892000 65.100000 18.186064 1 # 'data.datからデータを読み込み、BMIを計算しBMI値を判定し、全員のデータを標準出力に出力し、更に男性のデータをdata2.txtという名前のファイルに出力する' :- write('名前 性別 年齢 身長[m] 体重[kg] BMI BMI 判定\n'), get_split_lines('data1.txt',[' '],LL), append(_,[[_名前,_性別,_年齢,_身長,_体重]|R],LL), _BMI値 is _体重 / (_身長 * _身長), 'BMI判定'(BMI,_BMI判定), writef('%14r %4r %4r %8r %6r %5r %2r\n',[_名前,_性別,_年齢,_身長,_体重,_BMI値,_BMI判定]), R = []. 'BMI判定'(_BMI値,1) :- _BMI値 < 18.5,!. 'BMI判定'(_BMI値,2) :- _BMI値 >= 18.5, _BMI値 < 25.0,!. 'BMI判定'(_BMI値,3) :- _BMI値 >= 25.0, _BMI値 < 30.0,!. 'BMI判定'(_BMI値,4) :- _BMI値 >= 30.0,!., % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/330 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # テキストファイル bmi.txt を用意します # 17人の名前と彼らの身長と体重が記入されています. # $ cat bmi.txt # Ackley,D.H. 181.5 65.1 # Baker,J.E. 185.3 68.3 # Keller,K.S. 175.2 63.4 # Brent,R.P. 174.4 52.8 # Jong,K.A. 186.2 73.4 # Goldberg,D.E. 174.0 60.0 # Forrest,S. 175.5 60.6 # Fletcher,R. 180.3 73.8 # Powell,M.J.D. 170.1 55.9 # Smith,R.E. 178.7 69.6 # Richardson,J. 167.7 51.5 # Martin,F.G. 179.2 65.3 # Wilson,S.W. 185.8 84.4 # Lawler,E.L. 166.5 59.6 # Reed,J. 176.3 58.8 # Holland,J.H. 186.1 70.4 # Jones,W.T. 171.4 63.7 # # C プログラム delcomma.c を書き,以下の要領でコンパイルし,実行モジュール delcomma を生成します. # delcomma は想像通り,delete comma の略です. # 標準入力から受け取った名前の中で,カンマ以下を削除して標準出力に表示するコマンドです. # # '標準入力から受け取った名前の中で,カンマ以下を削除して標準出力に表示する' :- at_end_of_stream(user_input),!. '標準入力から受け取った名前の中で,カンマ以下を削除して標準出力に表示する' :- get_line(user_input,Line), split(Line,[','],[_名前|_]), writef(user_output,'%t\n',[_名前]), '標準入力から受け取った名前の中で,カンマ以下を削除して標準出力に表示する'. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/17 # # 前スレの未解決問題。(ほかにあったら転記してね) # 979 :デフォルトの名無しさん:2011/11/29(火) 21:17:42.06 # [1] 授業単元:コマンドライン引数 # [2] 問題文(含コード&リンク): # コマンドライン引数を用いて,以下の計算ができる簡易電卓プログラムを作成せよ. # 1. 2 〜5項式までの四則演算(計算順もちゃんと考慮すること) # (出力例)C :¥Programming>dentaku 2 + 5 / 5 + 4 * 2 + 1 # 答えは 12 # # C :¥Programming>dentaku 2 * 3 + 1 # 答えは 7 # # 2.()を用いた演算(かっこの中の計算を最優先する) # (出力例)C :¥Programming>dentaku ( 2 + 3 ) * 7 * ( 3 - 1 ) # 答えは 70 # # 3. (sin, cos, tan)の演算 # (出力例)C :¥Programming>dentaku sin(90) * 2 + 1 - 2 # 答えは 1 # # 4.logの演算 # (出力例)C :¥Programming>dentaku log(3) * 2 + 1 # 答えは 1.9542425094 # # 5. 半角スペースを入れ忘れても演算可能 # (出力例)C :¥Programming>dentaku 1-2*(3+1)-2 # 答えは 9 # 電卓 :- 式の入力(Line), 項に分解(Line,_項ならび), '2. () を用いた演算'(_項ならび,X), writef('%12r\n',[X]). 式の入力(Line) :- writef('%12r\n',[0]), get_line(Line),!. 項に分解(Line,_項ならび) :- atom_chars(Line,Chars), 一旦空白要素を削除する(Chars,Chars1), '先頭の符号に注意して、演算子の前後に空白を入れる'(Chars1,Chars2), atom_chars(Line2,Chars2), split(Line2,[' '],_項ならび). 一旦空白要素を削除する([],[]). 一旦空白要素を削除する([' '|R1],R2) :- 一旦空白要素を削除する(R1,R2),!. 一旦空白要素を削除する([A|R1],[A|R2]) :- 一旦空白要素を削除する(R1,R2),!. '先頭の符号に注意して、演算子の前後に空白を入れる'(['-'|R1],['-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '先頭の符号に注意して、演算子の前後に空白を入れる'(L1,L2) :- 演算子の前後に空白を入れる(L1,L2),!. 演算子の前後に空白を入れる([],[]),!. 演算子の前後に空白を入れる(['(','-'|R1],[' ','(',' '|R2]) :- 演算子の前後に空白を入れる(['-'|R1],R2),!. 演算子の前後に空白を入れる([')','-'|R1],[' ',')',' ','-',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['+','-'|R1],[' ','+',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-','-'|R1],[' ','-',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*','-'|R1],[' ','*',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/','-'|R1],[' ','/',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['('|R1],[' ','(',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる([')'|R1],[' ',')',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['+'|R1],[' ','+',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-'|R1],[' ','-',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*'|R1],[' ','*',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/'|R1],[' ','/',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる([A|R1],[A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '2. () を用いた演算'(_項ならび,X) :- '先に()グループを演算する'(_項ならび,_項ならびの一), '+,-でグループ化する'(_項ならびの一,_項ならびの二), '要素の四則演算'(_項ならびの二,X). '先に()グループを演算する'([],[]). '先に()グループを演算する'(['('|R1],[X|R2]) :- '()グループを演算して置換'(R1,X), '先に()グループを演算する'(R1,R2),!. '先に()グループを演算する'([A|R1],[A|R2]) :- '先に()グループを演算する'(R1,R2),!. '()グループを演算して置換'([],LX,X,[]) :- '+,-でグループ化する'(_項ならびの一,_項ならびの二), '要素の四則演算'(_項ならびの二,X),!. '()グループを演算して置換'([')'|R],LX,X,R) :- '+,-でグループ化する'(LX,_項ならびの二), '要素の四則演算'(_項ならびの二,X),!. '()グループを演算して置換'(['('|R],LX,X,R) :- '()グループを演算して置換'(['('|R],[],Y,R1), append(LX,[Y],LY), '()グループを演算して置換'(R1,LY,X,R),!. '()グループを演算して置換'([A|R1],LX,X,R) :- append(LX,[A],LY), '()グループを演算して置換'(R1,LY,X,R). '+,-でグループ化する'(L,[L0,A|R2]) :- append(L0,[A|R],L), '+か-'(A), '+,-でグループ化する'(R,R2),!. '+,-でグループ化する'(L,[L]). '+か-'(+). '+か-'(-). '要素の四則演算'([L],X) :- ならび評価(L,X),!. '要素の四則演算'([L1,'+'|R1],X) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A + Y. '要素の四則演算'([L1,'-',L2|R1],[C|R2]) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A - Y. ならび評価([A],A) :- !. ならび評価([A,'*'|R1],X) :- ならび評価(R1,Y), X is A * Y. ならび評価([A,'/'|R1],X) :- ならび評価(R1,Y), X is A // Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/17 # # 前スレの未解決問題。(ほかにあったら転記してね) # 979 :デフォルトの名無しさん:2011/11/29(火) 21:17:42.06 # [1] 授業単元:コマンドライン引数 # [2] 問題文(含コード&リンク): # コマンドライン引数を用いて,以下の計算ができる簡易電卓プログラムを作成せよ. # 1. 2 〜5項式までの四則演算(計算順もちゃんと考慮すること) # (出力例)C :¥Programming>dentaku 2 + 5 / 5 + 4 * 2 + 1 # 答えは 12 # # C :¥Programming>dentaku 2 * 3 + 1 # 答えは 7 # # 2.()を用いた演算(かっこの中の計算を最優先する) # (出力例)C :¥Programming>dentaku ( 2 + 3 ) * 7 * ( 3 - 1 ) # 答えは 70 # # 3. (sin, cos, tan)の演算 # (出力例)C :¥Programming>dentaku sin(90) * 2 + 1 - 2 # 答えは 1 # # 4.logの演算 # (出力例)C :¥Programming>dentaku log(3) * 2 + 1 # 答えは 1.9542425094 # # 5. 半角スペースを入れ忘れても演算可能 # (出力例)C :¥Programming>dentaku 1-2*(3+1)-2 # 答えは 9 # 電卓 :- 式の入力(Line), 項に分解(Line,_項ならび), '1. 2 〜5項式までの四則演算'(_項ならび,X), writef('%12r\n',[X]). 式の入力(Line) :- writef('%12r\n',[0]), get_line(Line),!. 項に分解(Line,_項ならび) :- atom_chars(Line,Chars), 一旦空白要素を除去する(Chars,Chars2), '先頭の符号に注意して、演算子の前後に空白を入れる'(Chars2,Chars3), atom_chars(Line2,Chars3), split(Line2,[' '],_項ならび). 一旦空白要素を除去する([],[]) :- !. 一旦空白要素を除去する([' '|R1],R2) :- 一旦空白要素を除去する(R1,R2),!. 一旦空白要素を除去する([A|R1],[A|R2]) :- 一旦空白要素を除去する(R1,R2). '先頭の符号に注意して、演算子の前後に空白を入れる'([-,A|R1],[-,A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '先頭の符号に注意して、演算子の前後に空白を入れる'(L1,L2) :- 演算子の前後に空白を入れる(L1,L2),!. 演算子の前後に空白を入れる([],[]),!. 演算子の前後に空白を入れる(['+','-'|R1],[' ','+',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-','-'|R1],[' ','-',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*','-'|R1],[' ','*',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/','-'|R1],[' ','/',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['+'|R1],[' ','+',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-'|R1],[' ','-',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*'|R1],[' ','*',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/'|R1],[' ','/',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる([A|R1],[A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '1. 2 〜5項式までの四則演算'(_項ならび,X) :- '+,-でグループ化する'(_項ならび,_項ならびの一), '要素の四則演算'(_項ならびの一,X). '+,-でグループ化する'(L,[L0,A|R2]) :- append(L0,[A|R],L), '+か-'(A), '+,-でグループ化する'(R,R2),!. '+,-でグループ化する'(L,[L]). '+か-'(+). '+か-'(-). '要素の四則演算'([L],X) :- ならび評価(L,X),!. '要素の四則演算'([L1,'+'|R1],X) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A + Y. '要素の四則演算'([L1,'-',L2|R1],[C|R2]) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A - Y. ならび評価([A],A) :- !. ならび評価([A,'*'|R1],X) :- ならび評価(R1,Y), X is A * Y. ならび評価([A,'/'|R1],X) :- ならび評価(R1,Y), X is A // Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/111 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):テキストファイルを読み込み1次元の離散コサイン変換を行って、その結果を新たなテキストファイルに書き込むプログラムを作れ。 # # [5] その他の制限: 例 10,15,20,80,120,160,210,10,20,100...と続く # テキストデータ3つ(data.txt data2.txt data3.txt)を(それぞれ内容は違う)読み込む。 # それぞれに1次元の離散コサイン変換を行う。 # 変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。 'テキストファイルを読み込み1次元の離散コサイン変換を行って、その結果を新たなテキストファイルに書き込む'(_テキストファイル名,_出力ファイル名) :- get_lines(_テキストファイル名,Lines), データ要素のならびとする(Lines,_要素ならび), '1次元の離散コサイン変換'(L1,L2), '新たなテキストファイルに書き込む'(_出力ファイル名,L2). データ要素のならびとする(Lines,_要素ならび) :- concat_atom(Lines,',',S), split(S,[',',' '],_要素ならび). '1次元の離散コサイン変換'(L1,L2) :- append([_第一要素],L,[_最終要素],L1), length(L1,N), '1次元の離散コサイン変換'(L,L,N,-1,_第一要素,_最終要素,L2). '1次元の離散コサイン変換'([],_,_,_,_第一要素,_最終要素,[]). '1次元の離散コサイン変換'([M|R1],L,N,-1,_第一要素,_最終要素,[Xk|R2]) :- findsum(U,( append(_,[B|_],L), length([_|L0],K), U is _最終要素 * cos(pi/(M-1) * N * K)), Sum), Xk is _第一要素/2 + Sum + ((-1) / 2) * (_最終要素-1)), '1次元の離散コサイン変換'(R1,L,N,1,_第一要素,_最終要素,R2). '1次元の離散コサイン変換'([M|R1],L,N,1,_第一要素,_最終要素,[Xk|R2]) :- findsum(U,( append(L0,[B|_],L), length([_|L0],K), U is _最終要素 * cos((pi / (M-1)) * N * K), Sum), Xk is _第一要素/2 + Sum + ((1 / 2) * (_最終要素-1)), '1次元の離散コサイン変換'(R1,L,N,-1,_第一要素,_最終要素,R2). '新たなテキストファイルに書き込む'(_テキストファイル名,L) :- open(_テキストファイル名,write,Outstream), append(_,[A|R],L), writef(Outstream,'%t,',[A]), R = [B], writef(Outstream,'%t\n',[B]), close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/17 # # 前スレの未解決問題。(ほかにあったら転記してね) # 979 :デフォルトの名無しさん:2011/11/29(火) 21:17:42.06 # [1] 授業単元:コマンドライン引数 # [2] 問題文(含コード&リンク): # コマンドライン引数を用いて,以下の計算ができる簡易電卓プログラムを作成せよ. # 1. 2 〜5項式までの四則演算(計算順もちゃんと考慮すること) # (出力例)C :¥Programming>dentaku 2 + 5 / 5 + 4 * 2 + 1 # 答えは 12 # # C :¥Programming>dentaku 2 * 3 + 1 # 答えは 7 # # 2.()を用いた演算(かっこの中の計算を最優先する) # (出力例)C :¥Programming>dentaku ( 2 + 3 ) * 7 * ( 3 - 1 ) # 答えは 70 # # 3. (sin, cos, tan)の演算 # (出力例)C :¥Programming>dentaku sin(90) * 2 + 1 - 2 # 答えは 1 # # 4.logの演算 # (出力例)C :¥Programming>dentaku log(3) * 2 + 1 # 答えは 1.9542425094 # # 5. 半角スペースを入れ忘れても演算可能 # (出力例)C :¥Programming>dentaku 1-2*(3+1)-2 # 答えは 9 # 電卓 :- 式の入力(Line), 項に分解(Line,_項ならび), '1. 2 〜5項式までの四則演算'(_項ならび,X), writef('%12r\n',[X]). 式の入力(Line) :- writef('%12r\n',[0]), get_line(Line),!. 項に分解(Line,_項ならび) :- atom_chars(Line,Chars), 一旦空白要素を除去する(Chars,Chars2), '先頭の符号に注意して、演算子の前後に空白を入れる'(Chars2,Chars3), atom_chars(Line2,Chars3), split(Line2,[' '],_項ならび). 一旦空白要素を除去する([],[]) :- !. 一旦空白要素を除去する([' '|R1],R2) :- 一旦空白要素を除去する(R1,R2),!. 一旦空白要素を除去する([A|R1],[A|R2]) :- 一旦空白要素を除去する(R1,R2). '先頭の符号に注意して、演算子の前後に空白を入れる'([-,A|R1],[-,A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '先頭の符号に注意して、演算子の前後に空白を入れる'(L1,L2) :- 演算子の前後に空白を入れる(L1,L2),!. 演算子の前後に空白を入れる([],[]),!. 演算子の前後に空白を入れる(['+','-'|R1],[' ','+',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-','-'|R1],[' ','-',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*','-'|R1],[' ','*',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/','-'|R1],[' ','/',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['+'|R1],[' ','+',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-'|R1],[' ','-',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*'|R1],[' ','*',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/'|R1],[' ','/',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる([A|R1],[A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '1. 2 〜5項式までの四則演算'(_項ならび,X) :- '+,-でグループ化する'(_項ならび,_項ならびの一), '要素の四則演算'(_項ならびの一,X). '+,-でグループ化する'(L,[L0,A|R2]) :- append(L0,[A|R],L), '+か-'(A), '+,-でグループ化する'(R,R2),!. '+,-でグループ化する'(L,[L]). '+か-'(+). '+か-'(-). '要素の四則演算'([L],X) :- ならび評価(L,X),!. '要素の四則演算'([L1,'+'|R1],X) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A + Y. '要素の四則演算'([L1,'-',L2|R1],[C|R2]) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A - Y. ならび評価([A],A) :- !. ならび評価([A,'*'|R1],X) :- ならび評価(R1,Y), X is A * Y. ならび評価([A,'/'|R1],X) :- ならび評価(R1,Y), X is A // Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/625 # # [1] 授業単元:C言語 # [2] 問題文:123, 1.23, 1.2.3という数字を入力したとき、 #        整数、小数、使用できない数字という分類に分けよ。 # '123, 1.23, 1.2.3という数字を入力したとき、整数、小数、使用できない数字という分類に分けよ。'(_整数分類ならび,_小数分類ならび,_使用できない数字分類ならび) :- split('123, 1.23, 1.2.3',[',',' '],L), '整数、小数、使用できない数字という分類'(L,_整数分類ならび,_小数分類ならび,_使用できない数字分類ならび). '整数、小数、使用できない数字という分類'([],[],[],[]). '整数、小数、使用できない数字という分類'([A|R1],[A|R2],R3,R4) :- 整数である(A), '整数、小数、使用できない数字という分類'(R1,R2,R3,R4),!. '整数、小数、使用できない数字という分類'([A|R1],R2,[A|R3],R4) :- 小数である(A), '整数、小数、使用できない数字という分類'(R1,R2,R3,R4). '整数、小数、使用できない数字という分類'([A|R1],R2,R3,[A|R4]) :- '整数、小数、使用できない数字という分類'(R1,R2,R3,R4),!. 整数である(A) :- 第一文字が符号で残りの文字列をA2とすると(A,A2), 文字列が符号を含まない数字だけから構成される(A2),!. 整数である(A) :- 文字列が符号を含まない数字だけから構成される(A2),!. 小数である(A) :- 第一文字が符号で残りの文字列をA2とすると(A,A2), 数字から始まる小数点表現文字列(A2),!. 小数である(A) :- 数字から始まる小数点表現文字列(A2),!. 数字から始まる小数点表現文字列(A) :- 間にピリオドがひとつだけあり他は数字である文字列(A),!. 数字から始まる小数点表現文字列(A) :- atom_chars(A,Chars), 指数部表現が適切(Chars). 指数部表現が適切(Chars) :- append(L0,[e,+|R],Chars), 'L0部の診断'(L0), 空ではなくかつ全て数字(R). 指数部表現が適切(Chars) :- append(L0,[e,-|R],Chars), 'L0部の診断'(L0), 空ではなくかつ全て数字(R). 'L0部の診断'(L0) :- 空ではなくかつ全て数字(L0),!. 'L0部の診断'(L0) :- append(L01,['.'|R],L0), 空ではなくかつ全て数字(L0), 空ではなくかつ全て数字(R),!. 間にピリオドがひとつだけあり他は数字である文字列(A) :- atom_chars(A,Chars), append(L0,['.'|R],Chars), 空ではなくかつ全て数字(L0), 空ではなくかつ全て数字(R),!. 第一文字が符号で残りの文字列をA2とすると(A,A2) :- sub_atom(A,0,1,R,_符号), member(_符号,[+,-]), sub_atom(A,1,R,0,A2). 文字列が符号を含まない数字だけから構成される(_文字列) :- atom_chars(_文字列,Chars), 空ではなくかつ全て数字(Chars). 空ではなくかつ全て数字([]) :- !,fail. 空ではなくかつ全て数字(L) :- 全て数字(L). 全て数字([]). 全て数字([A|R]) :- member(A,['0','1','2','3','4','5','6','7','8','9']), 全て数字([R]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/625 # # [1] 授業単元:C言語 # [2] 問題文:123, 1.23, 1.2.3という数字を入力したとき、 #        整数、小数、使用できない数字という分類に分けよ。 # '123, 1.23, 1.2.3という数字を入力したとき、整数、小数、使用できない数字という分類に分けよ。'(_整数分類ならび,_小数分類ならび,_使用できない数字分類ならび) :- split('123, 1.23, 1.2.3',[',',' '],L), '整数、小数、使用できない数字という分類'(L,_整数分類ならび,_小数分類ならび,_使用できない数字分類ならび). '整数、小数、使用できない数字という分類'([],[],[],[]). '整数、小数、使用できない数字という分類'([A|R1],R2,R3,[A|R4]) :- 'Aが使用できない数字'(A), '整数、小数、使用できない数字という分類'(R1,R2,R3,R4),!. '整数、小数、使用できない数字という分類'([A|R1],[A|R2],R3,R4) :- 'Aが整数'(A), '整数、小数、使用できない数字という分類'(R1,R2,R3,R4),!. '整数、小数、使用できない数字という分類'([A|R1],R2,[A|R3],R4) :- 'Aが小数(A), '整数、小数、使用できない数字という分類'(R1,R2,R3,R4). '整数、小数、使用できない数字という分類'([A|R1],R2,R3,[A|R4]) :- 'Aがエラーではないが整数でも小数でもない', '整数、小数、使用できない数字という分類'(R1,R2,R3,R4),!. 'Aが使用できない数字'(A) :- \+(catch(atom_to_term(A,_,_),_,fail)). 'Aが整数'(A) :- atom_to_term(A,X,_), integer(X). 'Aが小数'(A) :- atom_to_term(A,X,_), float(X). 'Aがエラーではないが整数でも小数でもない'. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/625 # # [1] 授業単元:C言語 # [2] 問題文:123, 1.23, 1.2.3という数字を入力したとき、 #        整数、小数、使用できない数字という分類に分けよ。 # '123, 1.23, 1.2.3という数字を入力したとき、整数、小数、使用できない数字という分類に分けよ。' :- split('123, 1.23, 1.2.3',[',',' '],L), '整数、小数、使用できない数字という分類'(L). '整数、小数、使用できない数字という分類'([]). '整数、小数、使用できない数字という分類'([A|R]) :- \+(catch(atom_to_term(A,_,_),_,fail)), writef('%tは 使用できない数字 に分類されます\n',[A]), '整数、小数、使用できない数字という分類'(R). '整数、小数、使用できない数字という分類'([A|R]) :- atom_to_term(A,X,_), integer(X), writef('%tは 整数 に分類されます\n',[A]), '整数、小数、使用できない数字という分類'(R). '整数、小数、使用できない数字という分類'([A|R]) :- atom_to_term(A,X,_), float(X), writef('%tは 小数 に分類されます\n',[A]), '整数、小数、使用できない数字という分類'(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/523 # # 【 課題 】キーボードで生徒のデータを入力するプログラムを作成せよ # データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。 # 【 形態 】Javaアプリケーション(main()で開始 # 【 GUI  】制限なし # 【 期限 】2011年11月24日(木) # 【 Ver  】java version 1.6.0_22 # 【 補足 】作ってみたものの、上手く行きません。 # http://ime.nu/ideone.com/8gqKi # 何処がどう間違っているか指摘していただければ幸いです。 # # 'キーボードで生徒のデータを入力する。データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。' :- repeat, 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断), 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,_診断),!. 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 指示に従い一行入力する('名前,ID,学年,電話番号 をカンマ区切りで入力して下さい(終了したい時は改行のみ) : ',Line), 入力診断(Line,_名前,_ID,_学年,_電話番号,_診断), \+(_診断 = 再入力),!. 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断). 指示に従い一行入力する(_指示,Line) :- writef('%t',[_指示]), get_line(Line),!. 入力診断('',_名前,_ID,_学年,_電話番号,終了) :- !. 入力診断(Line,_名前,_ID,_学年_1,_電話番号,入力完了) :- split(Line,[','],[_名前,_ID,_学年,_電話番号]), 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年),!. 入力診断(Line,_名前,_ID,_学年,_電話番号,再入力) :- writef('入力された %t からは求める生徒データが得られません。再入力をお願いします。\n',[Line]). 学年の入力が負の場合メッセージを表示して中断する(_学年,_学年) :- _学年 >= 0,!. 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年) :- _学年_1 < 0, writef('学年データ%tが負数です。再入力をしますか? y or n : ',[_学年_1]), get_line(y), 学年の再入力(_学年),!. 学年の再入力(_学年) :- write('学年を入力して下さい : '), get_line(Line), 学年再入力診断(Line,_学年),!. 学年再入力診断(Line,_学年) :- atom_to_term(Line,_学年,_), integer(_学年), _学年 >= 0,!. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,終了) :- !. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,入力完了) :- assertz(生徒のデータ(_名前,_ID,_学年,_電話番号)), fail. % % http://nojiriko.asia/prolog/j71_523.html とは僅かな違い。 % 何処が違うのか、捜すのさえ難しいくらいだが。 % どちらが好ましい表現かという問題。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/523 # # 【 課題 】キーボードで生徒のデータを入力するプログラムを作成せよ # データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。 # 【 形態 】Javaアプリケーション(main()で開始 # 【 GUI  】制限なし # 【 期限 】2011年11月24日(木) # 【 Ver  】java version 1.6.0_22 # 【 補足 】作ってみたものの、上手く行きません。 # http://ime.nu/ideone.com/8gqKi # 何処がどう間違っているか指摘していただければ幸いです。 # # 'キーボードで生徒のデータを入力する。データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。' :- 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断), 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,_診断),!. 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 指示に従い一行入力する('名前,ID,学年,電話番号 をカンマ区切りで入力して下さい(終了したい時は改行のみ) : ',Line), 入力診断(Line,_名前,_ID,_学年,_電話番号,_診断), \+(_診断 = 再入力). 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断). 指示に従い一行入力する(_指示,Line) :- writef('%t',[_指示]), get_line(Line),!. 入力診断('',_,_,_,_,終了) :- !. 入力診断(Line,_名前,_ID,_学年_1,_電話番号,入力完了) :- split(Line,[','],[_名前,_ID,_学年,_電話番号]), 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年),!. 入力診断(Line,_名前,_ID,_学年,_電話番号,再入力) :- writef('入力された %t からは求める生徒データが得られません。再入力をお願いします。\n',[Line]). 学年の入力が負の場合メッセージを表示して中断する(_学年,_学年) :- _学年 >= 0,!. 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年) :- _学年_1 < 0, writef('学年データ%tが負数です。再入力をしますか? y or n : ',[_学年_1]), get_line('学年データ%tが負数です。再入力をしますか? y or n : ',y), 学年の再入力(_学年),!. 学年の再入力(_学年) :- write('学年を入力して下さい : '), get_line(Line), 学年再入力診断(Line,_学年),!. 学年再入力診断(Line,_学年) :- atom_to_term(Line,_学年,_), integer(_学年), _学年 >= 0,!. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,終了) :- !. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,入力完了) :- assertz(生徒のデータ(_名前,_ID,_学年,_電話番号)), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/548 # # 1] 授業単元:画像処理 # [2] 問題文(含コード&リンク): # text.txtを読み取って0なら空白を、1なら*を表示するプログラム(test.c)がある。 # これを改良してtest.txtをtext.bmpに変換するプログラムを作れ。 # (ただし、0を白色、1を黒色とする。) # test.c # http://ime.nu/codepad.org/Xk3b2CZq # # /********test.txtの中身********** # 11 6 # 0 1 1 1 1 1 0 0 0 0 0 # 0 1 0 1 1 0 1 0 0 0 1 # 0 1 1 1 1 1 0 0 0 0 0 # 0 1 0 0 1 1 0 1 0 0 1 # 0 1 1 1 0 1 0 0 0 0 0 # 0 1 1 0 0 1 0 0 0 0 0 # ******************************/ # # 'text.txtを読み取って0なら空白を、1なら*を表示する' :- 'text.txtを読み取って'(_行数,_列数,_残り画像部Lines), '0なら空白を、1なら*を表示する'(_行数,_列数,_残り画像部Lines). 'text.txtを読み取って'(_行数,_列数,_残り画像部Lines) :- get_line('text.txt',Lines), 行数と列数を得る(Lines,_行数,_列数,_残り画像部Lines). 行数と列数を得る(Lines,_行数,_列数,_残り画像部Lines) :- Lines = [_第一行|_残り画像部Lines), split(_第一行,[' '],[_列数,_行数]). '0なら空白を、1なら*を表示する'(_行数,_列数,_残り画像部Lines) :- '残り画像部Linesを0,1ならびに変換'(_残り画像部Lines,_0_1_ならび), '行を切り取りながら0なら空白を、1なら*を表示する'(_行数,_列数,_0_1_ならび). '残り画像部Linesを0,1ならびに変換'(_残り画像部Lines,_0_1_ならび) :- concat_atom(_残り画像部Lines,_画像部文字列), split(_画像部文字列,[' '],_0_1_ならび). '行を切り取りながら0なら空白を、1なら*を表示する'(0,_,_). '行を切り取りながら0なら空白を、1なら*を表示する'(_行数,_列数,_0_1_ならび) :- 行データを切り取る(_列数,_0_1_ならび,_行データ,_残り_0_1_ならび), 行データを変換して表示する(_行データ), _行数_1 is _行数 - 1, '行を切り取りながら0なら空白を、1なら*を表示する'(_行数_1,_列数,_残り_0_1_ならび),!. 行データを切り取る(_列数,_0_1_ならび,_行データ,_残り_0_1_ならび) :- length(_行データ,_列数), append(_行データ,_残り_0_1_ならび,_0_1_ならび),!. 行データを変換して表示する(_行データ) :- append(_,[_0または1|R],_行データ), '0なら空白を、1なら*を表示する'(_0または1), 一行表示し終わったら改行する(R). '0なら空白を、1なら*を表示する'(0) :- write(' '). '0なら空白を、1なら*を表示する'(1) :- write('*'). 一行表示し終わったら改行する([]) :- write('\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/481 # # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):(1,10,5) (1,20,10)...というテキストデータを読み込み、一番左の数字(ここでいう1と1)を一つの配列として表示と書きこみをするプログラム。(真ん中も右の数字も同じように処理する) #  [3.1] OS: (Windows/Linux/等々) Linux #  [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) gcc #  [3.3] 言語: (C/C++/どちらでも可 のいずれか) c言語 # [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 11月23日 15時 # [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) 何でもおk # # '(1,10,5) (1,20,10)...というテキストデータを読み込み、一番左の数字(ここでいう1と1)を一つのならびとして表示と書きこみをする'(_何列目) :- get_line(_テキスト), '各構造の一番左の数字(ここでいう1と1)を一つのならびとして'(_テキスト,_括弧内の列で並べ直した行列), 括弧内の列で並べ直した行列を書きだす(_括弧内の列で並べ直した行列), 列データを順に表示する(_何列目,_括弧内の列で並べ直した行列). 括弧内の列で並べ直した行列を書きだす(_何列目,_括弧内の列で並べ直した行列) :- assertz(括弧内の列で並べ直した行列(_何列目,_括弧内の列で並べ直した行列)). 列データを順に表示する(_何列目,_括弧内の列で並べ直した行列) :- append(L0,[_ならび|_],_括弧内の列で並べ直した行列), length([_|L0],_何列目), writef('%t: %t\n',[_何列目,_ならび]). '一番左の数字(ここでいう1と1)を一つのならびとして'(_テキスト,_括弧内の列で並べ直した行列) :- 括弧構造を行列に変換(_テキスト,_行列), 転置(_行列,_括弧内の列で並べ直した行列). 括弧構造を行列に変換(_テキスト,_行列) :- split(_テキスト,['(',')'],L), findall(L1,( append(_,[S|_],L), split(S,[','],L1)), LL). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/399 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):http://ime.nu/i.imgur.com/UwzPZ.jpg # # # 下の例のような、学生の4科目の(数学、物理、科学、英語)の試験点数(100点満点)を # 書いたファイルがある。(学生数は100名以下) # # ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、 # 各科目の平均点を表示するプログラムを作成する。 # # ・ 科目名(6文字未満)を入れる文字列(文字の一次元配列)を4つ用意する。 # # ・ 学籍番号と点数を一緒に入れる二次元整数配列を用意する # 例 int tensu[ ? ][ ? ] # # 最初に二次元配列を表示して、実行例のように点数を表示し、次に各学生の # 平均点、各科目の平均点を表示する。 # # ただし、ファイルの先頭には学生数(この例では5名)があり、つぎに4科目の # 科目名(数学、物理、科学、英語)が記述され、続いて、1行目に指定した学生数分 # の学籍番号と各試験点数が書かれている。 # # # ファイルの例(5名の例) # # 5 # Math Phys Chem Eng # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 表示例 # # 点数 :::: # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 学生平均 :::: # 8001 : 80.0 # 8004 : 48.25 # 8013 : 85.50 # 8035 : 81.25 # 8062 : 47.25 # # 科目平均 # 数学 : 69.8 # 物理 : 65.0 # 科学 : 69.0 # 英語 : 70.0 # 'ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_ファイル名) :- 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび), '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび). 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- get_lines(_ファイル名,Lines), 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数), 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび), '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび),!. 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数) :- Lines = [_学生数文字列|_], atom_to_term(_学生数文字列,_学生数,_), integer(_学生数),!. 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび) :- Lines = [_,_二行目文字列|_], split(_二行目文字列,[' ',','],_科目名ならび),!. '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび) :- length(_学籍番号と各試験点数ならび,_学生数), Lines = [_,_|_残りLines], findall(_学籍番号と各点数,( append(_,[_学籍番号と各点数文字列|_],_残りLines), aplit(_学籍番号と各点数文字列,[' ',','],_学籍番号と各点数)), _学籍番号と各試験点数ならび). '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- 学生の科目の一覧を表示(_学籍番号と各試験点数ならび), '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび). 学生の科目の一覧を表示(_学籍番号と各試験点数ならび) :- append(_,[_学籍番号と各試験点数|R],_学籍番号と各試験点数ならび), concat_atom(_学籍番号と各試験点数,' ',_表示文字列), writef('%t\n',[_表示文字列]), R = []. '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび) :- 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび), 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点ならび), 各学生の平均点を表示する(_各学生の平均点ならび), 各科目の平均点を表示する(_各科目の平均点ならび). 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび) :- findall([_学籍番号,_平均点],( append(_,[[_学籍番号|L]|_],_学籍番号と各試験点数ならび), 相加平均(L,_平均点)), _各学生の平均点ならび). 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点ならび) :- 転置(_学籍番号と各試験点数ならび,[_|_科目別点数ならび]), findall([_科目名,_平均点],( 科目名と点数ならびを得る(_科目名ならび,_学籍番号と各試験点数ならび,_科目名,_点数ならび), 相加平均(_点数ならび,_平均点)), _各科目の平均点ならび). 科目名と点数ならびを得る(_科目名ならび,_学籍番号と各試験点数ならび,_科目名,_点数ならび) :- append(L0,[_科目名|_],_科目名ならび), length(L0,Len), nth1(Len,_科目別点数ならび,_点数ならび). 各学生の平均点を表示する(_各学生の平均点ならび) :- write('\n学生平均 ::::\n'), append(_,[[_学籍番号,_平均点]|R],_各学生の平均点ならび), writef('%8r : %5r\n',[_学籍番号,_平均点]), R = []. 各科目の平均点を表示する(_各科目の平均点ならび) :- write('\n科目平均 ::::\n'), append(_,[[_科目名,_平均点]|R],_各科目の平均点ならび), writef('8r : %5r\n',[_科目名,_平均点]), R = []. % % http://nojiriko.asia/prolog/c153_399.html の % 各学生の平均点以下の述語定義と比較して、 % どちらが、理解しやすいかを問う。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/399 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):http://ime.nu/i.imgur.com/UwzPZ.jpg # # # 下の例のような、学生の4科目の(数学、物理、科学、英語)の試験点数(100点満点)を # 書いたファイルがある。(学生数は100名以下) # # ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、 # 各科目の平均点を表示するプログラムを作成する。 # # ・ 科目名(6文字未満)を入れる文字列(文字の一次元配列)を4つ用意する。 # # ・ 学籍番号と点数を一緒に入れる二次元整数配列を用意する # 例 int tensu[ ? ][ ? ] # # 最初に二次元配列を表示して、実行例のように点数を表示し、次に各学生の # 平均点、各科目の平均点を表示する。 # # ただし、ファイルの先頭には学生数(この例では5名)があり、つぎに4科目の # 科目名(数学、物理、科学、英語)が記述され、続いて、1行目に指定した学生数分 # の学籍番号と各試験点数が書かれている。 # # # ファイルの例(5名の例) # # 5 # Math Phys Chem Eng # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 表示例 # # 点数 :::: # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 学生平均 :::: # 8001 : 80.0 # 8004 : 48.25 # 8013 : 85.50 # 8035 : 81.25 # 8062 : 47.25 # # 科目平均 # 数学 : 69.8 # 物理 : 65.0 # 科学 : 69.0 # 英語 : 70.0 # 'ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_ファイル名) :- 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび), '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび). 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- get_lines(_ファイル名,Lines), 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数), 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび), '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび),!. 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数) :- Lines = [_学生数文字列|_], atom_to_term(_学生数文字列,_学生数,_), integer(_学生数),!. 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび) :- Lines = [_,_二行目文字列|_], split(_二行目文字列,[' ',','],_科目名ならび),!. '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび) :- length(_学籍番号と各試験点数ならび,_学生数), Lines = [_,_|_残りLines], findall(_学籍番号と各点数,( append(_,[_学籍番号と各点数文字列|_],_残りLines), aplit(_学籍番号と各点数文字列,[' ',','],_学籍番号と各点数)), _学籍番号と各試験点数ならび). '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- write('\n'), 学生の科目の一覧を表示(_学籍番号と各試験点数ならび), '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび). 学生の科目の一覧を表示(_学籍番号と各試験点数ならび) :- append(_,[_学籍番号と各試験点数|R],_学籍番号と各試験点数ならび), concat_atom(_学籍番号と各試験点数,' ',_表示文字列), writef('%t\n',[_表示文字列]), R = []. '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび) :- 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび), 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点), write('\n学生平均 ::::\n'), 各学生の平均点を表示する(_各学生の平均点ならび), write('\n科目平均 ::::\n'), 各科目の平均点を表示する(_各科目の平均点). 各学生の平均点([],[]). 各学生の平均点([[_学籍番号|L]|R1],[[_学籍番号,_平均点]|R2]) :- 相加平均(L,_平均点), 各学生の平均点(R1,R2). 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点) :- 転置(_学籍番号と各試験点数ならび,[_|_科目別点数ならび]), 転置された点数ならびから科目別平均点を得る(_科目名ならび,_科目別点数ならび,_各科目の平均点). 転置された点数ならびから科目別平均点を得る([],[],[]). 転置された点数ならびから科目別平均点を得る([_科目名|R1],[L|R2],[[_科目名,_平均点]|R3]) :- 相加平均(L,_平均点), 転置された点数ならびから科目別平均点を得る(R1,R2,R3). 各学生の平均点を表示する([]). 各学生の平均点を表示する([[_学籍番号,_平均点]|R]) :- writef('%8r : %5r\n',[_学籍番号,_平均点]), 各学生の平均点を表示する(R). 各科目の平均点を表示する([]). 各科目の平均点を表示する([[_科目名,_平均点]|R]) :- writef('8r : %5r\n',[_科目名,_平均点]), 各科目の平均点を表示する(R). % 以下のサイトは ?- 'a##'. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/785 # # 質問です。 # # 文字ストリング「"山田","太郎",,"",,"自宅TEL","03-4567-8901"」から、 # 「"山田"」、「"太郎"」、「""」、「"自宅TEL"」、「"03-4567-8901"を取り出したいのですが、 # 対象を「.+?」で指定すると、 # 「"山田"」、「"太郎"」、「"",,"」、「","」が取り出されます。 # どのような指定にすれば良いのでしょうか # # '文字ストリング「"山田","太郎",,"",,"自宅TEL","03-4567-8901"」から、「"山田"」、「"太郎"」、「""」、「"自宅TEL"」、「"03-4567-8901"を取り出したい'(_文字列,_取り出したい文字列ならび) :- split(_文字列,[','],_取り出したい文字列ならび). % 以下のサイトは # twitter_by_@nooyosh_20111115_1 # # カレントディレクトリ以下にあるすべてのPDFファイルのサイズを合計して表示 # 'カレントディレクトリ以下にあるすべてのPDFファイルのサイズを合計して表示'(_合計サイズ) :- shs('ls -s *.pdf',L), findsum(_サイズ,( append(_,[_行|_],L), split(_行,[' '],[_サイズ|_])), _合計サイズ). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/762 # # ●正規表現の使用環境 # MySQL4.1のREGEXP # ●検索か置換か? # 検索 # ●説明 # カラム内に <> を含むテキストデータがあるのですが # 調べたい数字が入っているかを調べたい # # ●対象データ # 3<>4 # 5<>32<>2 # 5<>3<>6 # 3 # 4 # # この中から3を含むものを検索したい(32はヒットしないように) # # ●希望する結果 # 3<>4 # 5<>3<>6 # 3 # # 'カラム内に <> を含むテキストデータがあるのですが調べたい数字が入っているかを調べたい'(_カラムならび,_調べたい数字,_適合カラム) :- append(_,[_カラム|_],_カラムならび), 調べたい数字が入っているか(_カラム). 調べたい数字が入っているか(_,_調べたい数字) :- !. 調べたい数字が入っているか(_カラム,_調べたい数字) :- split(_カラム,['<>'],L), append(_,[_調べたい数字|_],L). % 以下のサイトは # # C:\Users\workspace\pythonというディレクトリの中のpythonファイルを実行すると、 # pythonがあるディレクトリと同ディレクトリの全てのテキスト形式ファイル内にある # path1、path2に格納されている文字列のディレクトリを # C:\Users\workspace\pythonに置き換えたいです。 # 現ディレクトリ('C:\\Users\\workspace\\python\\'). 'ディレクトリ内の全テキストファイル中のpath1, path2 のディレクトリを現ディレクトリに置換する' :- ディレクトリ内の全テキストファイル(_テキストファイル名ならび), 'ファイル中のpath1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名ならび). ディレクトリ内の全テキストファイル(_テキストファイル名ならび) :- shs('ls -N *.txt',_テキストファイル名ならび). 'ファイル内のpath1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名ならび) :- append(_,[_テキストファイル名|R],_テキストファイル名ならび), 'path1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名), R = []. 'path1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名) :- get_lines(_テキストファイル名,Lines), 'path1, path2 のディレクトリを現ディレクトリに置換する'(Lines,Lines2), put_lines(_テキストファイル名,Lines2). 'path1, path2 のディレクトリを現ディレクトリに置換する'([],[]) :- !. 'path1, path2 のディレクトリを現ディレクトリに置換する'([Line1|R1],[Line2|R2]) :- 'path1かpath2が存在する'(Line1,_path,_パス,R), パスを現ディレクトリに変換(_path,_パス,R,,Line2), 'path1, path2 のディレクトリを現ディレクトリに置換する'(R1,R2),!. 'path1, path2 のディレクトリを現ディレクトリに置換する'([Line|R1],[Line|R2]) :- 'path1, path2 のディレクトリを現ディレクトリに置換する'(R1,R2). 'path1かpath2が存在する'(Line1,_path,_パス,R) :- split(Line1,[' '],[_path,=,_パス|R]), member(_path,[path1,path2]),!. パスを現ディレクトリに変換(_path,_パス,R,Line2) :- 現ディレクトリ(DIR), split(_パス,['\\'],L), append(_,[_ファイル名],L), concat_atom([DIR,_ファイル名],_更新されたパス), concat_atom([_path,=,_更新されたパス,R],' ',Line2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/155 # # SQL命令で表(TABLE)を作る # 1、本(コード・題名・著者名・出版社名・価格・在庫冊数) # # 2、出納(費用・本のコード・冊数・日付) # # 3、顧客(顧客コード・氏名・連絡先) # # 4、予約本(顧客コード・本のコード・予約日付・入荷日付) # # このまんまの問題がでたんだけど意味が全く分からない # # テーブル構造を定義する(_定義文文字列) :- split(_定義文文字列,['(',')','・'],[_テーブル名|_属性名ならび]), append(L0,[_属性名|R],_属性名ならび), length([_|L0],_属性番号], _テーブル構造 =.. [_テーブル構造,_テーブル名,_属性番号,_属性名], assertz(_テーブル構造), R = [],!. ?- テーブル構造を定義する('本(コード・題名・著者名・出版社名・価格・在庫冊数)'). ?- テーブル構造を定義する('出納(費用・本のコード・冊数・日付)'). ?- テーブル構造を定義する('顧客(顧客コード・氏名・連絡先)'). ?- テーブル構造を定義する('予約本(顧客コード・本のコード・予約日付・入荷日付)'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/844 # # [1] 授業単元:C言語基礎 # [2] 問題文(含コード&リンク): # # 明治元年以降の西暦年を4桁の数で入力すると、 # 和暦で年を表示するプログラムを作成せよ。 # ただし、2つの元号を持つ年 # は両方の年を表示すること。 # (例: 1989年 → 昭和64年、平成元年) # # (2つの元号を持つ年の扱いについては # 余裕がある人は、月、日も入れて、その日の正しい # 元号を表示することによって元号を一つ表示す # るプログラムとしてもよい。) # 提出例 # === プログラム === # #include <stdio.h> # int main() # { # '明治元年以降の西暦年月日を入力して和暦を表示する' :- '明治元年以降の西暦年月日を入力すると'(_西暦年,_月,_日), '入力された西暦年月日から元号を表示する'(_西暦年,_月,_日). '明治元年以降の西暦年月日を入力すると'(_西暦年,_月,_日) :- write('西暦年月日をカンマ区切りで入力してください : '), readln([_西暦年,_月,_日]). '入力された西暦年月日から和暦を表示する'(_西暦年,_月,_日) :- findall(_和暦,( 元号期間(_元号,_期間開始年,_期間開始月,_期間開始日,_期間終了年,_期間終了月,_期間終了日), [_期間開始年,_期間開始月,_期間開始日] @=< [_西暦年,_月,_日], [_期間終了年,_期間終了月,_期間終了日] @>= [_西暦年,_月,_日], 西暦年月日と元号開始年から和暦を得る(_西暦年,_月,_日,_期間開始年,_和暦), L), 和暦を表示する(_西暦年,_月,_日,L). 和暦を表示する(_西暦年,_月,_日,[_和暦_1,_和暦_2]) :- writef('西暦%t年%月%日は二つの元号が重なっています。和暦は %t と %t になります。\n',[_西暦年,_月,_日,_和暦_1,_和暦_2]),!. 和暦を表示する(_西暦年,_月,_日,[_和暦]) :- writef('西暦%t年%月%日の和暦は %t です。\n',[_和暦]). 西暦年月日と元号開始年から和暦を得る(_西暦年,_月,_日,_期間開始年,_和暦) :- _数字和暦年 is _西暦年 - _期間開始年 + 1, 数字年和暦年変換(_数字和暦年,_和暦年), 九十九までの和数字変換(_月,_和暦月), 九十九までの和数字変換(_日,_和暦日), concat_atom([_元号,_和暦年,_和暦月,月,_和暦日,日],_和暦),!. 数字年和暦年変換(1,元年) :- !. 数字年和暦年変換(_西暦,_和暦年) :- 九十九までの和数字変換(_数字,_和数字), concat_atom([_和数字,年],_和暦年),!. 九十九までの和数字変換(0,''). 九十九までの和数字変換(1,一). 九十九までの和数字変換(2,ニ). 九十九までの和数字変換(3,三). 九十九までの和数字変換(4,四). 九十九までの和数字変換(5,五). 九十九までの和数字変換(6,六). 九十九までの和数字変換(7,七). 九十九までの和数字変換(8,八). 九十九までの和数字変換(9,九). 九十九までの和数字変換(数字,_和数字) :- N >= 10, N =< 19, M is N mod 10, 九十九までの和数字変換(M,M2), concat_atom([十,_和数字一の桁],_和数字). 九十九までの和数字変換(数字,_和数字) :- N >= 20, N =< 99, M is N mod 10, 九十九までの和数字変換(M,_和数字一の桁), N2 is N // 10, 九十九までの和数字変換(M2,_和数字十の桁), concat_atom([_和数字十の桁,十,_和数字一の桁],_和数字). 元号期間(明治,1868,1,1,1912,7,30). 元号期間(大正,1912,7,30,1926,12,25). 元号期間(昭和,1926,12,25,1989,1,7). 元号期間(平成,1989,1,8,_年,_月,_日) :- 今日(_年,_月,_日). 改元日(明治,1868,1,25,'改元は1月1日に遡って施行された') :- '実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'. 改元日(大正,1912,7,30,'改元は即日施行された') :- '改元は即日施行された'. 改元日(昭和,1926,12,25,'改元は即日施行された') :- '改元は即日施行された'. 改元日(平成,1989,1,7,'改元は翌日から施行された') :- '改元は翌日から施行された'. '実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'. '改元は即日施行された'. '改元は翌日から施行された'. 今日(_年,_月,_日) :- shs(date,S), split(S,[' ',年,月,日],[_年,_月,_日|_]),!. % 以下のサイトは # [1] 授業単元:C言語基礎 # [2] 問題文(含コード&リンク): # # 明治元年以降の西暦年を4桁の数で入力すると、 # 和暦で年を表示するプログラムを作成せよ。 # ただし、2つの元号を持つ年 # は両方の年を表示すること。 # (例: 1989年 → 昭和64年、平成元年) # # (2つの元号を持つ年の扱いについては # 余裕がある人は、月、日も入れて、その日の正しい # 元号を表示することによって元号を一つ表示す # るプログラムとしてもよい。) # 提出例 # === プログラム === # #include <stdio.h> # int main() # { # '明治元年以降の西暦年を4桁の数で入力すると、和暦で年を表示するプログラムを作成せよ。ただし、2つの元号を持つ年は両方の年を表示すること。' :- '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年), '入力された西暦を示す4桁の数から和暦で年を表示する'(_西暦年). '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年) :- write('明治元年以降の西暦年を4桁の数で入力 : '), 整数を得る(_西暦年), '明治元年以降の西暦年を4桁の数入力検査'(_西暦年),!. '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年) :- '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年). '明治元年以降の西暦年を4桁の数入力検査'(_西暦年) :- _西暦年 =< 9999, 元号期間(明治,_明治元年の西暦,_,_,_,_,_), _西暦年 >= _明治元年の西暦,!. '明治元年以降の西暦年を4桁の数入力検査'(Line,_西暦年) :- writef('入力された %t からは明治元年以降の西暦を示す整数は得られません。再入力をお願いします。\n',[Line]), fail. '入力された西暦を示す4桁の数から和暦で年を表示する'(_西暦年) :- findall(_和暦,( 西暦から和暦を得る(_西暦年,_和暦)), _和暦ならび), 和暦を表示する(_西暦年,_和暦ならび). '西暦から和暦を得る'(_西暦年,_和暦) :- 元号期間(_元号,_開始年,_,_,_終了年,_,_), _西暦年 >= _開始年, _西暦年 =< _終了年, 元号の開始年から和暦を得る(_西暦,_開始年,_和暦年), atomic_list_concat([_元号,_和暦年],_和暦). 元号の開始年から和暦年を得る(_西暦年,_開始年,_和暦年) :- _元号年 is _西暦年 - _開始年 + 1, 数字年和暦年変換(_元号年,_和暦年). 数字年和暦年変換(1,元年) :- !. 数字年和暦年変換(_西暦,_和暦年) :- 九十九までの和数字変換(_数字,_和数字), atomic_list_concat([_和数字,年],_和暦年),!. 九十九までの和数字変換(0,''). 九十九までの和数字変換(1,一). 九十九までの和数字変換(2,ニ). 九十九までの和数字変換(3,三). 九十九までの和数字変換(4,四). 九十九までの和数字変換(5,五). 九十九までの和数字変換(6,六). 九十九までの和数字変換(7,七). 九十九までの和数字変換(8,八). 九十九までの和数字変換(9,九). 九十九までの和数字変換(_数字,_和数字) :- 十から十九までの和数字変換(数字,_和数字). 九十九までの和数字変換(_数字,_和数字) :- 二十以上の和数字変換(_数字,_和数字). 十から十九までの和数字変換(_数字,_和数字) :- _数字 >= 10, _数字 =< 19, M is _数字 mod 10, 九十九までの和数字変換(M,M2), atomic_list_concat([十,_和数字一の桁],_和数字). 二十以上の和数字変換(_数字,_和数字) :- _数字 >= 20, _数字 =< 99, 一の桁の変換(_数字,_和数字一の桁), 十の桁の変換(_数字,_和数字十の桁), atomic_list_concat([_和数字十の桁,十,_和数字一の桁],_和数字). 一の桁の変換(_数字,_和数字一の桁) :- _一の桁の数字 is _数字 mod 10, 九十九までの和数字変換(_一の桁の数字,_和数字一の桁). 十の桁の変換(_数字,_和数字十の桁) :- _十の桁の数字 is _数字 // 10, 九十九までの和数字変換(_十の桁の数字,_和数字十の桁). 和暦を表示する(_西暦,[_和暦]) :- writef('西暦%t年は和暦では%tです。\n',[_西暦,_和暦]),!. 和暦を表示する(_西暦,[_和暦_1,_和暦_2]) :- writef('西暦%t年は和暦では%tか%tです。\n',[_西暦,_和暦_1,_和暦_2]),!. 元号の最終日と元号の開始日が一致する日(_年,_月,_日,_先の元号,_後の元号,_改元施行注釈) :- 元号期間(_先の元号,_年,_月,_日,_), 元号期間(_後の元号,_年,_月,_日,_改元施行注釈),!. 元号期間(明治,1868,1,1,1912,7,30). 元号期間(大正,1912,7,30,1926,12,25). 元号期間(昭和,1926,12,25,1989,1,7). 元号期間(平成,1989,1,8,_年,_月,_日) :- 今日(_年,_月,_日). 改元日(明治,1868,1,25,'改元は1月1日に遡って施行された') :- '実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'. 改元日(大正,1912,7,30,'改元は即日施行された') :- '改元は即日施行された'. 改元日(昭和,1926,12,25,'改元は即日施行された') :- '改元は即日施行された'. 改元日(平成,1989,1,7,'改元は翌日から施行された') :- '改元は翌日から施行された'. '実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'. '改元は即日施行された'. '改元は翌日から施行された'. 今日(_年,_月,_日) :- shs(date,S), split(S,[' ',年,月,日],[_年,_月,_日|_]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/736 # # # ファイル1(テキスト)に # AAA,BBB,CC,DDd,FF # OOO,TTT,FF,AAA,VV # DDD,EEE,GG,SSS,AA # が入っていて、真ん中のCC、FF、GGの部分だけを配列に入れ、 # もうひとつのファイルに配列に入れた部分を # 保存したいのですが、どうしたらいいですか。 # 'ファイル1(テキスト)に AAA,BBB,CC,DDd,FF\\nOOO,TTT,FF,AAA,VV\\nDDD,EEE,GG,SSS,AA\\nが入っていて、真ん中のCC、FF、GGの部分だけを配列に入れ、もうひとつのファイルに配列に入れた部分を保存したい' :- get_split_lines(_ファイル1,[','],LL), '中間要素だけをならびとして'(LL,_中間要素ならび), 'もうひとつのファイルにならびを保存する'(_もうひとつのファイル,_中間要素ならび). '中間要素だけをならびとして'(LL,_中間要素ならび) :- findall(E,( append(_,[L|_],LL), append(L0,[E|R],L), length(L0,Len), length(R,Len)), _中間要素ならび),!. 'もうひとつのファイルにならびを保存する'(_もうひとつのファイル,L) :- open(_もうひとつのファイル,write,Outstream), write(Outstream,L), write(Outstream,'.\n'), close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/627 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # scanf で n を受け取り, 要素数 n の乱数配列を作成し, 指定した 2 つの要素番号にある要素を交換するプログラムを作成せよ. # 'n を受け取り, 要素数 n の乱数ならびを作成し, 指定した 2 つの要素番号にある要素を交換する' :- 'n を受け取り'(_n), '要素数 n の乱数配列を作成し'(_n,_乱数ならび), '指定した 2 つの要素番号にある要素を交換する'(_n,_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび), 表示する(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび),!. 'n を受け取り'(_n) :- write('要素数nを入力してください : '), get_line(Line), 'n受け取り検査'(Line,_n),!. 'n を受け取り'(_n) :- 'n を受け取り'(_n). 'n受け取り検査'(Line,_n) :- atom_to_term(Line,_n,_), integer(_n), _n > 0,!. 'n受け取り検査'(Line,_n) :- writef('入力された%tからは適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. '要素数 n の乱数配列を作成し'(_n,_乱数ならび) :- length(_乱数ならび,_n), findall(_乱数,( append(_,[_乱数|_],_乱数ならび), _乱数 is random(100) + 1), _乱数ならび). '指定した 2 つの要素番号にある要素を交換する'(_n,_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :- '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2), '2 つの要素番号にある要素を交換する'(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび). '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2) :- writef('2つの要素番号[1~%t]をカンマ区切りで入力してください : ',[_n]), get_line(Line), '指定した 2 つの要素番号入力検査'(Line,_n,_要素番号_1,_要素番号_2),!. '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2) :- '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2). '指定した 2 つの要素番号入力検査'(Line,_n,_要素番号_1,_要素番号_2) :- '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2), '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2),!. '指定した 2 つの要素番号入力検査'(Line,_要素番号_1,_要素番号_2) :- write('再入力をお願いします\n'), fail. '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2) :- split(Line,[','],[_要素番号_1,_要素番号_2]),!. '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2) :- writef('入力された%tからは2要素の要素番号が得られません。\n',[Line]), fail. '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2) :- _要素番号_1 > 0, _要素番号_1 =< _n, _要素番号_2 > 0, _要素番号_2 =< _n,!. '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2) :- writef('入力された要素には[1~%t]の範囲を逸脱しているものが有ります。\n',[Line,_n]), fail. '2 つの要素番号にある要素を交換する'(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :- 要素番号を変数に置換(_乱数ならび,_要素番号_1,_元の値_1,_変数_1,_乱数ならびの一), 要素番号を変数に置換(_乱数ならびの一,_要素番号_2,_元の値_2,_変数_2,_2要素が交換された乱数ならび), _変数_1 = _元の値_2, _変数_2 = _元の値_1,!. 要素番号を変数に置換(_ならび,_要素番号,_元の値,_変数,_置換されたならび) :- length([_|L0],_要素番号), append(L0,[_元の値|R],_ならび), append(L0,[_変数|R],_置換されたならび). 表示する(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :- writef('元の乱数ならびは: %t\n',[_乱数ならび]), writef('%t番目と%t番目の要素を交換する\n',[_要素番号_1,_要素番号_2]), writef('2要素が交換された乱数ならびは: %t\n',[_2要素が交換された乱数ならび]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/615 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # 3 x 3 の行列の値が書かれたファイルを二つ用意する. この 2 つの行列の積を新しいファイルに書き出すプログラムを作成せよ. # (例えば, 行列 A を MatrixA.txt, 行列 B を MatrixB.txt と用意すると, プログラム実行後には行列 A と行列 B の積の値が ファイル MatrixC.txt に書き込まれているようにする.) # '3 x 3 の行列の値が書かれたファイルを二つ用意する. この 2 つの行列の積を新しいファイルに書き出す'(_入力ファイル1,_入力ファイル2,_出力ファイル) :- get_split_lines(_入力ファイル1,[',',' '],LL1), get_split_lines(_出力ファイル2,[',',' '],LL2), 行列の積(LL1,LL2,LL3), 新しいファイルに書きだす(_出力ファイル,LL3). 新しいファイルに書きだす(_出力ファイル,LL3) :- open(_出力ファイル,write,Outstream), append(_,[L|R],LL3), writef(Outstream,'%t,%t,%t\n',L), R = [], close(Outstream). 行列の積(L1,L2,X) :- 置換(L2,L4), 行列の積の一(L1,L4,X) . 行列の積の一([],_,[]) :- !. 行列の積の一([A|R1],L,[S1|R3]) :- 行列の積のニ(A,L,S1), 行列の積の一(R1,L,R3). 行列の積のニ(_,[],[]) :- !. 行列の積のニ(A,[B|R2],[C|R3]) :- 行列の積の三(A,B,C), 行列の積のニ(A,R2,R3). 行列の積の三([],[],0) :- !. 行列の積の三([A|R1],[B|R2],S) :- S1 is A * B, 行列の積の三(R1,R2,S2), S is S1 + S2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/566 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 番号と点数を配列に初期化して、それらを # 5段階にランク付けをして、受験番号・ランクを表示するプログラムを作成。 # ランク付けをする部分を関数Rankとして、番号と評価を表示する部分を関数Outputとすること。 # なお、ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 # 60〜79点をB、80〜100点をAとする。 # ただし、受験者の数は、50人以下とする。 # 番号と点数は、以下の配列を使用すること。 # 番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10}; # 点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100}; # '問題文の5段階にランク付け'('ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 60〜79点をB、80〜100点をAとする。 '). 番号の定義文('番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10};'). 点数の定義文('点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100};'). 'ランクならびの生成'(_ランクならび) :- '問題文の5段階にランク付け'(_ランク定義文), ランクの定義文解析(_ランク定義文,_ランクならび). 番号ならびの生成(_番号ならび) :- 番号の定義文(_番号の定義文), 番号の定義文解析(_番号の定義文,_番号ならび). 点数ならびの生成(_点数ならび) :- 点数の定義文(_点数の定義文), 点数の定義文解析(_点数の定義文,_点数ならび). '5段階にランク付けをして、受験番号・ランクを表示する' :- ランクならびの生成(_ランクならび), 番号ならびの生成(_番号ならび), 点数ならびの生成(_点数ならび), '5段階にランク付けをして、受験番号・ランクを表示する'(_番号ならび,_点数ならび,_ランクならび). '5段階にランク付けをして、受験番号・ランクを表示する'([],[],_). '5段階にランク付けをして、受験番号・ランクを表示する'([_番号|R1],[_点数|R2],_ランクならび) :- append(_,[[_点数下限,_点数上限,_ランク]|_],_ランクならび), _点数 >= _点数下限, _点数 =< _点数上限, writef('受験番号:%t ランク:%t\n',[_番号,_ランク]), '5段階にランク付けをして、受験番号・ランクを表示する'(R1,R2,_ランクならび). ランクの定義文解析(_ランク定義文,_ランクならび) :- 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文), split(_半角数字変換されたランク定義文,[' ','。','、','〜','点を','とする'],L), n個組(3,L,_ランクならび). 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文) :- atom_chars(_ランク定義文,Chars), findall(_文字_1, append(_,[_文字|_],Chars), 全角数字ならば半角数字に変換(_文字,_文字_1)), Chars2), atom_chars(_半角数字変換されたランク定義文,Chars2). 全角数字ならば半角数字に変換([_全角数字|R1],[_半角数字|R2]) :- 全角数字半角数字変換(_全角数字,_半角数字), 全角数字ならば半角数字に変換(R1,R2). 全角数字ならば半角数字に変換([_文字|R1],[_文字|R2]) :- \+(全角数字半角数字変換(_文字,_)), 全角数字ならば半角数字に変換(R1,R2). 全角数字半角数字変換(0,0). 全角数字半角数字変換(1,1). 全角数字半角数字変換(2,2). 全角数字半角数字変換(3,3). 全角数字半角数字変換(4,4). 全角数字半角数字変換(5,5). 全角数字半角数字変換(6,6). 全角数字半角数字変換(7,7). 全角数字半角数字変換(8,8). 全角数字半角数字変換(9,9). 番号の定義文解析(_番号の定義文,_番号ならび) :- split(_番号の定義文,['=',',',';'],[_|_番号ならび]). 点数の定義文解析(_点数の定義文,_点数ならび) :- split(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305217361/675 # # CSVモジュールを使用してCSVファイルを読み込み。 # 読み込んだファイル全体を指定フィールドでソートする方法を教えてください。 # csvfile = csv.reader(f) # csvfile.sort() # のような書き方をしたら、_csvredaerにそんなメソッドはない、的なエラーです。 # また、sortのkeyの書き方がよく解かりません。 # リスト(ファイル全体)の中のリスト(行)の中のリストのインデックス指定でソート # すればOKのような気がするのですが、書き方が不明です。よろしくお願いします。 'CSVファイルを読み込み。読み込んだファイル全体を指定フィールドでソートする'(_ファイル名,_フィールド位置) :- get_split_lines(_ファイル名,[','],LL), 指定フィールドでソートする(LL,_整列済みならび), ソートキーを剥がしながら出力する(_整列済みならび). 指定フィールドでソートする(LL,_ソートキーが先頭に付加された整列済みならび) :- ソートキーを先頭に付加(LL,LL2), sort(LL2,_ソートキーが先頭に付加された整列済みならび). ソートキーを先頭に付加(_キー位置,[],[]) :- !. ソートキーを先頭に付加(_キー位置,[L1|R1],[[K|L1]|R2]) :- nth1(_キー位置,L1,K), ソートキーを先頭に付加(_キー位置,R1,R2). ソートキーを剥がしながら出力する(_整列済みならび) :- ソートキーを剥がしながら(_整列済みならび,L,R), カンマ区切り文字列に変形(L,_カンマ区切り文字列), writef('%t\n',[_カンマ区切り文字列]), R = []. ソートキーを剥がしながら(_整列済みならび,L,R) :- append(_,[[_付加されたソートキー|L]|R],_整列済みならび). カンマ区切り文字列に変形(L,S) :- concat_atom(L,',',S). % 以下のサイトは # # リストをある要素で、複数のリストに分割するsplit/3を実装せよ。 # split(L1,_区切り文字,L2) :- findall(X,( 非決定性split(L1,_区切り文字,X)), L2). 非決定性split(L,_区切り文字,X) :- 最初に区切り文字が出現するまでの部分も対象(L,_区切り文字,X). 非決定性split(L,_区切り文字,X) :- 区切り文字と区切り文字に囲まれた部分(L,_区切り文字,X). 非決定性split(L,_区切り文字,X) :- 最後の要素は残り要素に区切り文字が出現しない(L,_区切り文字,X). 非決定性split(L,_区切り文字,L) :- リストのなかに区切り文字が存在しないときは(L,_区切り文字). 最初に区切り文字が出現するまでの部分も対象(L,_区切り文字,X) :- append(X,[_区切り文字|_],L), \+(member(_区切り文字,X)). 区切り文字と区切り文字に囲まれた部分(L,_区切り文字,X) :- append(_,[_区切り文字|X],[_区切り文字|_],L), \+(member(_区切り文字,X)). 最後の要素は残り要素に区切り文字が出現しない(L,_区切り文字,X) :- append(L0,[_区切り文字|X],L), \+(member(_区切り文字,X)). リストの中に区切り文字が存在しないときは(L,_区切り文字) :- \+(member(_区切り文字,L)). append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/699 # # ../test/read.cgi/tech/1311089619/682について内容が不足していたので再投稿します。 # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # [3] フラグ・判定にビット演算を使用してください。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する。判定はビット演算を使う' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'OK') :- 0 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'NG') :- 1 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/682 # # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(0,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,1,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,0,1,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,1,0,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,0,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(0,1,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,1,1,'NG') :- !. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/512 # # [1] 授業単元:ポインタ&配列 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/cr9HeX77 http://ime.nu/codepad.org/KRbWMvrc # [3.1] OS:WindowsXP # [3.2] コンパイラ名とバージョン: Visual Studio 2008 # [3.3] 言語:C # [4] 期限:7/ 27 15:00までです。  # 全く分からなくてほんとに困っています。誰か分かる方宜しくお願いします。 # # テキストがhttp://ime.nu/codepad.org/cr9HeX77で # 問題がhttp://ime.nu/codepad.org/KRbWMvrcです。 # # # テキストをファイルから読み込んで、その行を辞書式順序に並べ替えて # 出力するプログラムを書け. # プログラムは、下記のプログラムを書き直して提示せよ。 # # ヒント:文字列の例題を参考にして,まずテキストを配列に読み込む. # 文字列の配列を渡すとそれをソートする関数を書いて,それを用いればよい. # ファイルから読むためには、入力のリダイレクト(切り替え)を用いる. # そのためには、コマンドプロンプトで # prog< file.txt のように、コマンド名のあとに“<” # とそれに続けてファイル名を与える.英単語のファイルでテストするとよい 'テキストをファイルから読み込んで、その行を辞書式順序に並べ替えて出力する' :- get_split_lines('file.txt',['\n',' ',','],_語彙ならび), 辞書順クイックソート(_語彙ならび,_辞書順に整列した語彙ならび), 出力する(_辞書順に整列した語彙ならび). 辞書順クイックソート([],[]) :- !. 辞書順クイックソート(_ならび1,_ならび2) :- _ならび1 = [A|R], 辞書順クイックソート(A,R,_ならび2). 辞書順クイックソート(A,R,_ならび2) :- 辞書順分割(A,R,L1,R1), 辞書順クイックソート(L1,L2), 辞書順クイックソート(R1,R2), append(L2,[A|R2],_ならび2). 辞書順分割(A,[],[],[]) :- !. 辞書順分割(A,[B|R1],[B|R2],R3) :- 辞書順コード比較(A,B), 辞書順分割(A,R1,2,R3),!. 辞書順分割(A,[B|R1],R2,[B|R3]) :- \+(辞書順コード比較(A,B)), 辞書順分割(A,R1,R2,R3),!. 辞書コード比較(_文字列1,_文字列2) :- atom_to_codes(_文字列1,Codes1), 辞書順用にコード列を変換する(Codes1,_変換されたCodes1), atom_to_codes(_文字列2,Codes2), 辞書順用にコード列を変換する(Codes2,_変換されたCodes2), _変換されたCoode1 @> _変換されたCodes2,!. 辞書順用にコード列を変換する([],[]) :- !. 辞書順用にコード列を変換する([A|R1],[B|R2]) :- A >= 32, A =< 90, B is (A + 32) * 10, 辞書順用にコード列を変換する(R1,R2),!. 辞書順用にコード列を変換する([A|R1],[B|R2]) :- B is A * 10 + 1, 辞書順用にコード列を変換する(R1,R2),!. 辞書順用にコード列を変換する([A|R1],[B|R2]) :- B is A * 10, 辞書順用にコード列を変換する(R1,R2),!. 出力する(_辞書順に整列した語彙ならび) :- open('file.txt',write,Outstream), append(_,[_語彙|R],_辞書順に整列した語彙ならび), writef(Outstream,'%t\n',[_語彙]), R = [], close(Outstream),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/36 # # [1] 授業単元:構造体の配列利用 # [2] 問題文(含コード&リンク): # #include <stdio.h> # /* 配列arrayの要素数 */ # #define ELENUM(array) (sizeof(array) / sizeof((array)[0])) # #define SIZE_DATA (10) /* データ数 */ # # struct Address_data{ # char name[81]; # char phone[20]; # int age; # }; # # int main(void) # { # struct Address_data data[SIZE_DATA], *p = data; # printf("Input end = Ctrl + D\n"); # /* 配列初期化(入力プロンプトより前に置くべき?) */ # for (p = data; p - data < ELENUM(data); p++) { # p->age = -1; # } # /* 入力処理 */ # for (p = data; p - data < ELENUM(data); p++) { # printf("[%d]name phone age = ", p - data); # if (scanf("%s %s %d", p->name, p->phone, &p->age) != 3) { # break; # } # } # putchar('\n'); # /* 表示 */ # for (p = data; p->age >= 0; p++) { # printf("%s\t(%d)\t[%s]\n", p->name, p->age, p->phone); # } # return 0; # } # 表示を行う際に、年齢順に表示するようにしたい。 # 配列の並び替えを行なって表示するようにプログラムを拡張しなさい # データ数(10). 入力処理(L) :- データ数(_データ数), length(L,_データ数), findall([_名前,_年齢,_電話番号],( append(_,[_|_],L), '名前・年齢・電話番号の入力'(_名前,_年齢,_電話番号)), L). '名前・年齢・電話番号の入力'(_名前,_年齢,_電話番号) :- write('名前・年齢・電話番号をカンマ区切りで入力してください '), get_line(Line), split(Line,[',',' '],[_名前,_年齢,_電話番号]). 年齢順にデータを表示(L) :- 年齢をキーとする(L,L2), sort(L2,L3), キーを外す(L3,L4), データを表示(L4). 年齢をキーとする([],[]) :- !. 年齢をキーとする([[_名前,_年齢,_電話番号]|R1],[[_年齢,_名前,_年齢,_電話番号]|R2]) :- 年齢をキーとする(R1,R2). 年齢キーを外す([],[]). 年齢キーを外す([[_|L]|R1],[L|R2]) :- 年齢キーを外す(R1,R2). データを表示(L) :- append(_,[[_名前,_年齢,_電話番号]|R],L), writef('%t,%t,%t\n',[_名前,_年齢,_電話番号]), R = []. sort([],[]) :- !. sort([A|R1],L) :- partition(A,R1,L1,L2), sort(L1,L11), sort(L2,L22), append(L11,[A|L22],L). partition(_,[],[],[]) :- !. partition(A,[B|R1],[B|R2],R3) :- B @< A, partition(A,R1,R2,R3),!. partition(A,[B|R1],R2,[B|R3]) :- B @>= A, partition(A,R1,R2,R3),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/639 # # [1] C言語演習 # [2] argvで入力された引数 "123:456:78:90" の様な文字列を ":" 区切りで # 別の配列へ順に格納せよ。(strchr関数を使いなさい) # 上記の例では、[0]=123,[1]=456,[2]=78,[3]=90となる。 # 尚、::の連続もありで、"12:34::90" は [0]=12,[1]=34,[2]=null,[3]=90となる。 # # 下の様に処理しているが、スマートに行きません。。。 # p = NULL; # p = strchr(str, ':'); # while (p != NULL) { # printf("length %d\n", strlen(str)-strlen(p)); # p++; # p = strchr(p, ':'); # } # 'argvで入力された引数 "123:456:78:90" の様な文字列を ":" で区切り、プログラム引数述語のリスト引数とする' :- user_parameters([_引数文字列]), split(_引数文字列,[':'],L), assertz(プログラム引数(L)). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/607 # # [1]プログラミング言語 # [2]http:// codepad.org/2gG8qIOk # [3.1]window 7 # [3.2]VC2008 # [3.3]C++ # [4]7/14まで # [5]よろしくお願い致します。 # # # 100 100 0.123 0.345 # 100 110 0.256 -0.123 # 100 120 -0.351 0.112 # ・・・・ # などのようなテキストファイル(01.txt)がある。 # これらを # 100.1 100.3 0.123 0.345 # 100.3 109.9 0.256 -0.123 # 99.6 120.1 -0.351 0.112 # ・・・・ # のように # 3列目を1列目に加え、4列目を2列目に加えるようなプログラムを作成せよ。 # (少数第一位まで四捨五入し、加える事) # なお、MFCでボタンを押したら、02.txtファイルが作成される程度の簡単なもので良い '3列目を1列目に加え、4列目を2列目に加える(少数第一位まで四捨五入し、加える事)' :- get_split_lines('01.txt',[' '],LL), findall([_11,_22,_3,_4],( append(_,[[_1,_2,_3,_4]|R],LL), _11 is floor((_1 + _3) * 10) / 10, _22 is floor((_2 + _4) * 10) / 10), LL2), 出力する('02.txt',LL2). 出力する(_ファイル名,LL) :- open(_ファイル名,write,Outstream), append(_,[[_1,_2,_3,_4]|R],LL), writef(Outstream,'%t %t %t %t\n',[_1,_2,_3,_4]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/586 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/3dkRTmjJ # # 生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。 # このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人の # BMI値および肥満か否かを列挙するプログラムkadai13-1.cを書きなさい。 # ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分から # ないものとする。 # # ヒント: # ○何をしなければならないかを大まかに書き下してみよう。 #  1. ファイルのオープン(これに先立ってファイル名を取得する必要がある) #  2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう) #  3.データの読み込み #  4.BMIの算出 #  5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい) #  6. 画面表示 # # ○BMIとは? # BMIは次のようにして計算されるものとする。 # BMI値=体重(キログラム)÷(身長(メートル))^2 # '^2'は二乗を意味する。 # このBMI値が25を越えると、肥満とみなされる。 # # ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。 # rewind(FILE *stream); # # ○wh-list.dat の中身は以下の通りで、氏名 身長(cm) 体重(kg)が列挙されている。 # yamada 157 62.5 # tanaka 180 45.1 # yoneda 190 50.5 # yamashita 210 80.5 # toyama 140 80 # .... # # ○例えば画面表示は # toyama BMI=40.816326 himan # nagashima BMI=29.551020 himan # yamashita BMI=27.777779 himan # takenaka BMI=27.716263 himan # . # 中略 # . # nakano BMI=23.179012 # yamashita BMI=18.253969 # . # . # # 等と表示されるものとする。 # '生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する' :- user_parameters([_ファイル名]), 'ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_ファイル名,Instream), データの読み込み(Instream,Lines), 'BMIの算出と判定'(Lines,_BMIと判定ならび), 'BMIの大きい者順に並べ替える'(_BMIと判定ならび,_降順に整列したBMIと判定ならび), 画面表示(_降順に整列したBMIならび),!. 'ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_ファイル名,Instream) :- open(_ファイル名,read,Instream),!. データの読み込み(Instream,Lines) :- get_lines(Instream,Lines),!. 'BMIの算出と判定'([],[]) :- !. 'BMIの算出と判定'([Line|R1],[[_BMI,_名前,_判定]|R2]) :- split(Line,[' '],[_名前,_身長単位センチメートル,_体重]), _身長単位メートル is _身長単位センチメートル / 100, 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長単位メートル,_BMI値), 'BMI値が25を越えると、肥満とみなされる'(_BMI値,_判定), 'BMIの算出と判定'(R1,R2). 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長,_BMI値) :- _BMI値 is _体重 * _身長 ^ 2. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,肥満) :- _BMI値 > 25,!. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,''). 'BMIの大きい者順に並べ替える'(_BMIならび,_降順に整列したBMIならび) :- バブルソート(_BMIならび,_昇順に整列したBMIならび), reverse(_昇順に整列したBMIならび,_降順に整列したBMIならび). バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一), !, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). 画面表示(_降順に整列したBMIならび) :- append(_,[[_BMI,_名前,_判定]|R],_降順に整列したBMIならび), writef('%t %t %t\n',[_名前,_BMI,_判定]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/549 # # [1] 授業単元:演習 # [2] 問題文(含コード&リンク):http://pastebin.com/index/sg6akdN0 # 標準入力から「id, 名前, 年月日, 住所」のようなコンマ区切形式 (CSV 形式) の名簿データを受け付けて, # 項目を切り出してメモリ中に格納する.また,% で始まる入力行をコマンド入力として解釈し,格納されたデータを表示や整列する # '標準入力から「id, 名前, 年月日, 住所」のようなコンマ区切形式 (CSV 形式) の名簿データを受け付けて,項目を切り出してメモリ中に格納する.また,% で始まる入力行をコマンド入力として解釈し,格納されたデータを表示や整列する' :- get_line(Line), テキストの解析処理(Line,1,[]). テキストの解析処理(end_of_file,N,_オプションモード) :- \+member(整列,_オプションモード)),!. テキストの解析処理(end_of_file,N,_オプションモード) :- member(整列,_オプションモード), 名簿データをならびに変換(LL1), sort(LL1,LL2), 整列した名簿の表示(LL2),!. テキストの解析処理(_行,N,_オプションモード) :- コメント行(_行,_オプションモード,_オプションモードのニ), get_line(_行2), テキストの解析処理(_行2,N,_オプションモードのニ),!. テキストの解析処理(_行,N,_オプションモード) :- 'CSV行'(_行,_オプションモード), get_line(_行2), N2 is N + 1, テキストの解析処理(_行2,N2,_オプションモード). コメント行(_行,_オプションモード,_オプションモードのニ) :- sub_atom(_行,0,1,R,'%'), sub_atom(_行,1,R,0,_残り文字列), split(_残り文字列,[' ',','],L), コメント行解析(L,_オプションモード,_オプションモードのニ). 'CSV行'(_行,N,_オプションモード) :- member(表示,_オプションモード), writef('%t: %t\n',[N,_行]), split(_行,[','],[_id,_名前,_年月日,_住所]), assertz(名簿データ(_id,_名前,_年月日,_住所)), writef('%q\n',[名簿データ(_id,_名前,_年月日,_住所)]),!. 'CSV行'(_行,N,_オプションモード) :- \+(member(表示,_オプションモード)), split(_行,[','],[_id,_名前,_年月日,_住所]), assertz(名簿データ(_id,_名前,_年月日,_住所)),!. コメント行解析([],_オプションモード,_オプションモード) :- !. コメント行解析([非表示|R],_オプションモード,_オプションモードのニ) :- ならびから削除(表示,_オプションモード,_オプションモードの一), コメント行解析(R,_オプションモードの一,_オプションモードのニ),!. コメント行解析([_コマンド|R],_オプションモード,_オプションモードのニ) :- \+(member(_コマンド|_オプションモード)), コメント行解析(R,[_コマンド|_オプションモード],_オプションモードのニ). コメント行解析([_コマンド|R],_オプションモード,_オプションモードのニ) :- member(_コマンド|_オプションモード), コメント行解析(R,_オプションモード,_オプションモードのニ). 名簿データをならびに変換(LL) :- findall([_id,_名前,_年月日,_住所],( 名簿データ(_id,_名前,_年月日,_住所)), LL),!. 整列した名簿の表示(LL) :- append(_,[L|R],LL), writef('%t,%t,%t,%t\n',L), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309527259/120 # # [1] 問題文(含コード&リンク):このスレで「◆QZaw55cn4cって」から始まる定形の書き込みの # 間隔を調べ、最短書き込み間隔と最長書き込み間隔を表示しなさい。 # [2] 環境 #  [2.1] 言語: C #  [2.2] OS: LINUX #  [2.3] コンパイラ名とバージョン: # [3] 回答希望期限:2011年7月8日 # # 'ログから書き込みの間隔を調べ、最短書き込み間隔と最長書き込み間隔を表示する' :- get_split_lines('http://codepad.org/nYthq5XX',[' ','/',':','.'],LL), findall([A,B,C,D,E,F],( member(L,LL), append(_,[A,B,C,D,E,F,_],L)), LL2), 日付間隔ならびを得る(LL2,_日付間隔ならび), max(_日付間隔ならび,_最長書き込み間隔), min(_日付間隔ならび,_最短書き込み間隔), 表示する(_最長書き込み間隔,_最短書き込み間隔),!. 日付間隔ならびを得る([_],[]) :- !. 日付間隔ならびを得る([[A1,B1,C1,D1,E1,F1],[A2,B2,C2,D2,E2,F2]|R1],[[_何日,_何時間,_何分,_何秒]|R2]) :- count(翌日(A1,B1,C1,A2,B2,C2,_,_,_),Count), 時分秒の補正(Count,D1,E1,F1,D2,E2,F2,_何日,_何時間,_何分,_何秒), 日付間隔ならびを得る([[A2,B2,C2,D2,E2,F2]|R1],R2). 時分秒の補正(Count,D1,E1,F1,D2,E2,F2,_何日,_何時間,_何分,_何秒) :- 秒に変換(D1,E1,F1,_秒1), 秒に変換(D2,E2,F2,_秒2), 時分秒の補正(_秒1,_秒2,Count,_何日,_何時間,_何分,_何秒). 時分秒の補正(_秒1,_秒2,_何日,_何日,_何時間,_何分,_何秒) :- _秒2 @>= _秒1, _秒数 is (_秒2 - _秒1), 秒数から時間の算出(_秒数,_何時間,_何分,_何秒),!. 時分秒の補正(_秒1,_秒2,Count,_何日,_何時間,_何分,_何秒) :- _秒2 < _秒1, _何日 is Count - 1, _秒数 is 38400 + (_秒2 - _秒1), 秒数から時間の算出(_秒数,_何時間,_何分,_何秒). 秒数から時間の算出(_秒数,_何時間,_何分,_何秒) :- _何時間 is _秒数 // 3600, S2 is S1 mod 3600, _何分 is S2 // 60, _何秒 is S2 mod 60,!. 表示する(_最長書き込み間隔,_最短書き込み間隔) :- writef('最長書き込み間隔は %t日 %t時間 %t分 %秒 です。\n',_最長書き込み間隔), writef('最短書き込み間隔は %t日 %t時間 %t分 %秒 です。\n',_最短書き込み間隔),!. % 翌日/9の定義は http://nojiriko.asia/prolog/c150_293.html 参照 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/438 # # [1] 授業単元:関数 # [2] 問題文(含コード&リンク): # 1つめの食塩水aグラムは、濃度c%である。 # 2つめの食塩水bグラムは、濃度d%である。 # この2つの食塩水を混ぜると、何%の食塩水が何グラムできるか? # a,b,c,dの値を実数で入力する関数、答えを求める関数を作成し、プログラムを完成させなさい。 # 実行例) # 食塩1:食塩水100g 濃度2% # 食塩2:食塩水200g 濃度5% # 結果:4%の濃度になる # '1つめの食塩水aグラムは、濃度c%である'(_a,_c,_塩) :- _塩 is _a * _c / 100,!. '2つめの食塩水bグラムは、濃度d%である'(_b,_d,_塩) :- _塩 is _b * _d / 100,!. 'この2つの食塩水を混ぜると、何%の食塩水が何グラムできるか?' :- 'a,b,c,dの値を実数で入力する'(_a,_b,_c,_d), 濃度を計算する(_a,_b,_c,_d,_食塩数が何グラム,_濃度), writef('結果: %t%%の濃度になる\n',[_濃度]),!. 濃度を計算する(_a,_b,_c,_d,_食塩数が何グラム,_濃度) :- '1つめの食塩水aグラムは、濃度c%である'(_a,_c,_塩_1), '2つめの食塩水bグラムは、濃度d%である'(_b,_d,_塩_2), _食塩水が何グラム is _a + _b, _濃度 is (_塩_1 + _塩_2) / (_a + _b) * 100,!. 'a,b,c,dの値を実数で入力する'(_a,_b,_c,_d) :- 'a,cの値を得る'(_a,_c), 'b,dの値を得る'(_b,_d). 'a,cの値を得る'(_a,_c) :- write('食塩水1: '), get_line(Line), 食塩水と濃度を得る(Line,_a,_c),!. 'a,cの値を得る'(_a,_c) :- 'a,cの値を得る'(_a,_c). 'b,dの値を得る'(_b,_d) :- write('食塩水2: '), get_line(Line), 食塩水と濃度を得る(Line,_b,_d),!. 'b,dの値を得る'(_b,_d) :- 'b,dの値を得る'(_b,_d). 食塩水と濃度を得る(Line,X,Y) :- split(Line,['食塩数',g,' ',濃度,'%'],[X,Y]),!. 食塩水と濃度を得る(Line,X,Y) :- writef('入力された %t から食塩水の重さと濃度が得られません。再入力をお願いします\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/304 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # January, February, March, April, May, June, July, August, September,October, November, December # を12個の文字列をポインタの配列を用いて宣言し、ASCIIコードで昇順に並び替えなさい。 # char *month[12] = { “January”, “February”, …, “December” } ; # ASCIIコードで昇順 # A<B<C< … <Z , i文字目まで同じ場合は、i+1文字目の大小で順序をつける #  [3.1] OS:windows #  [3.2] コンパイラ名とバージョン:cygwin #  [3.3] 言語: C # [4] 期限: 2011/7/6 # [5] その他の制限: # 現在ポインタを習っているところです。 # 出来るだけ簡単に書いてもらえると助かります。 # # 'January, February, March, April, May, June, July, August, September,October, November, December を12個の文字列をASCIIコードで昇順に並び替える' :- split('January, February, March, April, May, June, July, August, September,October, November, December',[' ',','],L), バブルソート(L,_昇順に並べ替えられた12個の文字列). バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一),!, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/297 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/lqKLztNc # # あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示するプログラムkadai12-1.cを作ってみよう。 # kadai12-1.cでは次のようなmain()を定義したとする。 # # #include # #include # # void display_file(FILE *fp); # # int main() { # char INFILENAME[100]; //ファイル名を格納する文字列 # FILE *in_fp; # scanf("%s", INFILENAME); //ファイル名をキーボード入力 # in_fp = fopen(INFILENAME, "r"); //ファイルを開く # if (in_fp == NULL) {//ファイルが開けない場合はin_fpがNULLになる。(ファイルが見付からない時等) # fprintf(stderr, "I cannot open %s\n", INFILENAME);//標準エラー出力にエラーメッセージを出力 # exit(1); # } # # display_file(in_fp); //ファイルの中身を全部画面表示する関数 # fclose(in_fp); //ファイルを閉じる # } # # ○ 上記main関数の中の void display_file(FILE *fp)を以下の仕様を満たすように定義し、kadai12-1.cを完成させなさい。 # 読み込むファイルは上記プリプロセッサで定義されたFILENAMEにある. # これをcat して中身を見ると、 # cat /usr4/yamauchi/yamauchi/data/test.dat # 1.000000 1.136735 # 1.010000 1.137647 # 1.020000 1.137143 # 1.030000 1.137957 # 1.040000 1.142641 # 1.050000 1.153101 # ..... # と数値が1行に2個ずつ列挙されている。これらのデータを読み取って # # 1.000000 # 1.136735 # 1.010000 # 1.137647 # ... # のように1行に1つずつ数値を列挙するように定義しなさい。但し、ファイルポインターがファイルの最後か否かを判定する関数として # int feof(FILE *fp)が準備されている。この使いかたは次で調べよ。 # man feof # すると、使用方法が表示される。 # # 実行例: # gcc kadai112-1.c # ./a.out # 1.000000 # 1.136735 # 1.010000 # 1.137647 # ..... 'あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示する' :- open('test.dat',read,Instream), repeat, get_split_line(Instream,[' '],_実数ならび), 表示する(_実数ならび), at_end_of_stream(Instream), close(Instream). 表示する([]) :- !. 表示する([A|R]) :- number(A), writef('%t\n',[A]), 表示する(R),!. 表示する([A|R]) :- \+(number(A)), 表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/297 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/lqKLztNc # # あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示するプログラムkadai12-1.cを作ってみよう。 # kadai12-1.cでは次のようなmain()を定義したとする。 # # #include # #include # # void display_file(FILE *fp); # # int main() { # char INFILENAME[100]; //ファイル名を格納する文字列 # FILE *in_fp; # scanf("%s", INFILENAME); //ファイル名をキーボード入力 # in_fp = fopen(INFILENAME, "r"); //ファイルを開く # if (in_fp == NULL) {//ファイルが開けない場合はin_fpがNULLになる。(ファイルが見付からない時等) # fprintf(stderr, "I cannot open %s\n", INFILENAME);//標準エラー出力にエラーメッセージを出力 # exit(1); # } # # display_file(in_fp); //ファイルの中身を全部画面表示する関数 # fclose(in_fp); //ファイルを閉じる # } # # ○ 上記main関数の中の void display_file(FILE *fp)を以下の仕様を満たすように定義し、kadai12-1.cを完成させなさい。 # 読み込むファイルは上記プリプロセッサで定義されたFILENAMEにある. # これをcat して中身を見ると、 # cat /usr4/yamauchi/yamauchi/data/test.dat # 1.000000 1.136735 # 1.010000 1.137647 # 1.020000 1.137143 # 1.030000 1.137957 # 1.040000 1.142641 # 1.050000 1.153101 # ..... # と数値が1行に2個ずつ列挙されている。これらのデータを読み取って # # 1.000000 # 1.136735 # 1.010000 # 1.137647 # ... # のように1行に1つずつ数値を列挙するように定義しなさい。但し、ファイルポインターがファイルの最後か否かを判定する関数として # int feof(FILE *fp)が準備されている。この使いかたは次で調べよ。 # man feof # すると、使用方法が表示される。 # # 実行例: # gcc kadai112-1.c # ./a.out # 1.000000 # 1.136735 # 1.010000 # 1.137647 # ..... 'あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示する' :- open('test.dat',read,Instream), 実数を読み込んで表示する(Instream), close(Instream). 実数を読み込んで表示する(Instream) :- at_end_of_stream(Instream),!. 実数を読み込んで表示する(Line) :- get_line(Instream,Line), split(Line,[' '],_実数ならび), 表示する(_実数ならび), 実数を読み込んで表示する(Instream). 表示する([]) :- !. 表示する([A|R]) :- number(A), writef('%t\n',[A]), 表示する(R),!. 表示する([A|R]) :- \+(number(A)), 表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/297 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/lqKLztNc # # あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示するプログラムkadai12-1.cを作ってみよう。 # kadai12-1.cでは次のようなmain()を定義したとする。 # # #include # #include # # void display_file(FILE *fp); # # int main() { # char INFILENAME[100]; //ファイル名を格納する文字列 # FILE *in_fp; # scanf("%s", INFILENAME); //ファイル名をキーボード入力 # in_fp = fopen(INFILENAME, "r"); //ファイルを開く # if (in_fp == NULL) {//ファイルが開けない場合はin_fpがNULLになる。(ファイルが見付からない時等) # fprintf(stderr, "I cannot open %s\n", INFILENAME);//標準エラー出力にエラーメッセージを出力 # exit(1); # } # # display_file(in_fp); //ファイルの中身を全部画面表示する関数 # fclose(in_fp); //ファイルを閉じる # } # # ○ 上記main関数の中の void display_file(FILE *fp)を以下の仕様を満たすように定義し、kadai12-1.cを完成させなさい。 # 読み込むファイルは上記プリプロセッサで定義されたFILENAMEにある. # これをcat して中身を見ると、 # cat /usr4/yamauchi/yamauchi/data/test.dat # 1.000000 1.136735 # 1.010000 1.137647 # 1.020000 1.137143 # 1.030000 1.137957 # 1.040000 1.142641 # 1.050000 1.153101 # ..... # と数値が1行に2個ずつ列挙されている。これらのデータを読み取って # # 1.000000 # 1.136735 # 1.010000 # 1.137647 # ... # のように1行に1つずつ数値を列挙するように定義しなさい。但し、ファイルポインターがファイルの最後か否かを判定する関数として # int feof(FILE *fp)が準備されている。この使いかたは次で調べよ。 # man feof # すると、使用方法が表示される。 # # 実行例: # gcc kadai112-1.c # ./a.out # 1.000000 # 1.136735 # 1.010000 # 1.137647 # ..... 'あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示する' :- see('test.dat'), get_line(Line), 実数を読み込んで表示する(Line), seen. 実数を読み込んで表示する(end_of_file) :- !. 実数を読み込んで表示する(Line) :- split(Line,[' '],_実数ならび), 表示する(_実数ならび), get_line(Line2), 実数を読み込んで表示する(Line2). 表示する([]) :- !. 表示する([A|R]) :- \+(number(A)), 表示する(R),!. 表示する([_実数|R]) :- writef('%t\n',[_実数]), 表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/183 # # [2]xy平面上の10 個の点(0〜9 番とする) の(x, y) 座標を入力させ # つぎのようにソートするプログラムを作れ. # 大きさ10の配列x, y を用いて,i番目の点の座標をそれぞれx[i], y[i] に入れる. # # (梅) x座標の値の昇順 # # (原点より近い点から遠い点の順) # 注意:点を入れ替える時には,x 座標だけでなく,y座標も入れ替えること. # '座標点ならびを確保して、座標点を10個入力し、原点から近い順に整列する'(_整列された座標点ならび) :- '座標点ならびを確保して'(_座標点ならび), '座標点を10個入力し'(_座標点ならび), '原点から近い順に整列する'(_座標点ならび,_整列された座標点ならび). '座標点ならびを確保して'(_座標点ならび) :- length(_座標点ならび,10). '座標点を10個入力し'(_座標点ならび) :- findall((X,Y),( append(L0,[(X,Y)|_],_座標点ならび), 座標点の入力(L0,X,Y)), _座標点ならび). 座標点の入力(L0,X,Y) :- length([_|L0],_個目), writef('[%t個目] x,y座標をカンマ区切りで入力してください : ',[_個目]), get_line(Line), 座標点入力診断(Line,X,Y),!. 座標点の入力(L0,X,Y) :- 座標点の入力(L0,X,Y). 座標点入力診断(Line,X,Y) :- split(Line,[',',' '],[X,Y]), number(X), number(Y),!. 座標点入力診断(Line,X,Y) :- writef('入力された%tからは適切な座標点が得られませんでした。再入力をお願いします。\n',[Line]), fail. '原点から近い順に整列する'(_座標点ならび,_整列された座標点ならび) :- 原点からの距離を付加する(_座標点ならび,_原点からの距離を付加された座標点ならび), 整列(_原点からの距離を付加された座標点ならび,_整列した原点からの距離を付加された座標点ならび), 距離を削除する(_整列した原点からの距離を付加された座標点ならび,_整列された座標点ならび). 原点からの距離を付加する([],[]) :- !. 原点からの距離を付加する([(X,Y)|R1],[(D,X,Y)|R2]) :- D is sqrt(X^2+Y^2), 原点からの距離を付加する(R1,R2). 整列(_原点からの距離を付加された座標点ならび,_整列した原点からの距離を付加された座標点ならび) :- sort(_原点からの距離を付加された座標点ならび,_整列した原点からの距離を付加された座標点ならび). 距離を削除する([],[]). 距離を削除する([(_,X,Y)|R1],[(X,Y)|R2]) :- 距離を削除する(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/108 # # 以下のCのプログラム "test.c" から # 電話番号情報を抜き取り述語 電話帳/2 を定義しなさい。 # 電話番号はperson型の構造体 telbook として定義されている。 # # #include <stdio.h> # #include <string.h> # #define MAX 100 # struct person { # char name[MAX]; # char telno[MAX]; # }; # int search(struct person telbook[], int n, char *name) # { # /* ... */ # } # int main(void) # { # char name[MAX]; # struct person telbook[] = # { {"Taro", "090-111-1111"}, # {"Hanako", "090-222-2222"}, # {"Ichiro", "090-333-3333"}, # {"Jiro", "090-444-4444"}, # {"Hanayo", "090-555-5555"} }; # int n = 5; /* 電話帳に登録された人数 */ # int idx; # # printf("名前 > "); scanf("%s", name); # idx = search(telbook, n, name); # if (idx < 0) { # printf("該当者なし\n"); # } else { # printf("%s\n", telbook[idx].telno); # } # return 0; # } # # 'Cのプログラム "test.c" から電話番号情報を抜き取り述語 電話帳/2 を定義する' :- get_lines('test.c',Lines), telbookを捜す(Lines,R), 電話帳を定義する(R). telbookを捜す(Lines,R) :- append(L0,[_行|R],Lines), sub_atom(_行,_,_,_,'struct person telbook[];'),!. 電話帳を定義する(Lines) :- append(_,[_行|R],Lines), split(_行,[' ','{','"','}'],[_名前,_電話番号]), assertz(電話帳(_名前,_電話番号)), '}が2回出現'(R),!. '}が2回出現'([_行|_]) :- count(sub_atom(_行,_,1,_,'}'),2),!. '}が2回出現'([]). % 以下のサイトは # ・以下の実行結果になるようプログラムを作成せよ。 # # 実行結果 # 人数 > 5 # 0人目: # 名前 > Taro # 電話番号 > 090-111-1111 # 1人目: # 名前 > Hanako # 電話番号 > 090-222-2222 # 2人目: # 名前 > Ichiro # 電話番号 > 090-333-3333 # 3人目: # 名前 > Jiro # 電話番号 > 090-444-4444 # 4人目: # 名前 > Hanayo # 電話番号 > 090-555-5555 # # 電話帳: # Taro, 090-111-1111 # Hanako, 090-222-2222 # Ichiro, 090-333-3333 # Jiro, 090-444-4444 # Hanayo, 090-555-5555 # # 名前 > Hanayo # Hanayo, 090-555-5555 # # 実行結果 # 人数 > 2 # 0人目: # 名前 > Taro # 電話番号 > 090-111-1111 # 1人目: # 名前 > Taro # 電話番号 > 090-222-2222 # # 電話帳: # Taro, 090-111-1111 # Taro, 090-222-2222 # # 名前 > Taro # Taro, 090-111-1111 # Taro, 090-222-2222 # # 実行結果 # 人数 > 0 # # 電話帳: # # 名前 > Taro # 該当者なし '電話番号を登録し、それを表示し、さらに検索する' :- 電話番号登録, 電話番号表示, 電話番号検索. 電話番号登録 :- abolish(電話帳/2), 処理人数を入力する(_人数), length(Ln,_人数), append(L0,[_|R],Ln), length(L0,_人目), writef('%t人目:\n',[_人目]), 名前を入力する(_名前), 電話番号を入力する(_電話番号), assertz(電話帳(_名前,_電話番号)), R = [],!. 電話番号登録. 処理人数を入力する(_人数) :- write('\n人数 > '), get_line(Line), 処理人数入力診断(Line,_人数),!. 処理人数を入力する(_人数) :- 処理人数を入力する(_人数). 処理人数入力診断(Line,_人数) :- atom_to_term(line,_人数,_), integer(_人数), _人数 > 0,!. 処理人数入力診断(Line,_人数) :- writef('入力された %t から適切な人数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 名前を入力する(_名前) :- write('名前 > '), get_line(_名前). 電話番号を入力する(_電話番号) :- write('電話番号 > '), get_line(Line), 電話番号入力診断(Line,_電話番号),!. 電話番号を入力(_電話番号) :- 電話番号を入力する(_電話番号). 電話番号入力診断(Line,Line) :- split(Line,['(',')','-',' '],L), concat_atom(L,S), atom_chars(S,Chars), 全てが数字(Chars),!. 電話番号入力診断(Line,_電話番号) :- writef('入力された%tは電話番号として不適切です。再入力をお願いします。\n',[Line]), fail. 電話番号表示 :- writef('\n電話帳 >\n'), 電話帳(_名前,_電話番号), writef('%t, %t\n',[_名前,_電話番号]), fail. 電話番号表示. 電話番号検索 :- 名前を鍵に電話番号を得る. 名前を鍵に電話番号を得る :- 名前を入力(_名前), 電話番号の検索と出力(_名前),!. 電話番号の検索と出力(_名前,_電話番号) :- 電話帳(_名前,_電話番号), 名前と電話番号を出力する(_名前,_電話番号), fail. 電話番号の検索と出力(_名前,_電話番号) :- \+(電話帳(_名前,_電話番号)), write('該当者なし\n'),!. 電話番号の検索と出力(_,_). 名前と電話番号を出力する(_名前,_電話番号) :- writef('%t, %t\n',[_名前,_電話番号]). 全てが数字([]) :- !. 全てが数字([A|R]) :- member(A,['0','1','2','3','5','5','6','7','8','9']), 全てが数字(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/945 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # strcmp()を利用し、input.txtを読み込み、キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力するプログラムを作成しなさい。 # 'input.txtを読み込み、キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力する' :- 'input.txtを読み込み'(LL), キーボードから英単語を1つ入力し(_英単語), 英単語から何個含まれるか(LL,_英単語,_何個), writef('英単語%tはinput.txtに%t個含まれる\n',[_英単語,_何個]). 'input.txtを読み込み'(LL) :- see('input.txt'), readln(X,_終了状態), 'input.txtを読み込み'(X,_終了状態,LL), seen. 'input.txtを読み込み'(_,end_of_file,[]) :- !. 'input.txtを読み込み'(L,_,[L|R]) :- readln(L2,_終了状態2), 'input.txtを読み込み'(L2,_終了状態2,R). キーボードから英単語を1つ入力し(_英単語) :- get_line(_英単語),!. 英単語から何個含まれるか(LL,_英単語,_何個) :- flatten(LL,L), count(member(_英単語,L),_何個). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0) :- !. sum([N|R],X) :- sum(R,Y), X is N + Y. % split/3の定義 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/929 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # strcmp()を利用し、../test/read.cgi/tech/1307166756/904で利用したものと同様のimput.txtを読み込む。 # キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力するプログラムを作成しなさい。 # 'キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力するプログラムを作成しなさい' :- 'キーボードから英単語を1つ入力し'(_英単語), 'その単語が、input.txtに何個含まれるかを出力する'(_英単語). 'キーボードから英単語を1つ入力し'(_英単語) :- get_line(_英単語). 'その単語が、input.txtに何個含まれるかを出力する'(_英単語) :- 'input.txtを読み込む'(LL), 何個含まれるか(LL,_英単語,_何個), 出力する(_英単語,_何個). 'input.txtを読み込む'(LL) :- see('input.txt'), readln(X,_終了状態), 'input.txtを読み込む'(X,_終了状態,LL), seen,!. 'input.txtを読み込む'(_,end_of_file,[]) :- !. 'input.txtを読み込む'(A,_,[A|R]) :- readln(B,_終了状態2), 'input.txtを読み込む'(B,_終了状態2,R). 何個含まれるか(LL,_英単語,_何個) :- flatten(LL,L), count(member(_英単語,L),_何個). 出力する(_英単語,_何個) :- writef('%t はinput.txt中に %t個含まれます。\n',[_英単語,_何個]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0) :- !. sum([N|R],X) :- sum(R,Y), X is N + Y. % split/3の定義 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/908 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # strcmp()を利用し、../test/read.cgi/tech/1307166756/904で利用したものと同様のimput.txtを読み込む。 # キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力するプログラムを作成しなさい。 # 'キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力する' :- 'キーボードから英単語を1つ入力し'(_英単語), 'その単語が、input.txtに何個含まれるかを出力する'(_英単語). 'キーボードから英単語を1つ入力し'(_英単語) :- get_line(_英単語). 'その単語が、input.txtに何個含まれるかを出力する'(_英単語) :- 'その単語が、input.txtに何個含まれるか'(_英単語,_何個), 出力する(_英単語,_何個). 'その単語が、input.txtに何個含まれるか'(_英単語,_何個) :- get_chars('input.txt',Chars), concat_atom(Chars,S), split(S,[' ','\n'],_単語ならび), count(member(_英単語,_単語ならび),_何個). 出力する(_英単語,_何個) :- writef('単語 %t は %t個あります。\n',[_英単語,_何個]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0) :- !. sum([N|R],X) :- sum(R,Y), X is N + Y. % split/3の定義 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/564 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力した数だけの長さのint型の配列を用意して、 # 同じくキーボードから値を入力し、表示するプログラムkadai9-1.cを作りなさい。 # 但し長さlengthのint型の配列の内容を表示する関数 # void display_array(int *data, int length)を定義して使用すること。 # 実行例: # gcc kadai9-1.c # ./a.out # 3 <- 長さを入力 # 1 3 4 <-データ入力 # 1 <-ここから表示 # 3 # 4 # # 'キーボードから入力した数だけの長さのint型の配列を用意して、同じくキーボードから値を入力し、表示する' :- キーボードから入力した数(_入力した数), 'だけの長さのint型の配列を用意して'(_入力した数,_ならび), 同じくキーボードから値を入力し(_ならび), 表示する(_ならび). キーボードから入力した数(_入力した数) :- get_line(Line), 整数入力診断(Line,_入力した数),!. キーボードから入力した数(_入力した数) :- キーボードから入力した数(_入力した数) . 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'だけの長さのint型の配列を用意して'(_入力した数,_ならび) :- length(_ならび,_入力した数). 同じくキーボードから値を入力し(_ならび) :- 一行で数を入力する(ならび),!. 同じくキーボードから値を入力し(_ならび) :- 同じくキーボードから値を入力し(_ならび). 一行で数を入力する(_ならび) :- get_line(Line), 一行で数を入力診断(Line,_ならび),!. 一行で数を入力診断(Line,_ならび) :- get_split_line([' ',','],_ならび), すべて整数(_ならび),!. 一行で数を入力診断(Line,_ならび) :- length(_ならび,N), writef('入力された %t から %t個の整数を得られませんでした。再入力をお願いします。\n',[Line,N]), fail. 数を入力する(_数) :- get_line(Line), 整数数入力診断(Line,_数),!. 数を入力する(_数) :- 整数を入力する(_数). 表示する(_ならび) :- append(_,[_値|R],_ならび), writef('%t\n',[_値]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/386 # # [1] 授業単元:課題 # [2] 問題文: # 読み込んだ2つの正整数の最大公約数を出力するプログラムを作成せよ.ただし,以下の関数 gcd() を再帰を用いて定義し,使用すること. # 書式 # int gcd(int m, int n); # 返り値 # 正整数m, nの最大公約数 # 実行結果1 # 2正整数 > 8 12 # 4 # 実行結果2 # 2正整数 > 81 64 # 1 # 読み込んだ2つの正整数の最大公約数を出力する :- 読み込んだ2つの正整数(_1つ目の正整数,_2つ目の正整数), 最大公約数(_1つ目の正整数,_2つ目の正整数,_最大公約数), 出力する(_最大公約数). 読み込んだ2つの正整数(_1つ目の正整数,_2つ目の正整数) :- write('2つの正の整数を空白で区切り一行で入力してください : '), get_line(Line), 2つの正整数を読み込み診断(Line,_1つめの正整数,_2つ目の正整数),!. 読み込んだ2つの正整数(_1つ目の正整数,_2つ目の正整数) :- 読み込んだ2つの正整数(_1つ目の正整数,_2つ目の正整数). '2つの正整数を読み込み診断'(Line,_1つめの正整数,_2つ目の正整数) :- split(Line,[' '],[_1つ目の正整数,_2つ目の正整数]), integer(_1つ目の正整数), integer(_2つ目の正整数), _1つ目の正整数 > 0, _2つ目の正整数 > 0,!. '2つの正整数を読み込み診断'(Line,_,_) :- writef('入力された %t から2つの正整数を得ることができません。再入力をお願いします。\n',[Line]), fail. 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 出力する(_最大公約数) :- writef('%t\n',[_最大公約数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/384 # # # [1] 授業単元:2次元配列の利用 # [2] 問題文(含コード&リンク): # 新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示するプログラムを作成しなさい。 # なお、駅番号は、東京が1、新横浜が2、名古屋が3、京都が4、新大阪が5とする。 # 但し、料金を表示してから後で、1を入力すると上記の処理を繰り返し、0を入力するとプログラムを終了するものとする。 #     新大阪 京都  名古屋 新横浜 # 東京  14920 14390 11540  3180 # 新横浜 14600 13660 10910 # 名古屋 6840 6100 # 京都  3240 # のぞみ料金表の作成(File) :- get_split_lines(File,[' '],Lines), Lines = [_駅名横ならび|R1], findall(_駅名,( append(LL0,[[_駅名|_]|R],R1)), _駅名縦ならび), 駅番号の登録(_駅名縦ならび), findall(_料金ならび,( append(LL0,[[_|_料金ならび]|_],R1)), _料金表), のぞみ料金表の作成(_駅名縦ならび,_駅名横ならび,_料金表). 駅番号の登録(_駅名縦ならび) :- append(_駅名縦ならび,[新大阪],_駅名縦ならびのニ), append(L0,[_駅名|R],_駅名縦ならびのニ), length([_|L0],Len), assertz((駅番号(Len,_駅名) :- !)), R = []. のぞみ料金表の作成([],_,_) :- !. のぞみ料金表の作成([_駅名|R1],_駅名横ならび,[L3|R3]) :- 駅単位料金表(_駅名,_駅名横ならび,L3), のぞみ料金表の作成(R1,_駅名横ならび,R3). 起点駅単位料金登録(_,_,[]) :- !. 起点駅単位料金登録(_駅名,[_駅名2|R2],[_料金|R3]) :- assertz(のぞみ料金(_駅名,_駅名2,_料金)), assertz(のぞみ料金(_駅名2,_駅名,_料金)), 起点駅単位料金表(_駅名,R2,R3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/384 # # # [1] 授業単元:2次元配列の利用 # [2] 問題文(含コード&リンク): # 新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示するプログラムを作成しなさい。 # なお、駅番号は、東京が1、新横浜が2、名古屋が3、京都が4、新大阪が5とする。 # 但し、料金を表示してから後で、1を入力すると上記の処理を繰り返し、0を入力するとプログラムを終了するものとする。 #     新大阪 京都  名古屋 新横浜 # 東京  14920 14390 11540  3180 # 新横浜 14600 13660 10910 # 名古屋 6840 6100 # 京都  3240 # :- のぞみ料金表の生成('のぞみ料金表.txt'). 出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する :- 出発駅を得る(_出発駅), 到着駅を得る(_到着駅), のぞみ料金(_出発駅,_到着駅,_料金), 料金を表示する(_出発駅,_到着駅,_料金), write('0..終了 1..別の料金を検索する : '), get_line('0'),!. 出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する :- 出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する. 出発駅を得る(_出発駅) :- 駅番号駅名表示(_駅番号駅名表示), writef('出発駅を番号で選択してください。%t : ',[_駅番号駅名表示]), 駅番号で入力する(_駅番号), 駅番号(_駅番号,_出発駅),!. 出発駅を得る(_出発駅) :- 出発駅を得る(_出発駅). 到着駅を得る(_到着駅) :- 駅番号駅名表示(_駅番号駅名表示), writef('到着駅を番号で選択してください。%t : ',[_駅番号駅名表示]), 駅番号で入力する(_駅番号), 駅番号(_駅番号,_到着駅),!. 到着駅を得る(_到着駅) :- 到着駅を得る(_到着駅). 駅番号駅名表示(_駅番号駅名表示) :- findall(S,( 駅番号(_駅番号,_駅名), concat_atom([_駅番号,'..',_駅名],S)), L), concat_atom(L,' ',_駅番号駅名表示),!. 駅番号で入力する(_駅番号) :- get_line(Line), 駅番号入力診断(Line,_駅番号),!. 駅番号入力診断(Line,_駅番号) :- atom_to_term(Line,_駅番号,_), integer(_駅番号), _駅番号 >= 1, _駅番号 =< 5,!. 駅番号入力診断(Line,_駅番号) :- writef('入力された %t から適切な駅番号が得られません。再入力をお願いします\n',[Line]), fail. 料金を表示する(_出発駅,_到着駅,_料金) :- writef('%t から %t までの料金は %t 円です。\n',[_出発駅,_到着駅,_料金]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% のぞみ料金表の作成(File) :- get_split_lines(File,[' '],Lines), Lines = [_駅名横ならび|R1], findall(_駅名,( append(LL0,[[_駅名|_]|R],R1)), _駅名縦ならび), 駅番号の登録(_駅名縦ならび), findall(_料金ならび,( append(LL0,[[_|_料金ならび]|_],R1)), _料金表), のぞみ料金表の作成(_駅名縦ならび,_駅名横ならび,_料金表). 駅番号の登録(_駅名縦ならび) :- append(_駅名縦ならび,[新大阪],_駅名縦ならびのニ), append(L0,[_駅名|R],_駅名縦ならびのニ), length([_|L0],Len), assertz((駅番号(Len,_駅名) :- !)), R = []. のぞみ料金表の作成([],_,_) :- !. のぞみ料金表の作成([_駅名|R1],_駅名横ならび,[L3|R3]) :- 駅単位料金表(_駅名,_駅名横ならび,L3), のぞみ料金表の作成(R1,_駅名横ならび,R3). 起点駅単位料金登録(_,_,[]) :- !. 起点駅単位料金登録(_駅名,[_駅名2|R2],[_料金|R3]) :- assertz(のぞみ料金(_駅名,_駅名2,_料金)), assertz(のぞみ料金(_駅名2,_駅名,_料金)), 起点駅単位料金表(_駅名,R2,R3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/232 # # [1] 授業単元:配列の並び替え # [2] 問題文(含コード&リンク): # ../test/read.cgi/tech/1307166756/189のシステムを以下のように拡張する。 # 指定済みの座標を入力した場合、「先手の負け」または「後手の負け」と表示する。 # 全てのマスが埋まったら、「試合終了」と表示する。 # この段階でも、勝ち負けの判定も行わない。 '先手、後手の順番で、x=1,2,3 y=1,2,3の座標の整数値をx yの順番で与えると、その場所に先手ならA、後手ならBを表示して、3目並べを実現する' :- length(LL,3), findall(L,(append(_,[L|_],LL),length(L,3)),LL), 3目並べを実現する(後手,LL,_診断). 3目並べを実現する(_,_,_診断) :- \+(var(_診断)),!. 3目並べを実現する(_,LL,正常終了) :- 打つところがない(LL), write('試合終了),!. 3目並べを実現する(_前の手番,LL,正常終了) :- 三目ならび完成(LL), writef('%tの勝ちです\n',[_前の手番]),!. 3目並べを実現する(_前の手番,LL,_診断) :- \+(三目ならび完成(LL)), 手番(_前の手番,_手番), 座標値を与える(_手番,LL,_診断), 3目並べを実現する(_手番,LL,_診断). 打つところがない([]). 打つところがない([L|R]) :- 全て変数(L), 打つところがない(R). すべて変数([]). すべて変数([V|R]) :- var(V), すべて変数(R). 三目ならび完成([[_,_,A],[_,A,_],[A,_,_]]) :- \+(var(A)),!. 三目ならび完成([[A,_,_],[_,A,_],[_,_,A]]) :- \+(var(A)),!. 三目ならび完成([[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,_,[A,A,A]]) :- \+(var(A)),!. 三目ならび完成(L) :- 転置(L,L1), 三目ならび完成(L1). 手番(先手,後手). 手番(後手,先手). 着手記号(先手,'O'). 着手記号(後手,'@'). 座標値を与える(_手番,LL,_診断) :- 盤面表示(LL), writef('%t の手番です : \n',[_手番]), 座標値を得る(_x,_y), 座標値診断(_手番,_x,_y,LL),!. 座標値を得る(_x,_y) :- get_line(Line), split(Line,[' ',','],[_x,_y]),!. 座標値診断(_手番,_x,_y,LL,_診断) :- nth1(_y,LL,L), nth1(_x,L,V), var(V), 着手記号(_手番,_記号), V = _記号,!. 座標値診断(_手番,_,_,_,異常終了) :- write('%tの負けです。\n',[_手番]),!. 盤面表示(LL) :- write('---------\n'), append(_,[[A,B,C]|R],LL), 変数は空白に変換([A,B,C],[A2,B2,C2]), concat_atom([A2,B2,C2],'|',S), writef('|%t|\n',[S]), R = [], write('---------\n'),!. 変数は空白に変換([],[]). 変数は空白に変換([V|R1],[' '|R2]) :- var(V), 変数は空白に変換(R1,R2). 変数は空白に変換([V|R1],[V|R2]) :- \+(var(V)), 変数は空白に変換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/226 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):下記に記載 # # >>255のプログラムにそれぞれの成績がborderlineで表される成績を上回っているか否かを判定して、構造体のメンバーであるkokugo_gokakuおよびsugaku_gokakuに1(合格の意味)もしくは0(不合格の意味)の値を代入する関数 # void check_score(int borderline, struct SEISEKI *a) /* 引数aの前に'*'が付いていることに注意されたい */ # を定義して、その動作を確認するプログラムkadai8-2.cを作りなさい。 # 但し、ボーダーラインは60点とする。 # 1) 問1の構造体を拡張して以下を使う。 # struct SEISEKI { # char name[50]; # int kokugo; # int sugaku; # int kokugo_gokaku; # int sugaku_gokaku; # } '国語と数学の2科目のテストの成績を処理するプログラムを作る。成績を3人分キーボードから入力した後、それを表示する' :- 成績を3人分キーボードから入力した後(L), 'それぞれの成績が閾値で表される成績を上回っているか否かを判定して、合格なら1不合格の場合は0の値を返す'(L,L2), 表示する(L2). 成績を3人分キーボードから入力した後([[_氏名_1,_国語_1,_数学_1,_合否判定_1],[_氏名_2,_国語_2,_数学_2],[_氏名_3,_国語_3,_数学_3]]) :- write('氏名 国語得点 数学得点をスペース区切りで横に3人分入力しなさい : '), get_line(Line), split(Line,[' '],[_氏名_1,_国語_1,_数学_1,_氏名_2,_国語_2,_数学_2,_氏名_3,_国語_3,_数学_3]),!. 'それぞれの成績が閾値で表される成績を上回っているか否かを判定して、合格なら1不合格の場合は0の値を返す'([[_氏名,_国語,_数学]|R1],[[_氏名,_国語,_数学,_国語合否,_数学合否]|R2]) :- 合否線(国語,_国語合否線), 合否線(数学,_数学合否線), 合否判定(_国語,_数学,_国語合否線,_数学合否線,_国語合否,_数学合否), 'それぞれの成績が閾値で表される成績を上回っているか否かを判定して、合格なら1不合格の場合は0の値を返す'(R1,R2). 合否判定(_国語,_数学,_国語合否線,_数学合否線,合格,合格) :- _国語 >= _国語合否線, _数学 >= _数学合否線,!. 合否判定(_国語,_数学,_国語合否線,_数学合否線,合格,不合格) :- _国語 >= _国語合否線, _数学 < _数学合否線,!. 合否判定(_国語,_数学,_国語合否線,_数学合否線,不合格,合格) :- _国語 < _国語合否線, _数学 >= _数学合否線,!. 合否判定(_国語,_数学,_国語合否線,_数学合否線,不合格,不合格) :- _国語 < _国語合否線, _数学 < _数学合否線,!. 表示する([]). 表示する([[_氏名,_国語,_数学,_国語合否,_数学合否]|R]) :- writef('氏名:%t\n国語:%t %t\n数学:%t %t\n',[_氏名,_国語,_国語合否,_数学,_数学合否]), 表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/225 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):下記に記載 # # 国語と数学の2科目のテストの成績を処理するプログラムを作る。成績を3人分キーボードから入力した後、それを表示したい。これについて、次の手順でkadai8-1.cを作成しなさい。 # 1)次の構造体を利用する。 # struct SEISEKI { # char name[50]; # int kokugo; # int sugaku; # } # 2) 次の配列を用意する。 # struct SEISEKI score[3]; # 3) main関数で上記score[3]に次のようにデータをキーボード入力するようにする。 # scanf("%s %d %d %s %d %d %s %d %d", 一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....); # ex. 入力例: # yamauchi 60 70 yamada 80 90 tougou 70 80 # 4)次の関数を定義する。 # void print_score(struct SEISEKI a); # この関数は次のように成績を出力するものとする。 # printf(" name: %s\n kokugo: %d\n sugaku: %d\n", ........); # 表示例: # name: yamauchi # kokugo: 60 # sugaku: 70 # 5) void print_score()を使って3人分の成績を列挙する。 # よろしくお願いします。 '国語と数学の2科目のテストの成績を処理するプログラムを作る。成績を3人分キーボードから入力した後、それを表示する' :- 成績を3人分キーボードから入力した後(LL), 表示する(LL). 成績を3人分キーボードから入力した後([[_氏名_1,_国語_1,_数学_1],[_氏名_2,_国語_2,_数学_2],[_氏名_3,_国語_3,_数学_3]]) :- write('氏名 国語得点 数学得点をスペース区切りで横に3人分入力しなさい : '), get_line(Line), split(Line,[' '],[_氏名_1,_国語_1,_数学_1,_氏名_2,_国語_2,_数学_2,_氏名_3,_国語_3,_数学_3]),!. 表示する([]). 表示する([[_氏名,_国語,_数学]|R]) :- writef('氏名:%t\n国語:%t\n数学:%t\n',[_氏名,_国語,_数学]), 表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/189 # # [1] 授業単元:配列の並び替え # [2] 問題文(含コード&リンク): # 先手、後手の順番で、x=1,2,3 y=1,2,3の座標の整数値をx yの順番で与えると、その場所に先手ならO、後手なら@を表示して、3目並べを実現するプログラムを作成しなさい。 # 操作は、先手・後手が交互に座標の数値を1ずつ与えるものとし、入力ミスは考えない。 # すでに指定済みの座標かどうかについては判定し、指定済みの座標を入力した場合は、「異常終了」と表示し、プログラムを終了することとする。 # この段階では、勝ち負けの判定も行わない。 # '先手、後手の順番で、x=1,2,3 y=1,2,3の座標の整数値をx yの順番で与えると、その場所に先手ならA、後手ならBを表示して、3目並べを実現する' :- length(LL,3), findall(L,(append(_,[L|_],LL),length(L,3)),LL), 3目並べを実現する(後手,LL,_診断), 診断値表示(_診断). 3目並べを実現する(_,_,_診断) :- \+(var(_診断)),!. 3目並べを実現する(_前の手番,LL,正常終了) :- 三目ならび完成(LL), writef('%tの勝ちです\n',[_前の手番]),!. 3目並べを実現する(_前の手番,LL,_診断) :- \+(三目ならび完成(LL)), 手番(_前の手番,_手番), 座標値を与える(_手番,LL,_診断), 3目並べを実現する(_手番,LL,_診断). 三目ならび完成([[_,_,A],[_,A,_],[A,_,_]]) :- \+(var(A)),!. 三目ならび完成([[A,_,_],[_,A,_],[_,_,A]]) :- \+(var(A)),!. 三目ならび完成([[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,_,[A,A,A]]) :- \+(var(A)),!. 三目ならび完成(L) :- 転置(L,L1), 三目ならび完成(L1). 手番(先手,後手). 手番(後手,先手). 着手記号(先手,'O'). 着手記号(後手,'@'). 座標値を与える(_手番,LL,_診断) :- 盤面表示(LL), writef('%t の手番です : \n',[_手番]), 座標値を得る(_x,_y), 座標値診断(_手番,_x,_y,LL),!. 座標値を得る(_x,_y) :- get_line(Line), split(Line,[' ',','],[_x,_y]),!. 座標値診断(_手番,_x,_y,LL,_診断) :- nth1(_y,LL,L), nth1(_x,L,V), var(V), 着手記号(_手番,_記号), V = _記号,!. 座標値診断(_,_,_,_,異常終了). 診断値表示(異常終了) :- write('異常終了\n'),!. 診断値表示(_). 盤面表示(LL) :- write('---------\n'), append(_,[[A,B,C]|R],LL), 変数は空白に変換([A,B,C],[A2,B2,C2]), concat_atom([A2,B2,C2],'|',S), writef('|%t|\n',[S]), R = [], write('---------\n'),!. 変数は空白に変換([],[]). 変数は空白に変換([V|R1],[' '|R2]) :- var(V), 変数は空白に変換(R1,R2). 変数は空白に変換([V|R1],[V|R2]) :- \+(var(V)), 変数は空白に変換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/17 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): # 10人の身長(cm単位の実数)を入力させ、配列に記憶する。 # その後、平均身長を求めて表示した後、10人分の身長を表示するプログラムを作成しなさい。 # '10人の身長(cm単位の実数)を入力させ、配列に記憶する。その後、平均身長を求めて表示した後、10人分の身長を表示する' :- 'n人分の身長(cm単位の実数)を入力させ、配列に記憶する'(10,_10人分の身長ならび), その後、平均身長を求めて表示(_10人分の身長ならび), '10人分の身長を表示する'(_10人分の身長ならび). 'n人分の身長(cm単位の実数)を入力させ、配列に記憶する'(_n,_n人分の身長ならび) :- writef('%t人分の身長(実数)をカンマ区切りで入力してください : ',[_n]), get_line(Line), 入力診断(Line,_n,_n人分の身長ならび),!. 'n人分の身長(cm単位の実数)を入力させ、配列に記憶する'(_n,_n人分の身長ならび) :- 'n人分の身長(cm単位の実数)を入力させ、配列に記憶する'(_n,_n人分の身長ならび). 入力診断(Line,_n,_n人分の身長ならび) :- split(Line,[',',' '],L1), 全て実数化(L1,L2), 入力診断のニ(L2,_n,_n人分の身長ならび). 入力診断(Line,_n,_) :- writef('入力された %t から%t個の実数が得られません。再入力をお願いします。\n',[Line,_n]), fail. 入力診断のニ(L1,_n,_n人分の身長ならび) :- length(_n人分の身長ならび,_n), append(_n人分の身長ならび,L2,L1), length(L2,_n_2), writef('入力要素が10項を越えました。%t項を切り取ります\n',[_n_2]),!. 入力診断のニ(L1,_n,_n人分の身長ならび) :- length(_n人分の身長ならび,_n), append(L1,L2,_n人分の身長ならび), length(L2,_n_2), writef('入力が%t項足りません\n',[_n_2]), 補充の身長を入力する(_n_2,L2). 補充の身長を入力する(_n,_n人分の身長ならび) :- '身長(cm単位の実数)を入力させ、配列に記憶する'(_n,_n人分の身長ならび). すべて実数化([],[]). すべて実数化([V|R1],[V|R2]) :- real(V), すべて実数化(R1,R2). すべて実数化([N|R1],[V|R2]) :- integer(N), V is N * 1.0, すべて実数化(R1,R2). その後、平均身長を求めて表示(L) :- findavg(A,append(_,[A|_],L),_平均身長), writef('平均身長は %t \n',[_平均身長]). '10人分の身長を表示する'(L) :- concat_atom(L,' ',S), writef('入力された10人の身長は %t です\n',[S]). % 以下のサイトは # 出典:: 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/726 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力した10文字以内の任意の文字列の中で、 # ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す関数 # char *cut_str(char *address1, char target_char)を定義し、 # その動作を確認するkadai7-2.cを作りなさい。 # ただし、文字列と、ある特定の文字の入力は、 # char str[10], target_char; # scanf("%s %c", str, &target_char); # で入力されるものとして、 # 答えは以下で出力されるものとする。 # printf("answer = %s\n", cut_str(str, target_char)); # # 'キーボードから入力した10文字以内の任意の文字列の中で、ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す'(_ある特定の文字が最初に表れる位置からそれ以降の部分文字列) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字), sub_atom(_文字列,S,_,_,_ある特定の文字), sub_atom(_文字列,S,_,0,_ある特定の文字が最初に表れる位置からそれ以降の部分文字列). キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- write('10文字以内の任意の文字列とある特定の文字を空白区切りで入力してください : '), get_line(Line), 文字列入力診断(Line,_文字列,_ある特定の文字),!. キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字). 文字列入力診断(Line,_文字列,_ある特定の文字) :- split(Line,[' ',','],[_文字列,_ある特定の文字]), atom(_文字列), sub_atom(_ある特定の文字,0,1,0,_ある特定の文字), sub_atom(_文字列,_,_文字列の長さ,_,_文字列), 文字列の長さ診断(_文字列,_文字列の長さ),!. 文字列入力診断(Line,_,_) :- writef('入力された %t から適切な情報が得られません。再入力をお願いします。\n',[Line]), fail. 文字列の長さ診断(_文字列,_文字列の長さ) :- _文字列の長さ =< 10,!. 文字列の長さ診断(_文字列,_文字列の長さ) :- writef('入力された文字列 %t は%t文字あります。10文字以下の長さで再入力をお願いします\n',[Line,_文字列の長さ]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/719 # # # (1)%で始まっていればコマンドに応じた処理ができるように分岐処理を書く # %Q:プログラムの終了 # %C:メモリ中に保持しているデータの登録数を出力 # %P:0~99番目までの100人分のデータが登録されている場合 # %P 8 …0番目→7番目の順で表示 # %P -10 …90番目→99番目の順で表示 # 出力例: # # ID : 100023 # Name : Tokyo # Date : 1900/1/1 # Addr : Tokyoto....... # Memo : aaeiou 1234566.... # # ID : 100048 # Name : Osaka # Date : 1900/2/2 # Addr : Osakafu....... # Memo : abcde 124816.... # # (2)%で始まっていなければデータを格納 # (3)ループするようにしておいて何行でも入力可能にする(%Qでプログラムを終了) # # # # 以下プログラムですが実行してもうまくいきません。 # とりあえずどういった感じで作っているか雰囲気だけでも分かってもらえればと思います。 # プログラム :- データまたはコマンドの入力(_データまたはコマンド行), コマンドループ(_データまたはコマンド行,_診断), _診断 = 終了. データまたはコマンドの入力(_データまたはコマンド行) :- get_line(_データまたはコマンド行). コマンドループ(_データまたはコマンド行,_診断) :- sub_atom(_データまたはコマンド行,0,1,_,'%'), split(_データまたはコマンド行,['%',' '],[_コマンド|_引数], コマンドの実行(_コマンド,_引数,_診断). コマンドループ(_データまたはコマンド行,_診断) :- \+(sub_atom(_データまたはコマンド行,0,1,_,'%')), データ入力(_データまたはコマンド行,_診断). コマンドループ(_,_診断) :- データまたはコマンドの入力(_データまたはコマンド行), コマンドループ(_データまたはコマンド行,_診断). コマンドの実行('Q',_,終了) :- コマンドの実行('C',_,true) :- count(clause(データ(_),_),_登録データ数), writef('登録データ数 = %t\n',[_登録データ数]). コマンドの実行('P',[N],true) :- N < 0, N >= -50, M1 is 100 + N, M2 is 0 - N - 1, for(M1,M,M2), データ(M,_データ), writef('%t\n',[_データ]), M = M2,!. コマンドの実行('P',[N],true) :- N >= 0, N =< 100, M1 is 0, M2 is N - 1, for(M1,M,M2), データ(M,_データ), writef('%t\n',[_データ]), M = M2,!. コマンドの実行(_,_,false). データ入力(_データ,true) :- findmax(N,データ(N,_),Max), Max2 is Max + 1, assertz(データ(Max2,_データ)),!. データ入力(_データ,true) :- assertz(データ(0,_データ)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/207 # # すみません、もう1問お願いします # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 寒暖の差が大きい順番に並び替えて、ファイルkadai07.datへ出力するプログラムkadai07.c を作成せよ。 # 寒暖の差: 最高の最高気温? 最低の最低気温 # '寒暖の差が大きい順番に並び替えて、ファイルkadai07.datへ出力する' :- '寒暖の差が大きい順番に並び替えて、'(_差が大きい順寒暖の差ならび), 'ファイルkadai07.datへ出力する'(_差が大きい順寒暖の差ならび). '40年間気温情報ならび'(_40年間気温情報ならび) :- get_split_lines('気温データ',[' '],_40年間気温情報ならび). '寒暖の差が大きい順番に並び替えて、'(_差が大きい順寒暖の差ならび) :- '40年間気温情報ならび'(_40年間気温情報ならび), '寒暖の差ならび'(_40年間気温情報ならび,_寒暖の差ならび), sort(_寒暖の差ならび,_差が小さい順寒暖の差ならび), reverse(_差が小さい順寒暖の差ならび,_差が大きい順寒暖の差ならび). '寒暖の差ならび'(_40年間気温情報ならび,_寒暖の差ならび) :- findall([_年温度差,_年度],( append(_,[_年気温情報ならび|_],_40年間気温情報ならび), 寒暖の差(_年気温情報ならび,_年度,_年温度差)), _寒暖の差ならび). 寒暖の差(_年気温情報ならび,_年度,_年温度差) :- nth1(1,_年気温情報ならび,_年度), nth1(4,_年気温情報ならび,_年最高気温), nth1(11,_年気温情報ならび,_年最低気温), _年温度差 is _年最高気温 - _年最低気温. 'ファイルkadai07.datへ出力する'(_差が大きい順寒暖の差ならび) :- tell('kadai07.dat'), append(_,[[_寒暖差,_年度]|R],_差が大きい順寒暖の差ならび), writef('%t %t\n',[_年度,_寒暖差]), R = [], told. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/197 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/t6Un18Xw # 上記のファイルを元に40年間の年平均気温の平均より平均気温が低い年を # ファイルkadai05.datへ出力するプログラムkadai05.c を作成せよ。 # # また同様に年平均気温の低い順番に並び替えて、 # ファイルkadai06.datへ出力するプログラムkadai06.c を作成せよ # # 元のファイルで使っているtokyo.datは↓です # http://ime.nu/www.dotup.org/uploda/www.dotup.org1668350.dat # # 1970 15.2 19.3 35.5 8/29 3.4 12/26 11.5 -4.0 1/17 26.9 8/22 # 1971 15.0 19.0 34.4 8/11 3.1 1/3 11.5 -2.2 1/11 26.8 8/6 # 1972 15.7 19.6 35.2 8/8 2.0 2/26 12.2 -2.1 1/7 26.5 8/5 # 1973 15.7 19.9 34.7 7/18 4.0 1/15 11.9 -1.9 2/9 27.6 8/19 # 1974 15.2 19.2 34.2 8/7 2.5 1/21 11.8 -2.7 2/11 26.1 8/12 # 1975 15.6 19.5 35.6 7/18 4.2 1/2 12.2 -2.6 2/18 26.3 7/28 # 1976 15.0 19.0 35.4 8/24 5.0 1/21 11.4 -3.9 1/22 25.6 8/23 # 1977 15.8 19.7 34.9 8/9 2.4 1/23 12.3 -3.8 2/1 27.7 8/5 # 1978 16.1 20.0 36.3 8/22 3.3 1/18 12.6 -2.0 2/3 27.5 8/20 # 1979 16.9 20.6 34.3 7/31 3.5 1/13 13.5 -0.5 1/29 27.4 8/20 # 1980 15.4 19.2 33.0 7/23 3.9 1/13 12.0 -1.2 2/15 26.0 7/23 # 1981 15.0 18.8 34.3 7/17 4.5 2/24 11.6 -3.5 2/27 26.5 8/12 # 1982 16.0 19.5 33.0 8/22 4.0 1/16 12.6 -1.0 2/8 26.6 8/29 # 1983 15.7 19.5 37.1 8/19 6.1 1/22 12.3 -2.4 1/23 27.6 8/80 # 1984 14.9 18.7 38.1 9/3 0.7 1/21 11.6 -3.5 2/9 27.6 8/7 # 1985 15.7 19.3 35.0 9/2 3.9 1/30 12.3 -2.5 1/30 27.1 8/17 # 1986 15.2 18.7 34.6 8/5 2.9 2/11 11.9 -1.6 2/9 26.8 8/30 # 1987 16.3 20.0 37.3 7/24 3.4 2/18 12.8 -0.7 2/2 28.0 7/28 # 1988 15.4 19.0 32.9 8/23 5.0 2/27 12.1 -1.7 2/22 27.1 8/24 # 1989 16.4 19.9 33.5 8/10 5.8 2/24 13.2 0.9 1/28 26.5 8/31 # 1990 17.0 20.6 35.9 8/24 1.5 2/1 13.8 -1.4 1/27 28.8 8/24 # 1991 16.4 19.8 35.6 7/25 4.9 12/27 13.2 -0.8 2/25 27.8 8/30 # 1992 16.0 19.6 35.2 9/3 5.6 2/11 2.7 -0.5 2/1 27.3 9/30 # 1993 15.5 19.0 32.9 8/12 4.3 1/15 12.3 0.7 12/24 25.9 8/23 # 1994 16.9 20.5 39.1 8/3 4.1 2/12 13.5 -2.3 2/14 29.3 8/4 # 1995 16.3 20.1 36.4 8/28 4.6 3/4 13.0 -1.2 1/15 27.8 8/9 # 1996 15.8 19.7 38.7 8/15 2.0 2/17 12.3 -1.5 2/3 28.2 8/16 # 1997 16.7 20.6 37.7 7/5 4.6 2/22 13.2 -2.1 1/22 28.0 8/10 # 1998 16.7 20.5 36.1 7/4 4.2 1/12 13.4 -0.8 1/26 27.4 8/26 # 1999 17.0 20.9 34.8 8/23 6.1 1/8 13.6 -1.4 2/4 27.5 9/10 # 2000 16.9 20.6 37.8 9/2 4.4 2/26 13.6 -0.7 1/28 28.2 9/20 # 2001 16.5 20.4 38.1 7/24 4.4 1/20 13.1 -2.4 1/15 28.2 7/24 # 2002 16.7 20.5 35.8 8/11 3.0 12/9 13.4 -0.3 1/4 28.1 8/10 # 2003 16.0 19.6 34.3 9/13 1.8 1/3 12.8 -0.8 1/16 27.1 8/26 # 2004 17.3 21.3 39.5 7/20 4.3 12/31 13.9 0.2 12/31 29.6 7/21 # 2005 16.2 20.0 36.2 6/28 3.6 3/4 12.8 -0.8 12/19 27.6 8/5 # 2006 16.4 19.9 36.1 7/15 3.9 2/6 13.4 -1.5 2/5 27.5 8/19 # 2007 17.0 20.7 37.5 8/17 6.5 1/20 13.7 0.2 2/25 29.4 8/16 # 2008 16.4 20.1 35.3 8/8 4.5 2/9 13.3 -0.1 2/4 27.6 8/15 # 2009 16.7 20.2 34.2 7/16 5.3 2/27 13.6 0.0 1/13 26.7 7/26 '40年間気温情報ならび'(_40年間気温情報ならび) :- get_split_lines('気温データ',[' '],_40年間気温情報ならび). '40年間年平均気温'(_40年間気温情報ならび,_40年間年平均気温) :- findavg(_年平均気温,( append(_,[[_,_,_年平均気温|_]|_],_40年間気温情報ならび)), _40年間年平均気温). '40年間の年平均気温の平均より平均気温が低い年をファイルkadai05.datへ出力する' :- '40年間気温情報ならび'(_40年間気温情報ならび), '40年間年平均気温'(_40年間気温情報ならび,_40年間年平均気温), tell('kadai05.dat'), append(_,[[_年,_,_年平均気温|_]|R],_40年間気温情報ならび), 出力する(_年,_年平均気温,_40年間年平均気温), R = [], told. '40年間の年平均気温の平均より平均気温が低い年を出力する'(_年,_年平均気温,_40年間年平均気温) :- _年平均気温 < _40年間年平均気温, write('%t年\n',[_年]), fail. '40年間の年平均気温の平均より平均気温が低い年を出力する'(_,_,_). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/288 # # sqlite v3.6.23.1で、 # comment (text) ,postedtime (int) という形式にて掲示板を作っているのですが、 # 「最新の5コメント、但し、24時間以内の投稿については最大50個まで」を求めたくて # # SELECT comment FROM mm ORDER BY postedtime DESC LIMIT 50 # UNION # SELECT comment FROM mm WHERE postedtime > $nowtime - 3600*24 ORDER BY ptime DESC LIMIT 50 # # としてみたのですが($nowtimeには今の時間を入れてます)、 # 1st ORDER BY term does not match in the result set というエラーが出ます。 # (union前後のクエリそれぞれ単独ではエラーは出ません) # # 欲しい結果を求めるにはどのように書けばいいのでしょうか? # # '最新の5コメント、但し、24時間以内の投稿については最大50個まで'(_テーブル,_現在の時刻,P) :- split(_現在の時刻,[' ','/','-',':','.'],[_年,_月,_日,_時,_分,_秒,_]), テーブル構造(_テーブル,時刻,N), findmax(M,テーブル構造(_テーブル,_,M),Max), length(L1,Max), nth1(N,L1,_時刻), P =.. [_テーブル|L1], 選択(P,_年,_月,_日,_時,_分,_秒,L), append(_,[_時刻|_],L), call(P). 選択(P,_年,_月,_日,_時,_分,_秒,L) :- findsetof(_時刻,( call(P), 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻)), L1), 要素切り取り(L1,L),!. 選択(P,_年,_月,_日,_時,_分,_秒,L) :- findall(_時刻,( call(P), 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻)), L1), 整列(L1,L2), 要素切り取り(L2,L),!. 選択(P,_,_,_,_,_,_,L) :- findall(_時刻,( call(P)), L1), 整列(L1,L2), length(L,5), append(_,L,L2),!. 要素切り取り(L1,L) :- length(L1,Length), Length >= 50, length(L,50), append(_,L,L1),!. 要素切り取り(L1,L1) :- length(L1,Length), Length >= 5, length < 50,!. 時刻が24時間以内(_年,12,31,_時,_分,_秒,_時刻) :- split(_時刻,['/','-',':','.'],[_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]), _年_1 is _年 + 1, [_年_1,1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,2,29,_時,_分,_秒,_時刻) :- うるう年(_年), [_年,3,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,2,28,_時,_分,_秒,_時刻) :- \+(うるう年(_年)), [_年,3,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,30,_時,_分,_秒,_時刻) :- append(_,[_月|_],[4,6,9,11]), _月_1 is _月 + 1, [_年,_月_1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,31,_時,_分,_秒,_時刻) :- append(_,[_月|_],[1,3,5,7,8,10]), _月_1 is _月 + 1, [_年,_月_1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻) :- split(_時刻,['/','-',':','.'],[_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]), _日_1 is _日 + 1, [_年,_月,_日_1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数) . うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/79 # # aaa=bbb;ccc=ddd;eee=fff # # という感じの文字列からcccの値dddを取得したいです。 # dddは可変でその部分にはセミコロンとカンマは入ることはありません。 # (セミコロンは区切りとしては使いますが値としては使いません。) # cccは最後に書かれてる場合もあり、その場合は、 # 上記のeee=fffのように最後にセミコロンがつきません。 # # そこで正規表現なんですが、 # ccc=(.*?;|[^;\,]+$) # という感じにしました。 # 後方参照で()内の部分を取り出したとき、 # ccc=ddd;のときは、「ddd;」といった感じにセミコロンつきで取得され、 # ccc=dddのときは、「ddd」といった感じにセミコロンなしで取得されます。 # ccc=ddd;のときでもセミコロンなしで取得したいのですが、 # 正規表現のみで可能でしょうか? # # 'aaa=bbb;ccc=ddd;eee=fffという感じの文字列からcccの値dddを取得したい'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,後文字列,L1,L2,L3), sub_atom(S1,_,1,0,C1), セミコロンかカンマ(C1), sub_atom(_後文字列,0,1,_,C2), セミコロンかカンマ(C2), セミコロンかカンマを含まない(L2), split(S2,['='],[S2_1,_適合文字列]), concat_atom([S1,S2_1,'='],_前文字列). セミコロンかカンマ(';'). セミコロンかカンマ(','). セミコロンかカンマを含まない([]). セミコロンかカンマを含まない([A|R]) :- \+(A = ';'), \+(A = ','), セミコロンかカンマを含まない(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/908 # # # # [1] 授業単元:計算機プログラミング # [2] 問題文:http://nojiriko.asia/prolog/org1648258.pdf #         リンク先の問題2 # # 2.下記のような,学生 10 名の 5 科目の成績表がある(表の仕様,値などは各自決めてよい)。 # 成績表 # StudentNo. Electromag. Elec.Cct Computer Math English # E001 70 65 85 90 70 # E002 50 45 55 65 60 # E003 78 90 95 70 85 # E004 90 98 87 85 75 # E005 45 75 62 48 50 # # 個人毎,および科目毎の平均を計算するプログラムを組みなさい。 # ただし,プログラムの設計仕様に次の 2 点を必ず含めること。 # # (1) キーボードなどから点数を入力し,結果をファイルに出力すること(kekka.txt など)。 # ファイル(data.txt など)を読込ませてもよい。ただし,値をプログラムに組み込まないこと! # (2) 平均を求める箇所を関数にすること。 '個人毎,および科目毎の平均を計算する。キーボードなどから点数を入力し(ファイル(data.txt など)を読込ませてもよい),結果をファイルに出力する'(_入力ファイル,_出力ファイル) :- 'キーボードなどから点数を入力し(ファイル(data.txt など)を読込ませてもよい)'(_入力ファイル,_見出し項,_生成表), '個人毎,および科目毎の平均を計算する'(_成績表,_個人毎平均,_個人毎平均を付加した成績表,_科目毎平均), ファイルに出力する(_見出し項,_個人毎平均,_科目毎平均). 'キーボードなどから点数を入力し(ファイル(data.txt など)を読込ませてもよい)'(_入力ファイル,_見出し項,_生成表) :- get_split_lines(_入力ファイル,[' '],LL), LL = [_見出し項|_成績表]. '個人毎,および科目毎の平均を計算する'(_成績表,_個人毎平均,_個人毎平均を付加した成績表,_科目毎平均) :- 個人毎の平均を計算する(_成績表,_個人毎平均,_個人毎平均を付加した成績表), 科目毎の平均を計算する(_成績表,_科目毎平均). 個人毎の平均を計算する(_成績表,_個人毎平均を付加した成績表) :- findall(L,( append(_,[L1|_],_成績表), L1 = [_|_個人成績ならび], avg(_個人成績ならび,_個人毎平均), append(L1,[_個人毎平均],L)), _個人毎平均を付加した成績表). 科目毎の平均を計算する(_成績表,_科目毎平均) :- 転置(_成績表,_転置された成績表), findall(Avg,( append(_,[[_|L]|_],_転置された成績表), avg(L,Avg)), _科目毎平均). ファイルに出力する(_見出し項,_個人毎平均,_科目毎平均) :- open(_出力ファイル,write,Outstream), 見出し項を出力する(Outstream,_見出し項), 個人毎の平均を出力する(Outstream,_個人毎平均), 科目毎の平均を出力する(Outstream,_科目毎平均), close(Outstream). 見出し項を出力する(Outstream,_見出し項) :- append(_見出し項,['Average'],_見出し項のニ), write_formattet(Outstream,'%16t %16t %16t %16t %16t %16t %16t %16t \n',_見出し項のニ),!. 個人毎の平均を出力する(Outstream,_個人毎平均) :- append(_,[L|R],_個人毎平均), write_formatted(Outstream,'%16t %16t %16t %16t %16t %16t %16t %16t \n',L), R = []. 科目毎の平均を出力する(Outstream,_科目毎平均) :- write_formatted(Outstream,'avarage %16t %16t %16t %16t %16t %16t %16t \n',_科目毎平均). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/745 # # [1] 授業単元:プログラム実習 # [2] 問題文(含コード&リンク): # 名前・身長・体重・血液型が記録されたメモ帳(ファイル)がある。 # これを身長順にソートして並べ替えてコマンドプロンプト上に # 表示させるプログラムを作成せよ。 # なお、今回メモ帳はstudentsdata.txtという名前で保存されていることとする。 # # program :- get_lines('studentsdata.txt',Lines), 身長を取り出して鍵とする(Lines,LL1), sort(LL1,LL2), append(_,[[_,Line]|R],LL2), writef('%t\n',[Line]), R = [],!. 身長を取り出して鍵とする([],[]) :- !. 身長を取り出して鍵とする([Line|R1],[[_身長,Line]|R2]) :- split(Line,[' ',','],[_,_身長,_,_]), 身長を取り出して鍵とする(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/213 # # [1] 授業単元: 無し # [2] 問題文(含コード&リンク): # A,A+,B,B+,C,C+,D,D+,E,E+,F,F+と文字が並んでて、1つ文字を入力したときに # その文字が例えばAならA→B+→D→E+→A、D+ならD+→F→A+→C→D+というように # 入力された文字から2つ飛ばしで最初の文字まで表示する # 'A,A+,B,B+,C,C+,D,D+,E,E+,F,F+と文字が並んでて、1つ文字を入力したときにその文字が例えばAならA→B+→D→E+→A、D+ならD+→F→A+→C→D+というように入力された文字から2つ飛ばしで最初の文字まで表示する' :- write('ひとつの文字を入力してください : '), get_line(_ひとつの文字), split('A,A+,B,B+,C,C+,D,D+,E,E+,F,F+',[','],L), append(L0,[_ひとつの文字|R],L), append(R,L0,L2), '2つ飛ばして表示'(_ひとつの文字,L2). '2つ飛ばして表示'(A,[]) :- write_formatted('%t\n',[A]),!. '2つ飛ばして表示'(A,[_]) :- write_formatted('%t\n',[A]),!. '2つ飛ばして表示'(A,[_,B|R]) :- write_formatted('%t,',[B]), '2つ飛ばして表示'(A,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/31 # # 正規表現でとあるスレの、特定のURLを含まないレスをあぼーんにしたいと考えています # 特定のURLは"mt=8"と"hibari"が含まれたURLです # [^(mt=8)(hibari)] # と試しましたが駄目でした。どのようにすればよいのでしょうか? # # 正規表現でとあるスレの、特定のURLを含まないレスをあぼーんにしたい(_レス,URL) :- 'URLを切り出す'(_レス,_前文字列,URL,_後文字列), アボーンしない(URL),!. アボーンしない(URL) :- split(URL,['://','/'],L), append(_,[A|_],L), append(_,[A|_],[mate,hibari]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/212 # # [1]C言語演習 # [2]問題文 # 次の形式のタブ区切りファイルがある。(行数は最大で1000万行とする) # 生徒ID クラス名 国語得点 数学得点 英語得点 # 生徒IDは8桁の0から9で構成される文字列 # クラス名は4桁の0から9で構成される文字列 # 国語得点、数学得点、英語得点は3桁の0から9で構成される文字列とする。 # # (2)それぞれの教科の得点が所属しているクラスの各教科の平均点の大小関係と # 同じ生徒をリストアップせよ # ただしあるクラスの2つの教科の平均点が一致している場合はその2つの教科の得点の # 大小関係は不問として出力する。(3つが一致している場合はそのクラスの生徒全員 # がリストアップされることになる # [3] OSはLinux,言語はCです。(C++は不可) # [4] 4/30まで # [5] stdlib.h stdio.h string.hをincludeしても良いがそれ以外は不可だそうです # よろしくお願いします。 # # それぞれの教科の得点が所属しているクラスの各教科の平均点の大小関係が同じ生徒をリストアップ(_ファイル) :- get_split_lines(_ファイル,['\t'],LL), findsetof(_クラス,append(_,[[_,_クラス,_,_,_]|_],LL),_クラスならび), findall([_クラス,_パターン],( append(_,[_クラス|_],_クラスならび), パターン(LL,_クラス,_国語平均点,_数学平均点,_英語平均点,_パターン)), _クラス・パターンならび), append(_,[[_ID,_クラス,_国語,_数学,_英語]|R],LL), パターンが一致したら表示(_ID,_クラス,_クラスパターンならび,_国語,_数学,_英語), R = [],!. パターンが一致したら表示(_ID,_クラス,_クラス・パターンならび,_国語,_数学,_英語) :- append(_,[[_クラス,_パターン]|_],_クラス・パターンならび), パターン判断(_パターン,_国語,_数学,_英語), write_formatted('%t\n',[_クラス,_ID]),!. パターンが一致したら表示(_,_,_,_,_,_). パターン(LL,_クラス,_国語平均点,_数学平均点,_英語平均点,_パターン) :- findavg(_国語,append(_,[[_,_クラス,_国語,_,_]|_],LL),_国語平均点), findavg(_数学,append(_,[[_,_クラス,_数学,_,_]|_],LL),_数学平均点), findavg(_英語,append(_,[[_,_クラス,_英語,_,_]|_],LL),_英語平均点), パターン(_パターン,_国語平均点,_数学平均点,_英語平均点). パターン(1,A,B,C) :- A >B,B > C,!. パターン(2,A,B,C) :- A >C,C > B,!. パターン(3,A,B,C) :- B >A,A > C,!. パターン(4,A,B,C) :- B >C,C > A,!. パターン(5,A,B,C) :- C >A,A > B,!. パターン(6,A,B,C) :- C >B,B > A,!. パターン(7,E,E,C) :- \+(E=C),E > C,!. パターン(8,E,E,C) :- \+(E=C),E < C,!. パターン(9,E,B,E) :- \+(E=B),E > B,!. パターン(10,E,B,E) :- \+(E=B),E < B,!. パターン(11,A,E,E) :- \+(E=C),E < A,!. パターン(12,A,E,E) :- \+(E=C),E > A,!. パターン(13,E,E,E). パターン判断(_パターン,A,B,C) :- _パターン < 7, パターン(_パターン,A,B,C),!. パターン判断(7,A,B,C) :- C < A,C < B,!. パターン判断(8,A,B,C) :- C > A,C > B,!. パターン判断(9,A,B,C) :- B < A,B < C,!. パターン判断(10,A,B,C) :- B > A,B > C,!. パターン判断(11,A,E,E) :- A < B,A < C,!. パターン判断(12,A,E,E) :- A > B,A > C,!. パターン判断(13,_,_,_). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/212 # # [1]C言語演習 # [2]問題文 # 次の形式のタブ区切りファイルがある。(行数は最大で1000万行とする) # 生徒ID クラス名 国語得点 数学得点 英語得点 # 生徒IDは8桁の0から9で構成される文字列 # クラス名は4桁の0から9で構成される文字列 # 国語得点、数学得点、英語得点は3桁の0から9で構成される文字列とする。 # # (1)各教科の得点の和が同じ生徒達のグループについて、そのグループが何人で何クラスの # 生徒から構成されているかを、得点和毎に表出力せよ # ただし0人で構成されるグループについては出力する必要がない。 # 形式例 # 得点:123 人数:5人 グループ数:4 # 得点:128 人数:3人 グループ数:3 # 得点:214 人数:11人 グループ数:9 # ............ # # (2)それぞれの教科の得点が所属しているクラスの各教科の平均点の大小関係と # 同じ生徒をリストアップせよ # ただしあるクラスの2つの教科の平均点が一致している場合はその2つの教科の得点の # 大小関係は不問として出力する。(3つが一致している場合はそのクラスの生徒全員 # がリストアップされることになる # [3] OSはLinux,言語はCです。(C++は不可) # [4] 4/30まで # [5] stdlib.h stdio.h string.hをincludeしても良いがそれ以外は不可だそうです # よろしくお願いします。 # # '各教科の得点の和が同じ生徒達のグループについて、そのグループが何人で何クラスの生徒から構成されているかを、得点和毎に表出力せよ'(_ファイル) :- get_split_lines(_ファイル,['\t'],LL), findall([_得点合計,_クラス名],( append(_,[[_生徒ID,_クラス名,_国語得点,_数学得点,_英語得点]|_],LL), _得点合計 is _国語得点,_数学得点,_英語得点), L1), findsetof(_得点合計,( append(_,[[_得点合計,_]|_,L1)), L2), findsetof([_得点合計,_クラス]( append(_,[[_得点合計,_クラス]|_,L1)), L3), findall([_得点合計,_グループ人数,_クラス数],( append(_,[_得点合計|_],L2), count(append(_,[[_得点合計,_]|_],L1),_グループ人数)), count(append(_,[[_得点合計,_]|_],L3),_クラス数)), _得点合計・グループ人数・クラス数集計ならび), 出力する(_得点合計・グループ人数・クラス数集計ならび). 出力する(_得点合計・グループ人数・クラス数集計ならび) :- append(_,[[_得点合計,_グループ人数,_クラス数]|R],_得点合計・グループ人数・クラス数集計ならび), write_formatted('得点:%t 人数:%t人 グループ数:%t\n',[_得点合計,_グループ人数,_クラス数]), R = [],!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/19 # # 繰り返しの処理は分かるので正規表現の書き方を教えて頂きたいです。 # よろしくお願いします。 # # ●正規表現の使用環境 # VB.NET2003 # # ●検索か置換か? # 検索 # # ●説明 # 果物の名前を検索したい # # ●対象データ # 箱の色・箱A/緑、箱B/橙、箱C/黄、箱D/赤 # 箱の中身・箱A/メロン、箱B/みかん、箱C/バナナ、箱D/りんご # 箱の大きさ・箱A/100cm、箱B/120cm、箱C/140cm、箱D/160cm # # ●希望する結果 # メロン # みかん # バナナ # りんご # 対象データ('箱の色・箱A/緑、箱B/橙、箱C/黄、箱D/赤\n箱の中身・箱A/メロン、箱B/みかん、箱C/バナナ、箱D/りんご\n箱の大きさ・箱A/100cm、箱B/120cm、箱C/140cm、箱D/160cm\n'). 果物の名前を検索したい(_希望する結果) :- 対象データ(_対象データ), split(_対象データ,['\n'],Lines), append(_,[Line|R],Lines), sub_atom(Line,0,4,_,箱の中身), sPLIT(Line,['・','、','/'],L2), append(_,['/',_希望する結果|_],L2). % 以下のサイトは # http://hibari.2ch.net/test/read.cgi/tech/1301067486/12 # ●正規表現の使用環境 # 秀丸(複数行置換) # ●検索か置換か? # 置換 # ●説明 # 上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ # 変更したいです。 # # ●対象データ # name=Relative # color=#000000 # style=0 # # ●希望する結果 # name=Relative # color=#000000 # style=2 # # ******************************************** # 下のようにnameとcolorは値が変わるので.*としているのですが、 # 置換文の置換時に変更しないという書き方が分かりません。 # 分かる方おりましたら教えて下さいませ。 # # [検索条件] # name=.* # color=.* # style=0 # # [置換文] # name= # color= # style=2 # # '上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したい'(_文字列,_変更文字列) :- \+(list(_文字列)), split(_文字列,['\n'],Liens), '上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したい'(Lines1,Lines2), concat_atom(Lines2,'\n',_変更文字列). '上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したい'(Lines1,Lines2) :- list(Lines1), append(L0,[Line1,Line2,'style=0'|R],Lines), sub_atom(Line1,0,5,_,'name='), sub_atom(Line2,0,6,_,'color='), append(L0,[Line1,Line2,'style=2'|R],Lines2), '上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したい'(R,Lines3), append(Lines2,Lines3,Lines),!. '上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したい'(_文字列,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/968 # # ●正規表現の使用環境 # Perl # # ●検索か置換か? # 置換 # # ●説明 # 重複する文字列と区切り文字を削除したい # # ●対象データ # aaa;bbb;ccc;bbb;あああ;aaa;あああ;いいい # # ●希望する結果 # aaabbbcccあああいいい # # よろしくお願いします # # 重複する文字列と区切り文字を削除したい(_文字列,_重複する文字列と区切り文字を削除した文字列) :- split(_文字列,[' ',',','/',':',';'],_区切られた要素ならび), 出現順序を崩さず重複を取り除く(_区切られた要素ならび,[],_重複を取り除いた区切られた要素ならび), concat_atom(_重複を取り除いた区切られた要素ならび,_重複する文字列と区切り文字を削除した文字列). 出現順序を崩さず重複を取り除く([],L,L) :- !. 出現順序を崩さず重複を取り除く([A|R1],L1,L) :- append(_,[A|_],L1), 出現順序を崩さず重複を取り除く(R1,L1,L),!. 出現順序を崩さず重複を取り除く([A|R1],L1,L) :- append(L1,[A],L2), 出現順序を崩さず重複を取り除く(R1,L2,L),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/968 # # ●正規表現の使用環境 # Perl # # ●検索か置換か? # 置換 # # ●説明 # 重複する文字列と区切り文字を削除したい # # ●対象データ # aaa;bbb;ccc;bbb;あああ;aaa;あああ;いいい # # ●希望する結果 # aaa;bbb;ccc;あああ;いいい # # よろしくお願いします # # 区切り文字を除く重複する文字列と区切り文字を削除したい(_文字列,_区切り文字,_重複する文字列と区切り文字を削除した文字列) :- split(_文字列,[_区切り文字],_区切られた要素ならび), 出現順序を崩さず重複を取り除く(_区切られた要素ならび,[],_重複を取り除いた区切られた要素ならび), concat_atom(_重複を取り除いた区切られた要素ならび,_区切り文字,_重複する文字列と区切り文字を削除した文字列). 出現順序を崩さず重複を取り除く([],L,L) :- !. 出現順序を崩さず重複を取り除く([A|R1],L1,L) :- append(_,[A|_],L1), 出現順序を崩さず重複を取り除く(R1,L1,L),!. 出現順序を崩さず重複を取り除く([A|R1],L1,L) :- append(L1,[A],L2), 出現順序を崩さず重複を取り除く(R1,L2,L),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/932 # # お知恵をお貸しください…!どうかお詳しい方よろしくお願いいたしますm(__)m # # ●正規表現の使用環境 # VBScript # # ●検索か置換か? # 検索 # # ●説明 # メールアドレスをチェックしたい # 1.メールは1つか、複数 # 2.複数メールはカンマで区切られる # 3.カンマの直後にスペースが入るかも # 4.メールの@以降は固定(間違って変な宛先に送らないため) # 5.@より前はてきとう # # つづく # # # メールアドレス検索(_文字列,_メールアドレス) :- split(_文字列,[',',' ','\n'],L), append(_,[_メールアドレス|R],L), sub_atom(_メールアドレス,_,_,_,S1,S2,S3,L1,['@'|R2],L3), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/610 # # [1] 授業単元: プログラミング # [2] 問題文 サッカーの試合結果の記録されたデータファイルを読み取り、 # 優勝したチーム名を出力するプログラムを作成せよ。 # データファイルには、先頭の行にチーム数が出力されており、 # 2行目からチーム名(チーム数分)、 # それ以降の行に試合結果が出力されている。 # 試合結果の行は以下のフォーマットとなっている。 # <ホーム側のチーム名> <ホーム側チームの得点> # <アウェイ側チームの得点> <アウェイ側チーム名> # チーム名は30文字以内とする。 # 試合に勝ったチームには勝ち点3が与えられ、引き分けたチームには # 勝ち点1が与えられる。勝ち点の合計が最も多いチームが優勝となるが、 # 勝ち点の合計が同じチームが複数ある場合には、それらのうち、 # 得失点差(得点と失点の差)の合計が大きいチームが優勝となる。 # 得失点差の合計が同じ場合にはどちらを優勝としてもよい。 # 4 # MANCHESTER_UNITED # ARSENAL # CHELSEA # LIVERPOOL # MANCHESTER_UNITED 3 1 ARSENAL # CHELSEA 3 0 LIVERPOOL # ARSENAL 2 2 CHELSEA # LIVERPOOL 3 0 MANCHESTER_UNITED # ------------------------------------ # 優勝したチーム名を出力するプログラムを作成する(_データファイル) :- get_lines(_データファイル,Lines), データファイルには先頭の行にチーム数が出力されており、(Lines,_チーム数,_2行目以降ならび), '2行目からチーム名(チーム数分)'(_2行目以降ならび,_チーム数,_チーム名ならび,_試合結果ならび), 優勝したチーム名を(_チーム名ならび,_試合結果ならび,_優勝したチーム), 出力する(_優勝したチーム名). データファイルには先頭の行にチーム数が出力されており、(Lines,_チーム数,_2行目以降ならび) :- Lines = [_チーム数文字列|_2行目以降ならび], atom_to_term(_チーム数文字列,_チーム数,_),!. '2行目からチーム名(チーム数分)'(_2行目以降ならび,_チーム数,_チーム名ならび,_試合結果ならび) :- length(_チーム名ならび,_チーム数), append(_チーム名ならび,_試合結果ならび,_2行目以降ならび),!. 優勝したチーム名を(_チーム名ならび,_試合結果ならび,_優勝したチーム名) :- findall([_チーム名,_勝,_敗,_分,_勝ち点,_得点,_失点,_得失点差],( append(_,[_チーム名|_],_チーム名ならび), all([_勝,_敗,_分,_勝ち点,_得点,_失点,_得失点差],0)), _チーム成績ならび), 試合結果をチーム成績ならびに反映させる(_試合結果ならび,_チーム成績ならび,_最終チーム成績ならび), 優勝したチームを判定する(_最終チーム成績ならび,_優勝したチーム名). 試合結果をチーム成績ならびに反映させる([],_最終チーム成績ならび,_最終チーム成績ならび) :- !. 試合結果をチーム成績ならびに反映させる([_試合結果行|R],_チーム成績ならび1,_最終チーム成績ならび) :- split(_試合結果行,[' '],[_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名]), 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,_ホーム側の勝数の加算値,_アウェイ側の勝数の加算値,_ホーム側の敗数の加算値,_アウェイ側の敗数の加算値,_ホーム側の引き分け数の加算値,_アウェイ側の引き分け数の加算値,_ホーム側の勝ち点の加算値,_アウェイ側の勝ち数の加算値), チーム成績の更新(_ホーム側のチーム名,_ホーム側の得点,_ホーム側の勝数の加算値,_ホーム側の敗数の加算値,_ホーム側の引き分け数の加算値,_ホーム側の勝ち点の加算値,_チーム成績ならび1,_チーム成績ならび2), チーム成績の更新(_アウェイ側のチーム名,_アウェイ側の得点,_アウェイ側の勝数の加算値,_アウェイ側の敗数の加算値,_アウェイ側の引き分け数の加算値,_アウェイ側の勝ち点の加算値,_チーム成績ならび2,_チーム成績ならび3), 試合結果をチーム成績ならびに反映させる(R,_チーム成績ならび3,_最終チーム成績ならび). 優勝したチームを判定する(_最終チーム成績ならび,_優勝したチーム名) :- findmax([_勝ち点,_得失点差],( append(_,[[_チーム名,_勝,_敗,_分,_勝ち点,_得点,_失点,_得失点差]|_],_最終チーム成績ならび)), [_勝ち点,_得失点差]), append(_,[[_優勝したチーム名,_,_,_,_勝ち点,_,_,_得失点差]|_],_最終チーム成績ならび). 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,1,0,0,1,0,0,3,0) :- _ホーム側の得点 > _アウェイ側の得点,!. 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,0,1,1,0,0,0,0,3) :- _ホーム側の得点 < _アウェイ側の得点,!. 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,0,0,0,0,1,1,1,1) :- _ホーム側の得点 = _アウェイ側の得点,!. 出力する(_優勝したチーム名) :- write_formatted('優勝したチームは %t です\n',[_優勝したチーム名]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/564 # # http://ime.nu/codepad.org/jP4CQKdZ # リストの生成、検索、削除が出来るようにしてもらえないでしょうか? # # リストの生成(end,[]) :- !. リストの生成(gen,L) :- write('name,tel : '), get_line(Line), リストの生成(Line,L),!. リストの生成(Line,[[_name,_tel]|R]) :- split(Line,[','],[_name,_tel]), get_line(Line), リストの生成(Line2,R). リストから削除(L1,L2) :- write('削除キー : '), get_line(_削除キー), write('削除キー値 : '), get_line(_削除キー値), リスト構造(_削除キー,_削除値,_削除要素), リストから削除(_削除要素,L1,L2). リストから削除(_,[],[]) :- !. リストから削除(_削除要素,[_削除要素|R1],L2) :- リストから削除(_削除要素,R1,L2),!. リストから削除(_削除要素,[A|R1],[A|R2]) :- リストから削除(_削除要素,R1,R2). リスト構造(name,_name,[_name,_]). リスト構造(tel,_tel,[_,_tel]). リスト表示(L) :- findall('%t',リスト構造(_,_),L1), concat_atom(L1,',',_パターン), リスト表示(_パターン,L). リスト表示(_パターン,[L|R]) :- write_formatted('%t\n',L), リスト表示(_パターン,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/833 # # ●正規表現の使用環境 # C # # ●説明 # Apacheのログから一部分を抜き出して検索したい # # ●対象データ # host.ne.jp - - [11/May/2011:12:22:15 +0900] "GET /~akasata/index.xml?gat=tPFnlVCP8aUYq8jjPqA=&BSdebug=AV/w3.3r1.1/ HTTP/1.1" # 200 6703 "https://server.ne.jp/" "Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14" # (以上1行) # ●希望する結果 # 1件目 # host.ne.jp # 2件目 # /~akasata/index.xml # # 以上のような検索を実装しようとして、 # regerror(regcomp(&preg, "(.+) - [^[] \\[.+\\] \"[^\" ]+ ((/~akasata/[^\"]+)\\?g.+)*([^\"]+) [^\" ]+\".+", REG_EXTENDED|REG_NEWLINE), &preg, errbuf, sizeof(errbuf)); # 以下のような正規表現を用いた(Cのエスケープが混じっているため見辛ければすいません)のですが、 # 後ほど検索対象を調べて一部不要な部分があったため # regerror(regcomp(&preg, "(.+) - [^[] \\[.+\\] \"[^\" ]+ ((/~akasata/[^\"]+)\\?g.+) [^\" ]+\".+", REG_EXTENDED|REG_NEWLINE), &preg, errbuf, sizeof(errbuf)); # 以下のように正規表現を変更したところ、同じ結果を返すのにもかかわらず # 実行速度が4倍以上もかかるようになってしまいました。原因かわかる方教えていただけないでしょうか? # # 'Apacheのログから一部分を抜き出して検索したい'(ApacheLog,X) :- get_split_lines(ApacheLog,[' ','"','?'],LL), append(_,[L|R],LL), 選択(L,X). 選択(L,X) :- append(_,['GET',X|_],L). 選択(L,X) :- append(_,[X|_],L), sub_atom(X,0,4,_,http). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/349 # # [1] 授業単元: データの保存と表示 # [2] 問題文: http://ime.nu/codepad.org/2F3xiVeR # ↑で読み込むファイルに整数がいくつか表示されているので、それらの合計値とデータの中の1の個数を求める処理を追加する # '読み込むファイルに整数がいくつか表示されているので、それらの合計値とデータの中の1の個数を求める'(_ファイル,_合計値,_1の個数) :- get_chars(_ファイル,Chars), concat_atom(Chars,S), split(S,[' ','\n','\t'],L), sum(L,_合計値), count(append(_,[1|_],L),_1の個数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/337 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):次の書きこみにまとめます。 # # 地図データmap.dat に対して、出発点の交差点番号をキーボードから入力すると、 # A. 隣接する交差点名と交差点番号および出発点からの距離をディスプレイに表示 # する # B. 表示された交差点の中から次に進む交差点を選択できる # C. 選択された交差点に対して、A. の手順に戻り、順々に道案内する # プログラムを作成しなさい。手順A の距離は、出発点からの直線距離ではなく、 # 経路の累計移動距離を計算すること。また、プログラムを途中で終了させるコマ # ンドも用意すること。 # # # という問題について次のようなソースを書いたのですが、これでは経路の累計移動距離が計算されないため、不十分だと言われました。 # http://ime.nu/codepad.org/1hcQfHlM # 地図データはこちらに上げてあります # http://ime.nu/www1.axfc.net/uploader/Sc/so/202935.dat # どこをどう直せばいいのか、どなたかお願いします # # 1, 0.0, 0.0, A, 2, 2, 4 # 2, -0.6, 0.15, B, 3, 1, 3, 11 # 3, -0.83, 0.0, C, 4, 2, 4, 9, 10 # 4, -0.6, -0.38, D, 3, 1, 3, 5 # 5, -0.38, -0.68, E, 3, 4, 6, 7 # 6, 6.0, -0.3, F, 1, 5 # 7, -0.18, -1.02, G, 2, 5, 8 # 8,-0.84, -1.58, H, 3, 7, 9, 18 # 9, -0.9, -0.98, I, 2, 3, 8 # 10, -0.98, 0.15, J, 3, 3, 11, 13 # 11, -0.78, 0.3, K, 3, 2, 10, 12 # 12, -1.28, 0.68, L, 2, 11, 13 # 13, -1.32, 0.53, M, 4, 10, 12, 14, 15 # 14, -1.8, 0.98, N, 2, 13, 20 # 15, -1.43, -0.15, O, 2, 13, 16 # 16, -1.73, -0.26, P,3, 15, 17, 20 # 17, -1.8, -1.43, Q, 3, 16, 18, 19 # 18, -1.2, -1.73, R, 2, 8, 17 # 19, -2.48, -1.2, S, 2, 17, 20 # 20, -2.33, -0.51, T, 3, 14, 16, 19 交差点を進む(_出発交差点,_移動記録,_移動累積距離) :- 地図データを読み込む(_地図データ), 地図データの登録(_地図データ), 交差点を進む(_出発交差点,0.0,[],_移動記録,_移動累積距離). 交差点を進む(_交差点,_移動記録1,_移動累積距離1,_移動記録,_移動累積距離) :- 隣接交差点を表示する(_交差点), write_formatted('ここまでの移動累積距離は%tです\n',[_移動累積距離1]), write('どの交差点に進みますか ? '), get_line(_隣接交差点), 隣接交差点との距離(_交差点,_隣接交差点,_距離), _移動累積距離2 is _距離 + _移動累積距離1, 交差点を進む(_交差点,[_隣接交差点|_移動記録1],_移動累積距離2,_移動記録,_移動累積距離). 交差点を進む(_交差点,_移動記録,_移動累積距離,_移動記録,_移動累積距離) :- write_formatted('交差点%tは存在しません\nここまでの移動累積距離は%tでした\nプログラムを終了します\n',[_交差点,_累積移動距離]). 隣接交差点を表示する(_交差点) :- findall(_隣接交差点,隣接交差点(_交差点,_隣接交差点),_隣接交差点ならび), \+(_隣接交差点ならび=[]), concat_atom(_隣接交差点ならび,',',_隣接交差点表示), write_formatted('隣接交差点は %t があります\n',[_隣接交差点表示]). 隣接交差点との距離(_交差点,_隣接交差点,_距離) :- 交差点位置(_交差点,X1,Y1), 隣接交差点(_交差点,X2,Y2), _距離 is sqrt((X2 - X1) ^2 + (Y2 - Y1) ^ 2). 地図データを読み込む(_地図データ) :- get_split_lines('map.dat',[','],LL). 地図データの登録(_地図データ) :- 交差点位置の登録(_地図データ), 隣接交差点の登録(_地図データ). 交差点位置の登録(_地図データ) :- abolish(交差点位置/3), append(_,[[_,X,Y,_交差点|_]|R],_交差点データ), assertz(交差点位置(_交差点,X,Y)), R = []. 隣接交差点の登録(_地図データ) :- abolish(隣接交差点/2), append(_,[[_交差点ID,_,_,_交差点|_隣接交差点ならび]|R],_地図データ), 隣接交差点を得る(_地図データ,_隣接交差点IDならび,_隣接交差点), assertz(隣接交差点(_交差点,_隣接交差点)), R = []. 隣接交差点を得る(_地図データ,[_隣接交差点ID|R],_隣接交差点) :- list_nth(_隣接交差点ID,_地図データ,[_,_,_,_隣接交差点|_]). 隣接交差点を得る(_地図データ,[_|R],_隣接交差点) :- 隣接交差点を得る(_地図データ,R,_隣接交差点). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/819 # # 正規表現の使用環境は秀丸です。 # やりたいことは置換で、VBのソースを編集したいのが目的です。 # # 例: # ・Before # Dim s1, s2, s3 As String # # ・After # Dim s1 As String, s2 As String, s3 As String # # 上記のように、1行で複数の変数宣言を行っている箇所で # 型の宣言を省略している箇所を、最後の型宣言で補いたいのですが # どのように指定してやればよいでしょうか? # # '型の宣言を省略している箇所を、最後の型宣言で補う'(_文字列,_補正された文字列) :- 's1, s2, S3 の認識'(_文字列,_型宣言部分,_変数部分ならび,_型部分), findall(W,( append(_,[_変数|_],_変数部分ならび), concat_atom([_変数,_型部分],W)), L2), concat_atom(L2,',',S5), concat_atom(_型宣言部分,S5,_補正された文字列). 's1, s2, S3 の認識'(_文字列,_型宣言部分,_変数部分ならび,_型部分) :- split(_文字列,[','],[_第一要素|R1]), sPLIT(_第一要素,[' '],L1), append(L0,[A],L1), concat_atom(L0,_型宣言部分), append(L2,[U],R1), sPLIT(U,[' '],L3), '最後の変数と型部分に分離する'(L3,Z,_型部分), append([A],L2,[Z],_変数部分ならび),!. '最後の変数と型部分に分離する'(L,S,_型部分) :- append(L0,[_最後の変数|R],L), \+(A = ' '), all(L0,' '), concat_atom(R,_型部分),!. '最後の変数と型部分に分離する'([_最後の変数|R],_最後の変数,_型部分) :- concat_atom(R,_型部分),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/271 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):バブルソート法を使って、map.datに対して交差点名(アルファベット)を # 入力すると、その交差点から直線距離が近い順に、隣接交差点名とその距離の二乗をディスプレイに表示する # プログラムを書きなさい。 # 1 0.0 0.0 H 2 2 4 0 0 # 2 -0.6 0.15 D 3 1 3 11 0 # 3 -0.83 0.0 K 4 2 4 9 10 # 4 -0.6 -0.38 O 3 1 3 5 0 # 5 -0.38 -0.68 M 3 4 6 7 0 # 6 6.0 -0.3 T 1 5 0 0 0 # 7 -0.18 -1.02 U 2 5 8 0 0 # 8 -0.84 -1.58 N 3 7 9 18 0 # 9 -0.9 -0.98 V 2 3 8 0 0 # 10 -0.98 0.51 R 3 3 11 13 0 # 11 -0.78 0.3 P 3 2 10 12 0 # 12 -1.28 0.68 E 2 11 13 0 0 # 13 -1.32 0.53 I 4 10 12 14 15 # 14 -1.8 0.98 C 2 13 20 0 0 # 15 -1.43 -0.15 J 2 13 16 0 0 # 16 -1.73 -0.26 P 3 15 17 0 0 # 17 -1.8 -1.43 W 3 16 18 19 0 # 18 -1.2 -1.73 S 2 8 17 0 0 # 19 -2.48 -1.2 Z 2 17 20 0 0 # 20 -2.33 -0.51 B 3 14 16 19 0 # 'バブルソート法を使って、map.datに対して交差点名(アルファベット)を入力すると、その交差点から直線距離が近い順に、隣接交差点名とその距離の二乗をディスプレイに表示する' :- get_split_lines('map.dat',[','],LL), 交差点名の入力(_交差点名), append(_,[[N,X,Y,_交差点名,_,_,_,_,_]|_],LL), その交差点から直線距離が近い順に隣接交差点名とその距離の二乗を(_整列した直線距離の二乗ならび・交差点名ならび), 表示する(_整列した直線距離の二乗ならび・交差点名ならび). 交差点名の入力(_交差点名) :- write('交差点名を入力してください : '), get_line(_交差点名),!. その交差点から直線距離が近い順に隣接交差点名とその距離の二乗を(LL,_整列した直線距離の二乗ならび・交差点名ならび) :- findall([_直線距離の二乗,_交差点名1],( append(_,[[N1,X1,Y1,_交差点名1,_隣接点1,_隣接点2,_隣接点3,_隣接点4,_隣接点5]|_],LL), \+(_交差点名=_交差点名), 交差点はNと隣接している(N,_隣接点1,_隣接点2,_隣接点3,_隣接点4,_隣接点5), _直線距離の二乗 is (X1-X) ^ 2 + (Y1-Y) ^ 2), _直線距離の二乗ならび・交差点名ならび), バブルソート(_直線距離の二乗ならび・交差点名ならび,_整列した直線距離の二乗ならび・交差点名ならび),!. 交差点はNと隣接している(N,N,_,_,_,_) :- !. 交差点はNと隣接している(N,_,N,_,_,_) :- !. 交差点はNと隣接している(N,_,_,N,_,_) :- !. 交差点はNと隣接している(N,_,_,_,N,_) :- !. 交差点はNと隣接している(N,_,_,_,_,N) :- !. バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一),!, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). 表示する(_整列した直線距離の二乗ならび・交差点名ならび) :- append(_,[[_直線距離の二乗,]|R],_整列した直線距離の二乗ならび・交差点名ならび), write_formatted('%t,%t\n',[_隣接交差点名,_直線距離の二乗]), R = [],!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/122 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1311028.txt.html # # Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 # 県と県の間を半角開ける # # 1.北海道 2.青森県・・・47.沖縄県を表示 # 一行につき6県 # # (例) # _1.北海道____2.鹿児島県__3. # # ↑ # 桁が上がったとき用 # # # 43.□□□___44.□□ # # # 次に47都道府県のうち出発地と目的地の入力を要求する. # # 「出発の県を入力してください」 # 「目的の県を入力してください」 # # # # # 次に結果を表示. # # ・距離と経路を出力 # # 経路 # □□□□→□□□□→・・・→□□□□ # # -10byte-- # # 経路は7県まで # # # # とする # # # # map.datの中身は↓です # # 北海道,青森県,岩手県,宮城県,秋田県,山形県,福島県,茨城県,栃木県,群馬県,埼玉県,千葉県,東京都,神奈川県,新潟県,富山県,石川県,福井県,山梨県,長野県,岐阜県,静岡県,愛知県,三重県,滋賀県,京都府,大阪府,兵庫県,奈良県,和歌山県,鳥取県,島根県,岡山県,広島県,山口県,徳島県,香川県,愛媛県,高知県,福岡県,佐賀県,長崎県,熊本県,大分県,宮崎県,鹿児島県,沖縄県 # # 北海道,0,426,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 青森県,426,0,187,-1,190,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岩手県,-1,187,0,193,108,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 宮城県,-1,-1,193,0,258,72,84,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 秋田県,-1,190,108,258,0,212,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山形県,-1,-1,-1,72,212,0,102,-1,-1,-1,-1,-1,-1,-1,169,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 福島県,-1,-1,-1,84,-1,102,0,203,172,275,-1,-1,-1,-1,189,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 茨城県,-1,-1,-1,-1,-1,-1,203,0,76,-1,-1,116,128,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 栃木県,-1,-1,-1,-1,-1,-1,172,76,0,109,100,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 群馬県,-1,-1,-1,-1,-1,275,-1,109,0,103,-1,-1,-1,220,-1,-1,-1,-1,151,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 埼玉県,-1,-1,-1,-1,-1,-1,116,100,103,0,69,24,-1,-1,-1,-1,-1,157,215,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 千葉県,-1,-1,-1,-1,-1,-1,128,-1,-1,69,0,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 東京都,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,50,0,37,-1,-1,-1,-1,133,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 神奈川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,37,0,-1,-1,-1,-1,134,-1,-1,240,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 新潟県,-1,-1,-1,-1,169,189,-1,-1,220,-1,-1,-1,-1,0,250,-1,-1,-1,208,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 富山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,250,0,61,-1,-1,196,294,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 石川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,61,0,83,-1,-1,235,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 福井県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,83,0,-1,-1,160,-1,-1,-1,176,188,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山梨県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,164,-1,126,134,-1,-1,-1,-1,0,162,-1,109,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 長野県,-1,-1,-1,-1,-1,-1,-1,-1,-1,151,220,-1,-1,-1,208,196,-1,-1,162,0,295,271,272,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岐阜県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,294,235,160,-1,295,0,-1,43,113,128,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 静岡県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,167,-1,-1,-1,-1,109,271,-1,0,181,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 愛知県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,272,43,181,0,82,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 三重県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,-1,82,0,95,107,-1,-1,91,91,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 滋賀県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,176,-1,-1,128,-1,-1,95,0,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 京都府,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,188,-1,-1,-1,-1,-1,107,14,0,49,75,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 大阪府,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,49,0,45,33,80,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 兵庫県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,75,45,0,-1,-1,180,-1,139,-1,-1,115,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 奈良県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,-1,48,33,-1,0,98,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 和歌山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,-1,-1,-1,-1,98,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 鳥取県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,180,-1,-1,0,128,167,296,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # 島根県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,80,-1,128,0,-1,212,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岡山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,139,-1,-1,167,-1,0,165,-1,-1,70,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 広島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,296,212,165,0,131,-1,-1,190,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山口県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,131,0,250,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 徳島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,-1,-1,-1,-1,-1,-1,250,0,73,191,161,-1,-1,-1,-1,-1,-1,-1,-1 # # 香川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,-1,-1,73,0,156,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 愛媛県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,190,-1,191,156,0,156,-1,-1,-1,-1,-1,-1,-1,-1 # # 高知県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,161,-1,156,0,-1,-1,-1,-1,-1,-1,-1,-1 # # 福岡県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,165,-1,-1,-1,-1,0,61,-1,117,159,-1,-1,-1 # # 佐賀県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,61,0,109,-1,-1,-1,-1,-1 # # 長崎県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,109,0,-1,-1,-1,-1,-1 # # 熊本県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,117,-1,-1,0,218,192,187,-1 # # 大分県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,159,-1,-1,218,0,181,-1,-1 # # 宮崎県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,192,181,0,158,-1 # # 鹿児島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,187,-1,158,0,733 # # 沖縄県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,733,0 # '47都道府県のうち出発地と目的地の入力して最短経路を求めて距離と順路を表示する(ただし経路は7以下とする)' :- 'Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 県と県の間を半角 開ける'(_都道府県名ならび), '47都道府県のうち出発地と目的地の入力する'(_都道府県名ならび,_出発地,_目的地), 最短経路(_出発地,_目的地,_距離,_順路), 距離と経路の表示(_出発地,_目的地,_距離,_順路). '47都道府県のうち出発地と目的地の入力する'(_都道府県名ならび,_出発地,_目的地) :- 出発地を入力する(_都道府県名ならび,_出発地), 目的地を入力する(_都道府県名ならび,_目的地). 出発地を入力する(_都道府県名ならび,_出発地) :- write('出発地の都道府県名番号を入力してください : '), get_line(Line), 出発地を入力診断(Line,_都道府県名ならび,_出発地),!. 出発地を入力する(_都道府県名ならび,_出発地) :- 出発地を入力する(_都道府県名ならび,_出発地). 出発地を入力診断(Line,_都道府県名ならび,_出発地) :- atom_to_term(Line,_出発地番号,_), integer(_出発地番号), _出発地番号 > 1, _出発地番号 =< 47, list_nth(_出発地番号,_都道府県名ならび,_出発地),!. 出発地を入力診断(Line,_都道府県名ならび,_出発地) :- write_formatted('入力された %t から適切な出発地を得ることができません。再入力をお願いします。\n',[Line]), fail. 目的地を入力する(_都道府県名ならび,_目的地) :- write('目的地の都道府県名番号を入力してください : '), get_line(Line), 目的地を入力診断(Line,_都道府県名ならび,_目的地), 目的地を入力する(_都道府県名ならび,_目的地) :- 目的地を入力する(_都道府県名ならび,_目的地). 目的地を入力診断(Line,_都道府県名ならび,_目的地) :- atom_to_term(Line,_目的地番号,_), integer(_目的地番号), _目的地番号 > 1, _目的地番号 =< 47,!. 目的地を入力診断(Line,_,_目的地) :- write_formatted('入力された %t から適切な目的地を得ることができません。再入力をお願いします。\n',[Line]), fail. 距離と経路の表示(_出発地,_目的地,_距離,_順路) :- write_formatted('距離は %t,経路は %t',[_距離,_出発地]), append(_,[[A,B]|R],_順路), write_formatted(' -> %t ',[B]), R = [], write('\n'),!. 'Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 県と県の間を半角 開ける'(_都道府県名ならび) :- get_split_lines('Map.dat',[','],LL), 第要素は都道府県名、残りは経路情報(LL,_都道府県名ならび,_経路情報ならび), append(L0,[[_県名|_隣接情報ならび]|R2],_経路情報ならび), 隣接情報の登録(_県名,_都道府県名ならび,_隣接情報ならび), length([_|L0],_都道府県番号), write('%2d.%t ',[_都道府県番号,_県名]), R2 = [], write('\n'). 第一要素は都道府県名、残りは経路情報(LL,_都道府県名ならび,_経路情報ならび) :- LL = [_都道府県名ならび|_経路情報ならび],!. 隣接情報の登録(_都道府県名,_都道府県名ならび,L1) :- abolish(隣接県距離/3), append(L0,[_距離|R],L1), \+(_距離 = (-1)), \+(_距離 = 0), length([_|L0],Nth), list_nth(Nth,_都道府県名ならび,_都道府県名2), assertz(隣接県距離(_都道府県名,_件名2,_距離)), fail. 隣接情報の登録(_,_,_). 最短経路(_出発地,_目的地,_距離,_順路) :- findall([_順路,_距離],( 到達(_出発地,_目的地,_距離,[],_順路)), _順路・距離ならび), findmin(_距離,append(_,[[_,_距離]|_],_順路・距離ならび),_最短距離), append(_,[[_順路,_最短距離]|_],_順路距離ならび). 到達(_都道府県名1,_都道府県名2,_距離,_順路1,_順路) :- 隣接県距離(_都道府県名1,_都道府県名2,_距離), append(_順路1,[[_都道府県名1,_都道府県名2]],_順路),!. 到達(_都道府県名1,_都道府県名2,_距離,_順路1,_順路) :- length(_順路1,_経路数), _経路数 < 7, 隣接県距離(_都道府県名1,_都道府県名3,_距離1), この経路は選択されたことがない(_都道府県名1,_都道府県名2), append(_順路1,[[_都道府県名1,_都道府県名3]],_順路2), 到達(_都道府県名1,_都道府県名2,_距離2,_順路2,_順路), _距離 is _距離1 + _距離2. この経路は選択されたことがない(_都道府県名1,_都道府県名2) :- \+(append(_,[[_都道府県名1,_都道府県名3]|_],_順路1)), \+(append(_,[[_都道府県名3,_都道府県名1]|_],_順路1)),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/11 # # [1] 授業単元:C言語の基礎 # [2] 問題文 #  「複数の異なるデータ型を持つ情報に対して、情報の回覧と追加ができ、 #  ファイルの読込とができるプログラムを作成しなさい。 #  たとえば名簿のような物で、氏名、電話番号、住所、整理番号などを #  読込、書込、保存をする。可能なら、検索もできるようにすると良い。 #  複数のデータを扱うために、構造体を持つ配列を使うこと。 #  また、メンバ数は6個以上の情報を扱うこと。 #  ファイル形式は、CSV形式で、1つの情報の関連データ(メンバ)はカンマで区切り、 #  別の情報データ(行)は改行で区別しなさい。ファイル名の拡張子はcsv。 #  データファイルはプログラム起動時にコマンドラインから入力できること。 #  また、そうではないことにも対応すること。」 # リーディング情報の読み込み(_データファイル,LL) :- get_split_lines(_データファイル,[','],LL), append(_,[L|R],LL), P =.. [リーディング情報|L], assertz(P), R = [],!. リーデング情報の保存(_データファイル) :- open(_データファイル,write,Outstream), リーデング情報の書き込み(Outstream), close(Outstream). リーデング情報の書き込み(Outstream) :- リーデング情報(_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数), concat_atom([_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数],',',S), write_formatted(Output,'%t\n',[S]), fail. リーデング情報の書き込み(Outstream). 情報の回覧(LL) :- write('順位,種牡馬名,毛色,産地,出走頭数,勝馬頭数,出走回数,勝利回数,賞金,1出走賞金,1頭平均賞金,勝馬率,アーニング・インデックス\n'), リーデング情報(_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数), _1出走賞金 is truncate(_賞金 / _出走回数), _1頭平均賞金 is truncate(_賞金 / _出走頭数) _勝馬率 is _勝馬頭数 / _出走頭数, アーニング・インデックスの算出(_種牡馬名,_アーニング・インデックス), write_formatted('%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t\n',[_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_1出走賞金,1頭,_平均賞金,_勝馬率,_アーニング・インデックス]), fail. 情報の回覧(LL). リーディング情報の追加 :- write('指示に従い各項目を入力してください\n'), リーディング情報項目(_項目,_項目のタイプ), リーディング情報項目の入力(_項目,_項目のタイプ,_項目値ならび), P =.. [リーデング情報|_項目値ならび], assertz(P),!. リーディング情報項目の入力(_項目,_項目のタイプ,_項目値ならび) :- findall(_項目値,( リーディング情報項目(_項目,_項目のタイプ), 項目の入力(_項目,_項目のタイプ,_項目値)), _項目値ならび). 項目の入力(_項目,文字列,_項目値) :- write_formatted('%t (文字列) を入力してください : ',[_項目]), get_line(_項目値),!. 項目の入力(_項目,整数,_項目値) :- write_formatted('%t (整数)を入力してください : ',[_項目]), get_line(Line), 項目の入力診断(_項目,整数,Line,_項目値),!. 項目の入力(_項目,整数,_項目値) :- 項目の入力(_項目,整数,_項目値). 項目の入力診断(_項目,整数,Line,_項目値) :- atom_to_term(Line,_項目値,_), integer(_項目値),!. 項目の入力診断(_項目,整数,Line,_項目値) :- write_formatted('入力された%tからは%tにふさわしい整数を得られませんでした。再入力をお願いします。\n',[Line,_項目]), fail. % 産駒の総収得賞金/2,産駒の出走頭数/2,全出走馬収得賞金/1,総出走頭数/1 は未定義である。 % これらの述語をデータベースと定義した上で、アーニング・インデックスを算出する。 アーニング・インデックスの算出(_種牡馬名,_アーニングインデックス) :- 産駒の総収得賞金(_種牡馬名,_産駒の総収得賞金), 産駒の出走頭数(_種牡馬名,産駒の出走頭数), 全出走馬収得賞金(_全出走馬収得賞金), 総出走頭数(_総出走頭数), _アーニング・インデックス is ( _産駒の総収得賞金 / _産駒の出走頭数 ) / ( _全出走馬収得賞金 / _総出走頭数),!. リーディング情報項目(順位,整数). リーディング情報項目(種牡馬名,文字列). リーディング情報項目(毛色,文字列). リーディング情報項目(産地,文字列). リーディング情報項目(出走頭数,整数). リーディング情報項目(勝馬頭数,整数). リーディング情報項目(出走回数,整数). リーディング情報項目(勝利回数,整数). リーディング情報項目(賞金,整数). /* リーディング情報項目(1出走賞金,整数). リーディング情報項目(1頭平均賞金,整数). リーディング情報項目(勝馬率,浮動小数点数).). リーディング情報項目(アーニング・インデックス,浮動小数点数). */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/892 # # 【質問テンプレ】 # [1] 授業単元:C言語初級講座 # [2] 問題文(含コード&リンク): # http://ime.nu/www.dotup.org/uploda/www.dotup.org1384986.txt # # テキストファイル名"a.txt"から以下の表を作成せよ。 # xやxxxの所は計算結果を表示させ、 # テキストファイル名"b.txt"に計算結果を追加して # 保存せよ。 # # # 【テキストファイル内容】 # 商品名,アイスクリーム # 2010,2011 # 4,5,6,7,8,9,10,11,12,1,2,3 # 仕入数,3,3,13,22,30,15,11,5,5,3,5,5,仕入総数 # 販売個数,1,2,12,20,30,15,8,4,2,3,3,2,販売総数 # 在庫数,在庫総数 # # # 【表示結果】 # 商品名 アイスクリーム # 年度 2010年 2011年 # 月 4 5 6 7 8 9 10 11 12 1 2 3 # --------------------------------------------------------- # 仕入数 3 3 13 22 30 15 11 5 5 3 5 5 仕入総数 xxx # 販売個数 1 2 12 20 30 15 8 4 2 3 3 2 販売総数 xxx # --------------------------------------------------------- # 在庫数 x x x x x x x x x x x x 在庫総数 xxx 計算後の表イメージ(1,商品名,L,L,[]). 計算後の表イメージ(2,年度,_年度ならび,_年度ならび,[]). 計算後の表イメージ(3,月ならび,_月ならび,_月ならび,[]). 計算後の表イメージ(4,仕入数ならび,L,_仕入数ならび,R) :- append([仕入数],_仕入数ならび,[仕入総数|R],L). 計算後の表イメージ(5,販売個数ならび,L,_販売個数ならび,R) :- append([販売個数],_販売個数ならび,[販売総数|R],L). 計算後の表イメージ(6,在庫個数ならび,L,_在庫個数ならび,R) :- append([在庫個数],_在庫個数ならび,[在庫総数|R],L). 'テキストファイル名"a.txt"から以下の表を作成せよ。xやxxxの所は計算結果を表示させ、テキストファイル名"b.txt"に計算結果を追加して保存せよ。' :- get_split_lines('a.txt',[','],LL), 計算結果(LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数), 計算結果を表示する(LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数), 'テキストファイル名"b.txt"に計算結果を追加して保存する'(LL). 計算結果を表示する(LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数) :- 計算結果(LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数), 表示する(LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数),!. 計算結果(LL1,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数) :- 計算対象部分の抽出(LL1,LL2), 仕入総数・販売総数の計算(LL2,_仕入総数,_販売総数), 在庫個数の計算(LL2,_在庫個数ならび), 在庫総数(_在庫個数ならび,_在庫総数). 仕入総数・販売総数の計算([_仕入数ならび,_販売個数ならび],_仕入総数,_販売総数) :- 加算(_仕入数ならび,S1), _仕入総数 is trancate(S1), 加算(_販売個数ならび,S2), _販売総数 is trancate(S2),!. 在庫個数の計算(LL,_在庫個数ならび) :- 転置(LL,LL2), findall(_在庫個数,( append(_,[[_仕入個数,_販売個数]|_],LL2), _在庫個数 is _仕入個数 - _販売個数, _在庫個数 is truncate(S1)), _在庫個数ならび). 在庫総数(_在庫個数ならび,_在庫総数) :- 加算(_在庫個数ならび,S1), _在庫総数 is truncate(S1). 計算対象部分の抽出(LL1,[_仕入数ならび,_販売個数ならび]) :- append(_,[L1|_],LL1), 計算後の表イメージ(_,仕入数ならび,L1,_仕入数ならび), 計算後の表イメージ(_,販売個数ならび,L1,_販売個数ならび),!. 表示する(LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数) :- append(L0,[L|R],LL), length([_|L0],_行), 行ごとに表示(_行,L,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数), R = [],!. 行ごとに表示(1,L,_,_,_,_) :- write_formatted('%12s%12s\n',L),!. 行ごとに表示(2,L,_,_,_,_) :- write_formatted('%12s%30s%30s\n',L),!. 行ごとに表示(3,L,_,_,_,_) :- write_formatted('%10s%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%10s%3d\n',L), write('---------------------------------------------------------\n'),!. 行ごとに表示(4,L,_仕入総数,_,_,_) :- 計算後の表イメージ(4,_,LX,L,_仕入総数), write_formatted('%10s%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%10s%3d\n',LX),!. 行ごとに表示(5,L,_,_販売総数,_,_) :- 計算後の表イメージ(5,_,LX,L,_販売総数), write_formatted('%10s%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%10s%3d\n',LX), write('---------------------------------------------------------\n'),!. 行ごとに表示(6,L,_,_,_在庫個数ならび,_在庫総数) :- 計算後の表イメージ(5,_,LX,_在庫個数ならび,_在庫総数), write_formatted('%10s%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%10s%3d\n',LX),!. 'テキストファイル名"b.txt"に計算結果を追加して保存する'(LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数) :- open('b.txt',write,Outstream), 保存する(Outstream,LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数), close(Outstream),!. 保存する(Outstream,LL,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数) :- append(L0,[L|R],LL), length([_|L0],_行), 行ごとに保存する(Outstream,_行,L,_仕入個数,_販売総数,_在庫個数ならび,_在庫総数), R = [],!. 行ごとに保存(Outstream,4,L,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数) :- 計算後の表イメージ(4,_,LX,L,_仕入総数), concat_atom(LX,',',S), write_formatted(Outstream,'%t\n',[S]),!. 行ごとに保存(Outstream,5,L,_仕入総数,_販売総数,_在庫個数ならび,_在庫総数) :- 計算後の表イメージ(5,_,LX,L,_販売総数), concat_atom(LX,',',S), write_formatted(Outstream,'%t\n',[S]),!. 行ごとに保存(Outstream,6,L,_仕入個数,_販売総数,_在庫個数ならび,_在庫総数) :- 計算後の表イメージ(5,_,LX,_在庫個数ならび,_在庫総数), concat_atom(LX,',',S), write_formatted(Outstream,'%t\n',[S]),!. 行ごとに保存(Outstream,6,L,_仕入個数,_販売総数,_在庫個数ならび,_在庫総数) :- concat_atom(L,',',S), write_formatted(Outstream,'%t\n',[S]),!. 以下の表('商品名 アイスクリーム'). 以下の表('年度 2010年 2011年'). 以下の表(' 月 4 5 6 7 8 9 10 11 12 1 2 3'). 以下の表('---------------------------------------------------------'). 以下の表('仕入数 3 3 13 22 30 15 11 5 5 3 5 5 仕入総数 xxx'). 以下の表('販売個数 1 2 12 20 30 15 8 4 2 3 3 2 販売総数 xxx'). 以下の表('---------------------------------------------------------'). 以下の表('在庫数 x x x x x x x x x x x x 在庫総数 xxx'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/823 # # [1] 授業単元:ネットワークプログラミング # [2] 問題文(含コード&リンク): # ネットワーク対戦型ゲームを実装せよ # 宛先ホスト,ポート番号をコマンドライン引数として扱う. # serverとclientの1対1通信でOK # getaddrinfo()を使用すること # localhost内で動作すればOK # ゲームに関して # じゃんけん # ○×ゲーム # などなど・・・ # 提出物 # サーバ側,クライアント側のプログラム # 碁盤サーバ :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket), open(NewSocket,read,Instream), open(NewSocket,write,Outstream), get_line(Instream,Line), ゲーム(Instream,Outstream,Line), close(Instream), close(Outstream), socket_shutdown(Socket), socket_shutdown(NewSocket). ゲーム(_,_,ありません) :- !. ゲーム(Instream,Outstream,Line) :- exception_handler(atom_to_term(Line,Term,Varlist),Ex, Term = Ex), call(Term), 自分の手番(_次の手), write_formatted(Outstream,'着手(%q). ',[_次の手]), flush_output(Outstream), get_line(Instream,Line2), ゲーム(Instream,Outstream,Line2). 着手((A,B)) :- write_formatted('相手の着手は%t%tです\n',[A,B]), 盤面表示(A,B),!. 自分の手番(_次の手) :- write('次の手をカンマ区切りで入力してください : '), get_line(Line), 自分の着手診断(Line,_次の手),!. 自分の手番(_次の手) :- 自分の手番(_次の手). 自分の着手診断(Line,(A,B)) :- split(Line,[',',' '],[A,B]), A @>= 'A', A @=< 'S', B >= 0, B =< 19,!. 自分の着手診断(Line,_次の手) :- write_formatted('%t は適切な盤面表現ではありません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/853 # # 【 課題 】(1)三科目の点数を入力し、平均点を表示するプログラムを作成せよ。 # (2)まず人数を入力、その人数分の三科目の点数を入力、個人ごとの平均点を表示するプログラムを作成せよ。 #   (3)(2)を継承。オーバーライドを使用し、入力する科目を五科目に増やし、さらに合計点も表示するプログラムを作成せよ。 # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】本日九時 # 【 Ver  】java version "1.6.0_21" #   Java(TM) SE Runtime Environment (build 1.6.0_21-b07) #   Java HotSpot(TM) Client VM (build 17.0-b17, mixed mode, sharing) # 【 補足 】問題が口頭だったため、文章におかしいところがあるかも知れませんが、よろしくお願いします。 まず人数を入力、その人数分の三科目の点数を入力、個人ごとの平均点を表示する :- まず人数を入力(_人数), その人数分の三科目の点数を入力(_人数,_その人数分の三科目の得点ならび), 個人ごとの平均点を表示する(_その人数分の三科目の得点ならび). まず人数を入力(_人数) :- write('人数を入力してください : '), get_line(Line), 人数入力診断(Line,_人数),!. まず人数を入力(_人数) :- まず人数を入力(_人数). 人数入力診断(Line,_人数) :- atom_to_term(Line,_人数,_), integer(_人数), _人数 > 0,!. 人数入力診断(Line,_人数) :- write_formatted('入力された文字列 %t からは人数を得られませんでした。再入力をお願いします。\n',[Line]), fail. その人数分の三科目の点数を入力(_人数,_その人数分の三科目の得点ならび) :- length(_その人数分の三科目の得点ならび,_人数), findall(_三科目の得点,( append(_,[_三科目の得点|_],_その人数分の三科目の得点ならび), 三科目の点数を入力し(_三科目の得点)), _その人数分の三科目の得点ならび). 個人ごとの平均点を表示する(_その人数分の三科目の得点ならび) :- append(L0,[_三科目の得点|R],_その人数分の三科目の得点ならび), 個人idを付加して表示(L0), 平均点を表示する(_三科目の得点), R = []. 個人idを付加して表示(L0) :- length([_|L0],_何番目]), write_formatted('%t : ',[_何番目]). 三科目の点数を入力し(_三科目の得点) :- write('三科目の点数をカンマ区切りで一行で入力してください : '), get_split_line([','],_三科目の得点). 平均点を表示する(_三科目の点数) :- 平均点を(_三科目の点数,_平均点), 表示する(_平均点). 平均点を([_第一科目の点数,_第二科目の点数,_第三科目の点数],_平均点) :- _平均点 is (_第一科目の点数 + _第二科目の点数 + _第三科目の点数) / 3. 表示する(_平均点) :- write_formatted('三科目の平均は %t です\n',[_平均点]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/853 # # 【 課題 】(1)三科目の点数を入力し、平均点を表示するプログラムを作成せよ。 # (2)まず人数を入力、その人数分の三科目の点数を入力、個人ごとの平均点を表示するプログラムを作成せよ。 #   (3)(2)を継承。オーバーライドを使用し、入力する科目を五科目に増やし、さらに合計点も表示するプログラムを作成せよ。 # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】本日九時 # 【 Ver  】java version "1.6.0_21" #   Java(TM) SE Runtime Environment (build 1.6.0_21-b07) #   Java HotSpot(TM) Client VM (build 17.0-b17, mixed mode, sharing) # 【 補足 】問題が口頭だったため、文章におかしいところがあるかも知れませんが、よろしくお願いします。 三科目の点数を入力し、平均点を表示する :- 三科目の点数を入力し(_三科目の得点), 平均点を表示する(_三科目の点数). 三科目の点数を入力し(_三科目の得点) :- write('三科目の点数をカンマ区切りで一行で入力してください : '), get_split_line([','],_三科目の得点). 平均点を表示する(_三科目の点数) :- 平均点を(_三科目の得点,_平均点), 表示する(_平均点). 平均点を([_第一科目の点数,_第二科目の点数,_第三科目の点数],_平均点) :- _平均点 is (_第一科目の点数 + _第二科目の点数 + _第三科目の点数) / 3. 表示する(_平均点) :- write_formatted('三科目の平均は %t です\n',[_平均点]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/804 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1380209.txt.html # # データ例のように名前,性別,5教科の試験の得点を格納した.txtファイルを用意し、 # # そのデータを用いて実行例のような操作を行うことができるプログラムを作成せよ. # # このプログラムに細かい指定は無く、データ構造や関数は各自適切と考えるものを作成すればよい. # # 【データ例】 # ファイル名:classA.txt # Andrew M 92 63 85 71 81 # # Helen F 81 89 83 79 51 # # Jane F 65 75 59 81 69 # # John M 85 98 95 81 91 # # Susan F 60 50 53 69 43 # # Thomas M 72 62 79 66 72 # # ファイル名:classB.txt # Ichiro M 82 65 75 81 41 # # Jiro M 61 72 51 41 69 # # Sabu M 55 68 85 81 81 # # Hanako F 90 80 93 89 93 # # 【実行例】 # $はコマンドプロンプトを指す # # $ ./report (プログラムの実行) # # -------------Menu----------------- # 1.データ読み込み # 2.一覧表示 # 0.終了 # ---------------------------------- # コマンド>> 1 (ここでコマンドを入力できるようにする。以下同じ) # [データ読み込み] # ファイル名を入力してください>> classA.txt (読み込みたいファイル名の入力。以下同じ) # ファイルclassA.txtからデータを読み込みました。 # # -------------Menu----------------- # 1.データ読み込み # 2.一覧表示 # 0.終了 # ---------------------------------- # コマンド>> 2 # 名前 性別 国語 数学 理科 社会 英語 平均点 # Andrew  M    92    63   85    71   81    78.4 # Helen  F    81    89   83    79   51    76.6 # Jane   F    65    75   59    81   69    69.8 # John   M    85    98   95    81   91    90.0 # Susan  F    60    50   53    69   43    55.0 # Thomas  M 72 62 79 66 72 70.2 # -------------Menu----------------- # 1.データ読み込み # 2.一覧表示 # 0.終了 # ---------------------------------- # コマンド>> 1 # [データ読み込み] # ファイル名を入力してください>> classB.txt # ファイルclassB.txtからデータを読み込みました. # -------------Menu----------------- # 1. データ読込 # 2. 一覧表示 # 0. 終了 # ---------------------------------- # コマンド >> 2 # [一覧表示] # 名前 性別 国語 数学 理科 社会 英語 平均点 # Ichiro M 82 65 75 81 41 68.8 # Jiro M 61 72 51 41 69 58.8 # Sabu M 55 68 85 81 81 74.0 # Hanako F 90 80 93 89 93 89.0 # -------------Menu----------------- # 1. データ読込 # 2. 一覧表示 # 0. 終了 # ---------------------------------- # コマンド >> 0 # [終了] # # $ # # ※ファイル名を入力するところで存在しないファイル名を入力(classC.txtなど)した場合、 #  入力されたファイルは存在しない、という旨をきちんと表示させること # 選択された機能を実行する :- メニュー表示, コマンド番号を得る(_コマンド番号), 実行(_コマンド番号), 選択された機能を実行する. 選択された機能を実行する. 実行(1) :- テータ読み込み. 実行(2) :- 一覧表示. 実行(0) :- 終了, fail. メニュー表示 :- write('-------------Menu-----------------\n'), write('1.データ読み込み\n'), write('2.一覧表示\n'), write('0.終了\n'), write('----------------------------------\n'),!. コマンド番号を得る(_コマンド番号) :- write('コマンド>> '), get_integer(_コマンド番号), _コマンド番号 >= 0, _コマンド番号 =< 2,!. データ読み込み :- ファイル名を得る(_ファイル名), get_split_lines(_ファイル名,[' '],LL), length(L,8), データ述語削除(データ,_ファイル名,L), 述語定義(データ,_ファイル名,LL), write_formatted('ファイル%tからデータを読み込みました.\n',[_ファイル名]),!. データ読み込み(Lines) :- データ読み込み(Lines). ファイル名を得る(_ファイル名) :- write('[データ読み込み]\n'), write('ファイル名を入力してください>> '), get_line(_ファイル名), ファイル名診断(_ファイル名). ファイル名診断(_ファイル名) :- get_file_info(_ファイル名,L), append(_,[mode(L2)|_],L), ファイル名はファイルとして存在する(_ファイル名,L2), ファイル名は読み込み可能である(_ファイル,L2),!. ファイル名はファイルとして存在する(_ファイル名,L) :- append(_,[ifreg|_],L),!. ファイル名はファイルとして存在する(_ファイル名,L) :- write_formatted('ファイル %t は存在しません\n',[_ファイル名]), fail. ファイル名は読み込み可能である(_ファイル名,L) :- append(_,[irusr|_],L),!. ファイル名は読み込み可能である(_ファイル名,L) :- write_formatted('ファイル %t は存在しますが、現在読み込みができません\n',[_ファイル名]), fail. 述語定義(_述語名,_ファイル名,LL) :- append(_,[L|R],LL), P =.. [_述語名,_ファイル名|L], assertz(P), R = [],!. 一覧表示 :- write('名前 性別 国語 数学 理科 社会 英語 平均点\n'), データ(_ファイル名,名前,_性別,_国語,_数学,_理科,_社会,_英語,_平均点), write_formatted('%t %t %t %t %t %t %t %t %t\n',[名前,_性別,_国語,_数学,_理科,_社会,_英語,_平均点]), fail. 一覧表示. データ述語削除(_述語名,_ファイル名,L) :- P =.. [_述語名,_ファイル名|L]), retract(P), fail. データ述語削除(データ,_ファイル名). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/703 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # # 1..キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む関数を作れ。ただし、nの値とファイル名は引数として取得するものとする。 # 2..引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する関数を作れ。 # 3..以上で作成した関数を使用し、プログラムを完成せよ。ただし、nの値と使用するファイルの名前はプログラムの引数として与えられるものとする。 キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む。その後そのファイルから情報を読み込み学生番号順に表示する(_n,_ファイル名) :- キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む(_n,_ファイル名), 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_n,_ファイル名). 'キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む'(_n,_ファイル名) :- write('学生番号と氏名の組みをカンマ区切りで%t行入力してください : '), length(L,_n), findall(_行,( append(_,[_行|_],L)), L), put_lines(_ファイル名,L). 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_n,_ファイル名) :- length(LL1,_n), see(_ファイル名), findall([_学生番号,_氏名],( append(_,[_|_],L1L), get_split_line(Instream,[','],[_学生番号,_氏名])), LL1), close(Instream), sort(LL1,LL2), append(_,[L|R],LL2), write_formatted('%t%t\n',L), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/666 # # [1] 授業単元: # [2] 問題文: http://ime.nu/ux.getuploader.com/sanada1678/download/17/%E3%82%B3%E3%83%94%E3%83%BC+%EF%BD%9E+%E8%AA%B2%E9%A1%8C.csv # # ある駐車場が昼間20分100円の料金で駐車場を貸しています。 # 左のデータは入出庫のデータです。 # 駐車時間の長さの分類はおもに # 20分,40分,1時間,2時間,6時間,12時間,24時間以上 # です。これをもとに次の問題を解決せよ。 # # 毎時00分時点での(つまり1時間ごとの) # 駐車している駐車台数を自動計算するように表計算のプログラムを作成したい。 # # 1.1時間の間(たとえばその日の13時から14時)に入場してきた車の台数 #   その時間内に清算して出場して行った台数を自動計算するように表計算の #   プログラムを作成せよ。その結果として、00分時点での駐車台数が自動計算できる #   ようにプログラムを作成せよ。 # # 2.一定期間内(例えば1日や一週間と特定して)での #   駐車時間の長さで分類した台数 #   たとえば 30分以内,1H,2H,6H,12H,24H以上 #   が自動計算できるようにプログラムを作成せよ。 # # 3.とりあえず最初に駐車していた台数を0台として表を作成せよ。 #   それが出来たら最初に駐車していた台数を任意に設定することで #   その後の駐車している台数を自動計算できるように表を作成せよ。 # # 11月、12月などのデータを入力しても瞬時に計算できるようにしておく。 # 夜間の駐車料金などもデータから推測せよ。 # # 2010/10/31 20:38,2010/10/31 23:24,,300,300,,,,,,,,, # 2010/10/31 10:47,2010/10/31 22:12,,600,600,,,,,,,,, # 2010/10/31 12:25,2010/10/31 22:06,,600,600,,,,,,,,, # 2010/10/31 19:13,2010/10/31 21:52,,500,500,,,,,,,,, # 2010/10/31 18:49,2010/10/31 21:50,,600,600,,,,,,,,, # 2010/10/31 15:30,2010/10/31 21:45,,600,600,,,,,,,,, # 2010/10/31 10:06,2010/10/31 21:37,,600,600,,,,,,,,, # 2010/10/30 21:57,2010/10/31 21:32,,600,600,,,,,,,,, # 2010/10/31 13:02,2010/10/31 21:29,,600,600,,,,,,,,, # 2010/10/31 20:25,2010/10/31 21:16,,100,100,,,,,,,,, # 2010/10/30 21:19,2010/10/31 21:02,,600,600,,,20,,,,,, # 2010/10/31 9:43,2010/10/31 20:53,,600,600,,,,,,,,, # 2010/10/31 17:45,2010/10/31 20:43,,600,600,,,,,,,,, # 2010/10/31 18:38,2010/10/31 20:38,,600,600,,,00,,,,,, # 2010/10/29 6:53,2010/10/31 20:23,,1800,1800,,,,,,,,, # 2010/10/31 8:04,2010/10/31 19:53,,600,600,,,,,,,,, # 2010/10/31 5:32,2010/10/31 19:25,,600,600,,,,,,,,, # 2010/10/31 12:19,2010/10/31 19:15,,600,600,,,,,,,,, # 2010/10/31 5:53,2010/10/31 19:09,,600,600,,,00,,,,,, /* 'ある駐車場が昼間20分100円の料金で駐車場を貸しています。'. */ '左のデータは入出庫のデータです。'(_入出庫データファイル,_入出庫データならび) :- get_split_lines(_入出庫データファイル,[','],_入出庫データならび). /* '駐車時間の長さの分類はおもに20分,40分,1時間,2時間,6時間,12時間,24時間以上です。'(_駐車開始時刻,_駐車終了時刻,_駐車時間) :- 駐車時間は同一日である(_駐車開始時刻,_駐車終了時刻). '駐車時間の長さの分類はおもに20分,40分,1時間,2時間,6時間,12時間,24時間以上です。'(_駐車開始時刻,_駐車終了時刻,_駐車時間) :- \+(駐車時間は同一日である(_駐車開始時刻,_駐車終了時刻)). */ '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算する'(_毎時00分時点での駐車している駐車台数ならび) :- '左のデータは入出庫のデータです。'(_入出庫データファイル,_入出庫データならび), '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算するように表計算のプログラムを作成したい。'(_入出庫データならび,_毎時00分時点での駐車している駐車台数ならび). '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算する'(LL,LL2) :- findsetof([_年,_月,_日,_時],( append(_,[L|R1],LL), 発生した年・月・日・時(L,_年,_月,_日,_時)), LL1), findall([_年,_月,_日,_時,_駐車台数],( append(_,[[_年,_月,_日,_時]|_],LL1), '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数'(LL,_年,_月,_日,_時,_駐車台数)), LL2). 発生した年・月・日・時([_時刻|_],_年,_月,_日,_時) :- split(_時刻,[' ','/',':'],[_年,_月,_日,_時|_]). 発生した年・月・日・時([_,_時刻|_],_年,_月,_日,_時) :- split(_時刻,[' ','/',':'],[_年,_月,_日,_時|_]). '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数'(LL,_年,_月,_日,_時,_駐車台数) :- count(( member([A,B|_],LL), split(A,['/',' ',':'],LA), split(B,['/',' ',':'],LB), LA @=< [_年,_月,_日,_時,0], LB @>= [_年,_月,_日,_時,0]), _駐車台数),!. '1時間の間(たとえばその日の13時から14時)に入場してきた車の台数その時間内に清算して出場して行った台数を自動計算する'(LL,_年,_月,_日,_時,_入場車数,_出場車数) :- count(( member([A|_],LL), split(A,['/',' ',':'],LA), LA @>= [_年,_月,_日,_時,0], LA @=< [_年,_月,_日,_時,59]), _入場車数), count(( member([_,A|_],LL), split(A,['/',' ',':'],LA), LA @>= [_年,_月,_日,_時,0], LA @=< [_年,_月,_日,_時,59]), _出場車数),!. '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(LL,_時刻下限,_時刻上限,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(LL,_時刻下限,_時刻上限,0,0,0,0,0,0,0,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上). '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([],_時刻下限,_時刻上限,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- !. '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([[_入場時刻,_出場時刻|_]|R],_時刻下限,_時刻上限,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- split(_入場時刻,[' ','/',':'],[_年_1,_月_1,_日_1,_時_1,_分_1]), split(_出場時刻,[' ','/',':'],[_年_2,_月_2,_日_2,_時_2,_分_2]), [_年_1,_月_1,_日_1,_時_1,_分_1] @>= _時刻下限, [_年_2,_月_2,_日_2,_時_2,_分_2] @=< _時刻上限, 入場時刻と出場時刻の時間差分単位(_入場時刻,_出場時刻,_時間差分単位), 時間差単位(_時間差分単位,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_2,_2H_2,_2H_2,_6H_2,_22H_2,_24H_2,_24H以上_2), '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(R,_時刻下限,_時刻上限,_30分以内_2,_1H_2,_2H_2,_6H_2,_12H_2,_24H_2,_24H以上_2,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上). '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([_|R],_時刻下限,_時刻上限,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(R,_時刻下限,_時刻上限,_30分以内_1,_1H_1,_1H_1,_6H_1,_12H_1,_14H_1,_14H以上_1,_30分以内,_1H,_1H,_6H,_12H,_14H,_14H以上). 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_2,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 =< 30, _30分以内_2 is _30分以内_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_2,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 >= 30,_分 < 60, _1H_2 is _1H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_2,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 >= 60,_分 < 120, _2H_2 is _2H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_2,_12H_1,_24H_1,_24H以上_1) :- _分 >= 120,_分 < 360, _6H_2 is _6H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_2,_24H_1,_24H以上_1) :- _分 >= 360,_分 < 720, _12H_2 is _12H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_2,_24H以上_1) :- _分 >= 720,_分 < 1440, _24H_2 is _24H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_2) :- _分 >= 1440, _24H以上_2 is _24H以上_1 + 1,!. 'とりあえず最初に駐車していた台数を0台として表を作成せよ。それが出来たら最初に駐車していた台数を任意に設定することでその後の駐車している台数を自動計算できるように表を作成せよ。'. '11月、12月などのデータを入力しても瞬時に計算できるようにしておく。夜間の駐車料金などもデータから推測せよ。'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 入場時刻と出場時刻の時間差分単位(_入場時刻,_出場時刻,_時間差分単位) :- atom(_入場時刻), atom(_出場時刻), split(_入場時刻,['/',' ',':'],[_年_1,_月_1,_日_1,_時_1,_分_1]), split(_出場時刻,['/',' ',':'],[_年_2,_月_2,_日_2,_時_2,_分_2]), 出場時刻と入場時刻の時間差分単位([_年_1,_月_1,_日_1,_時_1,_分_1],[_年_2,_月_2,_日_2,_時_2,_分_2],_時間差分単位). 入場時刻と出場時刻の時間差分単位([_年,_月,_日,_時,_分_1],[_年,_月,_日,_時,_分_2],_時間差分単位) :- _時間差分単位 is _分2 - _分1,!. 入場時刻と出場時刻の時間差分単位([_年,_月,_日,_時_1,_分_1],[_年,_月,_日,_時_2,_分_2],_時間差分単位) :- _時間差分単位 is (60 * _時_2 + _分_2) - (60 * _時_1 + _分1),!. 入場時刻と出場時刻の時間差分単位([_年,_月,_日_1,_時_1,_分_1],[_年,_月,_日_2,_時_2,_分_2],_時間差分単位) :- _時間差分単位 is (1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _日_1 + 60 * _時_1 + _分1),!. 入場時刻と出場時刻の時間差分単位([_年,_月_1,_日_1,_時_1,_分_1],[_年,_月_2,_日_2,_時_2,_分_2],_時間差分単位) :- _月_2_1 is _月_2 - 1, findsum(_月日数,( for(_月_1,_月,_月_2_1), 月日数(_年_1,_月,_月日数)), _月日数合計の一), _月日数合計 is truncate(_月日数合計の一), _時間差分単位 is (1440 * _月日数合計 + 1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _日_1 + 60 * _時_1 + _分_1),!. 入場時刻と出場時刻の時間差分単位([_年_1,_月_1,_日_1,_時_1,_分_1],[_年_2,_月_2,_日_2,_時_2,_分_2],_時間差分単位) :- _年_2_1 is _年_2 - 1, findsum(_年日数,( for(_年_1,_年,_年_2_1), 年日数(_年,_年日数)), _年日数合計の一), _年日数合計 is truncate(_年日数合計の一), _月_1_1 is _月_1 - 1, findsum(_月日数,( for(0,_月,_月_1_1), 月日数(_年_1,_月,_月日数)), _月日数合計の一), _月日数合計_1 is truncate(_月日数合計の一), _月_2_1 is _月_2 - 1, findsum(_月日数,( for(0,_月,_月_2_1), 月日数(_年_2,_月,_月日数)), _月日数合計の二), _月日数合計_2 is truncate(_月日数合計の二), _時間差分単位 is (1440 * _年日数の合計 + 1440 * _月日数合計_2 + 1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _月日数合計_1 + 1440 * _日_1 + 60 * _時_1 + _分_1),!. 年日数(_年,366) :- うるう年(_年),!. 年日数(_年,365). 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,29) :- \+(うるう年(_年)),!. 月日数(_年,_月,31) :- append(_,[_月|_],[1,3,5,7,8,10,12]),!. 月日数(_年,_月,30) :- append(_,[_月|_],[4,6,9,11]),!. 月日数(_,0,0). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail . うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/673 # # # 仕上げたコードの可読性をあげるために # 演算子の前後にスペースを入れたいです # 例 x+y=z #   x + y = z # 式文字列の演算子の前後に空白を入れる(_式文字列,_空白を挿入して可読性を上げた式文字列) :- 空白を一旦取り除く(_式文字列,_空白を取り除いた式文字列), sPLIT(_空白を取り除いた式文字列,['=','+','-','*','/','mod','(',')'],L), concat_atom(L,' ',_空白を挿入して可読性を上げた式文字列). 空白を一旦取り除く(_式文字列,_空白を取り除いた式文字列) :- split(_式文字列,[' '],L), concat_atom(L,_空白を取り除いた文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/666 # # メールアドレスが正しいかマッチング。 # ただし、@gmail.com、@googlemail.com、@livedoor.comの場合は # @の前に「+」「.」が含まれている場合は除外する。 # これって正規表現1発でできたりしますか? # # チェック対象ドメイン('gmail.com'). チェック対象ドメイン('googlemail.com'). チェック対象ドメイン('livedoor.com'). メールアドレスチェック(_メールアドレス) :- split(_メールアドレス,['@'],[A,B]), メールアドレスチェック(A,B). メールアドレスチェック(A,B) :- \+(チェック対象ドメイン(B)),!. メールアドレスチェック(A,B) :- \+(sub_atom(A,_,1,_,'+')),!. メールアドレスチェック(A,B) :- \+(sub_atom(A,_,1,_,'.')),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/659 # # PHPで、例えば # # こう言った文章を考えるのは、たのしい。 # わたしは、「こんにちは」と言いました。 # 「この文章は、なかなか面白いですね。とても正確な正規表現を考える必要があるんです。」 # 「では、そんな正規表現をどうやって見つけるのでしょうか?そうだ、質問してみましょうよ!。」 # 「なるほど?。それは面白いアイディアだ。」と、もう一人は言った。 # # という文章があったときに、 # # "こう言った文章を考えるのは、たのしい。", # "わたしは、","「こんにちは」","と言いました。", # "「この文章は、なかなか面白いですね。","とても正確な正規表現を考える必要があるんです。」", # "「では、そんな正規表現をどうやって見つけるのでしょうか?","そうだ、質問してみましょうよ!。」", # "「なるほど?。","それは面白いアイディアだ。」","と、もう一人は言った。" # # という感じに分割して配列にしたいと思っています。 # 現在使っている正規表現は # $contents = array(); # preg_match_all('/.*?。|.*?「/m',$content,$contents); # という感じで書いてみました。 # $contentがもとの文章で、$contentsが新しく得る配列です。 # どうも複雑でどうしたら良いのかわからないので質問させていただきます。よろしくお願いします。 # # 文を改行区切りとするならびとする(_文,_行ならび) :- split(_文,['\n'],_行ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/642 # # Perl 5.8 /5.10で使用します。 # # HTMLソースの中のimgタグのファイル名を正規表現などで一括で変えたいです。 # # <img src="http://ime.nu/www.hoge.com/aaa/bb/ccc/ddd.jpg" alt="sss"> # <img src="/xxx/yyy.png"> # <img src="../aaa/fff/xxx/ccc.gif" width="32" height="16"> # #            ↓ # # <img src="/images/ddd.jpg" alt="sss"> # <img src="/images/yyy.png"> # <img src="/images/ccc.gif" width="32" height="16"> # # こんな感じです。どの様にしたらよいでしょうか。 # 'imgタグの書き換え'(Lines,_置換されたLines) :- findall(_置換された文字列,( append(_,[_文字列|_],Lines), 文字列の置換(_文字列,_置換された文字列)), _置換されたLines). 文字列の置換(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [<,i,m,g,' ',s,r,c,=,'"'|R2], L3 = [>|R3], \+(append(_,[>|_],R2)), concat_atom(R2,S22), split(S22,['/'],L), last(L,F), concat_atom([S1,'% 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/450 # # [1] 授業単元: Cプログラミング演習2 # [2] 問題文(含コード&リンク): 問題10-2(関数ポインタを用いて2つの整数値を入力して、加算・減算・最大値・最小値の # いずれかを選択して求めるプログラムを作成せよ)において、関数ポインタを用いて、4つの関数の値のいずれかを求めるのではなく、 # for-loopを用いて、4つの値とも出力するプログラムを作成せよ。 # # 入力に関して:キーボードから2つの整数をスペース1つあけて入力し、改行する。 # # 出力に関して:加算・減算・最大値・最小値の値を、それぞれ値+改行のフォーマットで #  4行にわけて出力する。指定した数値・改行以外の出力は一切行わないこと。 # 'キーボードから2つの整数をスペース1つあけて入力し、加算・減算・最大値・最小値の値を、それぞれ値+改行のフォーマットで4行にわけて出力する。' :- write('2つの整数をスペース1つあけて入力してください : '), get_split_line([' '],[_整数1,_整数2]), 演算結果の出力(_整数1,_整数2). 演算結果の出力(_整数1,_整数2) :- 演算(_,_整数1,_整数2,_項,_値), call(_項), write_formatted('%t\n',[_値]), fail. 演算結果の出力(_,_). 演算(加算,_整数1,_整数2,_値 is _整数1+_整数2,_値). 演算(減算,_整数1,_整数2,_値 is _整数1-_整数2,_値). 演算(最大値,_整数1,_整数2,max([_整数1,_整数2],_値),_値). 演算(最小値,_整数1,_整数2,min([_整数1,_整数2],_値),_値). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/341 # # 【質問テンプレ】 # [1] 授業単元:画像処理 # [2] 問題文(含コード&リンク):指定したテキストファイルの中にあるデータを読み込み、-1と右端の1を取り除き(横に4つの列、縦に約50の行の数字が並んでいる)、指定した場所にファイルを保存するプログラムを作成する。 # # 例で書くと # # 123 345 567 1 # 234 456 678 1 # 987 564 356 1 # -1 -1 -1 -1 # # って感じで数字が羅列してあります。 # 必ず右端に1があるんですが例外で-1だけの行が数か所あります。 # その-1と右端にある1を取り除くものをお願いします。 '指定したテキストファイルの中にあるデータを読み込み、-1と右端の1を取り除き(横に4つの列、縦に約50の行の数字が並んでいる)、指定した場所にファイルを保存する'(_テキストファイル,_指定した場所) :- get_split_lines(_テキストファイル,[',',' '],LL), '-1と右端の1を取り除き'(LL1,LL2), 指定した場所にファイルを保存する(_指定した場所,_テキストファイル,LL2). '-1と右端の1を取り除き'([],[]) :- !. '-1と右端の1を取り除き'([L1|R1],R2) :- append(_,[-1|_],L1), '-1と右端の1を取り除き'(R1,R2),!. '-1と右端の1を取り除き'([[A,B,C,1]|R1],[[A,B,C]|R2]) :- '-1と右端の1を取り除き'(R1,R2),!. '-1と右端の1を取り除き'([L1|R1],[L1|R2]) :- '-1と右端の1を取り除き'(R1,R2),!.\ 指定した場所にファイルを保存する(_指定した場所,_テキストファイル,LL) :- 保存ファイルのパス名(_指定した場所,_テキストファイル,_保存ファイルのパス), put_csv_lines(_保存ファイルのパス,' ',LL). 保存ファイルのパス名(_指定した場所,_テキストファイル,_保存ファイルのパス) :- split(_テキストファイル,['/'],L), last(L,_ファイル名), concat_atom([_指定した場所,'/',_ファイル名],_保存ファイルのパス). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/341 # # 【質問テンプレ】 # [1] 授業単元:画像処理 # [2] 問題文(含コード&リンク):指定したテキストファイルの中にあるデータを読み込み、-1と右端の1を取り除き(横に4つの列、縦に約50の行の数字が並んでいる)、指定した場所にファイルを保存するプログラムを作成する。 # '指定したテキストファイルの中にあるデータを読み込み、-1と右端の1を取り除き(横に4つの列、縦に約50の行の数字が並んでいる)、指定した場所にファイルを保存する'(_テキストファイル,_指定した場所) :- get_split_lines(_テキストファイル,[',',' '],LL), '-1と右端の1を取り除き'(LL1,LL2), 指定した場所にファイルを保存する(_指定した場所,_テキストファイル,LL2). '-1と右端の1を取り除き'([],[]) :- !. '-1と右端の1を取り除き'([L1|R1],[L2|R2]) :- '行の中の-1と右端の1を取り除き'(L1,L2), \+(L2=[]), '-1と右端の1を取り除き'(R1,R2),!. '-1と右端の1を取り除き'([L1|R1],R2) :- '-1と右端の1を取り除き'(R1,R2),!. '行の中の-1と右端の1を取り除き'([],[]) :- !. '行の中の-1と右端の1を取り除き'([1],[]) :- !. '行の中の-1と右端の1を取り除き'([-1|R1],R2) :- '行の中の-1と右端の1を取り除き'(R1,R2),!. '行の中の-1と右端の1を取り除き'([N|R1],[N|R2]) :- '行の中の-1と右端の1を取り除き'(R1,R2),!. 指定した場所にファイルを保存する(_指定した場所,_テキストファイル,LL) :- 保存するパス名(_指定した場所,_テキストファイル,_保存するパス名), open(_保存するパス名,write,Outstream), append(_,[L|R],LL), concat_atom(L,' ',S), write_formatted(Outstream,'%t\n',[S]), R = [], close(Outstream),!. 保存するパス名(_指定した場所,_テキストファイル,_保存するパス名) :- \+(sub_atom(_指定した場所,_,1,0,'/')), \+(sub_atom(_テキストファイル,0,1,_,'/')), concat_atom([_指定した場所,'/',_テキストファイル],_保存するパス名),!. 保存するパス名(_指定した場所,_テキストファイル,_保存するパス名) :- sub_atom(_指定した場所,_,1,0,'/'), \+(sub_atom(_テキストファイル,0,1,_,'/')), concat_atom([_指定した場所,_テキストファイル],_保存するパス名),!. 保存するパス名(_指定した場所,_テキストファイル,_保存するパス名) :- sub_atom(_指定した場所,_,1,0,'/'), sub_atom(_テキストファイル,0,1,R,'/'), split(_テキストファイル,['/'],L), last(L,_テキストファイルの二), concat_atom([_指定した場所,_テキストファイルの二],_保存するパス名),!. 保存するパス名(_指定した場所,_テキストファイル,_保存するパス名) :- \+(sub_atom(_指定した場所,_,1,0,'/')), sub_atom(_テキストファイル,0,1,R,'/'), split(_テキストファイル,['/'],L), last(L,_テキストファイルの二), concat_atom([_指定した場所,'/',_テキストファイルの二],_保存するパス名),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/239 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 縦は無数、横が10列で数字が書き込まれているecxelファイルを読み込む(ファイル名は何でもいいです) # 読み込む時は今後の処理を考えてなるべく配列で # その後各列を縦に参照していき、正の値が出たときは別の同じ型の配列の同じ位置に代入していく # 負の値が出たときに、そのセルの列の前5個、後ろ5個を参照し以下の処理を行う # 前にも後ろにも正の値が検出された場合 → 参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する # 前あるいは後ろの片方にしか正の値が検出されなかった場合 → 一番近い値をそのまま別の配列に格納する # 前にも後ろにも正の値が無い場合 → そのままの負の値で別の配列に格納する # # 最後に値の変更を終えた別の配列をそのままresult.csvとして出力する # # # 'ファイルからcsvファイルを読み取りルールにしたがってすべてのセルを書き換え、result.csvファイルに出力する'(_ファイル,LL) :- '縦は無数、横が10列で数字が書き込まれているecxelファイルを読み込む'(_ファイル,LL1), 転置(LL1,LL2), ルールにしたがってすべてのセルを書き換える(LL2,LL3), 転置(LL3,LL), 'result.csvファイルとして出力する'(LL). '縦は無数、横が10列で数字が書き込まれているecxelファイルを読み込む'(_ファイル,LL) :- get_split_lines(_ファイル,[' '],LL). ルールにしたがってすべてのセルを書き換える(L,[]) :- !. ルールにしたがってすべてのセルを書き換える([L1|R1],[L2|R2]) :- length(L1,Len), ルールにしたがってすべての行を書き換える(1,Len,L1,[_セル2|R2]) :- ルールにしたがってすべてのセルを書き換える(R1,R2). ルールにしたがってすべての行を書き換える(M,Len,[]) :- M > Len,!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_セル1|R2]) :- list_nth(M1,L,_セル1), _セル1 >= 0, M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_参照しているセルに一番近い値|R2]) :- そのセルの列の前5個、後ろ5個を参照し(L,M1,Len,_前5個ならび,_そのセル,_後ろ5個ならび), 前あるいは後ろの片方にしか正の値が検出されなかった場合(L,_前5個ならび,_そのセル,_後ろ5個ならび), '参照しているセルに一番近い値をそのまま別の配列に格納する'(_そのセルの位置,_前5個ならび,_そのセル,_後ろ5個ならび,_参照しているセルに一番近い値), M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_2つの平均値|R2]) :- そのセルの列の前5個、後ろ5個を参照し(L,M1,Len,_前5個ならび,_そのセル,_後ろ5個ならび), 前にも後ろにも正の値が検出された場合(_前5個ならび,_そのセル,_後ろ5個ならび), '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'(_前5個ならび,_そのセル,_後ろ5個ならび,_2つの平均値), M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_そのセル|R2]) :- そのセルの列の前5個、後ろ5個を参照し(L,M1,Len,_前5個ならび,_そのセル,_後ろ5個ならび), 前にも後ろにも正の値が無い場合(_前5個ならび,_そのセル,_後ろ5個ならび), M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. 前あるいは後ろの片方にしか正の値が検出されなかった場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセル < 0, append(_,[N1|_],_前5個ならび), N1 > 0, \+((append(_,[N2|_],_後ろ5個ならび),N2 > 0)),!. 前あるいは後ろの片方にしか正の値が検出されなかった場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセル < 0, \+((append(_,[N1|_],_前5個ならび),N1 > 0)), append(_,[N2|_],_後ろ5個ならび), N2 > 0,!. 前にも後ろにも正の値が検出された場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセル < 0, append(_,[N1|_],_前5個ならび), N1 > 0, append(_,[N2|_],_後ろ5個ならび), N2 > 0,!. 前にも後ろにも正の値が無い場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- \+((append(_,[N1|_],_前5個ならび),N1 > 0)), \+((append(_,[N2|_],_後ろ5個ならび),N2 > 0)),!. そのセルの列の前5個、後ろ5個を参照し(L,_そのセルの位置,Len,_前5個ならび,_そのセル,_後ろ5個ならび) :- Len < _そのセルの位置 + 5, _そのセルの位置 >= 6, len0 is _そのセルの位置 - 6, length(L0,Len0), length(_前5個ならび,5), append(_前5個ならび,[_そのセル|_後ろ5個ならび],L1), append(L0,L1,L),!. そのセルの列の前5個、後ろ5個を参照し(L,_そのセルの位置,Len,_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセルの位置 < 6, Len >= _そのセルの位置 + 5, _前5個ならびの長さ is _そのセルの位置 - 1, length(_前5個ならび,_前5個ならびの長さ), length(_後ろ5個ならび,5), append(_前5個ならび,[_そのセル|_後ろ5個ならび],L1), append(L1,L2,L),!. そのセルの列の前5個、後ろ5個を参照し(L,_そのセルの位置,Len,_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセルの位置 >= 6, Len >= _そのセルの位置 + 5, Len0 is _そのセルの位置 - 6, length(L0,Len0), length(_前5個ならび,5), append(_前5個ならび,[_そのセル|_後ろ5個ならび],L1), append(L0,L1,_,L),!. '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'([],_そのセル,_後ろ5個ならび,_値) :- findmin([M,N],( append(_,[N|_],_後5個ならび), M is abs(N - _そのセル)), [_差,_値]),!. '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'(_前5個ならび,_そのセル,[],_値) :- findmin([M,N],( append(_,[N|_],_前5個ならび), M is abs(N - _そのセル)), [_差,_値]), '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'(_前5個ならび,_そのセル,_後ろ5個ならび,_2つの平均値) :- findmin([M,N],( append(_,[N|_],_前5個ならび), M is abs(N - _そのセル)), [_差1,_値1]), findmin([M,N],( append(_,[N|_],_後5個ならび), M is abs(N - _そのセル)), [_差2,_値2]), _2つの平均値 is (_値1 + _値2) / 2. '参照しているセルに一番近い値をそのまま別の配列に格納する'(_前5個ならび,_そのセル,_後ろ5個ならび,_参照しているセルに一番近い値) :- append(_前5個ならび,_後ろ5個ならび,L), findmin([M,N],( append(_,[N|_],L), M is abs(N - _そのセル)), [_差2,_参照しているセルに一番近い値]),!. 'result.csvファイルとして出力する'(LL) :- open('result.csv',write,Outstream), 'result.csvファイルとして出力する'(Outstream,LL), close(Outstream). 'result.csvファイルとして出力する'(_,[]) :- !. 'result.csvファイルとして出力する'(Outstream,[L|R]) :- concat_atom(L,' ',S), write_formatted(Outstream,'%t\n',[S]), 'result.csvファイルとして出力する'(Outstream,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/755 # # すいません。行頭のスペースが消えておかしくなりましたので書き込み直します。 # # ●正規表現の使用環境 # Java1.6 # # ●検索か置換か? # 検索(Stringクラス String[] split(String regex)メソッドによる文字列分割) # # ●説明 # CSVファイル中の一行を対象文字列とし、 # その文字列中初出の\s*,\s*をデータ区切り子として見なしマッチさせる。 # (その前後で文字列を2つに分割) # # ●対象データ # aaa,bbb,ccc # aaa, bbb, ccc # aaa , bbb , ccc # # ●希望する結果 # "aaa"と"bbb,ccc"に分割 # "aaa"と"bbb, ccc"に分割 # "aaa"と"bbb , ccc"に分割 # # ●希望しない結果 # "aaa"と"bbb"と"ccc"に分割 # etc... # # 自分で考えた(?<^[^,]*)\s*,\s*では # java.util.regex.PatternSyntaxException: Unknown look-behind group near index 8 # というような例外が出てしまいました。 # # よろしくお願いします。 # # 'CSVファイル中の一行を対象文字列とし、その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(_csvファイル,_行,_前文字列,_後文字列) :- get_lines(_ファイル,Lines), append(L0,[Line|R],Lines), _行 is L0 + 1, 'その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(Line,_前文字列,_後文字列), fail. 'その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(Line,_前文字列,_後文字列) :- sub_atom(Line,_,_,_,_前文字列,_区切り文字列,_後文字列,L1,L2,L3), append(L0,[','|R],L2), all(L0,' '), \+((append(L01,[A|_],R),\+(A=' '))),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/721 # # 【課題】Studentというクラスを宣言するプログラムを作成せよ。インスタンス変数には、氏名、生年月日、学籍番号を記録せよ。 # ただし、学籍番号は入学年度を表す二桁の整数、学部を表す一桁の整数、残り四桁の整数を組み合わせた七桁の整数で表現されるものとする。 # インスタンスメソッドとしては、以下のものは必須とする。 # 名字を返すメソッド、名前を返すメソッド、誕生年を和暦で返すメソッド、誕生年を西暦で返すメソッド、入学年度を返すメソッド # 【形態】1. Javaアプリケーション # 【期限】1月11日 # 【ver】linux # 【補足】あまり難しくしないでください。 # データベース構造(学生,1,氏名). データベース構造(学生,2,誕生日). データベース構造(学生,3,学籍番号). 名字を返す(_学籍番号,_名字) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), split(_氏名,[' ',',','-','_'],[_名字,_]). 名前を返す(_学籍番号,_名前) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), split(_氏名,[' ',',','-','_'],[_,_名前]). 誕生年を和暦で返す(_学籍番号,_誕生日の和暦) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), 和暦西暦変換(_誕生日の和暦,_誕生日). 誕生年を西暦で返す(_学籍番号,_誕生日の西暦) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日の西暦,_整数学籍番号). 入学年度を返す(_学籍番号,_入学年度) :- 学籍番号変換(_学籍番号,_整数学籍番号), _入学年度 is _整数学籍番号 // 10000. 学籍番号変換(_学籍番号,_学籍番号) :- integer(_学籍番号),!. 学籍番号変換(_学籍番号,_整数学籍番号) :- \+(integer(_学籍番号)), atom_chars(_学籍番号,Chars), すべてが数字(Chars), atom_to_term(_学籍番号,_整数学籍番号,_),!. 学籍番号変換(_学籍番号ではなくて氏名,_整数学籍番号) :- atom(_学籍番号ではなくて氏名), 学生(_学籍番号ではなくて氏名,_,_整数学籍番号),!. すべてが数字([]) :- !. すべてが数字([A|R]) :- append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']), すべてが数字(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/115 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # 大量に数値が書き込まれているa.csvとb.csv(数値の数は同じ)をまず読み込み、中を参照していく # a.csvで100以上の数値が確認された場合,b.csvの同位置の数値を調べ、その値も100以上だった場合にはa.csvのその位置の値を0に書き換える # 最終的に補正が完了したa.csvをc.csvとしてはきだす、というプログラムの作成 # できれば実行前にプログラムの一部を書き換えることでa.csvのどの列を参照するのかを指定できるようにしてもらいたいです # '大量に数値が書き込まれているa.csvとb.csv(数値の数は同じ)をまず読み込み、中を参照していく。a.csvで100以上の数値が確認された場合,b.csvの同位置の数値を調べ、その値も100以上だった場合にはa.csvのその位置の値を0に書き換える。最終的に補正が完了したa.csvをc.csvとしてはきだす' :- get_split_lines('a.csv',LL1), get_split_lines('b.csv',LL2), findall(Line3,( append(L01,[L1|R1],LL1), append(L02,[L2|R2],LL2), length(L01,Len), length(L02,Len), '同一位置要素がともに100以上の時は0に更新'(L1,L2,Line3)), LL3), 'c.csvとしてはきだす'(LL3),!. '同一位置要素がともに100以上の時は0に更新'([],[],[]) :- !. '同一位置要素がともに100以上の時は0に更新'([A|R1],[B|R2],[0|R3]) :- A >= 100, B >= 100, '同一位置要素がともに100以上の時は0に更新'(R1,R2,R3). '同一位置要素がともに100以上の時は0に更新'([A|R1],[B|R2],[A|R3]) :- '同一位置要素がともに100以上の時は0に更新'(R1,R2,R3). 'c.csvとしてはきだす'(LL3) :- open('c.csv',write,Outstream), append(_,[L|R],LL3), concat_atom(L,',',S), write_formatted(Outstream,'%t\n',[S]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/31 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/www.dotup.org/uploda/www.dotup.org1341084.txt # # ファイルls-Rを読み込んでメモリ上にディレクトリツリーを構築し、全ファイルをホームディレクトリからの相対パスで出力せよ。 # ※ファイルls-Rはunixコマンドでls-rをしたものです 'ファイルls-Rを読み込んでメモリ上にディレクトリツリーを構築し、全ファイルをホームディレクトリからの相対パスで出力せよ。'(_ホームディレクトリ) :- get_lines('ls-R',Lines), 'メモリ上にディレクトリツリーを構築し、'(Lines,_ディレクトリツリー), '全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ). 'メモリ上にディレクトリツリーを構築し、'([]) :- !. 'メモリ上にディレクトリツリーを構築し、'([''|R]) :- 'メモリ上にディレクトリツリーを構築し、'(R),!. 'メモリ上にディレクトリツリーを構築し、'([_ディレクトリ|R]) :- sub_atom(_ディレクトリ,_,1,0,':'), sub_atom(_ディレクトリ,0,_,1,_ディレクトリパス), 'メモリ上にディレクトリツリーを構築し、'(_ディレクトリパス,R). 'メモリ上にディレクトリツリーを構築し、'(_,[]) :- !. 'メモリ上にディレクトリツリーを構築し、'(_ディレクトリパス,[''|R]) :- 'メモリ上にディレクトリツリーを構築し、'(R),!. 'メモリ上にディレクトリツリーを構築し、'(_ディレクトリパス,[_ファイルまたはディレクトリ|R]) :- assertz(dir(_ディレクトリパス,_ファイルまたはディレクトリ)), 'メモリ上にディレクトリツリーを構築し、'(_ディレクトリパス,R). '全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ) :- dir(_ディレクトリ,_パス), '全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ,_パス),fail. '全ファイルをホームディレクトリからの相対パスで出力する'(_). '全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ,_パス) :- dir(_パス,_パス2), ホームディレクトリからの相対パス(_ホームディレクトリ,_パス,_相対パス), write_formatted('%t/\n',[_相対パス]), dir(_パス,_パス2), '全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ,_パス2). '全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ,_パス) :- ホームディレクトリからの相対パス(_ホームディレクトリ,_パス,_相対パス), write_formatted('%t\n',[_相対パス]). ホームディレクトリからの相対パス(_ホームディレクトリ,_パス,_相対パス) :- atom_chars(_ホームディレクトリ,Chars1), atom_chars(_ホームディレクトリ,Chars2), append(Chars2,R,Chars1), 相対パスの微調整(R,_相対パス). ホームディレクトリからの相対パス(_ホームディレクトリ,_パス,_相対パス) :- split(_ホームディレクトリ,[/],L1), split(_パス,[/],L2), append(L0,[A|R1],L1), append(L0,[B|R2],L2), 遡り相対パス(A,R1,B,R2,_相対パス). 相対パスの微調整([/|R],_相対パス) :- concat_atom(R,_相対パス),!. 相対パスの微調整(L,_相対パス) :- concat_atom(L,_相対パス),!. 遡り相対パス(A,R1,B,R2,_相対パス) :- \+(A=B), findall('..',( append(_,[_|_],[B|R2])), LP), append(LP,[B|R2],L3), concat_atom(L3,'/',_相対パス),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/32 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): #   巡回セールスマン問題 #   いくつかの都市と都市間を結ぶ経路があります。全ての都市を一巡するのに最も短い経路を求めるプログラムを作成せよ。 #   TSPのデータファイルはgr17.txtで、数字の部分が都市数です。 #   ファイルの記述の仕方が以下のようになっています。 # #   gr17.txtの例 # #   17   最初の数値は都市数 #   0    第0都市と第0都市との距離が0 #   633 0  第1都市と第0都市との距離が633、第1都市と第1都市との距離が0 #   257 390 0 第2都市と第0、第1、第2都市との距離がそれぞれ257,390,0 #   91 661 228 0 以下同様 #   412 227 169 383 0 # 150 488 112 120 267 0 #      以下略 # #   補足説明として #   ・同じ道を通ってもよい #   ・全ての都市を1回通ればよい(巡回しなくていい) #   ・全探索はなるべく使用しないで深さ優先探索、分子限定法を用いること # # 17 # 0 # 633 0 # 257 390 0 # 91 661 228 0 # 412 227 169 383 0 # 150 488 112 120 267 0 # 80 572 196 77 351 63 0 # 134 530 154 105 309 34 29 0 # 259 555 372 175 338 264 232 249 0 # 505 289 262 476 196 360 444 402 495 0 # 353 282 110 324 61 208 292 250 352 154 0 # 324 638 437 240 421 329 297 314 95 578 435 0 # 70 567 191 27 346 83 47 68 189 439 287 254 0 # 211 466 74 182 243 105 150 108 326 336 184 391 145 0 # 268 420 53 239 199 123 207 165 383 240 140 448 202 57 0 # 246 745 472 237 528 364 332 349 202 685 542 157 289 426 483 0 # 121 518 142 84 297 35 29 36 236 390 238 301 55 96 153 336 0 # # 'いくつかの都市と都市間を結ぶ経路があります。全ての都市を一巡するのに最も短い経路を求めるプログラムを作成せよ。'(_出発都市,_最短経路) :- グラフを読み取る(LL), グラフを作成する(LL,_都市数), findmin([_距離合計,_巡回ならび],( 巡回(_都市数,_出発都市,_巡回ならび,_距離合計)), [_距離合計,_最短経路]). グラフを読み取る(LL) :- get_split_lines('gr17.txt',[' '],LL). グラフを作成する([_都市数|R],_都市数) :- グラフを作成する([],R). グラフを作成する([],_) :- !. グラフを作成する([_|Ln],[L|R]) :- length(Ln,_都市N), 都市間の距離定義([],Ln,L), グラフを作成する(Ln,R). 都市間の距離定義(Ln,Ln,[]) :- !. 都市間の距離定義(Ln,_都市N,[A|R]) :- !. length(Ln,_都市M), assertz(都市間の距離(_都市N,_都市M,A)), assertz(都市間の距離(_都市M,_都市N,A)), 都市間の距離定義([_|Ln],_都市N,R). 巡回(_都市数,_出発都市,_巡回ならび,_距離合計) :- 都市間の距離(_出発都市,_隣接都市,_距離), 巡回(_都市数,_出発都市,_隣接都市,[_出発都市],_巡回ならび,_距離,_距離合計). 巡回(_都市数,_出発都市,_出発都市,_巡回ならび,_巡回ならび,距離合計,_距離合計) :- sort(_巡回ならび,_巡回ならびの二), length(_巡回ならびの二,_都市数),!. 巡回(_都市数,_出発都市,_隣接都市,_巡回ならびの一,_巡回ならび,距離合計の一,_距離合計) :- 都市間の距離(_隣接都市,_隣接都市の二,_距離), \+(append(_,[_隣接都市の二,_隣接都市|_],_巡回ならびの一)), _距離合計の二 is _距離合計の一 + _距離, 巡回(_都市数,_出発都市,_隣接都市の二,[_隣接都市|_巡回ならびの一],_巡回ならび,_距離合計の二,_距離合計). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/514 # # すみません、質問させてください。 # # 曲名のリストを一括置換しようとしています。具体的には"〜 by"が # 入る丸括弧だけ四角括弧"[ ]"に置き換えたいのです。 # # 例 # This is me (talk) (Composed by Johan) # ↓ # This is me (talk) [Composed by Johan] # # どのような書式にすればいいかご教示お願いします。 # '曲名のリストを一括置換しようとしています。具体的には"〜 by"が入る丸括弧だけ四角括弧"[ ]"に置き換えたいのです。'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['('|R1],L3), last(R1,')'), \+(append(_,['('|_],R1)), split(R1,['(',')',' by '],[A,B]), concat_atom([S1,'[',A,' by ',B,']',S3],_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/14 # # 【質問テンプレ】 # [1] 授業単元: Cプログラミング入門2 # [2] 問題文(含コード&リンク): #   ファイル入出力関数を使って偶数個の値が入ったsample.csvから #   偶数行の数値だけを取り出したeven.csvと #   奇数行の数値だけとりだしたodd.csvを作成し #   even.csvからodd.csvの値を引いたdiff.csvを作成しなさい。 # '偶数個の値が入ったsample.csvから偶数行の数値だけを取り出したeven.csvと奇数行の数値だけとりだしたodd.csvを作成しeven.csvからodd.csvの値を引いたdiff.csvを作成しなさい。' :- get_split_lines('sample.csv',[' ',','],LL1), '偶数行の数値だけを取り出したeven.csvと'(LL1), '奇数行の数値だけとりだしたodd.csvを作成し'(LL1), 'even.csvからodd.csvの値を引いたdiff.csvを作成する'. '偶数行の数値だけを取り出したeven.csvと'(LL) :- open('even.csv',write,Outstream1), '偶数行の数値だけを書く'(Outstream1,LL), close(Outstream1). '奇数行の値数値だけをとり出したeven.csvを作成し'(LL) :- open('odd.csv',write,Outstream2), '奇数行の数値だけを書く'(Outstream2,LL), close(Outstream2). '偶数行の数値だけを書く'(Outstream1,LL) :- !. '偶数行の数値だけを書く'(Outstream1,[_,L|R]) :- concat_atom(L,',',S), write_formatted(Outstream,'%t\n',[S]), '偶数行の数値だけを書く'(Outstream1,R). '奇数行の数値だけを書く'(Outstream1,LL) :- !. '奇数行の数値だけを書く'(Outstream1,[L,_|R]) :- concat_atom(L,',',S), write_formatted(Outstream1,'%t\n',[S]), '奇数行の数値だけを書く'(Outstream1,R). 'even.csvからodd.csvの値を引いたdiff.csvを作成する' :- get_split_lines('even.csv',[' ',','],LL1), get_split_lines('odd.csv',[' ',','],LL2), 'LL1からLL2の値を引く'(LL1,LL2,LL3), open('diff.csv',write,Outstream), csvファイルとして書く(Outstream,LL3), close(Outstream). 'LL1からLL2の値を引く'([],[],[]) :- !. 'LL1からLL2の値を引く'([A|R1],[B|R2],[C|R3]) :- C is A - B, 'LL1からLL2の値を引く'(R1,R2,R3). csvファイルとして書く(Outstream,[]) :- !. csvファイルとして書く(Outstream,[L|R]) :- concat_atom(L,',',S), write_formatted(Outstream,'%t\n',[S]), csvファイルとして書く(Outstream,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/3 # # 【質問テンプレ】 # [1] 授業単元:画像処理学 # [2] 問題文(含コード&リンク): #   指定されたエクセルファイル(csv1)の中にあるデータを読み込み #   各列ごとにそれぞれのデータに対し[0,1]区間に正規化し #   別のエクセルファイル(csv2)として出力せよ. #   正規化されたエクセルファイルの中にあるデータを読み込み #   そのデータをそれぞれx軸の値として #   y = x + a  の式との交点であるy軸の値をそれぞれ #   別のエクセルファイルとして出力(csv3)せよ. #   a の値は -1〜1 までの値を0.5刻みでランダムにとり #   同じ行では同じ関数を使うものとする. #   その後そのプログラムに加え #   各行に対し3つずつそれぞれランダムにaを決定した関数との接点を求め出力する. #   また6列目に使用したaの値をa1,a2,a3という形で出力(csv4)せよ. # '正規化されたエクセルファイルの中にあるデータを読み込みそのデータをそれぞれx軸の値として y = x + a  の式との交点であるy軸の値をそれぞれ別のエクセルファイルとして出力(csv3)せよ. a の値は -1〜1 までの値を0.5刻みでランダムにとり同じ行では同じ関数を使うものとする'(_正規化されたCSVファイル,_別のCSVファイル) :- get_split_lines(_正規化されたCSVファイル,[' ',','],LL1), 'そのデータをそれぞれx軸の値として y = x + a  の式との交点であるy軸の値を'(LL1,LL2), '別のエクセルファイル(csv2)として出力する'(_別のCSVファイル,LL2). '別のエクセルファイル(csv2)として出力する'(_別のCSVファイル,LL) :- open(_別のCSVファイル,write,Outstream), 'CSVファイルとして出力する'(Outstream,LL), close(Outstream). 'そのデータをそれぞれx軸の値として y = x + a  の式との交点であるy軸の値を'([],[]) :- !. 'そのデータをそれぞれx軸の値として y = x + a  の式との交点であるy軸の値を'([L1|R1],[L2|R2]) :- 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a), findall(B,( append(_,[A|_],L1), B is A + _a), L2), 'そのデータをそれぞれx軸の値として y = x + a  の式との交点であるy軸の値を'(R1,R2). 'CSVファイルとして出力する'(Outstream,[]) :- !. 'CSVファイルとして出力する'(Outstream,[L|R]) :- concat_atom(L,',',S), write_formatted(Outstream,'%t\n',[S]), 'CSVファイルとして出力する'(Outstream,R). 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a) :- _a is ((random mod 5) - 2) / 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/3 # # 【質問テンプレ】 # [1] 授業単元:画像処理学 # [2] 問題文(含コード&リンク): #   指定されたエクセルファイル(csv1)の中にあるデータを読み込み #   各列ごとにそれぞれのデータに対し[0,1]区間に正規化し #   別のエクセルファイル(csv2)として出力せよ. #   正規化されたエクセルファイルの中にあるデータを読み込み #   そのデータをそれぞれx軸の値として #   y = x + a  の式との交点であるy軸の値をそれぞれ #   別のエクセルファイルとして出力(csv3)せよ. #   a の値は -1〜1 までの値を0.5刻みでランダムにとり #   同じ行では同じ関数を使うものとする. #   その後そのプログラムに加え #   各行に対し3つずつそれぞれランダムにaを決定した関数との接点を求め出力する. #   また6列目に使用したaの値をa1,a2,a3という形で出力(csv4)せよ. # '指定されたエクセルファイル(csv1)の中にあるデータを読み込み各列ごとにそれぞれのデータに対し[0,1]区間に正規化し別のエクセルファイル(csv2)として出力する'(_指定されたCSVファイル,_別のCSVファイル) :- get_split_lines(_指定されたCSVファイル,[' ',','],LL1), 転置(LL1,LL2), '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'(LL2,LL3), 転置(LL3,LL4), '別のエクセルファイル(csv2)として出力する'(LL4,_別のCSVファイル). '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'([],[]) :- !. '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'([L1|R1],[L2|R2]) :- 相加平均(L1,_相加平均), 標準偏差(L1,_標準偏差), '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'(L1,_相加平均,_標準偏差,L2), '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'(R1,R2). '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'([A|R1],_相加平均,_標準偏差,[B|R2]) :- B is ( A - _相加平均) / _標準偏差, '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'(R1,_相加平均,_標準偏差,R2). '別のエクセルファイル(csv2)として出力する'(_別のCSVファイル,LL) :- open(_別のCSVファイル,write,Outstream), 'CSVファイルとして出力する'(Outstream,LL), close(Outstream). 'CSVファイルとして出力する'(Outstream,[]) :- !. 'CSVファイルとして出力する'(Outstream,[L|R]) :- concat_atom(L,',',S), write_formatted(Outstream,'%t\n',[S]), 'CSVファイルとして出力する'(Outstream,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/498 # # PHP 正規表現について # # $str = 'test1?test2/test3;test4'; # # この文字の # test1 # test2 # test3 # test4 # を取り出すにはどうしたらよいでしょうか? # # この価を # data1=test1&data2=test2&data3=test3&data4=test4 # と変換したいです # # preg_replaceを使っています # $str = preg_replace("・^([a-zA-Z0-9]+\?+[a-zA-Z0-9]+)\/+[a-zA-Z0-9];+[a-zA-Z0-9)$・","data1=$1&data2=$2&data3=$3&data4=$4",$str)); # # # これではダメみたいです # '$str = ''test1?test2/test3;test4''; この文字の test1 test2 test3 test4 を取り出すにはどうしたらよいでしょうか?'(_文字列,L) :- split(_文字列,['?','/',';'],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/985 # # 帰ってくるのがこの時間帯になるもので遅くなって申し訳ないです # ../test/read.cgi/tech/1291471791/975, ../test/read.cgi/tech/1291471791/978拝見させていただきました # ../test/read.cgi/tech/1291471791/975の41行目 ../test/read.cgi/tech/1291471791/978の42行目の # csv = calloc(1, sizeof(CSV)); # という記述に対して #        'void *' から 'CSV *' に変換できません。 # というエラーが出ます # ../test/read.cgi/tech/1291471791/979さんのは実行の仕方が解らないのでただいま勉強中です # # また../test/read.cgi/tech/1291471791/965の問ですがこれは「正規化された値にランダム数を足す」のではなく # (以下2行は手順を追うための文です) # 正規化された値(範囲は[0,1])と 「関数y=x」の交点の値を別のcsvとして出力します # ここまでだと入力と出力のファイルが同じになります # (ここから本問) # 正規化された値(範囲は[0,1])と 「関数y=x+a」の交点の値を別のcsvとして出力します # a の値は-1〜1 までの値を0.5刻みでランダムにとり # 同じ横列では同じ関数を使って交点をとるものとする # それを縦列数分繰り返して出力するということです # データは横5データ縦250データのデータです # 横列ごとに同一の関数と比較した交点の出力なので # 結果としては正規化されただけのデータと比べて横列では同じ程度の数値の変化になります # # 問3は問2の拡大版で # 正規化された値と関数y=x+aとの比較を各横列ごとに3回行うということです # セル1-1に対して「y=x+a1との交点」「y=x+a2との交点」「y=x+a3との交点」 の値を # 出力するCSVのセル1-1の位置に a1との解 , a2との解 , a3との解 # とコンマで刻んで出力します # また正規化されたCSVが横5縦250なので横6縦250のところに # 使用したaの値を a1,a2,a3 と出力せよということです # 結果的には # a1解,a2解,a3解 a1解,a2解,a3解 a1解,a2解,a3解 a1解,a2解,a3解 a1解,a2解,a3解 a1,a2,a3 # となります # この横列が250行縦に続きます # # 元データの形(行列が詳しくないもので正しい用語を使えてるかわからないので) # 1 2 3 4 5 # 1 2 3 4 5  横が5つのデータで # 〜〜〜〜〜〜〜〜〜  縦が250個のデータです # 1 2 3 4 5  並み線は147個分省略 # # 指定されたエクセルのCSVファイルの中にあるデータを読み込みそれぞれのデータの各列に列の番号の値を加えて別のCSVファイルとして出力せよ(_指定されたCSVファイル,_別のCSVファイル) :- get_split_lines(_指定されたCSVファイル,[' ',','],LL), length(Ln,3), それぞれのデータの各列に関数をLn回適用する(LL,LL2), put_lines(_別のCSVファイル,LL2). それぞれのデータの各列に関数をLn回適用する(_,[],[]) :- !. それぞれのデータの各列に関数をLn回適用する(Ln,[L1|R1],[L2|R2]) :- 各列に関数を適用する(Ln,L1,L2), それぞれのデータの各列に関数をLn回適用する(Ln,R1,R2). '各列に関数を適用する'([],L,L) :- !. '各列に関数を適用する'([_|Ln],L1,L) :- findall(_加算された値,( 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a), append(L0,[_値|_],L1), length([_|L0],_列の番号), _加算された値 is _値 + _a), L2), '各列に関数を適用する'(Ln,L2,L). 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a) :- _a is ((random mod 5) - 2) / 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/985 # # 帰ってくるのがこの時間帯になるもので遅くなって申し訳ないです # ../test/read.cgi/tech/1291471791/975, ../test/read.cgi/tech/1291471791/978拝見させていただきました # ../test/read.cgi/tech/1291471791/975の41行目 ../test/read.cgi/tech/1291471791/978の42行目の # csv = calloc(1, sizeof(CSV)); # という記述に対して #        'void *' から 'CSV *' に変換できません。 # というエラーが出ます # ../test/read.cgi/tech/1291471791/979さんのは実行の仕方が解らないのでただいま勉強中です # # また../test/read.cgi/tech/1291471791/965の問ですがこれは「正規化された値にランダム数を足す」のではなく # (以下2行は手順を追うための文です) # 正規化された値(範囲は[0,1])と 「関数y=x」の交点の値を別のcsvとして出力します # ここまでだと入力と出力のファイルが同じになります # (ここから本問) # 正規化された値(範囲は[0,1])と 「関数y=x+a」の交点の値を別のcsvとして出力します # a の値は-1〜1 までの値を0.5刻みでランダムにとり # 同じ横列では同じ関数を使って交点をとるものとする # それを縦列数分繰り返して出力するということです # データは横5データ縦250データのデータです # 横列ごとに同一の関数と比較した交点の出力なので # 結果としては正規化されただけのデータと比べて横列では同じ程度の数値の変化になります # 指定されたエクセルのCSVファイルの中にあるデータを読み込みそれぞれのデータの各列に列の番号の値を加えて別のCSVファイルとして出力せよ(_指定されたCSVファイル,_別のCSVファイル) :- get_split_lines(_指定されたCSVファイル,[' ',','],LL), それぞれのデータの各列に関数を適用する(LL,LL2), put_lines(_別のCSVファイル,LL2). それぞれのデータの各列に関数を適用する([],[]) :- !. それぞれのデータの各列に関数を適用する([L1|R1],[L2|R2]) :- 各列に関数を適用する(L1,L2), それぞれのデータの各列に関数を適用する(R1,R2). '各列に関数を適用する'(L1,L2) :- findall(_加算された値,( 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a), append(L0,[_値|_],L1), length([_|L0],_列の番号), _加算された値 is _値 + _a), L2). 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a) :- _a is ((random mod 5) - 2) / 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/965 # # 【質問テンプレ】 # [1] 授業単元:画像処理学 # [2] 問題文(含コード&リンク): #   正規化されたエクセルファイルの中にあるデータを読み込み #   そのデータをそれぞれx軸の値として #   y = x + a  の式との交点であるy軸の値をそれぞれ #   別のエクセルファイルとして出力せよ. #   a の値は -1〜1 までの値を0.5刻みでランダムにとり #   同じ行では同じ関数を使うものとする. # '正規化されたエクセルファイルの中にあるデータを読み込みそのデータをそれぞれx軸の値として y = x + a の式との交点であるy軸の値をそれぞれ別のエクセルファイルとして出力せよ. a の値は -1〜1 までの値を0.5刻みでランダムにとり同じ行では同じ関数を使うものとする. ' :- '正規化されたエクセルファイルの中にあるデータを読み込み'(_正規化されたCSVファイル,LL), 'そのデータをそれぞれx軸の値として y = x + a の式との交点であるy軸の値に変換'(LL,LL2), 別のCSVファイルに出力する(_別のCSVファイル,LL2). '正規化されたエクセルファイルの中にあるデータを読み込み'(_正規化されたCSVファイル,LL) :- get_split_lines(_正規化されたCSVファイル,[' ',','],LL). 'そのデータをそれぞれx軸の値として y = x + a の式との交点であるy軸の値に変換'([],[]) :- !. 'そのデータをそれぞれx軸の値として y = x + a の式との交点であるy軸の値に変換'([L1|R1],[L2|R2]) :- 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a), findall(Y,( append(_,[X|_],L1), Y is X + _a), L2), 'そのデータをそれぞれx軸の値として y = x + a の式との交点であるy軸の値に変換'(R1,R2). 'aの値は-1〜1 までの値を0.5刻みでランダムにとり'(_a) :- _a is ((random mod 5) - 2) / 2. 別のCSVファイルに出力する(_別のCSVファイル,LL) :- open(_別のCSVファイル,write,Outstream), append(_,[L|R],LL), concat_atom(L,',',S), write_formatted(Outstream,'%t\n',[S]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/956 # # 【質問テンプレ】 # [1] 授業単元:画像処理学 # [2] 問題文(含コード&リンク): #   指定されたエクセルファイルの中にあるデータを読み込み #   各列ごとにそれぞれのデータに対し[0,1]区間に正規化し #   別のエクセルファイルとして出力せよ. # '指定されたエクセルファイルの中にあるデータを読み込み各列ごとにそれぞれのデータに対し[0,1]区間に正規化し別のエクセルファイルとして出力せよ.'(_指定されたCSVファイル,_別のCSVファイル) :- get_split_lines(_指定されたCSVファイル,[' ',','],LL), 転置(LL,LL1), 行単位に正規化(LL1,LL2), 転置(LL2,LL3), csvファイルとして出力する(_別のcsvファイル,LL3). 行単位に正規化([],[]) :- !. 行単位に正規化([L1|R1],[L2|R2]) :- 相加平均(L1,_相加平均), 標準偏差(L1,_標準偏差), 正規化(L1,_相加平均,_標準偏差,L2), 行単位に正規化(R1,R2). 正規化([],_,_,[]) :- !. 正規化([A|R1],_相加平均,_標準偏差,[B|R2]) :- B is (_相加平均 - A) / _標準偏差, 正規化(R1,_相加平均,_標準偏差,R2). csvファイルとして出力する(_別のcsvファイル,LL) :- open(_別のcsvファイル,write,Outstream), append(_,[L|R],LL), concat_atom(L,',',S), write_formatted(Outstream,'%t\n',[S]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/937 # # 【質問テンプレ】 # [1] 授業単元:画像処理学 # [2] 問題文(含コード&リンク): #   指定されたエクセルのCSVファイルの中にあるデータを読み込み #   それぞれのデータの各列に列の番号の値を加えて #   別のCSVファイルとして出力せよ. 指定されたエクセルのCSVファイルの中にあるデータを読み込みそれぞれのデータの各列に列の番号の値を加えて別のCSVファイルとして出力せよ(_指定されたCSVファイル,_別のCSVファイル) :- get_split_lines(_指定されたCSVファイル,[' ',','],LL), それぞれのデータの各列に列の番号の値を加えて(LL,LL2), put_lines(_別のCSVファイル,LL2). それぞれのデータの各列に列の番号の値を加えて([],[]) :- !. それぞれのデータの各列に列の番号の値を加えて([L1|R1],[L2|R2]) :- findall(_加算された値,( append(L0,[_値|_],L1), length([_|L0],_列の番号), _加算された値 is _値 + _列の番号), L2), それぞれのデータの各列に列の番号の値を加えて(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/391 # # 質問です。 # 下記のような配列の中から、 # (2)〜(4)までのみを抽出したいと思っています。 # #  (1) testa@hoge #  (2) _testb@hage #  (3) _testc@noge #  (4) _testd@nage #  (5) _teste@n_ge # # ルールとしては、 #  ・頭に[_]が付いている事、 #  ・@の後ろに[n_]が付いていない事 # です。上記前提で下記のように書いたのですが、 # これですと(2)しか抽出されませんでした。 # #  $test =~ /^_.*@[^(n_)]/ # # @の後ろの正規表現が悪いのだと思うんですが、 # この場合どのように書けばいいんでしょうか。 # ご教示お願いしますm(_ _)m # 'ルールとしては、頭に[_]が付いている事、@の後ろに[n_]が付いていない事'(_複数行文字列,_適合行) :- split(_複数行文字列,['\n'],_行ならび), append(_,[_行|_],_行ならび), 'ルールとしては、頭に[_]が付いている事、@の後ろに[n_]が付いていない事'(_行). 'ルールとしては、頭に[_]が付いている事、@の後ろに[n_]が付いていない事'(_文字列) :- \+(sub_atom(_文字列,0,1,_,'_')), \+(sub_atom(_文字列,_,3,_,'@n_')). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/326 # # PHP 正規表現 # # PHPの正規表現を勉強しているのですが、どうもうまくいきません。今回は一番簡単な正規表現をつくったのですが、どうやったらよいのでしょうか。 # # $h = '(名前)様の会員IDは(abc12)で、(5)番目に偉い方です。'; # # とあったら、名前、会員ID、番号を抜き出すには、どのようにしたらよいのでしょうか? # 実際に()は使用しません。 # また、$1 や $2 などを使いたいのですが、解説までできればお願いしたいです。 # 一応自分なりに考えました。 # preg_match('/^*.([a-zA-Z0-9]){2}([0-9]+)','名前$2.ID$1 $3 番目に偉い'); # ()を使えば、2つマッチさせたいときなどに分けることができるのでしょうか? # (名前)様は(数字) # 例:太郎様は5 # # このとき太郎様という日本語の文字を取得するには/^(+.)([0-9])$/ # # ここで名前は$1になり、数字は$2になるのでしょうか? # どのような時に$1や$2がどっちがどっちなのかは、どのようにしたらわかるのでしょうか? # # # 長々した質問すいません。わかるかた教えてください。 # '(名前)様の会員IDは(abc12)で、(5)番目に偉い方です。とあったら、名前、会員ID、番号を抜き出すには、どのようにしたらよいのでしょうか? 実際に()は使用しません。 '(_名前,_会員ID,_n番目) :- _文字列 = '名前様の会員IDはabc12で、5番目に偉い方です。', '名前、会員ID、番号を抜き出す'(_文字列,_名前,_会員ID,_n番目). '名前、会員ID、番号を抜き出す'(_文字列,_名前,_会員ID,_n番目) :- split(_文字列,[様の会員IDは,'で、',番目に],[_名前,_会員ID,_n番目|_]. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/92 # # IPを正規表現でチェックしたいのですが # 210.000.111.1〜210.000.111.255 # 215.100.000.1〜215.100.000.255 # の2つに当てはまる場合、TRUE(int1)をかえすにはどうすればいいでしょうか? # 以下のようにやってみたのですが他のIPでもint(1)がかえってきます。 # # preg_match('/^210\.000\.111\.([0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ || ^215\.100\.000\.([0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/', $_SERVER['REMOTE_ADDR']) # # 'IPが210.000.111.1〜210.000.111.255 か 215.100.000.1〜215.100.000.255 の範囲にある'(IP) :- split(IP,['.'],[210,0,111,D]), D >= 1, D =< 255,!. 'IPが210.000.111.1〜210.000.111.255 か 215.100.000.1〜215.100.000.255 の範囲にある'(IP) :- split(IP,['.'],[215,100,0,D]), D >= 1, D =< 255,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'IPがある範囲にあるか'(IPの文字列表現,IPの範囲表現) :- split(IPの文字列表現,[U1,U2,U3,U4]), split(IPの範囲表現,['~'],[IP1,IP2]), split(IP1,['.'],[A1,A2,A3,A4]), split(IP2,['.'],[B1,B2,B3,B4]), U1 >= A1,U1 =< B1, U2 >= A2,U2 =< B2, U3 >= A3,U3 =< B3, U4 >= A4,U4 =< B4,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/86 # # php4.3.11です # --------------------------------- # $str = <<< DOC_END # あああああ # いいいいい # <html_start> # ううううう # えええええ # <html_end> # おおおおお # DOC_END; # # $pattern = "/<html_start>(.*)<html_end>/"; # $replacement = 'aaaabbbb'; # # $res = preg_replace($pattern, $replacement, $str); # print_r($res); # --------------------------------- # と出力してみましたが何も表示されませんでした。 # ホントは「あああああいいいいいaaaabbbbおおおおお」と出て欲しかったのですが…。 # 最終的には<html_start><html_end>で囲まれた範囲に # PHPのhtmlspecialchars()やnl2br()関数を適用して出力したいです。 # 'あああああ\nいいいいい\n\nううううう\nえええええ\n\n\nおおおおお\n を あああああいいいいいaaaabbbbおおおおお に置換する'(_置換された文字列) :- split(''あああああ\nいいいいい\n\nううううう\nえええええ\n\n\nおおおおお\n',['\n'],L), append(L0,[''|R1],[''|R2],L), append(L0,[aaaabbb|R2],L2), concat_atom(L2,_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/467 # # ●正規表現の使用環境 # .net(C#3.0) # # ●検索か置換か? # 検索 # # ●説明 # 空白をデリミタとして、最初の文字列を取得したい # 空白は半角全角両方あり、複数連続することもあり得る # ただし、()や[]で囲まれる文字列はスルー(空白として処理する) # 正規表現一発で抜き出したいです # # 下記例の各行は全て「山田太郎」だけ抽出されるようにしたいです # # 山田太郎 39才 #  山田太郎 39才 # (A社) 山田太郎 39才 # (A社)山田太郎  39才 # (A社 B課)山田太郎 39才 # 山田太郎(A社)39才 '空白をデリミタとして、最初の文字列を取得したい。空白は半角全角両方あり、複数連続することもあり得るただし、()や[]で囲まれる文字列はスルー(空白として処理する)'(_文字列,_最初の文字列) :- split(_文字列,[' ',' ','(',')','[',']'],L1), '空白をデリミタとして、最初の文字列を取得したい。'(L1,_最初の文字列). '空白をデリミタとして、最初の文字列を取得したい。'(L1,Atom) :- '()や[]で囲まれる文字列はスルー(空白として処理する)'(L1,L2), '空白をデリミタとして、最初の文字列を取得したい。'(L2,Atom),!. '空白をデリミタとして、最初の文字列を取得したい。'(L1,Atom) :- 空白は半角全角両方あり、複数連続することもあり得る(L1,L2), '空白をデリミタとして、最初の文字列を取得したい。'(L2,Atom),!. '空白をデリミタとして、最初の文字列を取得したい。'([A|_],Atom). '()や[]で囲まれる文字列はスルー(空白として処理する)'(L1,L2) :- append(L0,['('|R1],[')'|R2],L1), append(L0,[' '|R2],L2),!. '()や[]で囲まれる文字列はスルー(空白として処理する)'(L1,L2) :- append(L0,['['|R1],[']'|R2],L1), append(L0,[' '|R2],L2),!. 空白は半角全角両方あり、複数連続することもあり得る([],[]) :- !. 空白は半角全角両方あり、複数連続することもあり得る([' '|R1],R2) :- 空白は半角全角両方あり、複数連続することもあり得る(R1,R2),!. 空白は半角全角両方あり、複数連続することもあり得る([' '|R1],R2) :- 空白は半角全角両方あり、複数連続することもあり得る(R1,R2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/385 # # ●正規表現の使用環境 # .net Framework 2.0 - 3.5 (C#) # # ●検索か置換か? # 検索 # # ●説明 # artist, titleの各グループの文字列を取得したい # # ●対象データ # Artist - Title # # ●希望する結果 # artist = Artist # title = Title # # よろしくおねがいします。 # 'artist, titleの各グループの文字列を取得したい'(_対象データ,_希望する結果) :- split(_対象データ,[' '],L), 'artist, titleの切り出し'(L,Artist,Title), write_formatted_atom(_希望する結果,'artist = %t\ntitle = %t',[Artist,Title]). 'artist, titleの切り出し'([Artist,Title],Artist,Title) :- !. 'artist, titleの切り出し'([Artist,_,Title|_],Artist,Title) :- !. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/785 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 2*2行列 X の逆行列を計算し、出力するプログラムを作れ # (公式を使って構わない) # # ただし、行列 X の要素は全て浮動小数点型であるとする # 要素の値は標準入力で与える # # ヒント # 逆行列が定義できないときはエラーを出力して終わる # '2*2行列Xの逆行列を計算し、出力する' :- 行列の入力([[X11,X12],[X21,X22]],[[Y11,Y12],[Y21,Y22]]), '2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],[[Y11,Y12],[Y21,Y22]]), 逆行列表示([[X11,X12],[X21,X22]],[[Y11,Y12],[Y21,Y22]]),!. '2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],[[Y11,Y12],[Y21,Y22]]) :- '2×2行列の行列式の計算'([[X11,X12],[X21,X22]],_行列式の値), '2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],_行列式の値,[[Y11,Y12],[Y21,Y22]]). '2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],0.0,[[Y11,Y12],[Y21,Y22]]) :- write('逆行列は作れません\n'),!,fail. '2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],0,[[Y11,Y12],[Y21,Y22]]) :- write('逆行列は作れません\n'),!,fail. '2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],_行列式の値,[[Y11,Y12],[Y21,Y22]]) :- Y11 is X22 / _行列式の値, Y12 is ((-1) * X12) / _行列式の値, Y21 is ((-1) * X21) / _行列式の値, Y22 is X11 / _行列式の値. '2×2行列の行列式の計算'([[X11,X12],[X21,X22]],_行列式の値) :- _行列式の値 is X11 * X22 - X12 * X21. 行列の入力(LL) :- length(LL,2), findall(L1, append(L0,[L1|_],LL), length([_|L0],Nth), write_formatted('行列の%t行目をカンマ区切りで2列入力してください\n',[Nth]), カンマ区切りによる二項入力(L1)), LL). カンマ区切りによる二項入力(L) :- get_line(Line), カンマ区切りによる二項入力診断(Line,L),!. カンマ区切りによる二項入力(L) :- カンマ区切りによる二項入力(L). カンマ区切りによる二項入力診断(Line,L) :- split(Line,[','],L), length(L,2), すべて数値(L),!. カンマ区切りによる二項入力診断(Line,L) :- write('入力された%tからは二項を取り出すことができません。再入力をお願いします。\n'), fail. すべて数値([]) :- !. すべて数値([V|R]) :- number(V),すべて数値(R). 逆行列表示([[X11,X12],[X21,X22]],[[Y11,Y12],[Y21,Y22]]) :- 行列表示([[X11,X12],[X21,X22]]), write('の逆行列は\n'), 行列表示([[Y11,Y12],[Y21,Y22]]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/778 # # 1] 授業単元:Cプロ実習 # [2] 問題文(含コード&リンク): # 2つの4×4行列を2次元配列に格納し、それらの積を求めるプログラムを作成せよ。 # 以下の関数を必ず利用すること。 # 関数の引数の型では1次元目が空白になっているが、 #  main関数では4×4の通常の2次元配列を用いればよい。 # '2つの4×4行列を2次元配列に格納し、それらの積を求める' :- 行列一の入力(LL1), 行列二の入力(LL2), 行列の積(LL1,LL2,LL3), 結果の表示(LL1,LL2,LL3). 行列一の入力(LL1) :- length(LL1,4), findall(L1, append(L0,[L1|_],LL1), length([_|L0],Nth), write_formatted('第二行列の%t行目をカンマ区切りで4列入力してください\n',[Nth]), カンマ区切りによる四項入力(L1)), LL1). 行列二の入力(LL2) :- length(LL2,4), findall(L2, append(L0,[L2|_],LL2), length([_|L0],Nth), write_formatted('第二行列の%t行目をカンマ区切りで4列入力してください\n',[Nth]), カンマ区切りによる四項入力(L2)), LL2). カンマ区切りによる四項入力(L) :- get_line(Line), カンマ区切りによる四項入力診断(Line,L),!. カンマ区切りによる四項入力(L) :- カンマ区切りによる四項入力(L). カンマ区切りによる四項入力診断(Line,L) :- split(Line,[','],L), length(L,4), すべて数値(L),!. カンマ区切りによる四項入力診断(Line,L) :- write('入力された%tからは四項を取り出すことができません。再入力をお願いします。\n'), fail. すべて数値([]) :- !. すべて数値([V|R]) :- number(V),すべて数値(R). 行列の積(L1,L2,X) :- 行列の転置(L2,L4), 行列の積_1(L1,L4,X). 行列の積_1([],_,[]) :- !. 行列の積_1([A|R1],L,[S1|R3]) :- 行列の積_2(A,L,S1), 行列の積_1(R1,L,R3). 行列の積_2(_,[],[]) :- !. 行列の積_2(A,[B|R2],[C|R3]) :- 行列の積_3(A,B,C), 行列の積_2(A,R2,R3). 行列の積_3([],[],0) :- !. 行列の積_3([A|R1],[B|R2],S) :- S1 is A * B, 行列の積_3(R1,R2,S2), S is S1 + S2. 行列の転置([],[],[]) :- !. 行列の転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 行列の転置(R2,R3,R4). 行列の転置([[]|_],[]) :- !. 行列の転置(L,[L1|R2]) :- 行列の転置(L,L2,L1), 行列の転置(L2,R2). 結果の表示(LL1,LL2,LL3) :- 行列の表示(LL1), write(' ×\n'), 行列の表示(LL2), write(' =\n'), 行列の表示(LL3). 行列の表示(LL) :- write('['), 行列の表示の一(LL). 行列の表示の一([]) :- write(']\n'),!. 行列の表示の一([L]) :- write_formatted(' %t]\n',[L]),!. 行列の表示の一([L|R]) :- write_formatted(' %t\n',[L]), 行列の表示の一(R),! % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/773 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 例題11-1において、第1回~第3回のそれぞれの小テストにおいて # 4人の学生の平均点を出力するプログラムを作れ # なお第1回~第3回のそれぞれの平均点は配列の宣言と生成double b[3]とし # この配列に代入するプログラムとせよ # 表('A 45 50 60\nB 75 95 45\nC 100 90 95\nD 60 70 80\n'). '4人の学生の平均点を出力する' :- 表(_表), split(_表,['\n'],L1), findall([_名前,_平均点],( append(_,[[_名前|R1]|_],L1), avg(R1,_平均点)), _4人の学生の平均点ならび), append(_,[[_名前,_平均点]|R],_4人数の学生の平均点ならび), write_formatted('%t,%t点\n',[_名前,_平均点]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/772 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 例題11-1において、A~Dの学生それぞれに対し # 第1回~第3回の小テストの平均点を求めるプログラムを作れ # なおA~Dそれぞれの平均点は、配列の宣言と生成double a[4]をしてから # この配列のa[0]から順に代入するようにせよ # # 上記の例題11-1は # 4人の学生A,B,C,Dの3回のテストの点数が表のようになっている # 表中の12個の点数の平均を求めよ # A 45 50 60 # B 75 95 45 # C 100 90 95 # D 60 70 80 # # という問題です。 表('A 45 50 60\nB 75 95 45\nC 100 90 95\nD 60 70 80\n'). '4人の学生A,B,C,Dの3回のテストの点数が表のようになっている表中の12個の点数の平均を求めよ'(_平均点) :- 表(_表), split(_表,['\n'],L1), findall(L2,( append(_,[Line|_],L1), split(Line,[' '],L2)), L3), findavg(_点数,( append(_,[[_|R1]|_],L3), append(_,[_点数|_],R1)), _平均点). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/729 # # [1] 授業単元:Cプログラミング # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1309111.txt.html # 構造体を用いて一人分の名前,性別,年齢,身長[m],体重[kg],BMI値,BMI判定を処理するプログラムを # 以下の手順(1)〜(4)に従って作成せよ.ただし,BMIの判定はBMI値が # 18.5未満なら1, 18.5以上25未満なら2,25以上30未満なら3,30以上なら4 とする. # # (1) 次のようなPERSON構造体を定義せよ # # 【PERSON構造体】 # # メンバ:名前を代入する配列 name # 性別を代入する変数 gender # 年齢を代入する変数 age # 身長を代入する変数 height # 体重を代入する変数 weight # BMI値を代入する変数 bmi # BMI判定結果を代入する変数judge # # (2) 以下の仕様を満たす関数makePersonalDataを作成せよ. # # ◎char *data = "Andrew M 38 1.805 105.2"; #  のように文字列で与えられている一人分の名前,性別,年齢,身長[m],体重[kg]のデータを引数として受け取る # # # ◎受け取った文字列を名前,性別,年齢,身長,体重のデータに分割し,PERSON構造体 #  変数のメンバ変数name, gender, age, height, weightに代入する # # ◎BMI値を計算し,メンバ変数bmiに代入する # # ◎BMI値を判定し,判定結果をメンバ変数judgeに代入する # # ※BMI値の計算と判定は以下に示す関数calc_bmiを利用する # # (3) 以下の仕様を満たす関数printPersonalDataを作成せよ. # ◎PERSON構造体変数を引数として受け取る # ◎PERSON構造体のメンバを1行で出力する.順番は名前,性別,年齢,身長,体重, #  BMI値,BMI判定とし,タブ区切り(’\t’を用いる)とする. #  Andrew M 38 1.805000 105.200000 32.289501 4 # # (4) (1)〜(3)で作成した構造体と関数が正しく動作することを次のmain関数を用いて確認せよ. # # 【実行結果】 # # Andrew M 38 1.805000 105.200000 32.289501 4 # # Jane F 31 1.724000 75.400000 25.368619 3 # # Thomas M 43 1.892000 65.100000 18.186064 1 # # 個人データの作成(_個人データ文字列,_名前,_性別,_年齢,_身長,_体重) :- split(_個人データ文字列,[' '],[_名前,_性別,_年齢,_身長,_体重]), 'BMI値の判定'(_身長,_体重,_BMI値,_BMI判定), assertz(個人データ(_名前,_性別,_年齢,_身長,_体重,_BMI値,_BMI判定)). 個人データの表示 :- 個人データ(_名前,_性別,_年齢,_身長,_体重,_BMI値,_BMI判定), write_formatted('%t\t%t\t%t\t%t\t%t\t%t\t%t\n',[_名前,_性別,_年齢,_身長,_体重,_BMI値,_BMI判定]), fail. 個人データの表示. 'BMI値の判定'(_身長,_体重,_BMI値,_BMI判定) :- _BMI値 is _体重 / ( _身長 * _身長), 'BMI値の判定'(_BMI値,_BMI判定). 'BMI値の判定'(_BMI値,1) :- _BMI値 < 18.5,!. 'BMI値の判定'(_BMI値,2) :- _BMI値 < 25.0,!. 'BMI値の判定'(_BMI値,3) :- _BMI値 < 30.0,!. 'BMI値の判定'(_BMI値,4). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/721 # # firefox3.6のbockmark形式の a.html、b.htmlを # マージして c.html として出力するプログラムを誰か書いてください。 # # 例; # <a.html> # <link>ホームページA # <link>ホームページB # <link>ホームページC # # <b.html> # <link>ホームページA # <link>ホームページY # <link>ホームページZ # # <diff.html> # <link>ホームページY # <link>ホームページZ # # <c.html> # <link>ホームページA # <link>ホームページB # <link>ホームページC # <link>ホームページY # <link>ホームページZ # # a.html と b.html の差分 diff.html # a.html に diff.html を追加し c.html # 'a.html と b.html の差分 diff.html'(_a_html,_b_html,_差分html) :- 'bookmarks.htmlの解析'('a.html',_頭部ならび_a,_リンク部ならび_a,_末尾部ならび_a), 'bookmarks.htmlの解析'('b.html',_頭部ならび_b,_リンク部ならび_b,_末尾部ならび_b), 差分の生成(_リンク部ならび_b,_リンク部ならび_a,_差分リンク部), append(_頭部ならび_a,_差分リンク部,_末尾ならび_a,_差分html行ならび), put_lines('diff.html',_差分hmtl行ならび). 'a.html に diff.html を追加し c.html'(_a_html,_差分html,c_html) :- 'bookmarks.htmlの解析'('a.html',_頭部ならび_a,_リンク部ならび_a,_末尾部ならび_a), 'bookmarks.htmlの解析'('diff.html',_頭部ならび_d,_リンク部ならび_d,_末尾部ならび_d), append(_リンク部_a,_リンク部_d,_新しいリンク部), append(_頭部ならび_a,_新しいリンク部,_末尾ならび_a,_c_html行ならび), put_lines('c.html',_c_html行ならび),!. 'bookmarks.htmlの解析'(HTMLファイル,_頭部ならび,_リンク部ならび,_末尾部ならび) :- get_lines(HTMLファイル,Lines), 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(Lines,_頭部ならび,_リンク部ならび,_末尾部ならび). 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(Lines,_頭部ならび,_リンク部ならび,_末尾部ならび) :- 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。'(Lines,_頭部ならび,_残りならび), 'その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(_残りならび,_リンク部ならび,_末尾部ならび),!. 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。'(Lines,_頭部ならび,_残りならび) :- append(_頭部ならびの一,[_行|_残りならび],Lines), atom_chars(_行,['<','D','L','>'|_]), append(_頭部ならびの一,[_行],_頭部ならび),!. 'その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(_残りならび,_リンク部ならび,_末尾部ならび) :- append(_リンク部,[_行2|_末尾部ならびの一],_残りならび), atom_chars(_行2,['<','/','D','L','>'|_]), _末尾ならび = [_行2|_末尾部ならび],!. 差分の生成(_リンク部ならび_1,_リンク部ならび_2,_差分リンク部) :- 'URL部分だけ抜き取る'(_リンク部_1,_リンク部_2,_参照URLならび_1,_参照URLならび_2), findall(_URL,( append(_,[_URL|_],_参照URLならび_2), \+(append(_,[_URL|_],_参照URLならび_1))), _差分参照URLならび), 行とURLを対応させる(_リンク部ならび_2,_差分参照URLならび,_差分リンク部). 'URL部分だけ抜き取る'(_リンク部_1,_リンク部_2,_参照URL_1,_参照URL_2) :- 参照URLならび(_リンク部ならび_1,_参照URL_1), 参照URLならび(_リンク部ならび_2,_参照URL_2),!. 参照URLならび(_リンク部ならび,_参照URLならび) :- findall(_参照URL,( append(_,[_行|_],_リンク部ならび), 参照URL(_行,_参照URL)), _参照URLならび). 参照URL(_行,_参照URL) :- split(_行,['"'],[_,_参照URL|_]),!. 行とURLを対応させる(_リンク部ならび_2,_差分参照URLならび,_差分リンク部) :- findall(_行,( append(_,[_行|_],_リンク部ならび_2), 参照URL(_行,_参照URL), append(_,[_参照URL|_],_差分参照URLならび)), _差分リンク部). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/721 # # firefox3.6のbockmark形式の a.html、b.htmlを # マージして c.html として出力するプログラムを誰か書いてください。 # # 例; # <a.html> # <link>ホームページA # <link>ホームページB # <link>ホームページC # # <b.html> # <link>ホームページA # <link>ホームページY # <link>ホームページZ # # <diff.html> # <link>ホームページY # <link>ホームページZ # # <c.html> # <link>ホームページA # <link>ホームページB # <link>ホームページC # <link>ホームページY # <link>ホームページZ # # a.html と b.html の差分 diff.html # a.html に diff.html を追加し c.html # 'a.html と b.html の差分 diff.html'(_a_html,_b_html,_差分html) :- 'bookmarks.htmlの解析'('a.html',_頭部ならび_a,_リンク部ならび_a,_末尾部ならび_a), 'bookmarks.htmlの解析'('b.html',_頭部ならび_b,_リンク部ならび_b,_末尾部ならび_b), 差分の生成(_リンク部ならび_b,_リンク部ならび_a,_差分リンク部), append(_頭部ならび_a,_差分リンク部,_末尾ならび_a,_差分html行ならび), put_lines('diff.html',_差分hmtl行ならび). 'a.html に diff.html を追加し c.html'(_a_html,_差分html,c_html) :- 'bookmarks.htmlの解析'('a.html',_頭部ならび_a,_リンク部ならび_a,_末尾部ならび_a), 'bookmarks.htmlの解析'('diff.html',_頭部ならび_d,_リンク部ならび_d,_末尾部ならび_d), append(_リンク部_a,_リンク部_d,_新しいリンク部), append(_頭部ならび_a,_新しいリンク部,_末尾ならび_a,_c_html行ならび), put_lines('c.html',_c_html行ならび),!. 'bookmarks.htmlの解析'(HTMLファイル,_頭部ならび,_リンク部ならび,_末尾部ならび) :- get_lines(HTMLファイル,Lines), 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(Lines,_頭部ならび,_リンク部ならび,_末尾部ならび). 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(Lines,_頭部ならび,_リンク部ならび,_末尾部ならび) :- 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。'(Lines,_頭部ならび,_残りならび), 'その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(_残りならび,_リンク部ならび,_末尾部ならび),!. 'bookmarks.htmlの構造は最初に頭部があり、行頭にDLタグがある行まで続く。'(Lines,_頭部ならび,_残りならび) :- append(_頭部ならびの一,[_行|_残りならび],Lines), atom_chars(_行,['<','D','L','>'|_]), append(_頭部ならびの一,[_行],_頭部ならび),!. 'その後がリンク部。行頭に/DLタグが来たらその行から以後は末尾部。'(_残りならび,_リンク部ならび,_末尾部ならび) :- append(_リンク部,[_行2|_末尾部ならびの一],_残りならび), atom_chars(_行2,['<','/','D','L','>'|_]), _末尾ならび = [_行2|_末尾部ならび],!. 差分の生成(_リンク部ならび_1,_リンク部ならび_2,_差分リンク部) :- 'URL部分だけ抜き取る'(_リンク部_1,_リンク部_2,_参照URLならび_1,_参照URLならび_2), findall(_URL,( append(_,[_URL|_],_参照URLならび_2), \+(append(_,[_URL|_],_参照URLならび_1))), _差分参照URLならび), 行とURLを対応させる(_リンク部ならび_2,_差分参照URLならび,_差分リンク部). 'URL部分だけ抜き取る'(_リンク部_1,_リンク部_2,_参照URL_1,_参照URL_2) :- 参照URLならび(_リンク部ならび_1,_参照URL_1), 参照URLならび(_リンク部ならび_2,_参照URL_2),!. 参照URLならび(_リンク部ならび,_参照URLならび) :- findall(_参照URL,( append(_,[_行|_],_リンク部ならび), 参照URL(_行,_参照URL)), _参照URLならび). 参照URL(_行,_参照URL) :- split(_行,['"'],[_,_参照URL|_]),!. 行とURLを対応させる(_リンク部ならび_2,_差分参照URLならび,_差分リンク部) :- findall(_行,( append(_,[_行|_],_リンク部ならび_2), 参照URL(_行,_参照URL), append(_,[_参照URL|_],_差分参照URLならび)), _差分リンク部). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/514 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルに保存された携帯電話データをコマンド選択により処理する # 携帯電話情報管理プログラムを作成せよ # # 右のテキストファイルを左のように書き換える(昇順ソート) # 2 SC-02B docomo 12 118     1 003SH softbank 12 139 # 3 IS03 au 13 138        → 2 SC-02B docomo 12 118 # 1 003SH softbank 12 139     3 IS03 au 13 138 # # 鍵情報(Line,_鍵) :- split(Line,[' '],[_,_,_,_鍵]). 切り出し指定行数(100). 昇順併合整列(_対象ファイル) :- tmpnam(_併合ファイル1), open(_併合ファイル1,read,Instream1), open(_対象ファイル,read,Instream), 昇順併合整列(Instream,Instream1,_併合ファイル1,_整列済みファイル), 整列済みファイルの表示(_整列済みファイル). 昇順併合整列(Instream,Instream1,_併合ファイル,_併合ファイル) :- at_end_of_stream(Instream), close(Instream), close(Instream1). 昇順併合整列(Instream,Instream1,_,_併合ファイル) :- tmpnam(_併合ファイル1), 先頭から指定行の整列(100,Instream,_整列したならび), open(_併合ファイル,write,Outstream), 昇順併合整列(_整列したならび,Instream1,_Outstream), close(Outstream), close(Instream1), open(_併合ファイル1,read,Instream2), 昇順併合整列(Instream,Instream2,_併合ファイル1,_併合ファイル). 昇順併合整列(_整列したならび,_整列ファイル,_併合ファイル) :- open(_整列ファイル,read,Instream), open(_併合ファイル,write,Outstream), get_line(Instream,Line), 昇順併合整列(Instream,Outstream,_整列したならび,Line), close(Outstream), close(Instream). 先頭から指定行の整列(Instream,_整列したならび) :- 切り出し指定行数(_切り出し指定行数), get_line(Insteam,Line), 先頭から指定行の切り出し(100,Instream,Line,_100行), 鍵指定整列(_切り出し指定行数,_整列したならび),!. 先頭から指定行の切り出し(1,Instream,Line,[Line]) :- !. 先頭から指定行の切り出し(_,Instream,end_of_file,[]) :- !. 先頭から指定行の切り出し(N,Instream,Line,[Line|R]) :- get_line(Instream,Line2), N1 is N - 1, 先頭から指定行の切り出し(N,Instream,Line2,R). 昇順併合整列(Instream,Outstream,[],end_of_file) :- !. 昇順併合整列(Instream,Outstream,[],Line) :- write_formatted(Outstream,'%t\n',[Line]), get_line(Instream,Line2), 昇順併合整列(Instream,Outstream,[],Line2),!. 昇順併合整列(Instream,Outstream,[A|R],Line) :- A @>= Line, get_line(Instream,Line2), 昇順併合整列(Instream,Outstream,[A|R],Line2),!. 昇順併合整列(Instream,Outstream,[A|R],Line) :- A @< Line, write_formatted(Outstream,'%t\n',[A]), 昇順併合整列(Instream,Outstream,R,Line),!. 昇順併合(Instream1,Instream2,Outstream) :- get_line(Instream1,Line1), get_line(Instream2,Line2), 昇順併合(Instream1,Instream2,Outstream,Line1,Line2). 昇順併合(Instream1,Instream2,Outstream,Line1,Line2) :- 鍵情報(Line1,_鍵1), 鍵情報(Line2,_鍵2), _鍵1 @=< _鍵2, write_formatted(Outstream,'%t\n',[Line1]), get_line(Instream1,Line), 昇順併合(Instream1,Instream2,Outstream,Line,Line2). 昇順併合(Instream1,Instream2,Outstream,Line1,Line2) :- write_formatted(Outstream,'%t\n',[Line2]), get_line(Instream2,Line), 昇順併合(Instream1,Instream2,Outstream,Line1,Line). 整列済みファイルの表示(_整列済みファイル) :- open(_整列済みファイル,read,Instream), get_line(Instream,Line), 整列済みファイルの表示(Instream,Line), close(Instream). 整列済みファイルの表示(_,end_of_file) :- !. 整列済みファイルの表示(Instream,Line) :- write_formatted('%t\n',[Line]), get_line(Instream,Line2), 整列済みファイルの表示(Instream,Line2). 鍵指定昇順整列([],[]) :- !. 鍵指定昇順整列([A|R],L) :- 鍵指定昇順分割(A,R,_Aより小さい,_Aと等しいか大きい), 鍵指定昇順整列(_Aより小さい,L1), 鍵指定昇順整列(_Aと等しいか大きい,L2), append(L1,[A|L2],L). 鍵指定昇順分割(A,[],[],[]) :- !. 鍵指定昇順分割(A,[_行|R],_Aより小さい,_Aと等しいか大きい) :- 鍵情報(A,_鍵1), 鍵情報(_行,_鍵2), _鍵1 @> _鍵2, 鍵指定昇順分割(A,R,[_行|_Aより小さい],_Aと等しいか大きい). 鍵指定昇順分割(A,[_行|R],_Aより小さい,_Aと等しいか大きい) :- 鍵情報(A,_鍵1), 鍵情報(_行,_鍵2), _鍵1 @=< _鍵2, 鍵指定昇順分割(A,R,_Aより小さい,[_行|_Aと等しいか大きい]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/694 # # Flexible Renamerというソフトで音楽ファイル名の検索&一括置換したいのですが、 # # 対象: aaa_bbb_01ccc.mp3 # ↓ # 結果: aaa_bbb_01_ccc.mp3 # # "_"区切りの三番目の2桁数字部分が区切られていないヤツを(選び)全て結果のように区切りたい、ということです。 # # よろしくおねがいします。 # % sub_atom/10 は http://nojiriko.asai/prolog/t264_u.html を参照 '対象:aaa_bbb_01ccc.mp3 -> 結果:aaa_bbb_01_ccc.mp3 "_"区切りの三番目の2桁数字部分が区切られていないヤツを(選び)全て結果のように区切りたい'(_名前,_区切り直された名前) :- split(_名前,['_'],[_項1,_項2,_項3]), sub_atom(_項3,_検索位置,1,_残り文字数,H,A,T,_,_,_), \+((A@>='0',A@=<'9')), concat_atom([_項1,'_',_項2,'_',H,'_',A,T],_区切り直された名前),!. '対象:aaa_bbb_01ccc.mp3 -> 結果:aaa_bbb_01_ccc.mp3 "_"区切りの三番目の2桁数字部分が区切られていないヤツを(選び)全て結果のように区切りたい'(_名前,_名前). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/347 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # # 東北地方の県のデータを打ち出すプログラムを作成しなさい。ただし、東北地方かどうかの判定をする部分は関数を使うこと。 # # 県データの1行からなる構造体を受取る関数とする。該当すればYを戻り値として返すようにする。) # 判定をする際の県名の比較は、関数側に県名の二次元配列を持ち、標準関数strcmpを使う。string.h のinclude を忘れないように。 # strcmp(文字列1,文字列2) は文字列が一致すれば0を返す。 # # コード例示: http://ime.nu/minus-k.com/nejitsu/loader/up84923.jpg # 県データ: http://ime.nu/minus-k.com/nejitsu/loader/up84924.txt # # Hokkaido 5683 83453 # Aomori 1476 9606 # Iwate 1416 15278 # Miyagi 2365 7285 # Akita 1189 11612 # Yamagata 1244 9323 # Fukushima 2127 13782 # Ibaraki 2985 6096 # Tochigi 2005 6408 # Gumma 2025 6363 # Saitama 6938 3797 # Chiba 5926 5156 # Tokyo 12059 2187 # Kanagawa 8490 2415 # Niigata 2476 12582 # Toyama 1121 4247 # Ishikawa 1181 4185 # Fukui 829 4189 # Yamanashi 888 4465 # Nagano 2214 13585 # Gifu 2108 10598 # Shizuoka 3767 7779 # Aichi 7043 5156 # Mie 1857 5776 # Shiga 1343 4017 # Kyoto 2644 4613 # Osaka 8805 1893 # Hyogo 5551 8392 # Nara 1443 3691 # Wakayama 1070 4726 # Tottori 613 3507 # Shimane 761 6707 # Okayama 1951 7112 # Hiroshima 2879 8477 # Yamaguchi 1528 6110 # Tokushima 824 4145 # Kagawa 1023 1876 # Ehime 1493 5676 # Kochi 814 7105 # Fukuoka 5016 4971 # Saga 877 2439 # Nagasaki 1517 4092 # Kumamoto 1859 7404 # Oita 1221 6338 # Miyazaki 1170 7734 # Kagoshima 1786 9187 # Okinawa 1318 2271 東北地方の県のデータを人口密度の小さい順に打ち出す :- 東北地方の県のデータならび(_東北地方の県のデータならび), sort(_東北地方の県のデータならび,_人口密度を鍵に整列した東北地方の県のデータならび), write('人口密度,県名,面積,人口\n'), append(_,[[[_人口密度,_県名,_面積,_人口]|R],_人口密度を鍵に整列した東北地方の県のデータならび), write_formatted('%t,%t,%t,%t,%t\n',[_人口密度,_件名,_面積,_人口]), R = []. 東北地方の県のデータならび(_東北地方の県のデータならび) :- webサイトから読み出した東北地方の県のデータならび(_県のデータならび), findall([_人口密度,_県名,_面積,_人口],( append(_,[[_県名,_面積,_人口]|_],_県のデータならび), 東北地方(_県名), 人口密度(_面積,_人口,_人口密度)), _東北地方の県のデータならび). webサイトから読み出した東北地方の県のデータならび(_県のデータならび) :- w3c('http://nojiriko.asia/prolog/c144_347_1.html',L), 県のデータ部分のみを切り出す(L,_県のデータ部分ならび), findall(_県のデータ,( append(_,[_行|_],_県のデータ部分ならび), split(_行,[' '],['#'|_県のデータ])), _県のデータならび),!. 県のデータ部分のみを切り出す(L,_県のデータ部分ならび) :- append(_,[_行,_|R],L), \+(sub_atom(_行,0,7,_,'# 県のデータ')), append(_県のデータ部分ならび,[_行2|_],R), \+(sub_atom(_行2,0,1,_,'#')),!. 人口密度(_面積,_人口,_人口密度) :- _人口密度 is floor((_人口 / _面積) * 10 + 5) / 10. 東北地方('Aomori'). 東北地方('Iwate'). 東北地方('Akita'). 東北地方('Miyagi'). 東北地方('Yamagata'). 東方地方('Fukushima'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/84 # # [1] プログラミング演習 # [2] 問題文 # 構造体を引数と戻り値とする関数を作成せよ。なお、作成する関数は # 引数を四則演算して戻すものとする。 # '構造体を引数と戻り値とする関数を作成せよ。なお、作成する関数は引数を四則演算して戻すものとする。' :- write('項1と項2をカンマ区切りで入力してください : '), get_split_line(Line,[','],[_項1,_項2]), _引数 = (_項1,_項2), '構造体を引数と戻り値とする関数'(_引数,_演算結果). '構造体を引数と戻り値とする関数'((_項,_項2),(_和,_差,_積,_商)) :- _和 is _項 + _項2, _差 is _項 - _項2, _積 is _項 * _項2, _商 is _項 / _項2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/570 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # file1.csv(マスタファイル)からデータを読み込みfile2.csv(トランザクションファイル)に記述された内容でデータを更新・追加し、 # 再度file1.csvに保存せよ。 # # file1.csv # 1,Ken Kawakami,kawakami@xxxxx.xx.jp # 2,Toshiyuki Ishikura,ishikura@xxxxx.xx.jp # 3,Yuuta Hayashi,yutahaya@xxxxx.xx.jp # 4,Kazuwo Inoue,inoue@xxxxx.xx.jp # 5,Kinya Nagata,osada@xxxxx.xx.jp # 6,Yuki Hayashi,yukihaya@xxxxx.xx.jp # 7,Yoshiyuki Hihara,hihara@xxx.xx.jp # # file2.csv # 2,,isikura@xxx.xx.xx.jp # 4,Kazuo Inoue, # 5,,nagata@xxxxx.xx.jp # 7,Yoshiyuki Hinohara,hinohara@xxx.xx.jp # 8,Kouki Takahashi,takahashi@xxxxx.xx.jp # 9,airi Saito,saito@xxx.xx.xx.jp # 'file1.csv(マスタファイル)からデータを読み込みfile2.csv(トランザクションファイル)に記述された内容でデータを更新・追加し、再度file1.csvに保存せよ。' :- 'file1.csv(マスタファイル)からデータを読み込み'(LL1), 'file2.csv(トランザクションファイル)に記述された'(LL2), '内容でデータを更新・追加し、'(LL2,LL1,LL3), '再度file1.csvに保存する'(LL3). 'file1.csv(マスタファイル)からデータを読み込み'(LL1) :- get_split_lines('file1.csv',[','],LL1). 'file2.csv(トランザクションファイル)に記述された内容で'(LL2) :- get_split_lines('file2.csv',[','],LL2). '内容でデータを更新・追加し、'([],LL,LL) :- !. '内容でデータを更新・追加し、'([[N|R02]|R2],LL1,LL) :- トランザクションの行指定と合致する行を更新する(N,R02,LL1,LL3), '内容でデータを更新・追加し、'(R2,LL3,LL),!. '内容でデータを更新・追加し、'([[N|R02]|R2],LL1,LL) :- トランザクションの行指定に合致しないがより小さい行とより大きい行があるためその間に挿入する(N,R02,LL1,LL3), '内容でデータを更新・追加し、'(R2,LL3,LL),!. '内容でデータを更新・追加し、'([[N|R02]|R2],LL1,LL) :- トランザクションの行指定より小さい行がないため先頭に挿入する(N,R02,LL1,LL3), append([[N|R02]],LL1,LL3), '内容でデータを更新・追加し、'(R2,LL3,LL),!. '内容でデータを更新・追加し、'([[N|R02]|R2],LL1,LL) :- トランザクションの行指定が現在の最大行を越えているため末尾に挿入する(N,R02,LL1,LL3), '内容でデータを更新・追加し、'(R2,LL3,LL),!. トランザクションの行指定と合致する行を更新する(N,R02,LL1,LL3) :- append(L0,[[N|R01]|R1],LL1), append(L0,[[N|R02]|R1],LL3),!. トランザクションの行指定に合致しないがより小さい行とより大きい行があるためその間に挿入する(N,LL1,LL3) :- append(L0,[[N1|R01]|R1],LL1), N1 > N, max(L0,M), M < N, append(LL0,[[N|R02]|R1],LL3),!. トランザクションの行指定より小さい行がないため先頭に挿入する(N,R02,LL1,LL3) :- append([],[[N1|R01]|R1],LL1), N1 > N, append([[N|R02]],LL1,LL3),!. トランザクションの行指定が現在の最大行を越えているため末尾に挿入する(N,R02,LL1,LL3) :- \+((append(L0,[[N1|R01]|R1],LL1),N1 > N)), append(LL1,[[N|R02]],LL3),!. '再度file1.csvに保存する'(LL3) :- findall(S,( append(_,[L|_],LL3), concat_atom(L,',',S)), LL4), open('file1.csv',write,Outstram), append(_,[Line|R],LL4), write_formatted(Outstream,'%t\n',[Line]), R = [], close(Outstream),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289816228/96 # # 文字で0〜255までのランダムな数字が、区切りにランダムな個数の半角スペースを使って、ずらっと並んでるファイルがあります。これをバイナリデータに変換したいんだけど、何か案はありませんか? # # # '文字で0〜255までのランダムな数字が、区切りにランダムな個数の半角スペースを使って、ずらっと並んでるファイルがあります。これをバイナリデータに変換する'(_入力ファイル,_出力ファイル) :- get_split_lines(_入力ファイル,[' '],LL), flat(LL,L), open(_出力ファイル,write,Outstream,[type(binary)]), append(_,[Code|R],L), put_byte(Outstream,Code), R = [], close(Outstream),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1258320456/157 # # 【 課題 】 # あるディレクトリに存在するすべてのファイルについて # 各ファイルの先頭一文字をディレクトリ名としてサブディレクトリを作成し # そのサブディレクトリへそのファイルを移動する # (既にサブディレクトリが存在する場合はファイルの移動のみ) # という操作を行うpythonで記述実行し動作を確認しなさい # # 【 期限 】11月25日13:00まで # 【 Ver  】2.5以上 2.6以下 # 【 補足 】済みません丸投げします # # 'あるディレクトリに存在するすべてのファイルについて各ファイルの先頭一文字をディレクトリ名としてサブディレクトリを作成しそのサブディレクトリへそのファイルを移動する'(_ディレクトリ) :- concat_atom(['ls -l ',_ディレクトリ],S), shs(S,_ディレクトリ詳細情報ならび), ディレクトリの生成(_ディレクトリ詳細情報ならび), ディレクトリへのファイルコピー(_ディレクトリ詳細情報ならび). ディレクトリの生成(_ディレクトリ詳細情報ならび) :- append(_,[Line|R],_ディレクトリ詳細情報ならび), split(Line,[' '],[A|R1]), last(R1,F), ディレクトリの生成(A,F), R = [],!. ディレクトリの生成(A,F) :- sub_atom(A,0,1,_,'-'), sub_atom(F,0,1,_,Dir), \+(exists(Dir,read)), concat_atom(['mkdir ',Dir],S), system(S),!. ディレクトリの生成(_,_). ディレクトリへのファイルコピー(_ディレクトリ詳細情報ならび) :- append(_,[Line|R],_ディレクトリ詳細情報ならび), split(Line,[' '],[A|R1]), last(R1,F), ディレクトリへファイルコピー(A,F), R = [],!. ディレクトリへファイルコピー(A,F) :- sub_atom(A,0,1,_,'-'), sub_atom(F,0,1,_,Dir), concat_atom(['cp ',F,' ',Dir,'/',F],S), system(S),!. ディレクトリへファイルコピー(_,_). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/273 # # [1] 授業単元:プログラミング # [2] 問題文 # 問題2.12 個の整数を入力し、それらの 3 倍の数値を表示するプログラムを作成しなさい。 # ただし、 # ・入力した整数は、4 行 3 列の 2 次元配列に格納しなさい。 # ・配列の作成と表示にはループ制御を使用すること。 # ・下記の実行結果になるようにしなさい。 # Column1 Column2 Column3 # ------------------------------------ # Row1 : 3 6 9 # Row2 : 300 600 900 # Row3 : 3000 6000 9000 # Row4 : 30000 60000 90000 # '12 個の整数を入力し、それらの 3 倍の数値を表示する' :- '12 個の整数を入力し'(_12個の整数ならび), '3倍にしながら3個組にまとめる'(_12個の整数ならび,_3個組ならび), write('------------------------------------\n'), 行見出し付き出力(1,_3個組ならび). '3倍にしながら3個組にまとめる'([],[]) :- !. '3倍にしながら3個組にまとめる'([A,B,C|R1],[[A3,B3,C3]|R2]) :- A3 is A * 3, B3 is B * 3, C3 is C * 3, '3倍にしながら3個組にまとめる'(R1,R2). 行見出し付き出力(_,[]) :- !. 行見出し付き出力(N,[[A,B,C]|R]) :- write_formatted('Row%t : %8d %8d %8d\n',[N,A,B,C]), N2 is N + 1, 行見出し付き出力(N2,R). '12 個の整数を入力し'(_12個の整数ならび) :- write('12個の整数をカンマ区切りで一行で入力してください : '), get_split_line([','],_12個の整数ならび), すべてが整数(_12個の整数ならび),!. すべてが整数([]) :- !. すべてが整数([N|R]) :- integer(N),すべてが整数(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/116 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):名前、学年、学科、番号を標準入力から入力し、 # サブルーチン内で表示するプログラムを構造体を用いて作成せよ。ただし、 # 構造体のメンバに値を代入する際には変数実体を操作する。 # すなわちドット演算子を用いること。 #  [3.1] OS:Windows #  [3.2] コンパイラ名とバージョン:Visual Studio 2005 #  [3.3] 言語:C++ # [4] 期限:11/19 # [5] その他の制限:特になし # # 連投しますが、よろしくお願いします。 # '名前、学年、学科、番号を標準入力から入力し、構造体を用いてサブルーチン内で表示する' :- '名前、学年、学科、番号を標準入力から入力し、'(L), サブルーチン内で表示する([名前,学年,学科,番号],L). '名前、学年、学科、番号を標準入力から入力し、'(L) :- write('名前,学年,学科,番号 をカンマで区切り一行で入力しなさい : '), get_split_line([','],L). サブルーチン内で表示する([],[]) :- nl,!. サブルーチン内で表示する([_項目名|R1],[_値|R2]) :- write_formatted('%t, ',[_項目名:_値]), サブルーチン内で表示する(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/93 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # # 関数int yokin(int yen, double rishi, int year)を定義しなさい。 # この関数はyen円を年利rishiの定期預金にyear年預けた後に戻ってくる金額を返す関数である。 # 引数はすべて0より大きいと仮定してよい。 # rishiは,5%の場合には0.05となる。 # 利子は端数(小数点以下の値)があったとしても切り捨てられる。 # 端数の切り捨ては,毎年行われる。 main関数は次の処理をしなさい。 # 入力として,預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。 # int yokin(int yen, double rishi, int year)を利用して,預け入れ後に受け取れる金額を出力せよ。 # # 入力例1: 10000 0.05 3 # 入力例1に対する出力:11576 # 入力例2: 10000 0.05 5 # 入力例2に対する出力:12761 # 入力例3: 10000 0.035 10 # 入力例3に対する出力:14101 # # '入力として,預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。預け入れ後に受け取れる金額を出力せよ。' :- '入力として,預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。預け入れ後に受け取れる金額を出力せよ。'(1). '入力として,預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。預け入れ後に受け取れる金額を出力せよ。'(N) :- '預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。'(N,_預け入れる金額を表す整数,_利子を表す実数,_年数), 預け入れ後に受け取れる金額('預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。'(_預け入れる金額を表す整数,_利子を表す実数,_年数,_受け取れる金額), write_formatted('入力例%tに対する出力 : %t\n',[_受け取れる金額]), N2 is N + 1, '入力として,預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。預け入れ後に受け取れる金額を出力せよ。'(N2). '預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。'(N,_預け入れる金額を表す整数,_利子を表す実数,_年数) :- write_formatted('入力例%t : ',[N]), get_line(Line), 入力診断(Line,_預け入れる金額を表す整数,_利子を表す実数,_年数),!. '預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。'(_預け入れる金額を表す整数,_利子を表す実数,_年数) :- '預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。'(_預け入れる金額を表す整数,_利子を表す実数,_年数). 入力診断(Line,_預け入れる金額を表す整数,_利子を表す実数,_年数) :- split(Line,[' '],[_預け入れる金額を表す整数,_利子を表す実数,_年数]), integer(_預け入れる金額を表す整数), float(_利子を表す実数), integer(_年数), _年数 > 0,!. 入力診断(Line,_預け入れる金額を表す整数,_利子を表す実数,_年数) :- write_formmated('入力された %t からは適切な値を3個取り出すことができません。\n再入力をお願いします。\n',[Line]), fail. 預け入れ後に受け取れる金額(_円,_利子,_年,_受け取れる金額) :- length(L,_年), 複利計算(_円,_利子,L,_受け取れる金額). 複利計算(_受け取れる金額,_,[],_受け取れる金額) :- !. 複利計算(_前残,_利子,[_|R],_受け取れる金額). _利息 is truncate(floor(_前残 * _利子)), _繰越 is _前残 + _利息, 複利計算(_繰越,_利子,R,_受け取れる金額). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/965 # # [1] 授業単元:統計データ解析 # [2] 問題文: # # 【時刻】【降水量】【気温】 # 1 10:00 10 10 # 2 10:30 10 20 # ・ # ・ # 300000 22:30 20 25 # # 上記のテキストデータをそれぞれリストとして読み取り、降水量の最大値と気温の平均値を求めるプログラムを作成せよ。尚、時刻は文字列として読み取ること。 # 'テキストデータをそれぞれリストとして読み取り、降水量の最大値と気温の平均値を求めるプログラムを作成せよ。尚、時刻は文字列として読み取ること。'(_統計データファイル,_最大降水量,_平均気温) :- get_split_lines(_統計データファイル,[' '],LL), findall(_時刻, append(_,[[_,_時刻,_,_]|_],LL), _時刻ならび), findall(_降水量, append(_,[[_,_,_降水量,_]|_],LL), _降水量ならび), findall(_気温, append(_,[[_,_,_,_気温]|_],LL), _気温ならび), 最大値(_降水量ならび,_最大降水量), 相加平均(_気温ならび,_平均気温). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/780 # # よろしくお願いいたします。 # [1] 授業単元:C++言語入門 # [2] 問題文(含コード&リンク): # # ネットワークのルートアドレスとネットマスク、そしてチェックしたいIPアドレスを # 渡して、チェックしたいIPアドレスがそのネットワークに含まれているかどうかを # チェックする関数int checkIPAddress(unsigned int root,unsigned int mask,unsigned # int address)を以下のように書いた。空欄をうめよ。 # ただし、あるIPアドレスがネットワークに含まれているかどうかチェックするには、 # ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)の # ネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると # 判定します。IPアドレス中のネットワーク部は、ネットマスクのビットパターンが1である部分と # 考えます。IPアドレスからネットワークIPを取り出すには、IPアドレスをネットマスクの # ビットごとのANDを取り出します。詳細はインターネットの検索エンジンで「ネットマスク」 # をキーワードに調べてください。 # # int checkIPAddress(unsigned int root,unsigned int mask,unsigned int address) # { # return(root 空欄 ゞ欄)==(root 空欄 空欄) # } # # 'ネットワークのルートアドレスとネットマスク、そしてチェックしたいIPアドレスを渡して、チェックしたいIPアドレスがそのネットワークに含まれているかどうかをチェックする。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークID,_そのネットワークに含まれているか否か) :- 'あるIPアドレスがネットワークに含まれているかどうかチェックするには、ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)のネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると判定します。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークIP,_診断). 'あるIPアドレスがネットワークに含まれているかどうかチェックするには、ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)のネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると判定します。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークIP,そのネットワークに含まれる) :- 'IPアドレスからネットワークIPを取り出すには、IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレス,_ネットマスク,_ネットワークIP), _ネットワークのルートアドレス = _ネットワークIP,!. 'あるIPアドレスがネットワークに含まれているかどうかチェックするには、ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)のネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると判定します。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークID,そのネットワークに含まれない) :- !. 'IPアドレスからネットワークIPを取り出すには、IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレス,_ネットマスク,_ネットワークIP) :- 'IPアドレスのビット'(_IPアドレス,_IPアドレスのビットならび), ネットマスクのビット(_ネットマスク,_ネットマスクのビットならび), 'IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレスのビットならび,_ネットのビットならび,_ネットワークIP). 'IPアドレスのビット'(_IPアドレス,_IPアドレスのビットならび) :- split(_IPアドレス,['.'],[N1,N2,N3,N4]), 二進ビットならびに変換(N1,N2,N3,N4,_IPアドレスのビットならび). ネットマスクのビット(_ネットマスク,_ネットマスクのビットならび) :- split(_IPアドレス,['.'],[N1,N2,N3,N4]), 二進ビットならびに変換(N1,N2,N3,N4,_ネットマスクのビットならび). 'IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレスのビットならび,_ネットのビットならび,_ネットワークIP) :- _ネットワークIPのビットならび is _IPアドレスのビットならび /\ _ネットのビットならび, ビットならびからネットワークIPを復元(L,_ネットワークIP_4byte_ならび), concat_atom(_ネットワークIP_4byte_ならび,'.',_ネットワークIP),!. ビットならびからネットワークIPを復元([],[]) :- !. ビットならびからネットワークIPを復元([_b1,_b2,_b3,_b4,_b5,_b6,_b7,_b8|R1],[V|R2]) :- V is _b1 * 128 + _b2 * 64 + _b3 * 32 + _b4 * 16 + _b5 * 8 + _b6 * 4 + _b7 * 2 + _b8, ビットならびからネットワークIPを復元(R1,R2). 二進ビットならびに変換([],[]) :- !. 二進ビットならびに変換([N|R],_二進ビットならび) :- '1byteビットならび'(N,_1byteビットならび), 二進ビットならびに変換(R,_二進ビットならび_1), append(_1bytpeビットならび,_二進ビットならび_1,_二進ビットならび). '1byteビットならび'(N,_1byteビットならび) :- '1byteビットならび_1'(N,L), reverse(L,_1byteビットならび). '1byteビットならびの一'(0,[]) :- !. '1byteビットならびの一'(N,[_b|R]) :- N2 is N // 2, _b is N mod 2, '1byteビットならびの一'(N2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/604 # # [1] 授業単元: プログラム # [2] 問題文(含コード&リンク):10人分の各教科の平均点を計算する関数を実装してください。 # % 10人分という部分に何か意味があるかどうか? 何教科あるかの方が問題ではないか。 % このプログラムだと教科数の検査ができていない。 '10人分の各教科の平均点を計算する関数を実装してください。' :- '10人分の各教科の点数を入力する'(_個人成績ならび), '10人分の各教科の平均点を計算する'(_個人成績ならび,_教科毎平均点), 教科毎の平均を表示する(_教科毎平均点). '10人分の各教科の平均点を計算する'(_個人成績ならび,_教科毎平均点) :- 転置(_個人成績ならび,[_|_個人名を除き転置された個人成績ならび]), findall(_教科の平均点,( append(_,[L|_],_個人名を除き転置された個人成績ならび), avg(L,_教科の平均点)), _教科毎の平均点). '10人分の各教科の点数を入力する'(_個人成績ならび) :- length(_個人成績ならび,10), 個人成績を一行で入力していく(_個人成績ならび). 個人成績を一行で入力していく([]) :- !. 個人成績を一行で入力していく([_個人成績|R]) :- write('個人成績を最初に個人名その後教科成績をカンマ区切りで入力してください : '), get_line(Line), split(Line,[','],_個人成績), 本来ならここに項目数検査、項目内容の精査が入る, 個人成績を一行で入力していく([_],R). 教科毎の平均を表示する(_,[]). 教科毎の平均を表示する(LC,[_平均|R]) :- length(LC,N), write_formatted('教科-%t の平均点は %t です。\n',[N,_平均]), 教科毎の平均を表示する([_|LC],R). %%%%%%%%%%%%%%%%%% 注釈的述語 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 本来ならここに項目数検査、項目内容の精査が入る. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/340 # # [1] 授業単元:C言語 # # [2] 問題文:以下の課題では、main関数を求めるなど、動作が可能なプログラムにして提出すること。 # (1)3つのint型関数の最小値を返す関数を作成しなさい。 # プロトタイプは次のようになる。int min3(int x, int y, int z); # キーボードから値を 3つ入力し、これらの関数に引数で値を渡す。関数で処理した結果を表示すること。 # (2)2つの整数の和を求める関数及び差を求める関数を作成しなさい。 #   プロトタイプは次のようになる。 # int sum(int x, int y); # int diff(int x, int y); # #   キーボードから値を2つ入力し、これらの関数に引数で値を渡す。関数で処理した結果を表すこと。 # # '3つのint型関数の最小値を返す' :- '3つのint型数を得る'(_x,_y,_z), min3(_x,_y,_z,Min3), write_formatted('入力された3つの数 %t %t %t の最小値は %t です。\n',[_x,_y,_z,Min3]). min3(_x,_y,_z,Min3) :- length(Lx,_x), length(Ly,_y), length(Lz,_z), append(Lx,_,Lz), append(Lx,_,Ly), length(Lx,Min3),!. min3(_x,_y,_z,Min3) :- min3(_y,_z,_x,Min3),!. min3(_x,_y,_z,Min3) :- min3(_z,_x,_y,Min3),!. '2つの整数の和を求める' :- '2つの整数を得る'(_x,_y), sum(_x,_y,_z), write_formatted('和は %t\n',[_z]). sum(_x,_y,_z) :- \+(var(_x)), \+(var(_y)), length(Lx,_x), length(Ly,_y), append(Lx,Ly,Lz), length(Lz,_z),!. sum(_x,_y,_z) :- \+(var(_x)), \+(var(_z)), length(Lx,_x), length(Lz,_z), append(Lx,Ly,Lz), length(Ly,_y),!. sum(_x,_y,_z) :- \+(var(_y)), \+(var(_z)), length(Ly,_y), length(Lz,_z), append(Lx,Ly,Lz), length(Lx,_x),!. diff(_x,_y,_z) :- \+(var(_x)), \+(var(_y)), length(Lx,_x), length(Ly,_y), append(Ly,Lz,Lx), length(Lz,_z). '2つの整数を得る'(_x,_y) :- write('2つの整数をカンマ区切りで一行で入力してください : '), get_line(Line), '2つの整数を得るための診断'(Line,_x,_y),!. '2つの整数を得る'(_x,_y) :- '2つの整数を得る'(_x,_y). '2つの整数を得るための診断'(Line,_x,_y) :- split(Line,[','],[_x,_y]), integer(_x), integer(_y),!. '2つの整数を得るための診断'(Line,_x,_y) :- write_formatted('入力された %t からは2つの整数を得られません\n再入力をお願いします\n',[Line]), fail. '3つのint型数を得る'(_x,_y,_z) :- write('3つのint型数をカンマ区切りで一行で入力してください : '), get_line(Line), '3つのint型数を得るための診断'(Line,_x,_y,_z),!. '3つのint型数を得る'(_x,_y,_z) :- '3つのint型数を得る'(_x,_y,_z). '3つのint型数を得るための診断'(Line,_x,_y,_z) :- split(Line,[','],[_x,_y,_z]), integer(_x), integer(_y), integer(_z),!. '3つのint型数を得るための診断'(Line,_x,_y,_z) :- write_formatted('入力された %t からは3つint型数を得られません\n再入力をお願いします\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/843 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 問題2 # 桁数を指定した書式指定(%s、%d、%f)とprintf()関数を用いて、下記の一覧表を表示するプログラムを作成しなさい。 # 【表示する表】 #      商品A    商品B    商品C # 数量   0000012  0000345   0006789 # 重量   1.234    543.210   12.345 # *文字列、整数値や実数値の桁数を指定する方法に注意しなさい。 # *表の枠線は必要ありません。各列の先頭が揃っている必要があります。 '桁数を指定した書式指定(%s、%d、%f)とprintf()関数を用いて、下記の一覧表を表示する' :- 下記の一覧表(A1,A2,A3,A4), 行の表示([A1,A2,A3,A4]). fail. '桁数を指定した書式指定(%s、%d、%f)とprintf()関数を用いて、下記の一覧表を表示する'. 行の表示([' '|R]) :- printf('%-9s %-12s %-12s %-12s\n',[' '|R]). 行の表示([数量|R]) :- printf('%-9s %-012d %-012d %-012d\n',[数量|R]). 行の表示([重量|R]) :- printf('%-9s %-12.3f %-12.3f %-12.3f\n',[重量|R]). 下記の一覧表(' ',商品A,商品B,商品C). 下記の一覧表(数量,12,345,6789). 下記の一覧表(重量,1.234,543.210,12.345). printf(_パターン,_値ならび) :- write_formatted(_パターン,_値ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '桁数を指定した書式指定(%s、%d、%f)とprintf()関数を用いて、下記の一覧表を表示する' :- 下記の一覧表(S), split(S,['\n'],[_見出し行|_行ならび]), 見出し行の表示(_見出し行), 行の表示(_行ならび). 見出し行の表示(_見出し行) :- split(_見出し行,[' ',' '],L), printf('%-9s %-12s %-12s %-12s\n',[' '|L]). 行の表示([]) :- !. 行の表示([_行|R]) :- split(_行,[' ',' '],_値ならび), 表示形式の選択して表示(_値ならび), 行の表示(R). 表示形式を選択して表示([数量|R]) :- printf('%-9s %-012d %-012d %-012d\n',[数量|R]). 表示形式を選択して表示([重量|R]) :- printf('%-9s %-12.3f %-12.3f %-12.3f\n',[重量|R]). 下記の一覧表(' 商品A 商品B 商品C\n数量 0000012 0000345 0006789 \n重量 1.234 543.210 12.345\n'). printf(_パターン,_値ならび) :- write_formatted(_パターン,_値ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/643 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # (1)ある10人の年齢がint score[] = {21, 70, 17, 12, 15, 80, 55, 43, 34, 48}; # で与えられている時、年齢の平均を求めるプログラムを作成せよ。 # ただし、ユーザー定義関数averageを定義してプログラムを作成すること。 # ※第一引数として年齢データの配列、第二引数として人数を受け取り、平均値を返すこと。 #                # (2)(1)の年齢をそれぞれ二乗して足した値の平均値を求めるプログラムを作成せよ。 #   ただし、ユーザー定義関数averageを定義してプログラムを作成すること。 # ※第一引数として年齢データの配列、第二引数として人数を受け取り、平均値を返すこと。 # ※(2)についてはプロトタイプ宣言を使用すること。 # # 'ある10人の年齢がint score[] = {21, 70, 17, 12, 15, 80, 55, 43, 34, 48}; で与えられている時、年齢を二乗して足した値の平均を求める' :- split('int score[] = {21, 70, 17, 12, 15, 80, 55, 43, 34, 48};',['=','{','}',' ',',',';'],[_,_|L]), avarage(L,10,_平均), write_formmate('10人の年齢を二乗して足した値の平均は%t歳です\n',[_平均]). avarage(L,_要素数,_平均) :- avarage(L,_要素数,0,_平均). avarage([],_要素数,_これまでの合計,_平均) :- \+(_要素数=0), _平均 is _これまでの合計 / _要素数,!. avarage([N|R],_要素数,_これまでの合計1,_平均) :- _これまでの合計2 is N * N + _これまでの合計1, avarage(R,_要素数,_これまでの合計2,_平均). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/643 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # (1)ある10人の年齢がint score[] = {21, 70, 17, 12, 15, 80, 55, 43, 34, 48}; # で与えられている時、年齢の平均を求めるプログラムを作成せよ。 # ただし、ユーザー定義関数averageを定義してプログラムを作成すること。 # ※第一引数として年齢データの配列、第二引数として人数を受け取り、平均値を返すこと。 #                # (2)(1)の年齢をそれぞれ二乗して足した値の平均値を求めるプログラムを作成せよ。 #   ただし、ユーザー定義関数averageを定義してプログラムを作成すること。 # ※第一引数として年齢データの配列、第二引数として人数を受け取り、平均値を返すこと。 # ※(2)についてはプロトタイプ宣言を使用すること。 # # 'ある10人の年齢がint score[] = {21, 70, 17, 12, 15, 80, 55, 43, 34, 48}; で与えられている時、年齢の平均を求める' :- split('{21, 70, 17, 12, 15, 80, 55, 43, 34, 48}',['{','}',',',' '],L), avarage(L,10,_平均), write_formmate('10人の年齢の平均は%t歳です\n',[_平均]). avarage(L,_要素数,_平均) :- avarage(L,_要素数,0,_平均). avarage([],_要素数,_これまでの合計,_平均) :- \+(_要素数=0), _平均 is _これまでの合計 / _要素数,!. avarage([N|R],_要素数,_これまでの合計1,_平均) :- _これまでの合計2 is N + _これまでの合計1, avarage(R,_要素数,_これまでの合計2,_平均). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1287755129/11 # # 3003,aaa # 3004,bbb # 3005,ccc # ・ # ・ # こんなレコードが何百万行っていうCSVがあって、 # 1カラム目の値をキーとして、2カラム目の値を取得したいんです。 # このリクエストは1分当たりに何度も発生します。 # 当然、1カラム目の値はユニークです。 # # で、リクエストが発生するたびに、 # 単純に先頭から検索していったんじゃ、時間がかかるんで、 # このCSVをハッシュに持っておいて、 # レスポンスを返すようなデーモンを作れば、速くなるかな〜 # と考えてるんですが、方向性は合ってますかね? # #DBは使えない環境です。。。 # # ここで聞くことか迷ったんですが、 # 組むならperlで組むんで、こちらで聞いてみました。 # # よろしくお願いします。 # # 要約関数(_述語幹部,_鍵整数値,_述語名) :- _法 = 1000, _剰余 is _鍵整数値 mod _法, concat_atom([_述語名幹部,'_',_剰余],_述語名),!. '第一項をユニークな整数鍵とするCSVファイルを要約関数述語として登録'(CSVファイル,_述語名幹部) :- get_lines(CSVファイル,Lines), append(_,[Line|R],Lines), split(Line,[','],[_鍵整数値|_値ならび]), 要約関数述語の節として追加(_述語名幹部,_鍵整数値,_値ならび), R = [],!. 要約関数述語の節として追加(_述語名幹部,_鍵整数値,_値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), P =.. [_述語名幹部,_鍵値|_値ならび], asserta(P). 要約関数述語の節を削除(_述語名幹部,_鍵整数値,_値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), P =.. [_述語名,_鍵値|_値ならび], retract(P). 要約関数述語の検索(_述語名幹部,_鍵整数値,_値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), P =.. [_述語名,_鍵値|_値ならび], call(P). 要約関数述語の節置換(_述語名幹部,_鍵整数値,_更新する値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), length(_更新する値ならび,Len), length(L,Len), P1 =.. [_述語名,_鍵値|L], retract(P1), P2 =.. [_述語名,_鍵値|_更新する値ならび], asserta(P2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/512 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク): # コマンド行から複数の数値を受け取りその平均値を出力するプログラムを # 作成し、プログラムリストと実行結果を示せ。ヒント:受け取った文字列を # double型に変換するには、関数double atof(const char *nPtr)を使う。 # この関数を使うには<stdlib.h>のインクルードが必要である。 # #include <stdio.h> # #include <stdlib.h> # int main(void) # { # char str[]="1.41421356"; # double x; # x = atof(str); # } # 'コマンド行から複数の数値を受け取りその平均値を出力する' :- write('複数の数値をカンマで区切り一行で入力してください : '), get_line(Line), split(Line,[','],L), findavg(V,append(_,[V|_],L),_平均値), write_formatted('%t の平均値は %t です。\n',[Line,_平均値]). /* ?- 'コマンド行から複数の数値を受け取りその平均値を出力する'. 複数の数値をカンマで区切り一行で入力してください : 37,24,114,88,19 37,24,114,88,19 の平均値は 56.4 です。 yes. ?- */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/391 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):入力した点から点まで直線を引くプログラミングを書く # 二重配列a[i][j]を使う # 入力した点から点まで直線を引く :- write('点1のX,Y座標をカンマ区切りで入力してください : '), get_split_line([','],[X1,Y1]), write('点2のX,Y座標をカンマ区切りで入力してください : '), get_split_line([','],[X2,Y2]), A is (Y2-Y1) / (X2-X1), B is Y1 - A * X1, findall([M,Y],( for(X1,M,X2), Y is truncate(A * M + B)), Z), キャンバスに描画(0,199,0,199,Z,LL), 描画(LL). キャンバスに描画(M,Mx,_,_,_,[]) :- M > Mx,!. キャンバスに描画(M,Mx,N1,Nx,Z,[L|R]) :- キャンバスに描画(M,N1,Nx,Z,L), M2 is M + 1, キャンバスに描画(M2,Mx,N1,Nx,Z,R). キャンバスに描画(_,N1,Nx,_,[]) :- N1 > Nx,!. キャンバスに描画(M,N1,Nx,Z,['.'|R]) :- member([M,N1],Z), M2 is N1 + 1, キャンバスに描画(M,N2,Nx,Z,R),!. キャンバスに描画(M,N1,Nx,Z,[' '|R]) :- M2 is N1 + 1, キャンバスに描画(M,N2,Nx,Z,R),!. 描画([]) :- !. 描画([L|R]) :- append(_,[Dot|R1],L), write(Dot), R1=[], 描画(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/579 # # 見出しと任意文字列の間にtabを挿入したいのですが、そうした置換は可能でしょうか? # サクラエディタを使っています。 # 幼稚な質問をお許し下さい # # # 見出し1=任意文字列1 # 見出し2=任意文字列2=任意文字列3 # 見出し3=任意文字列4=任意文字列5=任意文字列6 # # 【こうしたい】 # 見出し1=  任意文字列1 # 見出し2=  任意文字列2=任意文字列3 # 見出し3=  任意文字列4=任意文字列5=任意文字列6 # # # # # # 見出しと任意文字列の間にtabを挿入したい(_対象となる行ならび,_見出しと任意文字列の間にtabを挿入した行ならび) :- findall(_tabを挿入された行,( append(_,[_行|_],_対象となる行ならび), 文字列置換(_行,'=','=\t',_tabを挿入された行)), _見出しと任意文字列の間にtabを挿入した行ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 文字列置換/4 が未定義だったら、 見出しと任意文字列の間にtabを挿入したい(_対象となる行ならび,_見出しと任意文字列の間にtabを挿入した行ならび) :- findall(_tabを挿入された行,( append(_,[_行|_],_対象となる行ならび), split(_行,['='],[_見出し|R]), concat_atom(R,'=',S), concat_atom([_見出し,'=','\t',S],_tabを挿入された行)), _見出しと任意文字列の間にtabを挿入した行ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/277 # # [1] 授業単元: プログラム # [2] 問題文(含コード&リンク):テキストからデータを読み込んでユークリッド距離を求めるプログラムをお願いします。また、データを増やす事と最大距離と最小距離を求めてください。三次元なので、n=3とします。 # 'テキストからデータを読み込んでユークリッド距離を求めるプログラムをお願いします。また、データを増やす事と最大距離と最小距離を求めてください。三次元なので、n=3とします。'(_二点と距離ならび,_最大距離,_最小距離) :- データの読み込み(L), 組み合わせ位置番号ならびの生成(L,_位置番号ならび), findall([(x1,x2,x3),(y1,y2,y3),_距離],( 組み合わせ(_位置番号ならび,2,[Nth1,Nth2]), list_nth(Nth1,L,[X1,X2,X3]), list_nth(Nth2,L,[Y1,Y2,Y3]), _距離 is sqrt((X1-Y1)^2 + (X2-Y2)^2 + (X3-Y3)^2))), _二点と距離ならび), 最大値・最小値の取得(_二点と距離ならび,_最大値,_最小値). データの読み込み(L) :- write('データ(x1,x2,x3を)カンマ区切りで入力してください。(終了は空行で) : '), get_line(Line), データの読み込み(Line,L). データの読み込み('',[]) :- !. データの読み込み(Line,[[X1,X2,X3]|R]) :- split(Line,[',',' '],[X1,X2,X3]), get_line(Line2), データの読み込み(Line2,R). 組み合わせ位置番号ならびの生成(L,_位置番号ならび) :- length(L,Length), findall(N,for(1,N,Length),_位置番号ならび). 最大値・最小値の取得(_二点と距離ならび,_最大値,_最小値) :- 距離を分離(_二点と距離ならび,_距離ならび), max(_距離ならび,_最大距離), min(_距離ならび,_最小距離). 距離を分離([],[]) :- !. 距離を分離([[_,_,_距離]|R1],[_距離|R2]) :- 距離を分離(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/214 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク) # 問題1 # キーボードから読み込んだ整数値と実数値(倍精度:double)を、そのまま画面に表示するプログラムを作成せよ。 # 

入力する整数の値は123456
入力する実数の値は123.456 

 # 問題2
キーボードから入力した適当な長さの文字列を、そのまま画面に表示するプログラムを作成しなさい。 
 # 入力例 I_love_programming. 

 # 問題3
キーボードから読み込んだ実数値の書式を指定して、整数部4桁、小数点以下2桁で表示するプログラムを作成しなさい。 
 # 例 12.3456 -> __12.35 # % Prolog % 一番、「そのまま」出力される述語定義は。 'キーボードから読み込んだ整数値と実数値(倍精度:double)を、そのまま画面に表示する' :- get_line(Line), atom_to_term(Line,Term,_), number_chars(Term,L), concat_atom(L,_表示文字列), write_formatted('%t',[_表示文字列]). キーボードから入力した適当な長さの文字列を、そのまま画面に表示する :- get_line(Line), write_formatted('%t',[Line]). キーボードから読み込んだ実数値の書式を指定して、整数部4桁、小数点以下2桁で表示する(_実数値の書式) :- get_line(Line), 入力行から実数の整数部・小数点以下部を整数で取得(Line,_実数値の書式,_整数部,_小数点以下部), 入力行から実数の小数点以下部を整数表示を取得(_実数値の書式,_整数部表示), write_formatted('%t.%t',[_整数部表示,_小数点以下部]). 入力行から実数の整数部・小数点以下部を整数で取得(Line,_実数値の書式,_整数部,_小数点以下部) :- split(_実数値の書式,['%','.',f],[U,W]), concat_atom(['%',W,f],Format1), atom_to_term(Line,Term,_), write_formatted_atom(Atom,Format1,[Term]), split(Atom,['.'],[_整数部,_小数点以下部]). 入力行から実数の小数点以下部を整数部表示を取得(_実数値の書式,_整数部,_整数部表示) :- split(_実数値の書式,['%','.',f],[U,_]), C is _整数部 mod truncate(10 ^ U), concat_atom(['%',U,d],Format2), write_formatted_atom(_整数部表示,Format2,[C]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/502 # # 元データの日付(スケジュールとかログの日付)を全件検索するとします。 # その時、「その時刻より後の18時」を取得(生成)するうまい方法はあるでしょうか。 # 言い換えると、日付の繰り上がりに対して小技があったら教えてください。 # # ターゲットデータベースはH2Databaseですが、「Oracleならこんな方法が(ry」とかでも # 勉強になりますのでお願いします。 # # 元データ # ------------------- # 2010-10-01 01:00:00 # 2010-10-03 17:00:00 # 2010-10-04 20:00:00 # ------------------- # # 欲しいデータ # ------------------- # 2010-10-01 01:00:00 2010-10-01 18:00:00 # 2010-10-03 17:00:00 2010-10-03 18:00:00 # 2010-10-04 20:00:00 2010-10-05 18:00:00 # ------------------- # '元データの日付(スケジュールとかログの日付)を全件検索するとします。その時、「その時刻より後の18時」を取得(生成)する'(_欲しいデータ) :- データベース(_元のデータ), 次の18時の時刻文字列表現(_元のデータ,_次の18時の時刻文字列表現), concat_atom([_元のデータ,' ',_次の18時の時刻文字列表現],_欲しいデータ). 次の18時の時刻文字列表現(_時刻文字列表現,_次の18時の時刻文字列表現) :- 時刻文字列表現から年、月、日、時、分、秒を得る(_時刻文字列,_年,_月,_日,_時,_分,_秒), _時 < 18, write_formatted_atom(_次の18時の時刻文字列表現,'%4d-%02d-%02d 18:00:00',[_年,_月,_日]),!. 次の18時の時刻文字列表現(_時刻文字列表現,_次の18時の時刻文字列表現) :- 翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日), write_formatted_atom(_次の18時の時刻文字列表現,'%4d-%02d-%02d 18:00:00',[_翌日の年,_翌日の月,_翌日の日]),!. 時刻文字列表現から年、月、日、時、分、秒を得る(_時刻文字列,_年,_月,_日,_時,_分,_秒) :- split(_時刻文字列,[' ','-',':'],[_年,_月,_日,_時,_分,_秒]), _時 < 18. 翌日(_翌日の年整数,1,31,_翌日の年整数,2,1) :- !. 翌日(_翌日の年整数,3,31,_翌日の年整数,4,1) :- !. 翌日(_翌日の年整数,4,30,_翌日の年整数,5,1) :- !. 翌日(_翌日の年整数,5,31,_翌日の年整数,6,1) :- !. 翌日(_翌日の年整数,6,30,_翌日の年整数,7,1) :- !. 翌日(_翌日の年整数,7,31,_翌日の年整数,8,1) :- !. 翌日(_翌日の年整数,8,31,_翌日の年整数,9,1) :- !. 翌日(_翌日の年整数,9,30,_翌日の年整数,10,1) :- !. 翌日(_翌日の年整数,10,31,_翌日の年整数,11,1) :- !. 翌日(_翌日の年整数,11,30,_翌日の年整数,12,1) :- !. 翌日(_翌日の年整数,2,28,_翌日の年整数,3,1) :- \+(うるう年(_翌日の年整数)),!. 翌日(_翌日の年整数,2,29,_翌日の年整数,3,1) :- うるう年(_翌日の年整数),!. 翌日(_年整数,12,31,_翌日の年整数,1,1) :- _翌日の年整数 is _年整数 + 1,!. 翌日(_翌日の年整数,_翌日の月整数,_日整数,_翌日の年整数,_翌日の月整数,_翌日の日整数) :- _翌日の日整数 is _日整数 + 1,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/649 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # ダイエットファイルに # # 20100930,curry and rice # 20101003,kitsune soba # 20101003,rice ball # # のような形で日付とその日食べた昼食が保存されているとする. # コマンド行引数にダイエットファイル名と日付(yyyymmdd 形式) を指定して実行すると, # ファイルの中から指定した日付を含む行を検索し,その日の昼食を出力するプログラムを作成せよ. # また,引数としてファイルと文字列を指定しなかった場合に,使い方を出力して終了するようにせよ. # 日付の検索には,標準関数char *strstr(const char *str1, const char *str2); を使用するのが簡単である. # # 【実行例】 # % ./q3-3 diet.txt 20100929 # date 20100929 was not found in file diet.txt # % ./q3-3 diet.txt 20101003 # 20101003,kitsune soba # 20101003,rice ball # % ./q3-3 # Usage: ./q3-3 filename date(yyyymmdd) # % # # program :- パラメータを得る(_ファイル,_日付), get_split_lines(_ファイル,[','],LL), 日付をキーに検索する(_日付,LL,LL2), 検索した行を表示する(_日付,LL2). halt. パラメータを得る(_ファイル,_日付) :- user_paramaters(L), 診断(L,_ファイル,_日付),!. 診断([_ファイル,_日付],_ファイル,_日付) :- !. 診断(_,_,_) :- write('Usage: ./prolog filename date(yyyymmdd)\n'), halt. 日付をキーに検索する(_,[],[]) :- !. 日付をキーに検索する(_日付,[[_日付,_その日食べた昼食]|R1],[[_日付,_その日食べた昼食]|R2]) :- 日付をキーに検索する(_日付,R1,R2),!. 日付をキーに検索する(_日付,[_|R1],R2) :- 日付をキーに検索する(_日付,R1,R2),!. 検索した行を表示する([]) :- !. 検索した行を表示する([[_,_日付,_その日食べた昼食]|R]) :- write('%t,%t\n',[_日付,_その日食べた昼食]), 検索した行を表示する(R). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/500 # # MYSQLなんですけど # # date      data # 2010/01/01 hoge1 # 2010/01/05 hoge2 # # みたいなテーブルから # # 2010/01/01 hoge1 # 2010/01/02 NULL # 2010/01/03 NULL # 2010/01/04 NULL # 2010/01/05 hoge2 # # のような結果の出せるSQLを求めてます。 # # select * from table between date '2010/01/01' and '2010/01/05' # # とするとデータのある2レコードしか出ないのですが、 # データがない部分も日付を出しつつ、デフォルトのデータないよっていう文字列を出せると助かります。 # # お助けください! # 'データがない部分も日付を出しつつ、デフォルトのデータないよっていう文字列を出す'(_日付下限,_日付上限) :- 入力された日付を年、月、日整数に変換(_日付下限,_年下限整数,_月下限整数,_日下限整数), 入力された日付を年、月、日整数に変換(_日付上限,_年上限整数,_月上限整数,_日上限整数), 日付の生成(_年下限整数,_月下限整数,_日下限整数,_年整数,_月整数,_日整数,_年上限整数,_月上限整数,_日上限整数), swritef(_date,'%4r/%2r/%2r',[_年整数,_月整数,_日整数]), 生成日付のtableの組を表示する(_date), (_年整数,_月整数,_日整数) = (_年上限整数,_月上限整数,_日上限整数). 入力された日付を年、月、日整数に変換(_日付文字列,_年整数,_月整数,_日整数) :- split(_日付文字列,['/'],[_年整数,_月整数,_日整数]). 生成日付のtableの組を表示する(_date) :- table(_date,_data), write_formatted('%t %t\n',[_date,_data]),!. 生成日付のtableの組を表示する(_生成された日付) :- \+(table(_date,_)), writef('%t %t\n',[_date,'NULL']),!. 日付の生成(_年整数,_月整数,_日整数,_年整数,_月整数,_日整数,_年上限整数,_月上限整数,_日上限整数), (_年整数,_月整数,_日整数) @=< (_年上限整数,_月上限整数,_日上限整数). 日付の生成(_年下限整数,_月下限整数,_日下限整数,_年整数,_月整数,_日整数,_年上限整数,_月上限整数,_日上限整数) :- (_年整数,_月整数,_日整数) @=< (_年上限整数,_月上限整数,_日上限整数), 翌日(_年整数,_月整数,_日整数,_翌日の年整数,_翌日の月整数,_翌日の日整数), 日付の生成(翌日の年整数,_翌日の月整数,_翌日の日整数,_年整数,_月整数,_日整数,_年上限整数,_月上限整数,_日上限整数). 翌日(_翌日の年整数,1,31,_翌日の年整数,2,1) :- !. 翌日(_翌日の年整数,3,31,_翌日の年整数,4,1) :- !. 翌日(_翌日の年整数,4,30,_翌日の年整数,5,1) :- !. 翌日(_翌日の年整数,5,31,_翌日の年整数,6,1) :- !. 翌日(_翌日の年整数,6,30,_翌日の年整数,7,1) :- !. 翌日(_翌日の年整数,7,31,_翌日の年整数,8,1) :- !. 翌日(_翌日の年整数,8,31,_翌日の年整数,9,1) :- !. 翌日(_翌日の年整数,9,30,_翌日の年整数,10,1) :- !. 翌日(_翌日の年整数,10,31,_翌日の年整数,11,1) :- !. 翌日(_翌日の年整数,11,30,_翌日の年整数,12,1) :- !. 翌日(_翌日の年整数,2,28,_翌日の年整数,3,1) :- \+(うるう年(_翌日の年整数)),!. 翌日(_翌日の年整数,2,29,_翌日の年整数,3,1) :- うるう年(_翌日の年整数),!. 翌日(_年整数,12,31,_翌日の年整数,1,1) :- _翌日の年整数 is _年整数 + 1,!. 翌日(_翌日の年整数,_翌日の月整数,_日整数,_翌日の年整数,_翌日の月整数,_翌日の日整数) :- _翌日の日整数 is _日整数 + 1,!. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 140代目 #558 # [1] 授業単元:プログラミング基礎 # [2] TAR(x,y,z) # ={y (x<=y) } # {TAR(TAR(x-1,y,z),TAR(y-1,z,x),TAR(z-1,x,y) (other)} # 上記の計算をするプログラムを組んで、 # xyzに指定された数値を代入したときの答えを表示する。 # # '_甲 _乙 _丙 に指定された数値を代入したときの答えを表示する' :- write('三つの数を空白で区切って入力してください : '), get_split_line([' ',','],[_甲,_乙,_丙]), たらい回し(_甲,_乙,_丙,_丁), writef('答えは%tです。\n',[_丁]). たらい回し(_甲,_乙,_丙,_乙) :- _甲 =< _乙,!. たらい回し(_甲-1,_乙,_丙,_丁) :- _甲の一 is _甲 - 1, たらい回し(_甲の一,_乙,_丙,_丁),!. たらい回し(_甲,_乙,_丙,_丁) :- たらい回し(_甲-1,_乙,_丙,_丁の一), たらい回し(_乙-1,_丙,_甲,_丁の二), たらい回し(_丙-1,_甲,_乙,_丁の三), たらい回し(_丁の一,_丁の二,_丁の三,_丁). % get_split_lines/3 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/521 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # present.datを読み込み、小文字を全て大文字に変換し、以下のような形式[1]でファイルを # 出力するプログラムを作成せよ。また、present.datに自由なデータを6行追加し動作する # ことを確認せよ。またこの際にpriceが空白の行を設け、priceが空白であった場合には # price: xxxxと出力するようにせよ。 # # [1] # code: abc-23 # name: tea_set # price: 2500 # . # . # . # 以下略 # # present.dat # ↓ # ABC-23 Tea_set 2500 # EFG-34 Peach 2000 # HIJ-21 Greep 1500 # # 'present.datを読み込み、小文字を全て大文字に変換し、以下のような形式[1]でファイルを出力する。またこの際にpriceが空白の行を設け、priceが空白であった場合にはprice: xxxxと出力する'(_出力ファイル名) :- get_split_lines('present.dat',[': ',' '],LL1), '形式[1]に変換'(LL1,Lines), put_lines(_出力ファイル,Lines). '形式[1]に変換'([],[]) :- !. '形式[1]に変換'([[code,_code],[name,_name],[price,_price]|R1],[S|R2]) :- to_upper(_code,_code_2), to_upper(_name,_name_2), 'priceが空白であった場合にはprice: xxxxと'(_price,_price_2), concat_atom([_code_2,_name_2,_price_2],' ',S), '形式[1]に変換'(R1,R2). 'priceが空白であった場合にはprice: xxxxと'(_price,_price) :- number(_price),!. 'priceが空白であった場合にはprice: xxxxと'('','XXXX') :- !. % 以下のサイトは 入力催促文(_入力催促文). 一行で多項を入力する(_入力された項目ならび) :- 入力催促文(_入力催促文), write(_入力催促文), get_line(Line), 入力診断(Line,_入力された項目ならび),!. 一行で多項を入力する(_入力された項目ならび) :- 一行で多項を入力する(_入力された項目ならび). 入力診断(Line,_入力された項目ならび) :- split(Line,[' ',',',':'],_入力された項目ならび_1), 入力された項目検査(1,_入力された項目ならび_1,_入力された項目ならび,_エラー項ならび), all(_エラー項ならび,0),!. 入力診断(Line,_入力された項目ならび) :- write_fromatted('入力された行 "%t" から適切なデータを得ることができません\n',[Line]), write('再入力をお願いします\n'), fail. 入力された項目検査(_,[],[],[]) :- !. 入力された項目検査(N1,[A|R1],[B|R2],[C|R3]) :- 項目検査(N,A,B,C), N2 is N1 + 1, 入力された項目検査(N2,R1,R2,R3). /* 項目検査(1,_項目1,_項目,0) :- 変換(N,_項目1,_項目),!. 項目検査(1,_項目1,_,-1). */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284079940/8 # # 【問題】(超初級) # 時間を入力すると時針と分針の角度を出力するプログラムを作れ。 # 角度は度数法(ラジアンでない)を用い、3時の方向を0度とする。 # 出力する角度Rは (0.0 <= R && R < 360.0) を満たすこと。 # # ■入力例 # 時刻を入力してください> 15:30 # # ■出力例 # 時針:345.0度 # 分針:270.0度 # # ■応用問題 # なんらかの方法で現在時刻の時針分針の角度を出力するオプションを追加せよ。 # 例えばプログラムの引数や、時刻入力に"*"と入力する、などで判定することができる。 # # '時間を入力すると時針と分針の角度を出力するプログラムを作れ。角度は度数法(ラジアンでない)を用い、3時の方向を0度とする。出力する角度Rは (0.0 <= R && R < 360.0) を満たすこと。' :- write('時刻を入力してください : '), 時・分を得る(_時,_分), _分針R is 360 * ((_分 + 45) mod 60) / 60, _時針R is 360 * ((_時 + 21) mod 12) / 12) + _分針R / 12, 時針と分針の角度を出力する(_分針R,_時針R). 時・分を得る(_時,_分) :- get_line(Line), 時・分を得る(Line,_時,_分),!. 時・分を得る(_時,_分) :- 時・分を得る(_時,_分). 時・分を得る('*',_時,_分) :- A is time, localtime(A,_,_,_,_,_,_時,_分,_),!. 時・分を得る(Line,_時,_分) :- \+(Line='*'), split(Line,[':',' '],[_時,_分]),!. 時・分を得る(Line,_,_) :- write_formatted('入力された"%t"から時:分を得ることができません。再入力をお願いします\n',[Line]), write('時:分 を入力してください : '), fail. 時針と分針の角度を出力する(_分針R,_時針R) :- _角度R is abs(_分針R - _時針R), write_formatted('時針:%5.1f\n分針:%5.1f\n時針と分針で作る角度は:%5.1f\n',[_時針R,_分針R,_角度R]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/419 # # すいません。早い回答ありがとうございます # # 【質問テンプレ】 # [1] C言語 # [2] 乱数に数字列が列挙しているtxtファイルから読み込んでint配列の形でソート(どのソートでもよい)を行って別のtxtファイルに書き込む # 現状ではソート,ファイル書き込みの内容はできあがっているがファイルから読み込んでint配列の形にする部分で悩んでいる # # '乱数に数字列が列挙しているtxtファイルから読み込んでint配列の形でソート(どのソートでもよい)を行って別のtxtファイルに書き込む'(_txtファイル,_別のtxtファイル) :- get_split_lines(_txtファイル,[' ',','],LL), 'ソート(どのソートでもよい)を行って'(LL,L2), put_lines(_別のtxtファイル,L2). 'ソート(どのソートでもよい)を行って'([],[]) :- !. 'ソート(どのソートでもよい)を行って'([L1|R1],[S|R2]) :- クイックソート(L1,L2), concat_atom(L2,' ',S), 'ソート(どのソートでもよい)を行って'(R1,R2). クイックソート([],[]) :- !. クイックソート([A|R1],L2) :- クイックソート(A,R1,L2). クイックソート(A,L1,L2) :- 整列のための分割(A,L1,L3,L4), クイックソート(L3,L5), クイックソート(L4,L6), append(L5,[A|L6],L2). 整列のための分割(A,[],[],[]) :- !. 整列のための分割(A,[B|R1],[B|R2],L) :- B @< A, 整列のための分割(A,R1,R2,L),!. 整列のための分割(A,[B|R1],L,[B|R2]) :- B @>= A, 整列のための分割(A,R1,L,R2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1280653311/552 # # [1] 授業単元: 研究 # [2] 問題文(含コード&リンク):口頭の支持のみ # # 処理の内容ですが、CSVファイルの容量が多いため処理量を把握できていません。 # そのためサンプルのような形でお願いします。 # 処理としては、 # CSVファイルの列ごとに、ある固定値をかけるというものです。(よって列によってでかけるものが変わる) # また、何も行わない列もあります。(1部分の列のみに数値をかける)そしてその結果を出力するというものです。 # # もし、この説明で漠然としているようでしたらご指摘お願い致します。 CSVファイルの列ごとに、ある固定値をかける(_列ごとの乗数ならび,_入力CSVファイル,_出力CSVファイル) :- get_split_lines(_入力csvファイル,[',',' '],LL), 列ごとに、ある固定値をかける(_列ごとの乗数ならび,LL1,LL2), CSVファイルとして出力する(_出力CSVファイル,LL2,','). 列ごとに、ある固定値をかける([],[],[]) :- !. 列ごとに、ある固定値をかける([V|R1],[B|R2],[B|R3]) :- var(V), 列ごとに、ある固定値をかける(R1,R2,R3),!. 列ごとに、ある固定値をかける([1|R1],[B|R2],[B|R3]) :- 列ごとに、ある固定値をかける(R1,R2,R3),!. 列ごとに、ある固定値をかける([A|R1],[B|R2],[C|R3]) :- C is A * B, 列ごとに、ある固定値をかける(R1,R2,R3). CSVファイルとして出力する(_出力CSVファイル,LL,_区切り文字) :- findall(S,( member(L,LL), concat_atom(L,_区切り文字,S)), L2), put_lines(_出力CSVファイル,L2). % 以下のサイトは # 出典 :: C言語の宿題片付けます 139代目 #160 # [1]プログラミング演習 # [2]ttp://www.comm.info.eng.osaka-cu.ac.jp/~sugi/C_lang2/C6.htmlの # [問題6-2]はこのページの本文の指示通りにやるとどうなるのでしょうか? # [3.1]Linux環境 # [3.2] gcc # [3.3]C言語 # [3.4]今日の午後9時 # # よろしくお願いします # # # [ 問題6‐2 ] # 上の問題で定義した TIME型の構造体変数2個を引数として,両者の和を TIME型の値として返す関数 time_add() を作成しなさい.ただし,この関数の第一行を次のように定めます. # TIME time_add(TIME t1, TIME t2) # 次に,「時間の長さ」(日数,時,分の組)を繰り返しキーボードから読み込み,読み込むたびに # それまでの「時間の長さ」の総和を出力するプログラムを,関数 time_add() を引用して作成しなさい. # なお,最後に負の数を入力すれば実行を停止するようにすること.このプログラムの動作は,例えば # 次のようになります. # > a.out # (day, hour, minute)? 3 12 44 # sum = 3 12 44 # (day, hour, minute)? 1 22 54 # sum = 5 11 38 # (day, hour, minute)? 8 21 0 # sum = 14 8 38 # (day, hour, minute)? -1 -1 -1 ( ← 負の数を入力すれば停止) # > # (ヒント)各メンバーどうしの和をとり,その結果が上記の値の範囲を超える場合は「繰り上がり」の # 処理が必要になります.ただし繰り上がる値は1か0しかないので,if文などを用いて比較的簡単に # 書くことができます.繰り返しの部分は,例えば while(1){...} の無限ループを作り,負の数が # 入力されたら break; でループから出るなどの方法が考えられます. 入力された時間の総和を計算する(_累計日,_累計時,_累計分) :- 日・時・分の入力(_日,_時,_分), 入力された時間の総和を計算する(_日,_時,_分,0,0,0,_累計日,_累計時,_累計分). 入力された時間の総和を計算する(_日,_時,_分,_累計日,_累計時,_累計分,_累計日,_累計時,_累計分) :- 負数が入力されたら終了します(_日,_時,_分),!. 入力された時間の総和を計算する(_日,_時,_分,_累計日1,_累計時1,_累計分1,_累計日,_累計時,_累計分) :- 日・時・分の加算(_日,_時,_分,_累計日1,_累計時1,_累計分1,_累計日2,_累計時2,_累計分2), 日・時・分の入力(_日2,_時2,_分2), 入力された時間の総和を計算する(_日2,_時2,_分2,_累計日2,_累計時2,_累計分2,_累計日,_累計時,_累計分). 日・時・分の加算(_日,_時,_分,_累計日1,_累計時1,_累計分1,_累計日2,_累計時2,_累計分2) :- _累計時1 >= 24, _累計時2 is _累計時1 - 24, _累計日2 is _累計日1 + 1, 日・時・分の加算(_日,_時,_分,_累計日2,_累計時2,_累計分1,_累計日2,_累計時2,_累計分2). 日・時・分の加算(_日,_時,_分,_累計日1,_累計時1,_累計分1,_累計日,_累計時,_累計分) :- _累計分1 >= 60, _累計分2 is _累計分1 - 60, _累計時2 is _累計時1 + 1, 日・時・分の加算(_日,_時,_分,_累計日1,_累計時2,_累計分2,_累計日,_累計時,_累計分). 日・時・分の加算(0,0,0,_累計日,_累計時,_累計分,_累計日,_累計時,_累計分) :- !. 日・時・分の加算(_日,_時,_分,_累計日1,_累計時1,_累計分1,_累計日,_累計時,_累計分) :- _累計日2 is _日 + _累計日1,   _累計時2 is _時 + _累計時1, _累計分2 is _分 + _累計分1, 日・時・分の加算(0,0,0,_累計日2,_累計時2,_累計分2,_累計日,_累計時,_累計分). 負数が入力されたら終了します(_日,_時,_分) :- _日 < 0,!. 負数が入力されたら終了します(_日,_時,_分) :- _時 < 0,!. 負数が入力されたら終了します(_日,_時,_分) :- _分 < 0,!. 日・時・分の入力(_日,_時,_分) :- write('時間を 日 時 分 の順に空白で区切って入力してください : '), get_split_line([' '],[_日,_時,_分]), 診断(_日,_時,_分),!. 日・時・分の入力(_日,_時,_分) :- 日・時・分の入力(_日,_時,_分). 診断(_日,_時,_分) :- integer(_日), _時 < 24, _分 < 60,!. 診断(_日,_時,_分) :- write_formatted('日=%t,時=%t,分=%t には誤りの部分があります\n',[_日,_時,_分]), fail. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1280653311/120 # # [1] 授業単元: # C++プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10909.txt # # 得点と名前を5つ入力すると,得点の高いものから順に出力せよ。名前は最大20文字までとする。 # stringクラスは使用しないこと。 # # # 実行例 # name1?sato # score1?10 # ------------------- # name2?tanaka # score2?40 # ------------------- # name3?suzuki # score3?95 # ------------------- # name4?kimura # score4?60 # ------------------- # name5?mori # score5?50 # ------------------- # # suzuki:95 # # kimura:60 # # mori:50 # # tanaka:40 # # sato:10 # '得点と名前を5つ入力すると,得点の高いものから順に出力せよ。名前は最大20文字までとする。' :- write('空白で区切って得点と名前を5つ(5行)入力してください : '), findall([_得点,_名前],( for(1,_,5), '得点と名前の入力(名前は最大20文字までとする)'(_得点,_名前)), L1), sort(L1,L2), reverse(L2,L3), append(_,[_得点,_名前]|R],L3), write_formatted('%t:%t\n',[_得点,_名前]), R = [],!. '得点と名前の入力(名前は最大20文字までとする)'(_得点,_名前) :- get_split_line([' '],[_得点,_名前]), atom_length(_名前,_長さ), 診断(_得点,_長さ),!. '得点と名前の入力(名前は最大20文字までとする)'(_得点,_名前) :- '得点と名前の入力(名前は最大20文字までとする)'(_得点,_名前). 診断(_得点,_長さ) :- \+(integer(_得点)), write_formatted('得点が%tと入力されました。得点は整数です。再入力をお願いします\n',[_得点]), !,fail. 診断(_得点,_長さ) :- _長さ =< 20,!. 診断(_得点,_長さ) :- write_formatted('名前の長さが%t文字あります。20文字以下になるように再入力をお願いします\n',[_長さ]),!, fail. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/632 # # 【 課題 】 # 氏名(string)、ふりがな(string)、携帯番号(string)、メールアドレス(string) # をフィールドとして持つクラスAddressBookを定義せよ。 # クラス内に、ふりがなで辞書順に並べ替えるためのcompareToを定義せよ。 # 外部に,TelNoSortという、電話番号(文字列)を辞書順に並び変えるためのメソッドを # 作成せよ。 # メイン・プログラムで、AddressBookクラスの配列(ArrayList)を定義し、 # 以下の動作をおこなうプログラムを作れ。 # 3人分のデータをキーボードから入力し、リストに代入する。 # ・配列に代入されたデータをふりがな順に、見やすく出力する。 # ・配列に代入されたデータを電話番号順に、見やすく出力する。 # 入力、出力には、for文を使うこと。 # '3人分のデータをキーボードから入力し、リストに得る。ふりがな順と電話番号順に見やすく出力する' :- '3人分のデータをキーボードから入力し'(1), compareTo(_ふりがな順ならび), write_formatted('整列鍵は%tです\n\n',[ふりがな]), 見やすく出力する(_ふりがな順ならび), 'TelNosort'(_携帯番号順ならび), write_formatted('整列鍵は%tです\n\n',[携帯番号]), 見やすく出力する(_携帯番号順ならび). '3人分のデータをキーボードから入力し'(N) :- N > 3,!. '3人分のデータをキーボードから入力し'(N1) :- write('氏名 ふりがな 携帯番号 メールアドレス を空白で区切って入力しなさい : '), get_line(Line), split([' '],L), '3人分のデータをキーボードから入力診断(Line,L), N2 is N1 + 1, '3人分のデータをキーボードから入力し'(N2),!. '3人分のデータをキーボードから入力し'(N1) :- '3人分のデータをキーボードから入力し'(N1). '3人分のデータをキーボードから入力診断(_,[_氏名,_ふりがな,_携帯番号,_メールアドレス]) :- 氏名入力診断(_氏名), ふりがな入力診断(_ふりがな), 携帯電話入力診断(_携帯電話), メールアドレス入力診断(_メールアドレス), assertz('AddressBook'(_氏名,_ふりがな,_携帯番号,_メールアドレス)),!. '3人分のデータをキーボードから入力診断(Line,_) :- write_formatted('入力された %t は適切なものではありません。再入力をお願いします。\n',[Line]),!, fail. 氏名入力診断(_氏名) :- true. ふりがな入力診断(_ふりがな) :- true. 携帯電話入力診断(_携帯電話) :- true. メールアドレス入力診断(_メールアドレス) :- true. compareTo(_ふりがな順ならび) :- findall([_ふりがな,_氏名,_ふりがな,_携帯番号,_メールアドレス],'AddressBook'(_氏名,_ふりがな,_携帯番号,_メールアドレス),LL1), sort(LL1,LL2), findall(L,append(_,[[_|L]|R],LL2),_ふりがな順ならび). 'TelNoSort'(_携帯番号順ならび) :- findall([_電話番号,_氏名,_ふりがな,_携帯番号,_メールアドレス],'AddressBook'(_氏名,_ふりがな,_携帯番号,_メールアドレス),LL1), sort(LL1,LL2), findall(L,append(_,[[_|L]|R],LL2),_電話番号順ならび). 見やすく出力する([]) :- !. 見やすく出力する([[_氏名,_ふりがな,_携帯番号,_メールアドレス]|R]) :- write_formatted('氏名=%t\nふりがな=%t\n携帯番号=%t\nメールアドレス=%t\n\n',[_氏名,_ふりがな,_携帯番号,_メールアドレス]), 見やすく出力する(R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1197620454/581 # # 問題4:1月1日が金曜日の平年(たとえば2010年)について、月日の入力データから、曜日を求めるプログラム。 # (実行結果例) # 月を入力してください:9 # 日を入力してください:15 # 9月15日は、水曜日です。 # # 以上4問です。どうか回答よろしくお願い致します # '1月1日が金曜日の平年(たとえば2010年)について、月日の入力データから、曜日を求める' :- 曜日番号(_曜日番号_1,金曜), write('任意の月日を月と日を空白で区切り入力してください : '), get_split_line(Line,[' '],[_月,_日]), findall([_月_1,_日数_1],(平年の月は何日あるか(_月_1,_日数_1),_月_1 =< _月),L), 前月までの日数の合計は(L,0,_前月までの日数の合計), _曜日番号 is (_前月までの日数の合計 + _日 + (_曜日番号_1 - 1)) mod 7, 曜日番号(_曜日番号,_曜日), write_formatted('%t月%t日は、%tです。\n',[_月,_日,_曜日]). 平年の月は何日あるか(1,31). 平年の月は何日あるか(2,28). 平年の月は何日あるか(3,31). 平年の月は何日あるか(4,30). 平年の月は何日あるか(3,31). 平年の月は何日あるか(4,30). 平年の月は何日あるか(5,31). 平年の月は何日あるか(6,30). 平年の月は何日あるか(7,31). 平年の月は何日あるか(8,31). 平年の月は何日あるか(9,30). 平年の月は何日あるか(10,31). 平年の月は何日あるか(11,30). 平年の月は何日あるか(12,31). 前月までの日数の合計は([_],_前月までの日数の合計,_前月までの日数の合計) :- !. 前月までの日数の合計は([[_,N]|R],S1,S) :- S2 is S1 + N, 前月までの日数の合計は(R,S2,S). 曜日番号(0,日曜). 曜日番号(1,月曜). 曜日番号(2,火曜). 曜日番号(3,水曜). 曜日番号(4,木曜). 曜日番号(5,金曜). 曜日番号(6,土曜). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1197620454/581 # # 問題3:ファイルのデータ(英文)を読み込み、一行毎の文字数(スペースも含む)とワード数を数えるプログラム。 # (実行結果例) # (例として次のような C:\test3.txtを入力する) # And friends just can't be found # Like a bridge over troubled water # I will lay me down ←の文章を以下のようなプログラムにする。 # # ファイル名を入力してください:C:\test3.txt # 1:And friends just can't be found # ⇒31文字、6ワード # 2:Like a bridge over troubled water # ⇒33文字、6ワード # 3:I will lay me down # ⇒18文字、5ワード # 'ファイルのデータ(英文)を読み込み、一行毎の文字数(スペースも含む)とワード数を数える'(_ファイル) :- get_lines(_ファイル,Lines), append(_,[S|R],Lines), sub_atom(S,0,_文字数,0,S), split(S,[' ',',',':'],L1), length(L1,_ワード数), write_formatted('%t\n=%t文字、%tワード\n',[S,_文字数,_ワード数]), R = [],!. % 以下のサイトは ?- 'a##'. # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/827 # # 770で一度投稿しましたが問題文に不足が多かったため再度投稿します。 # [1] 授業単元:プログラミング # [2] 問題文:http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10362.txt[3] 環境 # 下記の機能を備えた極めて単純なデータベースシステムであるカード型データベースシステムの構築を考える。 # 課題7-1 # 下記のような方針でプログラムを作成せよ。 # # 新しい科目を登録する機能 # すでに登録されている科目を修正(更新)する機能 # 登録科目のソート(並び替え)を行う機能 # 登録科目の一部分のみを検索して取り出し、表示する機能 # 登録科目から、卒業までに必要な単位を計算し、表示する機能 # データベースファイルの仕様 # データベースファイルについては、本格的なデータベースになると、アクセス性や # 安定性など様々な要求を満たす必要があるが、ここでは最も単純なテキストファイルとする。 # さらに、書き込みをfprintfで、読み込みをfscanfで行えるように、 1行中に、 # それぞれの項目(フィールド)がスペースで区切られているようなファイルとする。 # なお、この場合、それぞれの項目はスペースを含んでいけないこととなる。 # 履修科目データベースシステムの例においては、例えば、 # 単位の種類(必修、選択必修など)、単位数、年次、前期か後期か、再履修かどうか、成績の6項目を含むこととする。 # ここで、いくつかの選択肢から選択するものについては、数字で置き換えることとする。 # このような仕様に基づいたファイルの例は以下のようなものになる。ここでは、ファイル名は、"ユーザ名_kamokudb.txt"とする。 # typedef struct _KAMOKU { # char name[MAX_KAMOKU_NAME]; /* 科目名 */ # int tanni_type; /* 必修、選択必修、選択、自由のいずれか */ # int tanni; /* 何単位か */ # int nenji; /* 何年次か */ # int kouki_flag; /* 前期なら0、後期なら1 */ # int sairi_flag; /* 再履修なら1、そうでないなら0 */ # int seiseki; /* 59点以下は不可、-1は未履修であることを示す */ # } KAMOKU; # # KAMOKU kamoku_list[200]; 履修科目データベースシステムを実装し、実行した例を以下に示す。なお、これは一例であって、課題は以下の通りに動作する必要はない。 ****** 単位データベースシステム ****** ユーザー名を入力して下さい:yamada ユーザー yamada は存在しません。データベースを新規に作成しますか? [1] Yes [2] No 番号を選択してください:1 **** 機能選択 **** [1] 科目登録 [2] 科目修正・削除 [3] データベース表示 [4] 必要単位数の表示 [5] 検索 [6] 並び替え [99] プログラム終了 機能を選択してください:1 **** 科目登録 **** 登録する科目を入力します。スペースを含まないローマ字で入力して下さい。 エンターキーのみを入力すると、科目の登録が終了します。 科目名:programming_ennsyuu_2 programming_ennsyuu_2 の情報を入力して下さい。 [1] 必修 [2] 選択必修 [3] 選択 [4] 自由 単位の種類:1 単位数:1 年次:2 [1] 前期 [2] 後期 前期・後期:2 [1] 非再履修 [2] 再履修 再履修:1 成績(-1:未履修):70 programming_ennsyuu_2 の情報を次のように登録します:必修, 1単位, 2年次, 後期, 非再履修, 70点 [1] 登録 [2] 再入力 番号を選択してください:1 programming_ennsyuu_2 の情報を登録しました。 科目名:denki_kairo_ennsyuu : 科目名: 科目登録を終了します。 **** 機能選択 **** : 機能を選択してください:2 **** 科目修正・削除 **** [1] programming_ennsyuu_2 [2] denki_kairo_ennsyuu [3] denki_kairo_kiso [4] digital_shingou_syori : 修正・削除する科目を選択して下さい:2 denki_kairo_ennsyuu の情報を修正して下さい。 最初の単位の種類で、[0] 削除 を選択すると、削除されます。 また、エンターキーを押すと、大括弧内の値が選択されます。 [0] 削除 [1] 必修 [2] 選択必修 [3] 選択 [4] 自由 単位の種類[3]: 単位数[1]: 年次[2]: [1] 前期 [2] 後期 前期・後期[1]: [1] 非再履修 [2] 再履修 再履修[1]: 成績(-1:未履修)[75]:85 denki_kairo_ennsyuu の情報を次のように修正します:選択, 1単位, 2年次, 前期, 非再履修, 85点 [1] 登録 [2] 再入力 番号を選択してください:1 denki_kairo_ennsyuu の情報を修正しました。 : 機能を選択してください:5 **** 検索 **** [1] 科目名 [2] 年次 [3] 前期・後期 [4] 不可の科目 検索したい項目を選択して下さい:2 年次を検索します。 検索対象:2 年次が 2 であるのは以下のものです: denki_kairo_kiso: 選択必修, 2単位, 2年次, 前期, 非再履修, 65点 denki_kairo_ennsyuu: 選択, 1単位, 2年次, 前期, 非再履修, 85点 programming_ennsyuu_1: 必修, 1単位, 2年次, 前期, 非再履修, 75点 programming_ennsyuu_2: 必修, 1単位, 2年次, 後期, 非再履修, 70点 digital_shingou_syori: 必修, 2単位, 2年次, 後期, 非再履修, 30点 : : 機能を選択してください:6 **** 並び替え **** [1] 科目名 [2] 年次 [3] 点数 どの項目で並べ替えるか選択して下さい:3 点数を昇順で並べ替えます。 digital_shingou_syori: 必修, 2単位, 2年次, 前期, 非再履修, 30点 denki_kairo_kiso: 選択必修, 1単位, 2年次, 前期, 非再履修, 65点 programming_ennsyuu_2: 必修, 1単位, 2年次, 後期, 非再履修, 70点 programming_ennsyuu_1: 必修, 1単位, 2年次, 前期, 非再履修, 75点 denki_kairo_ennsyuu: 選択, 1単位, 2年次, 前期, 非再履修, 85点 : : 機能を選択してください:4 **** 必要単位数の表示 **** 卒業に必要な単位数は、合計 62単位 総合基礎部門 計0単位 選択必修科目 0単位 選択科目 0単位 専門教育部門 計62単位 必修科目 12単位 選択必修科目 16単位 選択科目 34単位 : 機能を選択してください:99 プログラムを終了します。 データベースファイル yamada_kamokudb.txt を更新しました。 拡張 上記のプログラムの拡張を考える。例えば、以下のようなものが考えられる。 修得済み単位数や、不可となった科目を表示するなど、上記以外の機能を提供する。 検索において、完全一致のものだけでなく、条件に見合ったものを出力するようにする。 並び替えにおいて、年次だけでなく、年次と前期・後期を考慮した並べ替えをするなど、 他の並び替え方法を提供する。 データベースファイルとして、コンマ区切りのテキストファイルを用いる。 上記では、データファイルにスペース区切りのテキストファイルを用いたが、コンマ区切りのテキストファイル(CSVファイル)が用いられることも多い。この場合、フィールドにスペースが含まれていても問題なく動作する(ただし、コンマが含まれる場合には何らかの対策が必要になる)。 CSVファイルの読み込みのためには、いくつかの方法があるが、fgetsで読み込み、文字','を探す方法などが考えられる。また、strchrという関数が、文字列から特定の文字を含む箇所を取り出すものであるため、 fgetsとこれを組み合わせる方法もある。 構造体の配列を用いるのではなく、構造体へのポインタに対しmallocでメモリ確保する方法を用いる。 この場合、状況に応じてサイズを変えることが可能となる。ただし、確保したメモリは、使わなくなった場合には解放する必要がある。 KAMOKU *kamoku_list = NULL; : int num_list = 200; : kamoku_list = malloc(sizeof(struct _KAMOKU) * num_list); /* これ以降は、200の要素を持つ構造体の配列と同様に使用できる */ : printf("成績:%d\n", kamoku_list[0].seiseki); : free(kamoku_list); その他、既存のデータベースシステム等を参考にして機能を追加する。 履修科目データベースの検索(_検索項目,_検索鍵,_検索データ) :- get_split_lines('ユーザ名_kamokudb.txt',[' '],LL), member(_検索データ,LL), 鍵情報(_検索項目名,_検索データ,_検索鍵). 鍵情報(科目名,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_科目名). 鍵情報(単位の種類,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_単位の種類). 鍵情報(単位数,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_単位数). 鍵情報(年次,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_年次). 鍵情報(後期,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_後期). 鍵情報(前期,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_前期). 鍵情報(再履修,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_再履修). 鍵情報(成績,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_成績). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 鍵情報ソースプログラムの生成(_項目名ならび) :- append(_,[_項目名|R],_項目名ならび), findall(B,(member(A,_項目名ならび),concat_atom(['_',A],B)),L2), concat_atom(L2,',',_項目名ならび文字列), write_formatted('鍵情報(%t,[%t],_%t).\n',[_項目名,_項目名ならび文字列,_項目名]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/391 # # [1] C言語復習 # [2] 1 桁の整数をスーペース区切りで何個か入力する # (EOF で入力の終了とする) と, 下のように隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り, # 最後に残った 2 桁 (ただし 3 桁で 1 0 0 が残ったときは満点なのでそこで終了する) で運勢を占う, というプログラムを作成せよ. # 0 7 9 5 6 5 7 7 4 2 ← 入力 # 7 6 4 1 1 2 4 1 6 # 3 0 5 2 3 6 5 7 # 3 5 7 5 9 1 2 # 8 2 2 4 0 3 # 0 4 6 4 3 # 4 0 0 7 # 4 0 7 # 4 7 # '隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り,最後に残った 2 桁 (ただし 3 桁で 1 0 0 が残ったときは満点なのでそこで終了する) で運勢を占う'(_運勢) :- '1 桁の整数をスーペース区切りで何個か入力する'(Line), split(Line,[' '],L1), '隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り'(0,L1,_運勢情報), 運勢(_運勢情報,_運勢). '1 桁の整数をスーペース区切りで何個か入力する'(Line) :- write('1 桁の整数をスーペース区切りで何個か入力しなさい : '), get_line(Line). '隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り'(_,[1,0,0],[1,0,0]) :- !. '隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り'(_,[A,B],[A,B]) :- !. '隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り'(N,L1,_運勢情報) :- concat_atom(L1,' ',S), 'N桁の空白'(N,_N桁の空白), write_formatted('%t%t\n',[_N桁の空白,S]), '2桁ずつ桁上がりなしの加算'(L1,L2), N2 is N + 1, '隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り'(N2,L2,_運勢情報). '2桁ずつ桁上がりなしの加算'([_],[]) :- !. '2桁ずつ桁上がりなしの加算'([M1,M2|R1],[M|R2]) :- M is (M1 + M2) mod 10, '2桁ずつ桁上がりなしの加算'([M2|R1],R2). 運勢([1,0,0],'100点') :- !. 運勢([M,M],'90点') :- !. 運勢([M,N],'80点') :- M > 5,M < N,!. 運勢([M,N],'70点') :- M < 6,M < N,!. 運勢([M,N],'60点') :- M > N,!. 'N桁の空白'(N,_N桁の空白) :- findall(' ',(for(0,M,N),\+(M=0)),L), concat_atom(L,_N桁の空白). % 'N桁の空白'(N,_N桁の空白) :- findall(' ',for(1,_,N),L),concat_atom(L,_N桁の空白). % で良さそうなものだが、これだと0桁の空白を表現できない。 % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1280653311/72 # # C言語の問題なのですが # # 4ケタの番号,名前,名前(フリガナ),都道府県,住所,電話番号 # # といった300人分の名簿データみたいなcsvファイルがあり # それをで4ケタの番号どうりに単純ソートで昇順に表示して # 番号を入力すると2分探索で探索を開始し # 正しい番号を入力すると電話番号を、不正な番号を入力すると # エラー表示が出るプログラムを作成したいのですがわからず困ってます # どなたかよろしくお願いします # (malloc関数は使わずにとの事です) # # '4ケタの番号,名前,名前(フリガナ),都道府県,住所,電話番号といった300人分のcsvファイルがあり、番号を入力すると2分探索で探索を開始し正しい番号を入力すると電話番号を不正な番号を入力するとエラー表示する'(_csvファイル) :- write('検索する4ケタの番号を入力してください : '), get_integer(N), get_split_lines(_csvファイル,[','],L1), '4ケタの番号どうりに単純ソートで昇順にならべる'(L1,L2), lenth(L2,Len), M is Len // 2, list_nth(M,L2,L), 2分探索で探索(1,M,Len,L2,N,L,X), write_formatted('%t,%t,%t,%t,%t,%t\n',X). '4ケタの番号,名前,名前(フリガナ),都道府県,住所,電話番号といった300人分のcsvファイルがあり、それを4ケタの番号どうりに単純ソートで昇順に表示'(_csvファイル) :- get_split_lines(_csvファイル,L1), '4ケタの番号どうりに単純ソートで昇順にならべる'(L1,L2), '4ケタの番号どうりに表示'(L2). '4ケタの番号どうりに単純ソートで昇順にならべる'(L1,L2) :- sort(L1,L2),!. '4ケタの番号どうりに表示'([]) :- !. '4ケタの番号どうりに表示'([L|R]) :- concat_atom(L,',',A), write_formatted('%t\n',[A]), '4ケタの番号どうりに表示'(R). 2分探索で探索(_,_,_,_,N,[N|R],[N|R]) :- !. 2分探索で探索(S,M,E,L2,N,[N1|R1],X) :- N1 < N, M2 is (S+M) // 2, list_nth(M2,L2,L1), 2分探索で探索(S,M2,M,L2,N,L1,X),!. 2分探索で探索(S,M,E,L2,N,[N1|R1],X) :- N1 > N, M2 is (M+E) // 2, list_nth(M2,L2,L1), 2分探索で探索(M,M2,E,L2,N,L1,X),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/91 # # [1] 授業単元:情報処理 # [2] 問題文: # # 問1 キーボードから3個の実数(整数でない)値を1行に1組として計5組入力し、 # ファイル(ファイル名data1.txt)に保存する。 # # 問2 #  問1で作ったファイルから実数値を読み込み、総合計と各組の実数の平均を求める。 # ただし、ファイルに書かれている組の数は不明とする。 # 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力し、ファイル(ファイル名data1.txt)に保存する。 ' :- 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(1,L), open('data1.txt',write,Output), append(_,[[V1,V2,V3]|R],L), write_formatted(Output,'%t,%t,%t\n',[V1,V2,V3]), R = [], close(Output),!. 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(3,[]) :- !. 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(N,[L|R]) :- write_formatted('%t組目の入力 _実数1 _実数2 _実数3 : ',[N]), get_line(Line), 入力の診断(Line,L), N2 is N + 1, 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(N2,R),!. 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(N,X) :- 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(N,X). 入力の診断(Line,[V1,V2,V3]) :- split(Line,[' ',','],[V1,V2,V3]), real(V1), real(V2), real(V3),!. 入力の診断(Line,[V1,V2,V3]) :- write_formatted('%tは実数を3個(間をスペースであける)になっていません',[Line]), fail. '問1で作ったファイルから実数値を読み込み、総合計と各組の実数の平均を求める。'(_総合計,_各組の実数の平均) :- get_lines('data1.txt',Lines), 総合計の取得(Line,_総合計), 各組の平均の取得(Lines,_各組の実数の平均). 総合計の取得(Lines,_総合計) :- findsum(_各行の合計,( member(Line,Lines), split(Line,[','],[V1,V2,V3]), _各行の合計 is V1+V2+V3), _総合計). 各組の平均の取得(Lines,_各組の実数の平均ならび) :- findall(_各組の実数の平均,( member(Line,Lines), split(Line,[','],[V1,V2,V3]), _各組の実数の平均 is (V1+V2+V3) / 3), _各組の実数の平均ならび). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258320456/104 # # 以下の5行の文字列のいずれかをランダムに返すプログラムを書きなさい # あいうえお # かきくけこ # さしすせそ # たちつてと # なにぬねの # '5行の文字列のいずれかをランダムに返す'(_5行の文字列,_文字列) :- list(_5行の文字列), N is (random mod 5) + 1, list_nth(N,_5行の文字列,_文字列),!. '5行の文字列のいずれかをランダムに返す'(_5行の文字列,_文字列) :- atom(_5行の文字列), split(_5行の文字列,['\n'],L), '5行の文字列のいずれかをランダムに返す'(L,_文字列),!. % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(L1,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1) :- shs('ls -N *.txt',L1). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([],_,_). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_テキストファイル名|R1],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_|R1],_指定した科目,_指定した点数) :- 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(R1,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号) :- get_split_lines(_テキストファイル名,[' ',':'],L), member([_指定した科目,_指定した点数],L), 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/920 # # [1] C言語プログラミング演習 # [2] 問題文(含コード&リンク # ATM(Automated Teller Machine; 現金自動預け払い機)システムを実現するプログラムを考える。 # # 氏名,口座番号,暗証番号,預金残高を要素とする構造体を宣言し, 512人分の口座が作成可能なようにせよ.また,初期値として次のように構造体の内容を設定せよ. # # 立命太郎の口座番号は1234で,預金残高を1,234,560円に設定する. # 野路花子の口座番号は5678で,預金残高を987,600円に設定する. # 衣笠一郎の口座番号は9012で,預金残高を538,600円に設定する. # 暗証番号は口座番号に1111を足して10000で割った余りに設定する. # ここで暗証番号は、口座番号を引数としてとり、それに1111を足して10000で # 割った余りを計算する関数を作成して設定すること. # 上記の方法で初期値を設定し、設定された3人の預金残高を画面へ出力する # プログラムを作成せよ.ただし、ひとり分の預金残高を表示する関数を作成して、 # これを繰り返し使って3人の預金残高を出力すること. # # % ./initAccount # 預金残高は次のとおりです. # 立命太郎 (1234) 1234560 円 # 野路花子 (5678) 987600 円 # 衣笠一郎 (9012) 538600 円 # % 預金口座の初期設定(_ファイル) :- w3c('http://pc12.2ch.net/test/read.cgi/tech/1276810079/920',Lines), append(_,[Line|R],Lines), split(Line,[の口座番号は,'で,貯金残高を,円に設定する.'],[_氏名,_口座番号,_預金残高]), assertz(預金口座(_氏名,_口座番号,_預金残高)), _暗証番号 is (_口座番号 + 1111) mod 10000, assertz(預金口座暗証番号(_口座番号,_暗証番号)), R = [],!. 預金口座の初期設定(_). 設定された3人の預金残高を画面へ出力する :- findsetof(_口座番号,預金口座(_,_口座番号,_),_口座番号ならび), write('預金残高は次のとおりです.\n'), append(_,[_口座番号|R],_口座番号ならび), ひとり分の預金残高を表示する(_口座番号), R = []. ひとり分の預金残高を表示する(_口座番号) :- 預金口座(_氏名,_口座番号,_預金残高), write_formatted('%t (%t) %t 円\n',[_氏名,_口座番号,_預金残高]),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/916 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):県から国、及び国から県に換算する関数を作成し、 # main関数でキーボードから数値とその値が国であるか県であるかを入力し、県ならば国に、 # 国ならば県に換算した値を小数点以下1桁までで出力するプログラムを作成しなさい。 # 値を引数とする関数で計算させ(関数名は nation とする)、出力は main関数で行うこと。 # # 関係は以下の通り # 県(A):(B+2)*5 国(B):A/3+25 # <例> # 数値を入力してください: 75 # 75 が「県」なら "A" を「国」なら "B" を入力してください: B # # 県 75.0 = 国 50.0 # # なお、if文かfor文を用いること。 # # キーボードから数値とその値が国であるか県であるかを入力し、県ならば国に、国ならば県に換算した値を小数点以下1桁までで出力する :- キーボードから数値とその値が国であるか県であるかを入力し、(N,_AまたはB), 県ならば国に、国ならば県に換算した値を小数点以下1桁までで出力する(N,_AまたはB). キーボードから数値とその値が国であるか県であるかを入力し、(N,_AまたはB) :- write('数値を入力してください: '), get_integer(N), write_formatted('%t が「県」なら "A" を「国」なら "B" を入力してください: ',[N]), get_split_line(['"',' '],[_AまたはB]),!. 県ならば国に、国ならば県に換算した値を小数点以下1桁までで出力する(N,'A') :- A is N * 1.0, B is A / 3 + 25, write_formatted('県 %t = 国 %t\n',[A,B]),!. 県ならば国に、国ならば県に換算した値を小数点以下1桁までで出力する(N,'B') :- B is N * 1.0, A is (B + 2) * 5, write_formatted('県 %t = 国 %t\n',[A,B]),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/595 # # [1] 授業単元:プログラミング演習 # Q1. 問題文:4つの整数を入力し、それらを要素とする行列を求め、その値を以下のような # 形式で表示するプログラムを作成せよ。 # # 例 100 20 30 40と入力すれば #   | 100 20 | =3400 # | 30 40 | と表示される # # Q.2ディスカウントストアでどの商品でも5個以上買えば1割引、10個以上で2割引、20個以上で # 4割引となっていた。キーボードから買う商品の単価と個数を入力し、合計金額を計算するプログラミングを # 作成せよ。 # :- op(700,xfx,は). 'ディスカウントストアでどの商品でも5個以上買えば1割引、10個以上で2割引、20個以上で4割引となっていた。キーボードから買う商品の単価と個数を入力し、合計金額を計算する' :- write('商品単価と個数を入力してください : '), get_split_line([' ',','],[_単価,_個数]), 合計金額を計算する(_単価,_個数,_合計金額). 合計金額を計算する(_単価,_個数,_合計金額) :- abs(_個数) < 5, _合計金額 は 四捨五入(_単価 * _個数). 合計金額を計算する(_単価,_個数,_合計金額) :- abs(_個数) >= 5,abs(_個数) < 10, _合計金額 は 四捨五入(_単価 * _個数 * (1-0.1)). 合計金額を計算する(_単価,_個数,_合計金額) :- abs(_個数) >= 10,abs(_個数) < 20, _合計金額 は 四捨五入(_単価 * _個数 * (1-0.2)). 合計金額を計算する(_単価,_個数,_合計金額) :- abs(_個数) >= 20, _合計金額 は 四捨五入(_単価 * _個数 * (1-0.4)). _値 は 四捨五入(_式) :- _値_1 は _式, _値_1 >= 0.0, _値 is truncate(floor(_値_1 + 0.5)),!. _値 は 四捨五入(_式) :- _値_1 は _式, _値_1 < 0.0, _値 is truncate(ceiling(_値_1 - 0.5)),!. _値 は _式 :- _値 is _式. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/595 # # [1] 授業単元:プログラミング演習 # Q1. 問題文:4つの整数を入力し、それらを要素とする行列を求め、その値を以下のような # 形式で表示するプログラムを作成せよ。 # # 例 100 20 30 40と入力すれば #   | 100 20 | =3400 # | 30 40 | と表示される # # Q.2ディスカウントストアでどの商品でも5個以上買えば1割引、10個以上で2割引、20個以上で # 4割引となっていた。キーボードから買う商品の単価と個数を入力し、合計金額を計算するプログラミングを # 作成せよ。 # '4つの整数を入力し、それらを要素とする行列を求め、行列とその値を表示する' :- get_split_line([' ',','],[A,B,C,D]), 正方行列の行列式の値([[A,B],[C,D]],_値), write_formatted('  |%3d %3d| = %t\n',[A,B,_値]), write_formatted('  |%3d %3d|\n',[C,D]). 正方行列の行列式の値(_正方行列,_行列式の値) :- ガウス行列に変形(_正方行列,X,Y), '行列式|C|の値'(X,Z1), ならびの積(Y,Z2), _行列式の値 is Z1 // Z2. ならびの積([A],A) :- !. ならびの積([A|R],X) :- ならびの積(R,Y), X is A * Y. '行列式|C|の値'(_行列,_値) :- length(_行列,Len), findall(U,(for(1,N,Len),list_nth(N,_行列,_行),list_nth(N,_行,U)),L), ならびの積(L,_値). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/535 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):data.txtに書かれている氏名と成績を読み込み、氏名を2次元配列、成績を1次元配列に格納せよ。 # 'data.txtに書かれている氏名と成績を読み込み、氏名を2次元配列、成績を1次元配列に格納する' :- get_split_lines('data.txt',[' '],LL),   '氏名を2次元配列、成績を1次元配列に格納する'(LL,_氏名ならび,_成績ならび), 氏名ならび・成績ならびを格納する(_氏名ならび,_成績ならび). '氏名を2次元配列、成績を1次元配列に格納する'([],[],[]). '氏名を2次元配列、成績を1次元配列に格納する'([[_氏名,_成績]|R1],[_氏名文字ならび|R2],[_成績|R3]) :- atom_chars(_氏名,_氏名文字ならび), '氏名を2次元配列、成績を1次元配列に格納する'(R1,R2,R3). 氏名ならび・成績ならびを格納する(_氏名ならび,_成績ならび) :- assertz(氏名ならび(_氏名ならび)), assertz(成績ならび(_成績ならび)). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/877 # # [1] 授業単元:2分探索法 # [2] 問題文: http://nojiriko.asia/jpeg/up10962.jpg にコピーさせていただきました。 # _学籍番号+_氏名+_誕生_月+_誕生_日 :- open('data_b.txt',append,Output), write_formatted(Output,'%t %t %t %t\n',[_学籍番号,_氏名,_誕生_月,_誕生_日]), close(Output). 'data_b.txtを読み込み、4月1日を年初めとして、誕生日の早いもの順にソートし、その結果を「output_b.txt」ファイルに出力する' :- get_split_lines('data_b.txt',[' '],LL), 鍵項目の付加(LL,LL2), 整列(LL2,LL3), 鍵項目を除去しながら出力する(LL3). 鍵項目の付加([],[]) :- !. 鍵項目の付加([[_学籍番号,_氏名,_誕生_月,_誕生_日]|R1],[[_誕生_月_2,_誕生_日,_学籍番号,_氏名,_誕生_月,_誕生_日]|R2]) :- '1-3月を13-15月に修正'(_誕生_月,_誕生月_2), 鍵項目の付加(R1,R2). '1-3月を13-15月に修正'(_誕生_月,_誕生月_2) :- _誕生_月 >= 1,_誕生_月 =< 3,_誕生_月_2 is _誕生_月 + 12,!. '1-3月を13-15月に修正'(_誕生_月,_誕生月). 鍵項目を除去しながら出力する([]) :- !. 鍵項目を除去しながら出力する([[_,_|L]|R]) :- open('out_b.txt',append,Output), write_formatted(Output,'%t %t %t月 %t日\n',L), close(Output), 鍵項目を除去しながら出力する(R). 'output_b.txtを読み込み、ある誕生日を入力したときに、その学生の学籍番号、氏名、誕生月、誕生日を二分探索法により出力する'(_誕生_月,_誕生_日) :- get_split_lines('output_b.txt',[' ',月,日],LL), 二分探索法(LL,_誕生_月,_誕生_日,[_学籍番号,_氏名,_誕生_月,_誕生_日]), write_formatted('%t %t %t %t月%t日\n',[_学籍番号,_誕生_月,_誕生_日]). 二分探索法(LL,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :- '1-3月を13-15月に修正'(_誕生_月,_誕生月_0), length(LL,Len), Len0 is Len // 2, append(L0,[[_学籍番号_1,_氏名_1,_誕生_月_1,_誕生_日_1]|L1],LL), length(L0,Len0), '1-3月を13-15月に修正'(_誕生_月_1,_誕生月_10), 二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]). 二分探索法(L0,L,L1,_誕生_月,_誕生_日,_誕生_月,_誕生_日,L) :- !. 二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :- [_誕生_月_0,_誕生_日] @> [_誕生_月_10,_誕生_日_1], 二分探索法(L0,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]). 二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :- [_誕生_月_0,_誕生_日] @< [_誕生_月_10,_誕生_日_1], 二分探索法(L1,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/335 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):ファイルに保存された会員情報を指定された項目をキーとしてソートするプログラムを作成する. # 出力形式は,入力データと同じ,つまり1行に1人分のデータを格納し,各項目間はカンマで区切るものとする. # また,ソート済みのデータはファイルではなく標準出力に出力するものとする. # 整数型のデータについては数値として,文字列型のデータについては大文字/小文字を区別せずにソートをすること. # ソートアルゴリズムはこれまでの演習で使用したもの,していないものに関わらず,何を用いてもよい. # # また,会員数は最大で20,000人と仮定してもよい. # # 会員情報の入ったファイルのファイル名,キーとなる項目,正順か逆順かの指定はプログラム実行時の引数として与える.第一引数が会員情報の入ったファイル名,第二引数が項目番号(表1参照),第三引数がソート方法(0なら昇順,1なら降順)とする. # # 表1: データ型 項目名 項目番号 型 # 会員ID 1 整数(int) # 姓 2 文字列(最大で50文字) # 名 3 文字列(最大で50文字) # 年齢 4 整数(int) # 州 5 文字列(最大で50文字) # 郡 6 文字列(最大で50文字) # # # オンメモリ整列限界数(1000). ファイルに保存された会員情報を指定された項目をキーとしてソートする(_対象ファイル,_鍵項目番号,_ソート方法) :- オンメモリ整列限界数(_オンメモリ整列限界数), open(_対象ファイル,read,Input), ふたつの仮ファイルの取得と交互からくり生成, 入力出力ファイルを交互しながらの繰り返し(_,_仮出力ファイル,InputT,OutputT), 対象ファイルから読み込む(Input,_オンメモリ整列限界数,_鍵項目番号,LL,_診断), 昇降順・指定整列(LL,_ソート方法,_整列されたLL), 鍵項目番号とソート方法をしてファイルマージ(_整列されたLL,_ソート方法,InputT,OutputT), \+(_診断=1000),close(Input), 仮出力ファイルの内容を整理しながら標準出力に表示する(_仮出力ファイル). 入力出力ファイルを交互しながらの繰り返し(_仮ファイルA,_仮ファイルB,InputT,OutputT) :- 仮ファイルからくり(_仮ファイルA,_仮ファイルB), open(_仮ファイルA,read,InputT), open(_仮ファイルB,write,OutputT). 仮ファイルからくり(X) :- 仮ファイルからくり(X). ふたつの仮ファイルの取得と交互からくり生成 :- tmpnam(_仮ファイル1),open(_仮ファイル1,write,Output1),close(Output1), tmpnam(_仮ファイル2),opene(_仮ファイル2,write,Output2),close(Output2), asserta(仮ファイルからくり(_仮ファイル2,_仮ファイル1)), asserta(仮ファイルからくり(_仮ファイル1,_仮ファイル2)). 対象ファイルから読み込む(Input,_オンメモリ整列限界数,_鍵項目番号,LL,_診断) :- 対象ファイルから読み込む(Input,0,_オンメモリ整列限界数,_鍵項目番号,LL,_診断),!. 対象ファイルから読み込む(Input,_オンメモリ整列限界数,_オンメモリ整列限界数,_,[],_オンメモリ整列限界数) :- !. 対象ファイルから読み込む(Input,N,_オンメモリ整列限界数,_鍵項目番号,[[_鍵_1,_会員ID,_姓_1,_名_1,_年齢,_州_1,_郡_1]|R],_診断) :- get_line(Input,Line), N2 is N + 1, split([','],Line,[_会員ID,_姓,_名,_年齢,_州,_郡]), to_upper([_姓,_名,_州,_郡],[_姓_1,_名_1,_州_1,_郡_1]), list_nth(_鍵項目番号,[_会員ID,_姓_1,_名_1,_年齢,_州_1,_郡_1],_鍵), 文字項目なら大文字に変換(_鍵,_鍵項目番号,_鍵_1), 対象ファイルから読み込む(Input,N,_オンメモリ整列限界数,_鍵項目番号,R,_診断). 文字項目なら大文字に変換(_鍵,_鍵項目番号,_鍵_1) :- member(_鍵項目番号,[2,3,5,6]), to_upper(_鍵,_鍵_1),!. 文字項目なら大文字に変換(_鍵,_,_鍵). 昇降順・指定整列(LL,1,_整列されたLL) :- sort(LL,_整列されたLL). 昇降順・指定整列(LL,2,_整列されたLL) :- rsort(LL,_整列されたLL). 鍵項目番号とソート方法をしてファイルマージ([],end_of_file,_,InputT,OutputT) :- !. 鍵項目番号とソート方法をしてファイルマージ([L1|R1],end_of_file,_,InputT,OutputT) :- write_formatted(OutputT,'%t,%t,%t,%t,%t,%t,%t\n',L1), 鍵項目番号とソート方法をしてファイルマージ(R1,end_of_file,_,InputT,OutputT),!. 鍵項目番号とソート方法をしてファイルマージ([],[_鍵2|L2],_,InputT,OutputT) :- write_formatted(OutputT,'%t,%t,%t,%t,%t,%t,%t\n',[_鍵2|L2]), eofまでコピーする(InputT,OutputT), close(InputT), close(OutputT),!. 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]]|R1],[_鍵2|L2],1,InputT,OutputT) :- _鍵1 @=< _鍵2, write_formatted(OutputT,'%t\n',[_鍵1|L1]), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵2|L2],_ソート方法,InputT,OutputT). 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]|R1],[_鍵2|L2],1,InputT,OutputT) :- _鍵1 @> _鍵2, write_formatted(OutputT,'%t\n',[_鍵2|L2]), get_line(InputT,Line), atom_to_term(Line,(_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3),_), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3],_ソート方法,InputT,OutputT). 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]|R1],[_鍵2|L2],2,InputT,OutputT) :- _鍵1 @>= _鍵2, write_formatted(OutputT,'%t\n',[_鍵1|L1]), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵2|L2],_ソート方法,InputT,OutputT). 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]|R1],[_鍵2|L2],2,InputT,OutputT) :- _鍵1 @< _鍵2, write_formatted(OutputT,'%t\n',[_鍵2|L2]), get_line(InputT,Line), atom_to_term(Line,(_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3),_), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3],_ソート方法,InputT,OutputT). eofまでコピーする(InputT,OutputT) :- repeat, get_line(Line), ( Line=end_of_file;write_formatted('%t\n',[Line]),fail),!. 仮出力ファイルの内容を整理しながら標準出力に表示する(_仮出力ファイル) :- open(_仮出力ファイル,read,Input), repeat, get_line(Line), ( Line=end_of_file; split([','],Line,[_|L]), write_formatted('%t,%t,%t,%t,%t,%t\n',L), fail ). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/200 # # [課題]携帯のiアプリをSTARを使い作成しています。 # 学校のホームページに載っている休講情報に接続して、それから先生の名前と日にちだけ取り出す方法が知りたいです。 # 休講情報は # # 6月 # 24日 #  野口 文子 先生 #  山下 紗枝 先生 #  井上 恵子 先生 # # 25日 #  山下 紗枝 先生 # # 26日 # ・ # ・ # ・ # # のようになっています。 # 先生の名前の前の全角スペースを目印にして、配列に入れるそうなのですが・・・。 # # [形態]STARアプリケーション # # [Ver]1.6.0_18 # # [期限]6月29日お昼頃 # # [補足] # 期限が短くてすみません。 # ペアになりiアプリを製作しています。ペアの友達が時間割りを表示するところをつくり、私は学校のHPからとってくる休講情報の文字列処理を担当しています。わかりづらいとはおもいますが、よろしくお願いします。 # # 学校のホームページに載っている休講情報に接続して、それから先生の名前と日にちだけ取り出す(URL,_休講情報ならび) :- w3c(URL,Lines), 先生の名前と日にちだけ取り出す(Lines,_休講情報ならび),!. 先生の名前と日にちだけ取り出す(Lines,_休講情報ならび) :- append(L0,[A|R1],Lines), sub_atom(A,_,2,_,先生), 月日を取り出す(L0,_月,_日), ある日の休講情報ならびを得る([A|R1],_月,_日,_ある日の休講となる情報ならび,_残りならび), 先生の名前と日にちだけ取り出す(_残りならび,R), append(_ある日の休講となる情報ならび,_休講情報ならび),!. 先生の名前と日にちだけ取り出す(_,[]) :- !. 月日を取り出す(Lines,_月,_日) :- append(_,[A|_],Lines),sub_atom(A,S,1,_,月),sub_atom(A,0,S,_,_月), append(_,[B|_],Lines),sub_atom(A,S,1,_,日),sub_atom(B,0,S,_,_日),!. ある日の休講情報ならびを得る([],_,_,[],[]) :- !. ある日の休講情報ならびを得る(['\n'|R],_,_,[],R) :- !. ある日の休講情報ならびを得る([A|R1],_月,_日,[[_氏名,_月,_日]|R2],_残りならび) :- sub_atom(A,_,2,_,先生), split(A,[' '],[_姓,_名,先生]), concat_atom([_姓,_名],_氏名), ある日の休講情報ならびを得る(R1,_月,_日,R2,_残りならび). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/357 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10767.txt # # 登録番号(int no)と名前(char *name)と年齢(int age)を含む構造体person型のポインタ変数を宣言し, # 登録人数分だけの動的メモリ確保をせよ. そして, データをファイルから入力せよ. (malloc関数を使用すること) # ファイルの形式は, 先頭に登録する人数とし, そのあとに人数分のデータを登録番号, 名前, 年齢の順に書いていく # (下の例を参照. 登録番号は入力順に1,2,3,4,5, …とする. そして, 入力した全員データを表示せよ. # # (ファイルの例) # 3 # 1 田中 20 # 2 大田 40 # 3 井上 35 % Prolog データファイルを作ることも問題のうちなのかな。例によってポインター云々は無視。 ファイル作成(_ファイル名) :- write('作成するデータ数を入力してください : '), get_integer(N), tell(_ファイル名), for(1,M,N), write('名前と年齢をカンマまたはスペース区切りで入力してください : '), get_split_line([',',' '],[_名前,_年齢]), write_formatted(人物('%q,%q,%q).\n',[N,_名前,_年齢]), M = N, told. ファイルから読み取ったデータを登録する(_ファイル名) :- consult(_ファイル名). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ファイル作成(_ファイル名) :- write('作成するデータ数を入力してください : '), get_integer(N), tell(_ファイル名), write_formatted('%t\n',[N]), for(1,M,N), write('名前と年齢をカンマまたはスペース区切りで入力してください : '), get_split_line([',',' '],[_名前,_年齢]), write_formatted('%t %t %t\n',[N,_名前,_年齢]), M = N, told. ファイルから読み取ったデータを登録する(_ファイル名) :- get_split_lines(_ファイル名,[' '],LL), LL = [_|LL2], 'この場合、要素数(構造体の数)はいらないから', append(_,[[_登録番号,_名前,_年齢]|R],LL2), assertz(人物(_登録番号,_名前,_年齢)), R = []. 'この場合、要素数(構造体の数)はいらないから'. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/861 # # [1] 授業単元:ファイル操作、2分探索法 # [2] 問題文:学生の身長、体重のデータを読み込みある学籍番号を入力した # ときにその学生の学籍番号、身長、体重を2分探索法により求め、出力しなさい。 # 学生のデータは、txtファイルでxx yyy zzという風に記載されています。 # (例)出力結果 # 学生番号:xx # 身長:yyy (cm) # 体重:zz (kg) # 学生の身長、体重のデータを読み込む(_テキストファイル) :- get_split_lines(_テキストファイル,[' '],LL), 二分木を育てる(LL). ある学籍番号を入力したときにその学生の学籍番号、身長、体重を2分探索法により求める(_学籍番号,_身長,_体重) :- 二分木の根(_根), 葉まで辿る([_学籍番号,_身長,_体重],_根). 二分木を育てる([A|R]) :- assertz(二分木(A,_,_)), assertz(二分木の根(A)), 二分木を育てる(L,_根). 二分木を育てる([],_) :- !. 二分木を育てる([A|R],_根) :- 根・葉の成長(A,_根), 二分木を育てる(R,_根). 葉まで辿る(_値,_値) :- 二分木(_値,_左,_右). 葉まで辿る(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@<,_値,_根), \+(var(_左)), 葉まで辿る(_値,_左). 葉まで辿る(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@>=,_値,_根), \+(var(_右)), 葉まで辿る(_値,_右). 根・葉の成長(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@<,_値,_根), \+(var(_左)), 根・葉の成長(_値,_左). 根・葉の成長(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@>=,_値,_根), \+(var(_右)), 根・葉の成長(_値,_右). 根・葉の成長(_値,_根) :- retract(二分木(_根,_左,_右1)), 根・葉の成長(_値,_根,_左,_右1),!. 根・葉の成長(_値,_根,_左,_右1) :- 変数を含む値を較べる(@<,_値,_根), var(_左), assertz(二分木(_根,_値,_右1)), assertz(二分木(_値,_,_)),!. 根・葉の成長(_値,_根,_左,_右1) :- 変数を含む値を較べる(@>=,_値,_根), var(_右), assertz(二分木(_根,_左,_値)), assertz(二分木(_値,_,_)),!. 変数を含む値を較べる(@<,[V|R1],[_|R2]) :- var(V), 変数を含む値を較べる(@<,R1,R2),!. 変数を含む値を較べる(@<,[A|R1],[B|R2]) :- \+(var(A)), A @< B,!. 変数を含む値を較べる(@>=,[],[]) :- !. 変数を含む値を較べる(@>=,[V|R1],[_|R2]) :- var(V), 変数を含む値を較べる(@>=,R1,R2),!. 変数を含む値を較べる(@>=,[A|R1],[B|R2]) :- \+(var(A)), A @> B,!. 変数を含む値を較べる(@>=,[A|R1],[A|R2]) :- \+(var(A)), 変数を含む値を較べる(@>=,R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/340 # # [1] 授業単元: プログラミング開発基礎 # [2] 問題文 複数ありますのでこちらで # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10764.txt # # 1 問題1 # 整数値を読み込んで,その数が10 で割り切れるかどうかを表示するプログラムを作成せよ. # なお,表示後に,もう一度続けるかの確認を促し,それに応じて何度でも繰り返せるようにすること # # 2 問題2 # 非負の整数値を読み込んで,その桁数を表示するプログラムを作成せよ. # なお,負の値を読み込んだ場合は,再入力を促すメッセージを表示すること. # # 3 問題3 # 二つの整数値を読み込んで,小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示するプログラムを作成せよ. # 4 問題4 # 9999 を読み込むまで次々と整数値を読み込んでいき,合計値および平均値を表示するプログラムを作成せよ.なお,最後に読み込んだ9999 は合計には加えないものとする '整数値を読み込んで,その数が10 で割り切れるかどうかを表示する' :- 催促付き整数入力('整数値を入力してください : ',N), '10で割り切れるか判定する'(N), write('入力を続けますか y or n : '),get_line(Line), Line = y, '整数値を読み込んで,その数が10 で割り切れるかどうかを表示する'. '整数値を読み込んで,その数が10 で割り切れるかどうかを表示する'. '10で割り切れるか判定する'(N) :- 0 is N mod 10, write_formatted('あなたの入力した数%tは10で割り切れます\n',[N]),!. '10で割り切れるか判定する'(N) :- write_formatted('あなたの入力した数%tは10で割り切れません\n',[N]),!. '非負の整数値を読み込んで,その桁数を表示する' :- 催促付き整数入力('非負の整数値を入力してください : ',N),N >= 0, 入力された整数の桁数を表示する(1,N), write_formatted('入力を続けますか y or n : '),get_line(Line), Line = y, '非負の整数値を読み込んで,その桁数を表示する'. '非負の整数値を読み込んで,その桁数を表示する'. 入力された整数の桁数を表示する(M,N) :- truncate(10 ^ M) > N,write_formatted('入力された非負整数は%桁です\n',[M]),!. 入力された整数の桁数を表示する(M1,N) :- M2 is M1 + 1,入力された整数の桁数を表示する(M2,N). 二つの整数値を読み込んで,小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示する :- write('整数値をカンマで区切り二つ読み込みます : '), get_split_line([','],[N1,N2]), 小さい順に(N1,N2,N3,N4), findsum(N,for(N3,N,N4),Sum1), Sum is truncate(Sum1), write_formatted('%t以上%t以下のすべての整数の和は%tです。\n',[N3,N4,Sum]). 小さい順に(N1,N2,N1,N2) :- N1 =< N2,!. 小さい順に(N1,N2,N2,N1) :- N1 > N2,!. '9999 を読み込むまで次々と整数値を読み込んでいき,合計値および平均値を表示する' :- findall(N,(repeat,get_integer(N),(N=9999,!,fail;true)),L), length(L,Len),\+(Len=0), 合計値および平均値(L,Len,0,_合計値,_平均値), write_formatted('合計値 = %t, 平均値 = %t\n',[_合計値,_平均値]). 合計値および平均値([],Len,_合計値,_合計値,_平均値) :- _平均値 is _合計値 / Len,!. 合計値および平均値([N|R],Len,_合計値1,_合計値,_平均値) :- _合計値2 is _合計値 + N, 合計値および平均値(R,Len,_合計値2,_合計値,_平均値). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/255 # # 1] 授業単元:情報処理学 # [2] 問題文(含コード&リンク): # 1次元配列に34 57 45 21 89 63 39 48 78 68 76 84 92 53 62 のデータをセットして、 # これらの平均値を求めよ。さらにint eval[3]という1次元配列を用意して # eval[0]には0〜60の数の個数 # eval[1]には61〜80の数の個数 # eval[2]には81〜100の数の個数 # を格納するようにし、それらを出力するプログラムを作成せよ。(配列、for文、if文を使って) # '1次元配列に34 57 45 21 89 63 39 48 78 68 76 84 92 53 62 のデータをセットして、これらの平均値を求めよ'(L,_平均値) :- '1次元配列に34 57 45 21 89 63 39 48 78 68 76 84 92 53 62 のデータをセットして'(L), avg(L,_平均値). '1次元配列に34 57 45 21 89 63 39 48 78 68 76 84 92 53 62 のデータをセットして'(L) :- split('34 57 45 21 89 63 39 48 78 68 76 84 92 53 62',[','],L). '1次元配列に34 57 45 21 89 63 39 48 78 68 76 84 92 53 62 のデータをセットして、0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する' :- '1次元配列に34 57 45 21 89 63 39 48 78 68 76 84 92 53 62 のデータをセットして'(L), '0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'(L,0,0,0),!. '0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'([],_0〜60の数の個数,_61〜80の数の個数,_81〜100の数の個数) :- write_formatted('0〜60の数の個数=%t\n',[_0〜60の数の個数]), write_formatted('61〜80の数の個数=%t\n',[_61〜80の数の個数]), write_formatted('81〜100の数の個数=%t\n',[81〜100の数の個数]). '0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'([N|R],_0〜60の数の個数_1,_61〜80の数の個数,_81〜100の数の個数) :- N =< 60, _0〜60の数の個数_2 is_0〜60の数の個数_1 + 1, '0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'(R,_0〜60の数の個数_2,_61〜80の数の個数,_81〜100の数の個数),!. '0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'([N|R],_0〜60の数の個数,_61〜80の数の個数_1,_81〜100の数の個数) :- N >= 61,N =< 80, _61〜80の数の個数_2 is_61〜80の数の個数_1 + 1, '0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'(R,_0〜60の数の個数,_61〜80の数の個数_2,_81〜100の数の個数),!. '0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'([N|R],_0〜60の数の個数,_61〜80の数の個数,_81〜100の数の個数_1) :- N >= 81,N =< 100, _81〜100の数の個数_2 is_81〜100の数の個数_1 + 1, '0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'(R,_0〜60の数の個数,_61〜80の数の個数,_81〜100の数の個数_2),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1266565626/627 # # ずぶの素人なのですのでお手柔らかにお願いします # # 今2つのテキストファイルがあって、内容はおおよそ下のようです # # --------------テキストA------------------- # fcart1 -0.0000000000E+00 -0.0000000000E+00 1.0770536961E-04 # -0.0000000000E+00 -0.0000000000E+00 6.6543134784E-04 # -0.0000000000E+00 -0.0000000000E+00 -7.7313671745E-04 # getden1 0 # ------------------------------------------ # # --------------テキストB-------------------- # xred 0.0 0.0 0.047843858990 # 0.0 0.0 0.000434433306 # 1/3 2/3 -0.011730466739 # #Definition of the planewave basis set # ------------------------------------------ # テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足したいのですが # どのようにしたらいいでしょうか # ご教授お願いします # テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(_テキストA,_テキストB) :-     get_lines(_テキストA,LinesA),     get_lines(_テキストB,LinesB),     テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(LinesA,LinesB,LinesC),     put_lines(_テキストB,LineC). テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(LinesA,LinesB,LinesC) :-     テキストの一番右の列の数値を切り取る(LinesA,LA),     テキストの一番右の列の数値を切り取る(LinesB,LB),     加算([LA,LB],LC),         テキストBの最終数値要素を置換(LB,LC,LineC). テキスト一番右の列の数値を切り取る([],[]) :- !. テキスト一番右の列の数値を切り取る([Line|R1],[V|R2]) :-     split(Line,[ ],L),     数値要素が3個以上(L),     last(L,V),     テキストAの一番右の列の数値を切り取る(R1,R2). テキストBの最終数値要素を置換([],_,[]) :- !. テキストBの最終数値要素を置換([Line|R1],[V|R2],[LineC|R3]) :-     sPLIT(Line,[ ],L1),     数値要素が3個以上(L1),         length(L1,Len),     findmax(Nth,(            for(1,Nth,Len),            list_nth(Nth,L1,V1),number(V1)),         LastNth),     要素番号によるならびの置換(LastNth,V,L1,L3),     concat_atom(L3,LineC),     テキストBの最終数値要素を置換(R1,R2,R3),!. テキストBの最終数値要素を置換([Line|R1],L2,[Line|R3]) :-     テキストBの最終数値要素を置換(R1,L2,R3),!. 数値要素が3個以上(L1) :-     count((member(A,L1),number(A)),Count),     Count >= 3,!. % *** user: sPLIT / 3 *** sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not U = ''),L), L = X,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % *** user: 'SPLIT' / 3 *** 'SPLIT'(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Z), Z = X,!. % *** user: split_00 / 3 *** split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび),atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). % *** user: split_0 / 3 *** split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X) . % *** user: split_1 / 3 *** split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. % *** user: split_2 / 5 *** split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. % *** user: split / 3 *** split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not U = ''),L), L = X,!. % *** user: sPlit / 3 *** sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(member(U,_区切り符号ならび))), Z), Z = X,!. % *** user: put_lines / 2 *** put_lines(_,[]) :- !. put_lines(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), open(File_1,write,Output), put_lines(Output,L), close(Output),!. put_lines(Output,[Line|R]) :- is_stream(_,Output,_), write(Output,Line), write(Output,'\n'), put_lines(Output,R),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/749 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10241.txt # 下記構造体型配列を作る。 # データは入力すること。 # 確認のため各配列要素を表示すること。 # # 20 40 10 50 30 # CD GH AB IJ EF % % [[20,40,10,50,30],['CD','GH','AB','IJ','EF']] % % a([20,40,10,50,30],['CD','GH','AB','IJ','EF']). prologで構造体配列に近いものを作り確認のため表示する :- prologで構造体配列に近いものを作る(L), findall(L1,member(L1,L),L2), concat_atom(L2,' ',S2), write_formatted('%t\n',[S2]), fail. prologで構造体配列に近いものを作る(L) :- get_split_lines(user_input,[','],L). prologで構造体配列に近いものを作り述語として定義する(_構造体名) :- prologで構造体配列に近いものを作る(L), member(L1,L), P =.. [_構造体名,L1], assertz(P), fail. prologで構造体配列に近いものを作り述語定義する(_). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/749 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10241.txt # 下記構造体型配列を作る。 # データは入力すること。 # 確認のため各配列要素を表示すること。 # # 20 40 10 50 30 # CD GH AB IJ EF % % [20,'CD'],[40,'GH'],[10,'AB'],[50,'IJ'],[30,'EF'] % prologで構造体配列に近いものを作り確認のため表示する :- prologで構造体配列に近いものを作る(L), findall(A,member([A,_],L),L1), concat_atom(L1,' ',S1), write_formatted('%t\n',[S1]), findall(B,member([B,_],L),L2), concat_atom(L2,' ',S2), write_formatted('%t\n',[S2]). prologで構造体配列に近いものを作る(L) :- get_split_lines(user_input,[','],L). prologで構造体配列に近いものを作り述語として定義する(_構造体名) :- prologで構造体配列に近いものを作る(L),, member(L1,L), P =.. [_構造体名|L1], assertz(P), fail. prologで構造体配列に近いものを作り述語定義する(_). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/904 # # 期限6月21日18時 # よろしくお願いします。 # # 3次元の実数ベクトルを、要素がfloat型で要素数3の配列を用いて表すものとする。 # 二つの3次元ベクトルに対して、それらの和、差、内積、外積を求める関数を定義する。 # 和、差、内積、外積を計算する関数はそれぞれaddvec、subvec、innervec、outervecとし、 # それぞれの関数定義の頭部は # void addvec(const float x[3], const float y[3], float z[3]) # void subvec(const float x[3], const float y[3], float z[3]) # float innervec(const float x[3], const float y[3]) # void outervec(const float x[3], const float y[3], float z[3]) # とする。 # プログラムの動作は、二つの3次元ベクトルaとbの各成分をじゅんじに入力して、それらの和、差、内積、外積を求めて出力する。 # 以上の説明に沿ったプログラムをC言語を用いて書け。 # # # '二つの3次元ベクトルaとbの各成分をじゅんじに入力して、それらの和、差、内積、外積を求めて出力する' :- write('入力してください X1,Y1,Z1 : '),get_split_line([','],[X1,Y1,Z1]), write('入力してください X2,Y2,Z2 : '),get_split_line([','],[X2,Y2,Z2]), ベクトルの和([[X1],[Y1],[Z1]],[[X2],[Y2],[Z2]],_ベクトルの和), ベクトルの差([[X1],[Y1],[Z1]],[[X2],[Y2],[Z2]],_ベクトルの差), ベクトルの内積([[X1],[Y1],[Z1]],[[X2],[Y2],[Z2]],_ベクトルの内積), ベクトルの外積([[X1],[Y1],[Z1]],[[X2],[Y2],[Z2]],_ベクトルの外積), write_formatted('和は %t \n差は %t \n内積は %t \n外積は %t です\n'). ベクトルの和([],[],[]) :- !. ベクトルの和([[A]|R1],[[B]|R2],[[C]|R3]) :- C is A + B, ベクトルの和(R1,R2,R3). ベクトルの差([],[],[]) :- !. ベクトルの差([[A]|R1],[[B]|R2],[[C]|R3]) :- C is A - B, ベクトルの差(R1,R2,R3). ベクトルの内積([],[],0) :- !. ベクトルの内積([[A]|R1],[[B]|R2],X) :- ベクトルの内積(R1,R2,Y), X is Y + A * B. innervec([],[],0) :- !. innervec([A|R1],[B|R2],Inner) :- innervec(R1,R2,Inner2), Inner is Inner2 + A * B,!. ベクトルの外積([[X1],[Y1],[Z1]],[[X2],[Y2],[Z2]],_ベクトルの外積) :- X3 is Y1 * Z2 - Z1 * Y2, Y3 is Z1 * X2 - X1 * Z2, Z3 is X1 * Y2 - Y1 * X2, _ベクトルの外積 = [[X3],[Y3],[Z3]],!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/722 # # [1] 授業単元: ハフマン符号 # [2] 問題文(含コード&リンク): 文字とその確率を入力しそれに対するハフマン符号を文字に割当て # 表示する # 文字とその確率を入力しそれに対するハフマン符号を文字に割当て表示する :- 文字とその確率を入力し(LL1), ハフマン符号化(LL1,LL2), ハフマン符号表(LL2). 文字とその確率を入力し(LL1) :- get_split_lines([' ',','],LL), findall([_確率,_文字],( member([_文字,B],LL), atom_to_term(B,_確率,_)), LL1). ハフマン符号化(L1,[[A,'0']|R]) :- sort(L1,L2), append(L3,[[_,A]],L2), ハフマン符号の割り当て(L3,[[B,C]|L4]), ハフマン符号に補正する(L4,[[B,C]],R). ハフマン符号の割り当て([[_,A]],[[A,'1']]) :- !. ハフマン符号の割り当て([[_,A]|R1],[[A,S1]|R2]) :- ハフマン符号の割り当て(R1,R2), R2 = [[B,S2]|_], concat_atom(['1',S2],S1). ハフマン符号に補正する([],L,L) :- !. ハフマン符号に補正する([[A,B]|R1],L1,L) :- concat_atom([B,'0'],C), ハフマン符号に補正する(R1,[[A,C]|L1],L). ハフマン符号表([]) :- !. ハフマン符号表([[A,B]|R]) :- write_formatted('%t %t\n',[A,B]), ハフマン符号表(R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/834 # # [2010/01/15 19:27:07] リュック: 【質問テンプレ】 # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://ime.nu/www.dotup.org/uploda/www.dotup.org563734.zip.html # # 課題8 # # 以下の機能を持った丁半ゲームのプログラムを作成せよ. # なお,丁半ゲームとは,2つのサイコロをツボと呼ばれる篭に # 入れて振り,出たサイコロの目の合計が丁(偶数)か半(奇数) # かを当てる昔のギャンブルである. # # - 半と丁のどちらに賭けるかを入力する機能 # - 2つのサイコロを振り,出た目を表示する機能(もちろん出る目はランダム) # - 賭けに勝ったか負けたかを判定して結果を表示する機能 # ゲームを続行するかどうかを入力する機能 # # # # # 課題9 # # # - メニュー画面から操作を選ぶ機能.図1参照.今回は,「1:はじめから」 # 「0:終了する」を実行できるようにする.「1:はじめから」を選ぶと,ゲーム # がスタートし,プレーヤーが「続行しない」旨の入力を行うまでゲームを # 続行する.「続行しない」旨の入力があれば,メニュー画面に戻る. # 「0:終了する」を選ぶと,プログラムを終了する. # - お金を賭ける機能.初期の所持金は4000文で,一回の賭け金は1文 # 以上所持金以下とする.所持金が無くなればゲームオーバーであり, # メ画面に戻る現在の所持金がいくらであるかは必要なタイミングでプレーヤーに示 される必要がある. # - 不正な入力を検知し,プレーヤーにフィードバックする機能.たとえば, # 1または0の入力のみが期待される場合に,文字列や,1,0以外の数字 # などが入力されれば,エラーメッセージを出力した上で再度の入力を # 求める.図3参照. # - プレーヤーに入力を促すためのプロンプト("> ")を表示する機能. # # # # # 課題10 # # # 演習課題9で作成した丁半ゲームのプログラムに,以下の機 # 能を追加せよ. # - コンピュータが自動で操作を行う博打打(以降では自動プレーヤーと呼ぶ)を3名 # 参加させる機能.図1,図2参照.3名にはそれぞれ,名前,初期の所持金,1回あ # たりの最大の賭け金(現在の所持金における割合として表される)があらかじめ設 # 定されている.設定値はゲームバランスを考慮して決定すること.ゲームを開始す # ると,自動プレーヤーは自らの所持金が尽きるまで連続して賭けに参加する.半, # 丁に賭ける確率はそれぞれ1/2であり,1文以上最大賭け金以下の範囲でランダ # ムな金額を賭ける. # # ゲームデータをセーブ・ロードする機能図3参照ゲームデータとは自動プレーヤ― # を含む全プレーヤーの現在の所持金,賭けに勝った回数と負けた回数で # ある.プレーヤーはゲームを終了してメニューに戻る際に,それまでの内容を保存 # するかどうか選択することができる.また,メニューから「2:つづきから」を選択する # と,前回保存した内容を反映してゲームを開始する.ゲームデータは2つ以上作 # 成しないものとする.ゲームデータのファイルフォーマットは特に指定しない. # # # # # 課題11 # # # 演習課題10で作成した丁半ゲームのプログラムに,以下の # 機能を追加せよ. # - 成績を評価する機能.メニューから「3: 成績」を選択すると,ゲームデータをロード # して各プレーヤーの(1) 勝ち負けの回数,(2) 現在の所持金,(3) 稼いだ金額, # (4) 初期設定の所持金に対する(3)の割合を表示する.そして(4)によってプレー # ヤーの順位を明らかにし,その順位によってA〜Dの4段階評価を表示する.つま # り,プレーヤーの(4)の大きさが1番であればA,2番であればB,3番であればC,4 # 番であればDである.以上を表示した後,メニューに戻る.ゲームデータが存在し # ない場合については,その旨表示してメニューに戻る. # # # 長くなりましたが、どうかよろしくお願いします。 # 途中までは作成しているのですが、よくわかりません。 # どなたか、よろしくお願いします。 # 難易度設定はいらないそうです。 # # 賭場 :- 壷, サイコロを振る(_壷), 丁か半か, 壷を開く(_壷,_出目), 勝負の表示(_出目). 壷 :- write('入ります\n'),音楽スタート. サイコロを振る(_壷) :- _ひとつ目の賽の目 is random(6) + 1, _ふたつ目の賽の目 is random(6) + 1, サイコロの目を描く(_ひとつ目の賽の目,_ふたつ目の賽の目), _壷 = ([_ひとつ目の賽の目,_ふたつ目の賽の目],_サイコロ表示),!. サイコロの目を描く(_ひとつ目の賽の目,_ふたつ目の賽の目,_サイコロ表示) :- N1 is (random(6) + 1) * 2, N2 is (random(6) + 1) * 2, atomic_list_concat(['%',N1,'s%t\n%',N2,'s%t\n'],_表示パターン), swritef(_サイコロ表示,_表示パターン,[' ',_ひとつ目の賽の目,' ',_ふたつ目の賽の目]). 丁か半か :- write('丁か半か\n'), sleep(3), 張る, 'よろしいですか、よろしいですね'. 張る :- findall(_,( 丁か半か(_行), ( _行 = '',!,fail;丁か半か(_行))), _). 丁か半か(_行) :- get_line(_行), split(_行,[' '],[_客,_丁か半か,_金額]), assertz(賭け(_客,_丁か半か,_金額)). 丁か半か(_行) :- 丁か半か(_行). 'よろしいですか、よろしいですね' :- write('よろしいですか\n'), sleep(5), write('よろしいですね\n'), sleep(2). 壷を開く(_壷,_ひとつ目の賽の目,_ふたつ目の賽の目,_丁か半か) :- _壷 = ([_ひとつ目の賽の目,_ふたつ目の賽の目],_サイコロ表示), writef('%t',[_サイコロ表示]), sleep(2), writef('%t %tの%t\n',[_ひとつ目の賽の目,_ふたつ目の賽の目,_丁か半か]),!. 丁半判定(_ひとつ目の賽の目,_ふたつ目の賽の目,丁) :- 0 is (_ひとつ目の賽の目 + _ふたつ目の賽の目) mod 2. 丁半判定(_ひとつ目の賽の目,_ふたつ目の賽の目,半) :- 1 is (_ひとつ目の賽の目 + _ふたつ目の賽の目) mod 2. 勝負の表示(_出目) :- 賭け(_客,_丁か半か,_金額), 勝負判定(_出目,_丁か半か,_勝ち負け), writef('%t,%t,%t円\n',[_客,_勝ち負け,_金額]), fail. 勝負の表示(_) :- 賭け金の分配については知識がないから省略. 勝負判定(_目,_目,勝ち). 勝負判定(_出目,_丁か半か,負け) :- \+(_出目=_丁か半か). 音楽スタート. 賭け金の分配については知識がないから省略. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1136788500/442 # # 輝け甲子園の星(2010早春号)より # 選抜高校野球選手権大会出場選手「好きなタレント」アンケート # # 1位 北川景子 49票 # 2位 上戸 彩 24票 # 3位 香里奈  23票 # 4位 佐々木希 22票 # 5位 松本人志 18票 # 6位 新垣結衣 17票 # 7位 南 明奈 黒木メイサ 15票 # 9位 木下優樹奈 12票 # 10位 市川由衣 11票 # 11位 EXILE 10票 # 12位 ダウンタウン 相武紗季 9票 # 14位 宮崎あおい 8票 # 15位 柴咲コウ 戸田恵梨香 井上真央 コトリッチ 7票 # # 姓名表示のクセを補正する事例 :- '"好きなタレント.txt" ファイルから次のデータを呼び出し、述語 好きなタレント順位/3 を定義する'. '"好きなタレント.txt" ファイルから次のデータを呼び出し、述語 好きなタレント順位/3 を定義する' get_split_lines('好きなタレント.txt',[' '],_順位ならび), member(_行情報,_順位ならび), 行解析(_行情報,_順位,_票,_姓名ならび), member(_姓名,_姓名ならび), assertz(好きなタレント(_順位,_姓名,_票)), fail. '"好きなタレント.txt" ファイルから次のデータを呼び出し、述語 好きなタレント順位/3 を定義する'. 行解析([_順位1|R1],_順位,_姓名ならび,_票) :- sub_atom(_順位1,_,1,0,位), sub_atom(_順位1,0,_,1,_順位文字列から位を除いた文字列), 全角文字数値整数変換(_順位文字列から位を除いた文字列,_順位), 行解析_1(R1,_姓名ならび,_票). 行解析_1([A],[],_票) :- sub_atom(A,_,1,0,票),sub_atom(A,0,_,1,B),全角文字数値整数変換(B,_票),!. 行解析_1(L1,[B|R2],_票) :- 姓名変換(L1,B,R1),行解析_1(R1,R2,_票). 姓名変換([_姓,_名|R],_姓名,R) :- sub_atom(_姓,0,2,0,_姓),sub_atom(_名,0,1,0,_名),concat_atom([_姓,_名],_姓名),!. 姓名変換([_姓,_名|R],_姓名,R) :- sub_atom(_姓,0,1,0,_姓),sub_atom(_名,0,2,0,_名),concat_atom([_姓,_名],_姓名),!. 姓名変換([_姓名|R],_姓名,R). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/php/1147830986/9 # # 1.1行ずつURLが記述されたテキストファイルを読み込み、 # 2.そのURLのコンテンツを取得して # 3.タイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) # するプログラムを作ってください。 # # 尚テキストファイルに記述されているURLは妥当なものと見なして構わないものとする。 # (リンク先が存在し、そこには必ず<title></title>で囲まれた箇所があるhtml) # また正常系のみで、エラー(テキストファイルが読み込めない、ネットワークが # 繋がらなくてコンテンツが取得できない)の場合の処理は無くて構わない。 # # 1〜3まで順を追ってやっていくと良いよ。 # 1がファイルの扱い、ループ処理や配列の扱い(逐次処理でやれば配列使わないけど)、 # 2がネット(HTTP)関連、3が文字列処理や正規表現あたり。 # '1行ずつURLが記述されたテキストファイルを読み込み、そのURLのコンテンツを取得してタイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) する'(_テキストファイル) :- get_lines(_テキストファイル,Lines), member(URL,Lines), 'URLをHost,Port,Fileに分解する'(URL,Host,Port,File), www_lines(Host,Port,File,_行ならび), 文字コードを得る(_行ならび,_文字コード), タイトルを得る(_行ならび,_文字コード,_タイトル), write_formatted('URL=%t タイトル=%t\n',[URL,_タイトル]), fail. '1行ずつURLが記述されたテキストファイルを読み込み、そのURLのコンテンツを取得してタイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) する'(_). 'URLをHost,Port,Fileに分解する'(URL,Host,Port,File) :- 'sPLIT'(URL,['/',':'],[http,':','/','/',Host,':',Port,'/'|File]),!. 'URLをHost,Port,Fileに分解する'(URL,Host,80,File) :- 'sPLIT'(URL,['/',':'],[http,':','/','/',Host,'/'|File]),!. 文字コードを得る(_行ならび,_文字コード) :- append(_,[''|R],_行ならび), append(_,[_行|R1],R), sub_atom(_行,_,8,_,P,'char_set',_残り文字列,_,_,_), split(_残り文字列,['=',' ',',','>'],[A|_]), to_upper(A,B), 文字コード(A,_文字コード). タイトルを得る(_行ならび,euc,_タイトル) :- append(_,[''|R],_行ならび), append(_,[_行|R1],R), sub_atom(_行,_,7,_,_,'',_残り文字列,_,_,_), sub_atom(_残り文字列,_,8,_,_エンコードされたタイトル,'',_,_,_,_), URLの文字列をデコードする(_エンコードされたタイトル,_タイトル),!. 文字コード('EUC_JP',euc) :- !. 文字コード('EUC-JP',euc) :- !. 文字コード('SJIS_JP',sjis) :- !. 文字コード('SJIS-JP',sjis) :- !. www_lines(Host, Port, File, DataList) :- hp_open_client(Host, Port, Socket), make_request_header(Host,Header), hp_work_client(Socket,Header,DataList). hp_open_client(Host, Service, Socket) :- atom(Service), !, net_service(Service, tcp, Port), socket(internet, stream, Socket), host_addr(Host, Addr), socket_connect(Socket, Addr : Port). hp_open_client(Host, Port, Socket) :- integer(Port), !, socket(internet, stream, Socket), socket_connect(Socket, Host : Port). make_request_header(_ファイル,Header) :- myhostname(Myhostname), request_header_file(_ファイル,_整形されたファイル), concat_atom(['GET ',_ファイル,' HTTP/1.1\nHost: ',Myhostname, '\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.7.8) Gecko/20050511\n', 'Accept: text/xml,application/xml,application/xhtml+xml,', 'text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\nAccept-Language: ja,', 'en-us;q=0.7,en;q=0.3\nAccept-Encoding: gzip,deflate\n', 'Accept-Charset: EUC-JP,utf-8;q=0.7,*;q=0.7\nKeep-Alive: 300\n', 'Connection: keep-alive\n\n'],Header). request_header_file(_ファイル,_ファイル) :- sub_atom(_ファイル,0,1,_,'/'),!. request_header_file(_ファイル,_整形されたファイル) :- \+(sub_atom(_ファイル,0,1,_,'/')), concat_atom(['/',_ファイル],_整形されたファイル),!. hp_work_client(Socket,Header,DataList) :- open(Socket, read, Input), open(Socket, write, Output), write_formatted(Output,'%t',[Header]), flush_output, findall(X,(repeat,get_line(Input,_診断,Data),(_診断=終了,!,fail;true)),DataList), close(Input), close(Output), socket_shutdown(Socket). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/php/1251989472/378 # # ----------input.txt- # 1 2 3 # 4 5 6 # 7 8 9 # ------------------- # ---------------output.txt- # 左上の数字は1です # 中上の数字は2です #    ・ #    ・ #    ・ # --------------- # input.txt->output.txtのようなprogramの書き方を教えてください # できれば、input.txtを空白で区切った値をそれぞれ$a_1,$a_2といった変数にしてしまいたいのですが 位置と値を組み合わせて表示する :- get_split_lines('input.txt',[' '],LL), tell('output.txt'), 位置と値を組み合わせて行表示する([上,中,下],[左,中,右],LL), told. 位置と値を組み合わせて行表示する(_,_,[]) :- !. 位置と値を組み合わせて行表示する([_行表現|R1],L1,[L2|R2]) :- 位置と値を組み合わせて列表示する(_行表現,L1,L2), 位置と値を組み合わせて行表示する(R1,L1,R2). 位置と値を組み合わせて列表示する(_,[],[]) :- !. 位置と値を組み合わせて列表示する(_行表現,[_列表現|R1],[N|R2]) :- 位置表現を構成する(_行表現,_列表現,_表示文字列), write_formatted('%tの数字は%tです\n',[_表示文字列,N]), 位置と値を組み合わせて列表示する(_行表現,R1,R2). 位置表現を構成する(中,中,まん中) :- !. 位置表現を構成する(_行表現,_列表現,_表示文字列) :- concat_atom([_列表現,_行表現],_表示文字列). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/43 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10627.txt # 問題:2人のプレーヤーが1台のパソコンの前に座って、五目並べをするプログラムを # 次のステップ([1]〜[4])に従って作成しなさい。 # # [step1]'十','−’,'|’などの文字を使って五目並べをするための10行10列の格子枠をキャラク #    タモードで表示する。関数化(関数名waku)しておく。(注意:この格子枠を表示するのが #    難しければ、列を表す最上端の数字1〜1Oと、各行の左端に行を現す数字1〜10を表示 #    すること) # 1 2 ・・・・・10 # +−−−+−−−+・・・ # 1 | # + # 2 | # ・ #  ・ # 10 # [step2]メイン関数で”Aさん次の手を入力しなさい”とモニタに表示し、次の手を3_4↓のよ #   うに入力する。入力データを引数で関数wakuに渡し、関数側で格子枠の3行目4列目に’A’ #   を埋め込み,[step 1 ]で作成した格子枠とともに表示する。 #                3   4 # ・    ・   ・  #           ・  +−−−+−−−+ #           3 | | B | #             +−−−+−−−+ # # # [step3]AさんとBさんが交互に次の手を入力しながら、Aさんの手は'A'を、Bさんの手は'B'を #  枠内に埋め込み格子枠とともに表示する。この時、既に打たれた枠に入力した場合は再度入力 #  を促すようにする。 # [step4]更に、AさんとBさんが次の手を打つ毎に、そのデータを5個並んだか調べる関数(関数 #  名narabi)に渡し、縦、横、斜め方向に5個並んでいるか調べ、結果をメイン関数に返す。 5 #  個並んでいたらメイン関数側で”Aさんの勝ぢまたぱBさんの勝ぢと表示する。並んで #  いなければゲームを続ける。 # # 質問1 # :このプログラムは人間同士がディスプレイを単なる碁盤として使用し、五目並べを行う # プログラムである。このプログラムを修正して人間とコンピュータが対戦するようにするに # はどのような改良を加えなければならないか、考えて答えなさい。 初期盤面[ [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ']]. 五目並べ :- 初期盤面(_盤面), 五目並べ(A,_盤面). 五目並べ(A,_盤面) :- 次の手を入力する(A,_盤面,_行,_列,_更新された盤面), 五目並べ表示(_更新された盤面), 五目並べ評価(A,_行,_列,_更新された盤面). 五目並べ(B,_盤面) :- 次の手を入力する(B,_盤面,_行,_列,_更新された盤面), 五目並べ表示(_更新された盤面), 五目並べ評価(B,_行,_列,_更新された盤面). 五目並べ評価(_棋士,_盤面) :- 五目並べ完成(_棋士,_行,_列,_盤面), write_formatted('%tさんの勝ちです!\n',[_棋士]),!. 五目並べ評価(A,_,_,_盤面) :- 五目並べ(B,_盤面),!. 五目並べ評価(B,_,_,_盤面) :- 五目並べ(A,_盤面),!. 五目並べ完成(_棋士,_行,_列,_盤面) :- 五目並んだ状態とは(_棋士,_五目並んだ状態), 五目並んでいる(_五目並んだ状態,_行,_列,_盤面),!. 五目並んでいる(_五目並んだ状態,_行,_列,_盤面) :- 五目(_行,_列,L), findall(X,(member((A,B),L),I is A,J is B,list_nth(I,_盤面,L1),list_nth(J,L1,X)),_五目並んだ状態),!. 五目(_行,_列,[(_行,_列),(_行-1,_列+1),(_行-2,_列+2),(_行-3,_列+3),(_行-4,_列+4)]). 五目(_行,_列,[(_行+1,_列-1),(_行,_列),(_行-1,_列+1),(_行-2,_列+2),(_行-3,_列+3)]). 五目(_行,_列,[(_行+2,_列-2),(_行+1,_列-1),(_行,_列),(_行-1,_列+1),(_行-2,_列+2)]). 五目(_行,_列,[(_行+3,_列-3),(_行+2,_列-2),(_行+1,_列-1),(_行,_列),(_行-1,_列+1)]). 五目(_行,_列,[(_行+4,_列-4),(_行+3,_列-3),(_行+2,_列-2),(_行+1,_列-1),(_行,_列)]). % 五目(_行,_列,[(_行,_列),(_行+1,_列+1),(_行+2,_列+2),(_行+3,_列+3),(_行+4,_列+4)]). 五目(_行,_列,[(_行-1,_列-1),(_行,_列),(_行+1,_列+1),(_行+2,_列+2),(_行+3,_列+3)]). 五目(_行,_列,[(_行-2,_列-2),(_行-1,_列-1),(_行,_列),(_行+1,_列+1),(_行+2,_列+2)]). 五目(_行,_列,[(_行-3,_列-3),(_行-2,_列-2),(_行-1,_列-1),(_行,_列),(_行+1,_列+1)]). 五目(_行,_列,[(_行-4,_列-4),(_行-3,_列-3),(_行-2,_列-2),(_行-1,_列-1),(_行,_列)]). % 五目(_行,_列,[(_行,_列),(_行+1,_列),(_行+2,_列),(_行+3,_列),(_行+4,_列)]). 五目(_行,_列,[(_行-1,_列),(_行,_列),(_行+1,_列),(_行+2,_列),(_行+3,_列)]). 五目(_行,_列,[(_行-2,_列),(_行-1,_列),(_行,_列),(_行+1,_列),(_行+2,_列)]). 五目(_行,_列,[(_行-3,_列),(_行-2,_列),(_行-1,_列),(_行,_列),(_行+1,_列)]). 五目(_行,_列,[(_行-4,_列),(_行-3,_列),(_行-2,_列),(_行-1,_列),(_行,_列)]). % 五目(_行,_列,[(_行,_列),(_行,_列+1),(_行,_列+2),(_行,_列+3),(_行,_列+4)]). 五目(_行,_列,[(_行,_列-1),(_行,_列),(_行,_列+1),(_行,_列+2),(_行,_列+3)]). 五目(_行,_列,[(_行,_列-2),(_行,_列-1),(_行,_列),(_行,_列+1),(_行,_列+2)]). 五目(_行,_列,[(_行,_列-3),(_行,_列-2),(_行,_列-1),(_行,_列),(_行,_列+1)]). 五目(_行,_列,[(_行,_列-4),(_行,_列-3),(_行,_列-2),(_行,_列-1),(_行,_列)]). 五目並んだ状態とは(_棋士,[_棋士,_棋士,_棋士,_棋士,_棋士]). 次の手を入力する(_棋士,_盤面,_行,_列,_更新された盤面) :- write_formatted('%tさん次の手を入力しなさい : ',[_棋士]), get_split_line([' '],[_行,_列]), 盤面更新(_棋士,_行,_列,_盤面,_更新された盤面),!. 次の手を入力する(_棋士,_盤面,_行,_列,_更新された盤面) :- write('その手は既に石があり打てませんもう一度入力してください\n'), 次の手を入力する(_棋士,_盤面,_行,_列,_更新された盤面). 盤面更新(_棋士,_行,_列,_盤面,_更新された盤面) :- list_nth(_行,_盤面,L), 要素番号によるならびの置換(_列,_棋士,L,L1), 要素番号によるならびの置換(_行,L1,_盤面,_更新された盤面),!. 五目並べ盤面表示(_盤面) :- 五目並べ横罫, 五目並べ表示(1,_盤面),!. 五目並べ横罫 :- write('  +−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+\n'). 五目並べ表示(_,[]) :- !. 五目並べ表示(N,[_行|R]) :- 半角全角数字変換(N,NS), write_formatted('%t',[NS]), 五目並べ行表示(_行), 五目並べ横罫, N2 is N + 1, 五目並べ表示(N2,R). 五目並べ行表示([]) :- write('|\n'),!. 五目並べ行表示([A|R]) :- write('| %t ',[A]),五目並べ行表示(R). 半角全角数字変換(1,' 1'). 半角全角数字変換(2,' 2'). 半角全角数字変換(3,' 3'). 半角全角数字変換(4,' 4'). 半角全角数字変換(5,' 5'). 半角全角数字変換(6,' 6'). 半角全角数字変換(7,' 7'). 半角全角数字変換(8,' 8'). 半角全角数字変換(9,' 9'). 半角全角数字変換(10,'10'). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/84 # # 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/966.txt # # 【sports.csv】 # 10,サッカー,中村俊輔 # 18,野球,松坂大輔 # # 背番号,種目,名前がカンマで区切られたCSVファイルを読み込み、ファイルに出力する。 # なお出力の際には背番号に種目ごとに決められた番号を加算する。 # 今は2行だが今後は行数を追加し、「1,テニス,松岡修造」などを追加することもある。 # # サッカー → 10 # 野球   → 50 # # 【出力例】 # 20,サッカー,中村俊輔 # 68,野球,松坂大輔 背番号,種目,名前がカンマで区切られたCSVファイルを読み込み、ファイルに出力する。なお出力の際には背番号に種目ごとに決められた番号を加算する(_CSVファイル,_出力ファイル) :- 背番号,種目,名前がカンマで区切られたCSVファイルを読み込み、(_CSVファイル,L), ファイルに出力する。なお出力の際には背番号に種目ごとに決められた番号を加算する(_出力ファイル,L). 背番号,種目,名前がカンマで区切られたCSVファイルを読み込み、(_CSVファイル,L) :- get_split_lines(_CSVファイル,[','],L). ファイルに出力する。なお出力の際には背番号に種目ごとに決められた番号を加算する(_出力ファイル,L) :- tell(_出力ファイル), ファイルに出力する。なお出力の際には背番号に種目ごとに決められた番号を加算する(L), told. ファイルに出力する。なお出力の際には背番号に種目ごとに決められた番号を加算する([]) :- !. ファイルに出力する。なお出力の際には背番号に種目ごとに決められた番号を加算する([[_背番号,_種目,_名前]|R]) :- 背番号に種目ごとに決められた番号を加算する(_背番号,_種目,_加算された背番号), write_formatted('%t,%t,%t\n',[_加算された背番号,_種目,_名前]), ファイルに出力する。なお出力の際には背番号に種目ごとに決められた番号を加算する(R). 背番号に種目ごとに決められた番号を加算する(_背番号,_種目,_加算された背番号) :- 背番号に加算する種目ごとに決められた番号(_種目,_加算値), _加算された背番号 is _背番号 + _加算値. 背番号に加算する種目ごとに決められた番号(サッカー,10). 背番号に加算する種目ごとに決められた番号(野球,50). 背番号に加算する種目ごとに決められた加算値を追加する(_種目,_加算値) :- retract(背番号に加算する種目ごとに決められた番号(_種目,_)),fail. 背番号に加算する種目ごとに決められた加算値を追加する(_種目,_加算値) :- assertz(背番号に加算する種目ごとに決められた番号(_種目,_加算値)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 一般にCSVファイルの加工(_入力CSVファイル,_出力CSVファイル) :- get_split_lines(_入力CSVファイル,[','],L1), 加工する(L1,L2), put_csv_lines(_出力CSVファイル,L2,','). 加工する(L1,L2) :- 具体的な加工の例(L1,L2). 具体的な加工の例([],[]). 具体的な加工の例([[_背番号,_種目,_名前]|R1],[[_加算された背番号,_種目,_名前]|R2]) :- 種目ごとの背番号加算値(_種目,_加算値), _加算された背番号 is _背番号 + _加算値, 具体的な加工の例(R1,R2). 種目ごとの背番号加算値(サッカー,10). 種目ごとの背番号加算値(野球,50). put_csv_lines(_出力CSVファイル,L,_区切り文字) :- open(_出力CSVファイル,write,Output), put_csv_lines_2(Output,L,_区切り文字), close(Output). put_csv_lines_2(_,[],_) :- !. put_csv_lines_2(Output,[L|R],_区切り文字) :- concat_atom(L,_区切り文字,_表示文字列), write_formatted(Output,'%t\n',[_表示文字列]), put_csv_lines_2(Output,R,_区切り文字). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/976 # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10619.txt # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10620.txt # # 「三目並べのプログラムを作る」 # 2人のプレーヤーが1台のパソコンの前に座り、交互に(○、×)を置いてい<。 # 次にどこに置<かは3×3の配列内の行と列を表す数字(座標)を順に入力して # 行<。○と×を置くたびに、3個並んだかを調べる。そして、縦、横、斜め方向 # のいずれかに先に3個並んだ方が勝ちとして、結果を表示する。このような要求 # を満たすような、2人で3目並べをするプログラムを作りなさい。 三目ならべ :- 三目ならべ(○,[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']]). 三目ならべ(_手番,LL) :- 勝ちパターン(LL), write_formatted('%tの勝ちです\n',[_手番]),!. 三目ならべ(_手番,LL) :- flat(LL,L), \+(member(' ',L)), write('引き分けです\n'),!. 三目ならべ(○,LL) :- 次の着手(×,_行,_列), list_nth(_行,LL,L2), list_nth(_列,L1,' '), ならびの位置指定置換(_列,×,L1,L2). ならびの位置指定置換(_行,L2,LL,LL2), 三目ならべ(×,LL2). 三目ならべ(×,LL) :- 次の着手(○,_行,_列), list_nth(_行,LL,L1), list_nth(_列,L1,' '), ならびの位置指定置換(_列,○,L1,L2), ならびの位置指定置換(_行,L2,LL,LL2), 三目ならべ(○,LL2). 次の着手(_手番,_行,_列) :- repeat, write_formatted('%tの手番です。行,列を入力してください : ',[_手番]), get_line(Line), split(Line,[' ',','],[_行,_列]),!. 勝ちパターン([[○,○,○],_,_]). 勝ちパターン([_,[○,○,○],_]). 勝ちパターン([_,_,[○,○,○]). 勝ちパターン([[○,_,_],[○,_,_],[○,_,_]]). 勝ちパターン([[_,○,_],[_,○,_],[_,○,_]]). 勝ちパターン([[_,_,○],[_,_,○],[_,_,○]]). 勝ちパターン([[○,_,_],[_,○,_],[_,_,○]]). 勝ちパターン([[_,_,○],[_,○,_],[○,_,_]]). 勝ちパターン([[×,×,×],_,_]). 勝ちパターン([_,[×,×,×],_]). 勝ちパターン([_,_,[×,×,×]). 勝ちパターン([[×,_,_],[×,_,_],[×,_,_]]). 勝ちパターン([[_,×,_],[_,×,_],[_,×,_]]). 勝ちパターン([[_,_,×],[_,_,×],[_,_,×]]). 勝ちパターン([[×,_,_],[_,×,_],[_,_,×]]). 勝ちパターン([[_,_,×],[_,×,_],[×,_,_]]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/2 # # [1] 授業単元:プログラミング演習 # [2] 問題文:単価と数量を入力するごとに金額を表示し、データ入力終了後合計金額と、千円札のみで払う場合の枚数と釣り銭を表示しなさい。なお、入力データのの終わりは単価0とする。 # 実行例 # 300 2         <ーーデータ入力 # 300*2=600円     <ー表示 # 250 5 # 250*5=1250円 # 100 1 # 100*1=100円 # 1500 2 # 1500*2=3000円 # 350 4 # 350*4=1400円 # 0 0         <ーーデータの終わり # 合計金額 6350円   <ーー合計表示 # 1000円札 7枚     <ーー1000円札の枚数表示 # 釣り銭 650円     <ーー釣り銭の金額表示 # # 単価と数量を入力するごとに金額を表示し、データ入力終了後合計金額と、千円札のみで払う場合の枚数と釣り銭を表示しなさい。なお、入力データのの終わりは単価0とする。 :- 単価と数量の入力(_単価,_数量), '単価と数量を入力(入力データの終わりは単価0とする)するごとに金額を表示し、'(_単価,_数量,_合計金額), データ入力終了後合計金額と、千円札のみで払う場合の枚数と釣り銭を表示しなさい。 '単価と数量を入力(入力データのの終わりは単価0とする)するごとに金額を表示し、'(0,_,0) :- !. '単価と数量を入力(入力データのの終わりは単価0とする)するごとに金額を表示し、'(_単価,_数量,_合計金額) :- _金額 is _単価 * _数量, write_formatted('%t * %t = %t円\n',[_単価,_数量,_金額]), 単価と数量の入力(_単価_2,_数量_2), '単価と数量を入力(入力データのの終わりは単価0とする)するごとに金額を表示し、'(_単価_2,_数量_2,_合計金額_2). _合計金額 is _合計金額_2 + _金額,!. 単価と数量の入力(_単価,_数量) :- get_line(Line), 単価と数量の入力(Line,_単価,_数量). 単価と数量の入力(Line,0,0) :- split(Line,[' '],[0]),!. 単価と数量の入力(Line,_単価,_数量) :- split(Line,[' '],[_単価,_数量]). データ入力終了後合計金額と、千円札のみで払う場合の枚数と釣り銭を表示しなさい。(_合計金額) :- 0 is _合計金額 mod 1000, _千円札の枚数 is _合計金額 // 1000, write_formatted('合計金額 %t円\n千円札の枚数 %t枚,釣り銭 %t円\n',[_合計金額,_千円札の枚数,0]),!. データ入力終了後合計金額と、千円札のみで払う場合の枚数と釣り銭を表示しなさい。(_合計金額) :- \+(0 is _合計金額 mod 1000), _千円札の枚数 is (_合計金額 // 1000) + 1, _釣り銭 is 1000 * _千円札の枚数 - _合計金額, write_formatted('合計金額 %t円\n千円札の枚数 %t枚,釣り銭 %t円\n',[_合計金額,_千円札の枚数,0]),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/921 # # [1]授業単元:プログラミング # [2]問題文:(1)scanfにより3つの正の整数a,b,cの値を入力する。 #      (2)(i,j)要素がj+(a-1)*iであるa×b行列を定義する。 #       (3)(i,j)要素がj-(b-1)*iであるb×c行列を定義する。 #      (4)2つの行列の積を計算し、結果を表示する。 # [3]環境:windows,C++ # [4]期限:5月25日 # [5]なし # # よろしくおねがいします。 # '(4)2つの行列の積を計算し、結果を表示する' :- '3つの正の整数a,b,cの値を入力する'(_a,_b,_c), '(i,j)要素がj+(a-1)*iであるa×b行列を定義する'(_a,_b,_行列1), '(i,j)要素がj-(b-1)*iであるb×c行列を定義する'(_b,_c,_行列2), 行列の積(_行列1,_行列2,_行列の積), 行列の表示(_行列の積). '3つの正の整数a,b,cの値を入力する'(_a,_b,_c) :- get_split_line([' '],[_a,_b,_c]). '(i,j)要素がj+(a-1)*iであるa×b行列を定義する'(_a,_b,_行列) :- findall(L2,(for(1,_i,_a),findall(U,(for(1,_j,_b),U is _j + ( _a - 1 ) * _i),L2)),_行列). '(i,j)要素がj-(b-1)*iであるb×c行列を定義する'(_b,_c,_行列) :- findall(L2,(for(1,_i,_b),findall(U,(for(1,_j,_c),U is _j - ( _b - 1 ) * _i),L2)),_行列). 行列の積(L1,L2,X) :- 行列の転置(L2,L4), 行列の積_1(L1,L4,X). 行列の積_1([],_,[]) :- !. 行列の積_1([A|R1],L,[S1|R3]) :- 行列の積_2(A,L,S1), 行列の積_1(R1,L,R3). 行列の積_2(_,[],[]) :- !. 行列の積_2(A,[B|R2],[C|R3]) :- 行列の積_3(A,B,C), 行列の積_2(A,R2,R3). 行列の積_3([],[],0) :- !. 行列の積_3([A|R1],[B|R2],S) :- S1 is A * B, 行列の積_3(R1,R2,S2), S is S1 + S2. 行列の転置([],[],[]) :- !. 行列の転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 行列の転置(R2,R3,R4). 行列の転置([[]|_],[]) :- !. 行列の転置(L,[L1|R2]) :- 行列の転置(L,L2,L1), 行列の転置(L2,R2). 行列の表示([]) :- write(']\n'),!. 行列の表示([L]) :- write_formatted(' %t]\n',[L]),!. 行列の表示([L|R]) :- write_formatted(' %t\n',[L]),行列の表示(R),! % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/901 # # ../test/read.cgi/tech/1269438098/900 # こんな入力・出力例でいいの? # # Input: # # 2 # 1,1,murayama # 1,2,sugano # 3,3,koizumi # 3,4,abe # 5,5,hatoyama # 6,6,ozawa # # Output: # # #1 # Rep. Name: murayama # Rep. Attendance: 1 # Group: 001 # Group Attendance: 2 # # #2 # Rep. Name: koizumi # Rep. Attendance: 1 # Group: 003 # Group Attendance: 2 # 代表の生徒の名前、代表者の出席回数、グループメンバーの出席回数、グループの全体の出席回数の上位x番だけ出力する(_代表の生徒の名前,_代表者の出席回数,_グループメンバーの出席回数上位5位,_グループ全体の出席回数上位5位) :- findall([_代表の個人ID,_名前],生徒(_代表の個人ID,_代表の個人ID,_名前),_代表の個人ID・名前ならび), member([_代表の個人ID,_名前],_代表の個人ID・名前ならび), 代表者の出席回数(_代表の個人ID,_代表者の出席回数), グループメンバーの出席回数(_代表のID,_グループメンバーの出席回数ならび), グループメンバーの出席回数上位5位(_グループメンバーの出席回数ならび,グループメンバーの出席回数上位5位), グループ全体の出席回数(_代表のID,_グループ全体の出席回数ならび), グループ全体の出席回数上位5位(_グループ全体の出席回数ならび,グループ全体の出席回数上位5位). 代表者の出席回数(_代表の個人ID,_代表者の出席回数) :- count(出席者(_代表の個人ID),_代表者の出席回数). グループメンバーの出席回数(_代表のID,_グループメンバーの出席回数ならび) :- findsetof(_個人ID,(生徒(_代表のID,_個人ID,_),\+(_代表のID=_個人のID)),_グループメンバーならび), findall([_出席回数,_個人ID], ( member(_個人ID,_グループメンバーならび), count(出席者(_個人ID),_出席回数)), _グループメンバーの出席回数ならび),!. グループ全体の出席回数(_代表のID,_グループメンバーの出席回数ならび) :- findsetof(_個人ID,生徒(_代表のID,_個人ID,_),_グループメンバーならび), findall([_出席回数,_個人ID], ( member(_個人ID,_グループメンバーならび), count(出席者(_個人ID),_出席回数)), _グループ全体の出席回数ならび),!. グループメンバーの出席回数上位N位(N,_グループメンバーの出席回数ならび,_グループメンバーの出席回数上位5位) :- 大きい順に上位N位(N,_グループメンバーの出席回数ならび,_グループメンバーの出席回数上位5位). グループ全体の出席回数上位N位(N,_グループ全体の出席回数ならび,_グループ全体の出席回数上位5位) :- 大きい順に上位N位(N,_グループ全体の出席回数ならび,_グループ全体の出席回数上位5位). 大きい順に上位N位(L1,L) :- sort(L1,L2), reverse(L2,L3), length(L,N), append(L,_,L3),!. 大きい順に上位N位(L1,L) :- sort(L1,L2), reverse(L2,L),!. キーボードから代表者のID,個人のID,名前を入力するものとし、グループメンバーは代表者のIDでのみで関連付けされる :- キーボードから代表者のID,個人のID,名前を入力する(_代表者のID,_個人のID,_名前), assertz(生徒(_代表者のID,_個人のID,_名前)), キーボードから代表者のID,個人のID,名前を入力するものとし、グループメンバーは代表者のIDでのみで関連付けされる. キーボードから代表者のID,個人のID,名前を入力するものとし、グループメンバーは代表者のIDでのみで関連付けされる. キーボードから代表者のID,個人のID,名前を入力する(_代表者のID,_個人のID,_名前) :- get_split_line([','],[_代表者のID,_個人のID,_名前]). 出席者の入力 :- get_line(Line), atom_to_term(Line,_個人ID,_), integer(_個人ID), assertz(出席者(_個人ID)), 出席者の入力. 出席者の入力. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/837 # # 大学の課題です。何度修正してコンパイルしてもエラーになります。教えてください。 # 問題:キーボードから三個の値x[0]、x[1]、x[2]を入力する。 キーボードからyの値を入力する。 # x[0]、x[1]、x[2]の中にyと同じ値があれば『○』と出力し、なければ『×』と表示する。 # 'キーボードから三個の値x[0]、x[1]、x[2]を入力する。キーボードからyの値を入力する。x[0]、x[1]、x[2]の中にyと同じ値があれば『○』と出力し、なければ『×』と表示する' :- 'キーボードから三個の値x[0]、x[1]、x[2]を入力する。'(L), 'キーボードからyの値を入力する。'(Y), 'x[0]、x[1]、x[2]の中にyと同じ値があれば『○』と出力し、なければ『×』と表示する。'(Y,L). 'キーボードから三個の値x[0]、x[1]、x[2]を入力する。'(L) :- write('三個の値x[0]、x[1]、x[2]をカンマ区切りで入力してください : '),get_line(Line), split(Line,[','],L). 'キーボードからyの値を入力する。'(Y) :- write('Yの値を入力してください : '), get_integer(Y). 'x[0]、x[1]、x[2]の中にyと同じ値があれば『○』と出力し、なければ『×』と表示する。',(Y,L) :- 同じ値があれば(Y,L), '『○』と出力',!. 'x[0]、x[1]、x[2]の中にyと同じ値があれば『○』と出力し、なければ『×』と表示する。',(Y,L) :- 'なければ'(Y,L), 『×』と表示する。',!. 同じ値があれば(Y,L) :- member(Y,L). 'なければ'(Y,L) :- \+(member(Y,L)). '『○』と出力' :- write('○\n'). '『×』と表示する。' :- write('×\n'). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/74 # # 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/964.txt # # ・指定したディレクトリの一覧を表示する。サブディレクトリがあればその一覧も表示する。 # ・指定したディレクトリからの相対パスで出力。 % Prolog ディレクトリをget_byte/2できるPrologはないと思う。 指定したディレクトリの一覧を表示する。サブディレクトリがあればその一覧も表示する(_ディレクトリのバス) :- 指定したディレクトリの情報を取得(_ディレクトリのパス,_ディレクトリの情報ならび), 一覧を表示する。サブディレクトリがあればその一覧も表示する(_ディレクトリのバス,_ディレクトリの情報ならび). 指定したディレクトリの情報を取得(_ディレクトリのパス,_ディレクトリの情報ならび) :- concat_atom(['ls -l ',_ディレクトリのパス],S), shs(S,_ディレクトリ情報ならび),!. 一覧を表示する。サブディレクトリがあればその一覧も表示する(_ディレクトリのパス) :- write_formatted('%%% ディレクトリ=%t %%%\n',[_ディレクトリのパス]), 一覧を表示する(_ディレクトリのパス), サブディレクトリがあればその一覧も表示する。(_ディレクトリのパス). 一覧を表示する([]) :- write('\n'),!. 一覧を表示する([_行|R]) :- write_formatted('%t\n',[_行]),一覧を表示する(R). サブディレクトリがあればその一覧も表示する([]) :- !. サブディレクトリがあればその一覧も表示する([_行|R]) :- sub_atom(_行,0,1,_,d), ディレクトリのパスを取得(_行,_ディレクトリのパス), 指定したディレクトリの一覧を表示する。サブディレクトリがあればその一覧も表示する(_ディレクトリのバス), サブディレクトリがあればその一覧も表示する(R),!. サブディレクトリがあればその一覧も表示する([_|R]) :- サブディレクトリがあればその一覧も表示する(R). ディレクトリのパスを取得(_行,_ディレクトリのパス) :- split(_行,[' '],L),last(L,_ディレクトリのパス). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/426 # # [1] 授業単元:プログラム # [2] 問題文(含コード&リンク):sample.txtを読み込み、データを身長の小さい人から順番に並び変えてans.txtに出力せよ。 # # sample.txtの中身はこんな感じです。 # 12 ヤマダタロウ 56.7 165.1 # 43 タナカハナコ 44.3 156.8 # 54 スズキイチロウ 70.3 179.2 # 左から番号、名前、体重、身長です # 'sample.txtを読み込み、データを身長の小さい人から順番に並び変えてans.txtに出力せよ' :-    get_split_lines('sample.txt',[' '],Ls),    findall([_身長|L1],(member(L1,Ls),list_nth(4,L1,_身長)),Ls2),    sort(Ls2,Ls3),    findall(L2,member([_|L2],Ls3),_整列されたLs),    put_lines('ans.txt',_整列されたLs). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 鍵項目位置(身長,[_,_,_,_身長],[_身長]). % 鍵項目位置(体重,[_,_,_体重,_],[_体重]). % 鍵項目位置(身長・体重,[_,_,_体重,_身長],[_身長,_体重]). '鍵項目順に整列(昇順)の一般解'(Ls,_鍵名,_整列されたLs) :- findall(L2,(member(L1,Ls),先頭に鍵項目を付加する(_鍵名,L1,L2)),Ls2), sort(Ls2,Ls3), findall(L4,(member(L3,Ls3),先頭の鍵項目を除去する(_鍵名,L3,L4)),_整列されたLs). 先頭に鍵項目を付加する(_鍵名,L1,L2) :- 鍵項目位置(_鍵名,L1,L0), append(L0,L1,L2). 先頭の鍵項目を除去する(_鍵名,L1,L2) :- 鍵項目位置(_鍵名,L2,L0), append(L0,L2,L1). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/295 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10573.c # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10574.txt # # 番号 名前 取得資格(1,0で表記)という書式の # txtファイルをfscanfで読み込んで、取得資格文字列に1が1つでも含まれる行を出力する。 # (省略しているが、このプログラムより上に出力されたものと文字を合わせるため、 # 取得資格文字列の出力は1文字づつ間にスペースを空ける) # 上のソースファイルで実行すると、途中で止まってしまいますがどこが間違ってますか? # # txtファイルをfscanfで読み込んで、取得資格文字列に1が1つでも含まれる行を出力する(_txtファイル) :- txtファイルをfscanfで読み込んで(_txtファイル,L), 取得資格文字列に1が1つでも含まれる行を出力する(L). txtファイルをfscanfで読み込んで(_txtファイル,L) :- get_split_lines(_txtファイル,[' '],L). 取得資格文字列に1が1つでも含まれる行を出力する([]) :- !. 取得資格文字列に1が1つでも含まれる行を出力する([[_番号,_名前,_取得資格文字列]|R]) :- split(_取得資格文字列,[','],_取得資格指標ならび), '1が1つでも含まれる'(_取得資格指標ならび), 取得資格文字列の出力は一文字づつ間にスペースを空ける(_取得資格指標ならび,' ',_取得資格表示文字列), write_formatted('%t %t %t\n',[_番号,_名前,_取得資格表示文字列]), 取得資格文字列に1が1つでも含まれる行を出力する(R),!. 取得資格文字列に1が1つでも含まれる行を出力する([_|R]) :- 取得資格文字列に1が1つでも含まれる行を出力する(R),!. '1が1つでも含まれる'(L) :- member(1,L),!. 取得資格文字列の出力は一文字づつ間にスペースを空ける(_取得資格指標ならび,_取得資格表示文字列) :- concat_atom(_取得資格指標ならび,' ',_取得資格表示文字列). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/243 # # [1] 授業単元: 3DGAME # [2] 問題文:下記 # 学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力しファイルに出力する。(カンマ区切り) # 入力したファイルを読み取り、メニューを作成し次の処理を行えるようにする。 # ・ 学生番号で昇順、降順に並べ替えてファイルに出力する。 # ・ 氏名で昇順、降順に並び替えてファイルに出力する。 # ・ 点数で昇順、降順に並び替えてファイルに出力する。 # ・ 各項目について修正を行えるようにする。 # ・ 点数の平均を画面に出力する。 # ・ クラス別に学生番号で昇順、降順を指定してファイルに出力する。 # # 【画面例】 # <メニュー> # 1 学生番号で並び替え 2.氏名で並び替え # 3.点数で並び替え 4.修正 # 5.平均の出力 6.クラス別で出力 # ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー # メニュー番号=>  # 【データ】 # 学生番号 8桁   # 氏名  12桁  # カナ  12桁 # 点数   3桁(小数点第1まで)  # クラス  3桁 # 12000001, 田中太郎, タナカタロウ, 40.5, 003 '学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力しファイルに出力する。(カンマ区切り)'(_出力ファイル) :- open(_出力ファイル,append,Output), '学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力し'(_学生番号,_氏名,_カナ,_点数,_クラス), write_formatted(Output,'%t,%t,%t,%t\n',[_学生番号,_氏名,_カナ,_点数,_クラス]), close(Output),!. '学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力し'(_学生番号,_氏名,_カナ,_点数,_クラス):- write('ガイドに従って入力し改行してください\n学生番号 : '),get_line(_学生番号), write('氏名 : '),get_line(_氏名), write('カナ : '),get_line(_カナ), write('点数(少数第一位まで) : '),get_line(_点数文字列), atom_to_term(_点数文字列,_点数,_), write('クラス(3桁) : '),get_line(クラス),!. メニューに示された機能を選択して実行するパターン(_ファイル名) :- get_split_lines(_ファイル名,[','],L), メニューに示された機能を実行する(_ファイル名,L). メニューに示された機能を実行する(_ファイル名,L) :- メニュー画面, write('メニュー番号=> '), get_integer(N), 機能選択(_ファイル名,N,L,_診断), 診断(_診断),!. メニューに示された機能を実行する(_ファイル名,L) :- メニューに示された機能を実行する(_ファイル名,L). 機能選択(0,_,_,終了) :- !. 機能選択(1,_ファイル名,L,_診断) :- 学生番号で並び替え(_ファイル名,L,_診断). 機能選択(2,_ファイル名,L,_診断) :- 氏名で並び替え(_ファイル名,L,_診断). 機能選択(3,_ファイル名,L,_診断) :- 点数で並び替え(_ファイル名,L,_診断). 機能選択(4,_ファイル名,L,_診断) :- 修正(_ファイル名,L,_診断). 機能選択(5,_,L,_診断) :- 平均の出力(L,_診断), 機能選択(6,_,L,_診断) :- クラス別で出力(L,_診断). 診断(終了) :- !. メニュー画面 :- write('0 終了 \n'), write('1 学生番号で並び替え 2.氏名で並び替え \n'), write('3.点数で並び替え 4.修正 \n'), write('5.平均の出力 6.クラス別で出力 \n'), write('ーーーーーーーーーーーーーーーー\n'). 学生番号で並び替え(_ファイル名,L,_診断) :- 並べ替え(_ファイル名,1,L,_診断). 点数で並び替え(_ファイル名,L,_診断) :- 並べ替え(_ファイル名,4,L,_診断). 修正(_ファイル名,L,正常終了) :- write('[_学生番号,_氏名,_カナ,_点数,_クラス] の形式で入力して対象レコードを指定してください : '), get_line(Line), atom_to_term(Line,[_学生番号,_氏名,_カナ,_点数,_クラス],_), 修正(_ファイル名,[_学生番号,_氏名,_カナ,_点数,_クラス],L,L2,_), open(_ファイル名,write,Output), カンマならび出力(Output,L2), close(Output),!. 修正(_,L,L,打ち切り) :- !. 修正(_,[],[],_診断) :- !. 修正([_学生番号,_氏名,_カナ,_点数,_クラス],[[_学生番号,_氏名,_カナ,_点数,_クラス]|R1],[L|R2],_診断) :- write('[_学生番号,_氏名,_カナ,_点数,_クラス] の形式で正確に入力して修正してください : '), get_line(Line), atom_to_term(Line,L,_), 打ち切り診断(L,_診断), 修正([_学生番号,_氏名,_カナ,_点数,_クラス],R1,R2,_診断),!. 修正([_学生番号,_氏名,_カナ,_点数,_クラス],[L|R1],[L|R2]_診断) :- 修正([_学生番号,_氏名,_カナ,_点数,_クラス],R1,R2,_診断). 打ち切り診断([_|_],_診断) :- !. 打ち切り診断(Atom,打ち切り) :- atomic(Atom). 平均の出力(L,正常終了) :- findavg(_点数,(memer(L0,L),list_nth(4,L0,_点数)),_平均点), write_formatted('平均点は %t です\n',[_平均点]). クラス別で出力(L,正常終了) :- write('クラスを指定してください : ', get_line(_クラス), findall(L0,(member(L0,L),list_nth(5,L0,_クラス)),L2), カンマならび出力(L2). 並べ替え(_ファイル名,N,L,正常終了). findall([A|L1],(member(L1,L),list_nth(N,L1,A)),L2), sort(L2,L3), open(_ファイル名,write,Output), カンマならび出力(Output,L2), close(Output),!. カンマならび出力(Output,[]) :- !. カンマならび出力(Output,[[_|L1]|R]) :- concat_atom(L1,',',S), write_formatted(Output,'%t\n',[S]), カンマならび出力(Output,R). カンマならび出力([]) :- !. カンマならび出力([[_|L1]|R]) :- concat_atom(L1,',',S), write_formatted('%t\n',[S]), カンマならび出力(R). % 以下のサイトは % *** user: '西暦和暦変換' / 2 *** '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_和暦年), \+(atomic(_西暦年)), atom_chars(_和暦年,L), '年漢字表現'(N,L2), append(L3,L2,L), concat_atom(L3,_元号), concat_atom(L2,_年), '西暦和暦表'(_西暦年,_元号,N,_). '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_西暦年), \+(atomic(_和暦年)), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- var(_西暦年), var(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- var(_西暦年), var(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_西暦年), atom(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). 西暦和暦表(645,大化,1,[]). 西暦和暦表(646,大化,2,[]). 西暦和暦表(647,大化,3,[]). 西暦和暦表(648,大化,4,[]). 西暦和暦表(649,大化,5,[]). 西暦和暦表(650,大化,6,[]). 西暦和暦表(650,白雉,1,[]). 西暦和暦表(651,白雉,2,[]). 西暦和暦表(652,白雉,3,[]). 西暦和暦表(653,白雉,4,[]). 西暦和暦表(654,白雉,5,[]). 西暦和暦表(686,朱鳥,1,[]). 西暦和暦表(687,朱鳥,2,[]). 西暦和暦表(701,大宝,1,[]). 西暦和暦表(702,大宝,2,[]). 西暦和暦表(703,大宝,3,[]). 西暦和暦表(704,大宝,4,[]). 西暦和暦表(704,慶雲,1,[]). 西暦和暦表(705,慶雲,2,[]). 西暦和暦表(706,慶雲,3,[]). 西暦和暦表(707,慶雲,4,[]). 西暦和暦表(708,慶雲,5,[]). 西暦和暦表(708,和銅,1,[]). 西暦和暦表(709,和銅,2,[]). 西暦和暦表(710,和銅,3,[]). 西暦和暦表(711,和銅,4,[]). 西暦和暦表(712,和銅,5,[]). 西暦和暦表(713,和銅,6,[]). 西暦和暦表(714,和銅,7,[]). 西暦和暦表(715,和銅,8,[]). 西暦和暦表(715,霊亀,1,[]). 西暦和暦表(716,霊亀,2,[]). 西暦和暦表(717,霊亀,3,[]). 西暦和暦表(717,養老,1,[]). 西暦和暦表(718,養老,2,[]). 西暦和暦表(719,養老,3,[]). 西暦和暦表(720,養老,4,[]). 西暦和暦表(721,養老,5,[]). 西暦和暦表(722,養老,6,[]). 西暦和暦表(723,養老,7,[]). 西暦和暦表(724,養老,8,[]). 西暦和暦表(724,神亀,1,[]). 西暦和暦表(725,神亀,2,[]). 西暦和暦表(726,神亀,3,[]). 西暦和暦表(727,神亀,4,[]). 西暦和暦表(728,神亀,5,[]). 西暦和暦表(729,神亀,6,[]). 西暦和暦表(729,天平,1,[]). 西暦和暦表(730,天平,2,[]). 西暦和暦表(731,天平,3,[]). 西暦和暦表(732,天平,4,[]). 西暦和暦表(733,天平,5,[]). 西暦和暦表(734,天平,6,[]). 西暦和暦表(735,天平,7,[]). 西暦和暦表(736,天平,8,[]). 西暦和暦表(737,天平,9,[]). 西暦和暦表(738,天平,10,[]). 西暦和暦表(739,天平,11,[]). 西暦和暦表(740,天平,12,[]). 西暦和暦表(741,天平,13,[]). 西暦和暦表(742,天平,14,[]). 西暦和暦表(743,天平,15,[]). 西暦和暦表(744,天平,16,[]). 西暦和暦表(745,天平,17,[]). 西暦和暦表(746,天平,18,[]). 西暦和暦表(747,天平,19,[]). 西暦和暦表(748,天平,20,[]). 西暦和暦表(749,天平,21,[]). 西暦和暦表(749,天平感宝,1,[]). 西暦和暦表(749,天平勝宝,1,[]). 西暦和暦表(750,天平勝宝,2,[]). 西暦和暦表(751,天平勝宝,3,[]). 西暦和暦表(752,天平勝宝,4,[]). 西暦和暦表(753,天平勝宝,5,[]). 西暦和暦表(754,天平勝宝,6,[]). 西暦和暦表(755,天平勝宝,7,[]). 西暦和暦表(756,天平勝宝,8,[]). 西暦和暦表(757,天平勝宝,9,[]). 西暦和暦表(757,天平宝字,1,[]). 西暦和暦表(758,天平宝字,2,[]). 西暦和暦表(759,天平宝字,3,[]). 西暦和暦表(760,天平宝字,4,[]). 西暦和暦表(761,天平宝字,5,[]). 西暦和暦表(762,天平宝字,6,[]). 西暦和暦表(763,天平宝字,7,[]). 西暦和暦表(764,天平宝字,8,[]). 西暦和暦表(765,天平宝字,9,[]). 西暦和暦表(765,天平神護,1,[]). 西暦和暦表(766,天平神護,2,[]). 西暦和暦表(767,天平神護,3,[]). 西暦和暦表(767,神護景雲,1,[]). 西暦和暦表(768,神護景雲,2,[]). 西暦和暦表(769,神護景雲,3,[]). 西暦和暦表(770,神護景雲,4,[]). 西暦和暦表(770,宝亀,1,[]). 西暦和暦表(771,宝亀,2,[]). 西暦和暦表(772,宝亀,3,[]). 西暦和暦表(773,宝亀,4,[]). 西暦和暦表(774,宝亀,5,[]). 西暦和暦表(775,宝亀,6,[]). 西暦和暦表(776,宝亀,7,[]). 西暦和暦表(777,宝亀,8,[]). 西暦和暦表(778,宝亀,9,[]). 西暦和暦表(779,宝亀,10,[]). 西暦和暦表(780,宝亀,11,[]). 西暦和暦表(781,天応,1,[]). 西暦和暦表(782,天応,2,[]). 西暦和暦表(782,延暦,1,[]). 西暦和暦表(783,延暦,2,[]). 西暦和暦表(784,延暦,3,[]). 西暦和暦表(785,延暦,4,[]). 西暦和暦表(786,延暦,5,[]). 西暦和暦表(787,延暦,6,[]). 西暦和暦表(788,延暦,7,[]). 西暦和暦表(789,延暦,8,[]). 西暦和暦表(790,延暦,9,[]). 西暦和暦表(791,延暦,10,[]). 西暦和暦表(792,延暦,11,[]). 西暦和暦表(793,延暦,12,[]). 西暦和暦表(794,延暦,13,[]). 西暦和暦表(795,延暦,14,[]). 西暦和暦表(796,延暦,15,[]). 西暦和暦表(797,延暦,16,[]). 西暦和暦表(798,延暦,17,[]). 西暦和暦表(799,延暦,18,[]). 西暦和暦表(800,延暦,19,[]). 西暦和暦表(801,延暦,20,[]). 西暦和暦表(802,延暦,21,[]). 西暦和暦表(803,延暦,22,[]). 西暦和暦表(804,延暦,23,[]). 西暦和暦表(805,延暦,24,[]). 西暦和暦表(806,延暦,25,[]). 西暦和暦表(806,大同,1,[]). 西暦和暦表(807,大同,2,[]). 西暦和暦表(808,大同,3,[]). 西暦和暦表(809,大同,4,[]). 西暦和暦表(810,大同,5,[]). 西暦和暦表(810,弘仁,1,[]). 西暦和暦表(811,弘仁,2,[]). 西暦和暦表(812,弘仁,3,[]). 西暦和暦表(813,弘仁,4,[]). 西暦和暦表(814,弘仁,5,[]). 西暦和暦表(815,弘仁,6,[]). 西暦和暦表(816,弘仁,7,[]). 西暦和暦表(817,弘仁,8,[]). 西暦和暦表(818,弘仁,9,[]). 西暦和暦表(819,弘仁,10,[]). 西暦和暦表(820,弘仁,11,[]). 西暦和暦表(821,弘仁,12,[]). 西暦和暦表(822,弘仁,13,[]). 西暦和暦表(823,弘仁,14,[]). 西暦和暦表(824,弘仁,15,[]). 西暦和暦表(824,天長,1,[]). 西暦和暦表(825,天長,2,[]). 西暦和暦表(826,天長,3,[]). 西暦和暦表(827,天長,4,[]). 西暦和暦表(828,天長,5,[]). 西暦和暦表(829,天長,6,[]). 西暦和暦表(830,天長,7,[]). 西暦和暦表(831,天長,8,[]). 西暦和暦表(832,天長,9,[]). 西暦和暦表(833,天長,10,[]). 西暦和暦表(834,天長,11,[]). 西暦和暦表(834,承和,1,[]). 西暦和暦表(835,承和,2,[]). 西暦和暦表(836,承和,3,[]). 西暦和暦表(837,承和,4,[]). 西暦和暦表(838,承和,5,[]). 西暦和暦表(839,承和,6,[]). 西暦和暦表(840,承和,7,[]). 西暦和暦表(841,承和,8,[]). 西暦和暦表(842,承和,9,[]). 西暦和暦表(843,承和,10,[]). 西暦和暦表(844,承和,11,[]). 西暦和暦表(845,承和,12,[]). 西暦和暦表(846,承和,13,[]). 西暦和暦表(847,承和,14,[]). 西暦和暦表(848,承和,15,[]). 西暦和暦表(848,嘉祥,1,[]). 西暦和暦表(849,嘉祥,2,[]). 西暦和暦表(850,嘉祥,3,[]). 西暦和暦表(851,嘉祥,4,[]). 西暦和暦表(851,仁寿,1,[]). 西暦和暦表(852,仁寿,2,[]). 西暦和暦表(853,仁寿,3,[]). 西暦和暦表(854,仁寿,4,[]). 西暦和暦表(854,斉衡,1,[]). 西暦和暦表(855,斉衡,2,[]). 西暦和暦表(856,斉衡,3,[]). 西暦和暦表(857,斉衡,4,[]). 西暦和暦表(857,天安,1,[]). 西暦和暦表(858,天安,2,[]). 西暦和暦表(859,天安,3,[]). 西暦和暦表(859,貞観,1,[]). 西暦和暦表(860,貞観,2,[]). 西暦和暦表(861,貞観,3,[]). 西暦和暦表(862,貞観,4,[]). 西暦和暦表(863,貞観,5,[]). 西暦和暦表(864,貞観,6,[]). 西暦和暦表(865,貞観,7,[]). 西暦和暦表(866,貞観,8,[]). 西暦和暦表(867,貞観,9,[]). 西暦和暦表(868,貞観,10,[]). 西暦和暦表(869,貞観,11,[]). 西暦和暦表(870,貞観,12,[]). 西暦和暦表(871,貞観,13,[]). 西暦和暦表(872,貞観,14,[]). 西暦和暦表(873,貞観,15,[]). 西暦和暦表(874,貞観,16,[]). 西暦和暦表(875,貞観,17,[]). 西暦和暦表(876,貞観,18,[]). 西暦和暦表(877,貞観,19,[]). 西暦和暦表(877,元慶,1,[]). 西暦和暦表(878,元慶,2,[]). 西暦和暦表(879,元慶,3,[]). 西暦和暦表(880,元慶,4,[]). 西暦和暦表(881,元慶,5,[]). 西暦和暦表(882,元慶,6,[]). 西暦和暦表(883,元慶,7,[]). 西暦和暦表(884,元慶,8,[]). 西暦和暦表(885,元慶,9,[]). 西暦和暦表(885,仁和,1,[]). 西暦和暦表(886,仁和,2,[]). 西暦和暦表(887,仁和,3,[]). 西暦和暦表(888,仁和,4,[]). 西暦和暦表(889,仁和,5,[]). 西暦和暦表(889,寛平,1,[]). 西暦和暦表(890,寛平,2,[]). 西暦和暦表(891,寛平,3,[]). 西暦和暦表(892,寛平,4,[]). 西暦和暦表(893,寛平,5,[]). 西暦和暦表(894,寛平,6,[]). 西暦和暦表(895,寛平,7,[]). 西暦和暦表(896,寛平,8,[]). 西暦和暦表(897,寛平,9,[]). 西暦和暦表(898,寛平,10,[]). 西暦和暦表(898,昌泰,1,[]). 西暦和暦表(899,昌泰,2,[]). 西暦和暦表(900,昌泰,3,[]). 西暦和暦表(901,昌泰,4,[]). 西暦和暦表(901,延喜,1,[]). 西暦和暦表(902,延喜,2,[]). 西暦和暦表(903,延喜,3,[]). 西暦和暦表(904,延喜,4,[]). 西暦和暦表(905,延喜,5,[]). 西暦和暦表(906,延喜,6,[]). 西暦和暦表(907,延喜,7,[]). 西暦和暦表(908,延喜,8,[]). 西暦和暦表(909,延喜,9,[]). 西暦和暦表(910,延喜,10,[]). 西暦和暦表(911,延喜,11,[]). 西暦和暦表(912,延喜,12,[]). 西暦和暦表(913,延喜,13,[]). 西暦和暦表(914,延喜,14,[]). 西暦和暦表(915,延喜,15,[]). 西暦和暦表(916,延喜,16,[]). 西暦和暦表(917,延喜,17,[]). 西暦和暦表(918,延喜,18,[]). 西暦和暦表(919,延喜,19,[]). 西暦和暦表(920,延喜,20,[]). 西暦和暦表(921,延喜,21,[]). 西暦和暦表(922,延喜,22,[]). 西暦和暦表(923,延喜,23,[]). 西暦和暦表(923,延長,1,[]). 西暦和暦表(924,延長,2,[]). 西暦和暦表(925,延長,3,[]). 西暦和暦表(926,延長,4,[]). 西暦和暦表(927,延長,5,[]). 西暦和暦表(928,延長,6,[]). 西暦和暦表(929,延長,7,[]). 西暦和暦表(930,延長,8,[]). 西暦和暦表(931,延長,9,[]). 西暦和暦表(931,承平,1,[]). 西暦和暦表(932,承平,2,[]). 西暦和暦表(933,承平,3,[]). 西暦和暦表(934,承平,4,[]). 西暦和暦表(935,承平,5,[]). 西暦和暦表(936,承平,6,[]). 西暦和暦表(937,承平,7,[]). 西暦和暦表(938,承平,8,[]). 西暦和暦表(938,天慶,1,[]). 西暦和暦表(939,天慶,2,[]). 西暦和暦表(940,天慶,3,[]). 西暦和暦表(941,天慶,4,[]). 西暦和暦表(942,天慶,5,[]). 西暦和暦表(943,天慶,6,[]). 西暦和暦表(944,天慶,7,[]). 西暦和暦表(945,天慶,8,[]). 西暦和暦表(946,天慶,9,[]). 西暦和暦表(947,天慶,10,[]). 西暦和暦表(947,天暦,1,[]). 西暦和暦表(948,天暦,2,[]). 西暦和暦表(949,天暦,3,[]). 西暦和暦表(950,天暦,4,[]). 西暦和暦表(951,天暦,5,[]). 西暦和暦表(952,天暦,6,[]). 西暦和暦表(953,天暦,7,[]). 西暦和暦表(954,天暦,8,[]). 西暦和暦表(955,天暦,9,[]). 西暦和暦表(956,天暦,10,[]). 西暦和暦表(957,天暦,11,[]). 西暦和暦表(957,天徳,1,[]). 西暦和暦表(958,天徳,2,[]). 西暦和暦表(959,天徳,3,[]). 西暦和暦表(960,天徳,4,[]). 西暦和暦表(961,天徳,5,[]). 西暦和暦表(961,応和,1,[]). 西暦和暦表(962,応和,2,[]). 西暦和暦表(963,応和,3,[]). 西暦和暦表(964,応和,4,[]). 西暦和暦表(964,康保,1,[]). 西暦和暦表(965,康保,2,[]). 西暦和暦表(966,康保,3,[]). 西暦和暦表(967,康保,4,[]). 西暦和暦表(968,康保,5,[]). 西暦和暦表(968,安和,1,[]). 西暦和暦表(969,安和,2,[]). 西暦和暦表(970,安和,3,[]). 西暦和暦表(970,天禄,1,[]). 西暦和暦表(971,天禄,2,[]). 西暦和暦表(972,天禄,3,[]). 西暦和暦表(973,天禄,4,[]). 西暦和暦表(973,天延,1,[]). 西暦和暦表(974,天延,2,[]). 西暦和暦表(975,天延,3,[]). 西暦和暦表(976,天延,4,[]). 西暦和暦表(976,貞元,1,[]). 西暦和暦表(977,貞元,2,[]). 西暦和暦表(978,貞元,3,[]). 西暦和暦表(978,天元,1,[]). 西暦和暦表(979,天元,2,[]). 西暦和暦表(980,天元,3,[]). 西暦和暦表(981,天元,4,[]). 西暦和暦表(982,天元,5,[]). 西暦和暦表(983,天元,6,[]). 西暦和暦表(983,永観,1,[]). 西暦和暦表(984,永観,2,[]). 西暦和暦表(985,永観,3,[]). 西暦和暦表(985,寛和,1,[]). 西暦和暦表(986,寛和,2,[]). 西暦和暦表(987,寛和,3,[]). 西暦和暦表(987,永延,1,[]). 西暦和暦表(988,永延,2,[]). 西暦和暦表(989,永延,3,[]). 西暦和暦表(989,永祚,1,[]). 西暦和暦表(990,永祚,2,[]). 西暦和暦表(990,正暦,1,[]). 西暦和暦表(991,正暦,2,[]). 西暦和暦表(992,正暦,3,[]). 西暦和暦表(993,正暦,4,[]). 西暦和暦表(994,正暦,5,[]). 西暦和暦表(995,正暦,6,[]). 西暦和暦表(995,長徳,1,[]). 西暦和暦表(996,長徳,2,[]). 西暦和暦表(997,長徳,3,[]). 西暦和暦表(998,長徳,4,[]). 西暦和暦表(999,長徳,5,[]). 西暦和暦表(999,長保,1,[]). 西暦和暦表(1000,長保,2,[]). 西暦和暦表(1001,長保,3,[]). 西暦和暦表(1002,長保,4,[]). 西暦和暦表(1003,長保,5,[]). 西暦和暦表(1004,長保,6,[]). 西暦和暦表(1004,寛弘,1,[]). 西暦和暦表(1005,寛弘,2,[]). 西暦和暦表(1006,寛弘,3,[]). 西暦和暦表(1007,寛弘,4,[]). 西暦和暦表(1008,寛弘,5,[]). 西暦和暦表(1009,寛弘,6,[]). 西暦和暦表(1010,寛弘,7,[]). 西暦和暦表(1011,寛弘,8,[]). 西暦和暦表(1012,寛弘,9,[]). 西暦和暦表(1012,長和,1,[]). 西暦和暦表(1013,長和,2,[]). 西暦和暦表(1014,長和,3,[]). 西暦和暦表(1015,長和,4,[]). 西暦和暦表(1016,長和,5,[]). 西暦和暦表(1017,長和,6,[]). 西暦和暦表(1017,寛仁,1,[]). 西暦和暦表(1018,寛仁,2,[]). 西暦和暦表(1019,寛仁,3,[]). 西暦和暦表(1020,寛仁,4,[]). 西暦和暦表(1021,寛仁,5,[]). 西暦和暦表(1021,治安,1,[]). 西暦和暦表(1022,治安,2,[]). 西暦和暦表(1023,治安,3,[]). 西暦和暦表(1024,治安,4,[]). 西暦和暦表(1024,万寿,1,[]). 西暦和暦表(1025,万寿,2,[]). 西暦和暦表(1026,万寿,3,[]). 西暦和暦表(1027,万寿,4,[]). 西暦和暦表(1028,万寿,5,[]). 西暦和暦表(1028,長元,1,[]). 西暦和暦表(1029,長元,2,[]). 西暦和暦表(1030,長元,3,[]). 西暦和暦表(1031,長元,4,[]). 西暦和暦表(1032,長元,5,[]). 西暦和暦表(1033,長元,6,[]). 西暦和暦表(1034,長元,7,[]). 西暦和暦表(1035,長元,8,[]). 西暦和暦表(1036,長元,9,[]). 西暦和暦表(1037,長元,10,[]). 西暦和暦表(1037,長暦,1,[]). 西暦和暦表(1038,長暦,2,[]). 西暦和暦表(1039,長暦,3,[]). 西暦和暦表(1040,長暦,4,[]). 西暦和暦表(1040,長久,1,[]). 西暦和暦表(1041,長久,2,[]). 西暦和暦表(1042,長久,3,[]). 西暦和暦表(1043,長久,4,[]). 西暦和暦表(1044,長久,5,[]). 西暦和暦表(1044,寛徳,1,[]). 西暦和暦表(1045,寛徳,2,[]). 西暦和暦表(1046,寛徳,3,[]). 西暦和暦表(1046,永承,1,[]). 西暦和暦表(1047,永承,2,[]). 西暦和暦表(1048,永承,3,[]). 西暦和暦表(1049,永承,4,[]). 西暦和暦表(1050,永承,5,[]). 西暦和暦表(1051,永承,6,[]). 西暦和暦表(1052,永承,7,[]). 西暦和暦表(1053,永承,8,[]). 西暦和暦表(1053,天喜,1,[]). 西暦和暦表(1054,天喜,2,[]). 西暦和暦表(1055,天喜,3,[]). 西暦和暦表(1056,天喜,4,[]). 西暦和暦表(1057,天喜,5,[]). 西暦和暦表(1058,天喜,6,[]). 西暦和暦表(1058,康平,1,[]). 西暦和暦表(1059,康平,2,[]). 西暦和暦表(1060,康平,3,[]). 西暦和暦表(1061,康平,4,[]). 西暦和暦表(1062,康平,5,[]). 西暦和暦表(1063,康平,6,[]). 西暦和暦表(1064,康平,7,[]). 西暦和暦表(1065,康平,8,[]). 西暦和暦表(1065,治暦,1,[]). 西暦和暦表(1066,治暦,2,[]). 西暦和暦表(1067,治暦,3,[]). 西暦和暦表(1068,治暦,4,[]). 西暦和暦表(1069,治暦,5,[]). 西暦和暦表(1069,延久,1,[]). 西暦和暦表(1070,延久,2,[]). 西暦和暦表(1071,延久,3,[]). 西暦和暦表(1072,延久,4,[]). 西暦和暦表(1073,延久,5,[]). 西暦和暦表(1074,延久,6,[]). 西暦和暦表(1074,承保,1,[]). 西暦和暦表(1075,承保,2,[]). 西暦和暦表(1076,承保,3,[]). 西暦和暦表(1077,承保,4,[]). 西暦和暦表(1077,承暦,1,[]). 西暦和暦表(1078,承暦,2,[]). 西暦和暦表(1079,承暦,3,[]). 西暦和暦表(1080,承暦,4,[]). 西暦和暦表(1081,承暦,5,[]). 西暦和暦表(1081,永保,1,[]). 西暦和暦表(1082,永保,2,[]). 西暦和暦表(1083,永保,3,[]). 西暦和暦表(1084,永保,4,[]). 西暦和暦表(1084,応徳,1,[]). 西暦和暦表(1085,応徳,2,[]). 西暦和暦表(1086,応徳,3,[]). 西暦和暦表(1087,応徳,4,[]). 西暦和暦表(1087,寛治,1,[]). 西暦和暦表(1088,寛治,2,[]). 西暦和暦表(1089,寛治,3,[]). 西暦和暦表(1090,寛治,4,[]). 西暦和暦表(1091,寛治,5,[]). 西暦和暦表(1092,寛治,6,[]). 西暦和暦表(1093,寛治,7,[]). 西暦和暦表(1094,寛治,8,[]). 西暦和暦表(1094,嘉保,1,[]). 西暦和暦表(1095,嘉保,2,[]). 西暦和暦表(1096,嘉保,3,[]). 西暦和暦表(1096,永長,1,[]). 西暦和暦表(1097,永長,2,[]). 西暦和暦表(1097,承徳,1,[]). 西暦和暦表(1098,承徳,2,[]). 西暦和暦表(1099,承徳,3,[]). 西暦和暦表(1099,康和,1,[]). 西暦和暦表(1100,康和,2,[]). 西暦和暦表(1101,康和,3,[]). 西暦和暦表(1102,康和,4,[]). 西暦和暦表(1103,康和,5,[]). 西暦和暦表(1104,康和,6,[]). 西暦和暦表(1104,長治,1,[]). 西暦和暦表(1105,長治,2,[]). 西暦和暦表(1106,長治,3,[]). 西暦和暦表(1106,嘉承,1,[]). 西暦和暦表(1107,嘉承,2,[]). 西暦和暦表(1108,嘉承,3,[]). 西暦和暦表(1108,天仁,1,[]). 西暦和暦表(1109,天仁,2,[]). 西暦和暦表(1110,天仁,3,[]). 西暦和暦表(1110,天永,1,[]). 西暦和暦表(1111,天永,2,[]). 西暦和暦表(1112,天永,3,[]). 西暦和暦表(1113,天永,4,[]). 西暦和暦表(1113,永久,1,[]). 西暦和暦表(1114,永久,2,[]). 西暦和暦表(1115,永久,3,[]). 西暦和暦表(1116,永久,4,[]). 西暦和暦表(1117,永久,5,[]). 西暦和暦表(1118,永久,6,[]). 西暦和暦表(1118,元永,1,[]). 西暦和暦表(1119,元永,2,[]). 西暦和暦表(1120,元永,3,[]). 西暦和暦表(1120,保安,1,[]). 西暦和暦表(1121,保安,2,[]). 西暦和暦表(1122,保安,3,[]). 西暦和暦表(1123,保安,4,[]). 西暦和暦表(1124,保安,5,[]). 西暦和暦表(1124,天治,1,[]). 西暦和暦表(1125,天治,2,[]). 西暦和暦表(1126,天治,3,[]). 西暦和暦表(1126,大治,1,[]). 西暦和暦表(1127,大治,2,[]). 西暦和暦表(1128,大治,3,[]). 西暦和暦表(1129,大治,4,[]). 西暦和暦表(1130,大治,5,[]). 西暦和暦表(1131,大治,6,[]). 西暦和暦表(1131,天承,1,[]). 西暦和暦表(1132,天承,2,[]). 西暦和暦表(1132,長承,1,[]). 西暦和暦表(1133,長承,2,[]). 西暦和暦表(1134,長承,3,[]). 西暦和暦表(1135,長承,4,[]). 西暦和暦表(1135,保延,1,[]). 西暦和暦表(1136,保延,2,[]). 西暦和暦表(1137,保延,3,[]). 西暦和暦表(1138,保延,4,[]). 西暦和暦表(1139,保延,5,[]). 西暦和暦表(1140,保延,6,[]). 西暦和暦表(1141,保延,7,[]). 西暦和暦表(1141,永治,1,[]). 西暦和暦表(1142,永治,2,[]). 西暦和暦表(1142,康治,1,[]). 西暦和暦表(1143,康治,2,[]). 西暦和暦表(1144,康治,3,[]). 西暦和暦表(1144,天養,1,2 / 23). 西暦和暦表(1145,天養,2,[]). 西暦和暦表(1145,久安,1,7 / 22). 西暦和暦表(1146,久安,2,[]). 西暦和暦表(1147,久安,3,[]). 西暦和暦表(1148,久安,4,[]). 西暦和暦表(1149,久安,5,[]). 西暦和暦表(1150,久安,6,[]). 西暦和暦表(1151,久安,7,[]). 西暦和暦表(1151,仁平,1,1 / 26). 西暦和暦表(1152,仁平,2,[]). 西暦和暦表(1153,仁平,3,[]). 西暦和暦表(1154,仁平,4,[]). 西暦和暦表(1154,久寿,1,10 / 28). 西暦和暦表(1155,久寿,2,[]). 西暦和暦表(1156,久寿,3,[]). 西暦和暦表(1156,保元,1,4 / 27). 西暦和暦表(1157,保元,2,[]). 西暦和暦表(1158,保元,3,[]). 西暦和暦表(1159,保元,4,[]). 西暦和暦表(1159,平治,1,4 / 20). 西暦和暦表(1160,平治,2,[]). 西暦和暦表(1160,永暦,1,1 / 10). 西暦和暦表(1161,永暦,2,[]). 西暦和暦表(1161,応保,1,9 / 4). 西暦和暦表(1162,応保,2,[]). 西暦和暦表(1163,応保,3,[]). 西暦和暦表(1163,長寛,1,3 / 29). 西暦和暦表(1164,長寛,2,[]). 西暦和暦表(1165,長寛,3,[]). 西暦和暦表(1165,永万,1,6 / 5). 西暦和暦表(1166,永万,2,[]). 西暦和暦表(1166,仁安,1,8 / 27). 西暦和暦表(1167,仁安,2,[]). 西暦和暦表(1168,仁安,3,[]). 西暦和暦表(1169,仁安,4,[]). 西暦和暦表(1169,嘉応,1,4 / 8). 西暦和暦表(1170,嘉応,2,[]). 西暦和暦表(1171,嘉応,3,[]). 西暦和暦表(1171,承安,1,4 / 21). 西暦和暦表(1172,承安,2,[]). 西暦和暦表(1173,承安,3,[]). 西暦和暦表(1174,承安,4,[]). 西暦和暦表(1175,承安,5,[]). 西暦和暦表(1175,安元,1,7 / 28). 西暦和暦表(1176,安元,2,[]). 西暦和暦表(1177,安元,3,[]). 西暦和暦表(1177,治承,1,8 / 4). 西暦和暦表(1178,治承,2,[]). 西暦和暦表(1179,治承,3,[]). 西暦和暦表(1180,治承,4,[]). 西暦和暦表(1181,治承,5,[]). 西暦和暦表(1181,養和,1,7 / 14). 西暦和暦表(1182,養和,2,[]). 西暦和暦表(1182,寿永,1,5 / 27). 西暦和暦表(1183,寿永,2,[]). 西暦和暦表(1184,寿永,3,[]). 西暦和暦表(1185,寿永,4,[]). 西暦和暦表(1185,文治,1,8 / 14). 西暦和暦表(1186,文治,2,[]). 西暦和暦表(1187,文治,3,[]). 西暦和暦表(1188,文治,4,[]). 西暦和暦表(1189,文治,5,[]). 西暦和暦表(1190,文治,6,[]). 西暦和暦表(1190,建久,1,4 / 11). 西暦和暦表(1191,建久,2,[]). 西暦和暦表(1192,建久,3,[]). 西暦和暦表(1193,建久,4,[]). 西暦和暦表(1194,建久,5,[]). 西暦和暦表(1195,建久,6,[]). 西暦和暦表(1196,建久,7,[]). 西暦和暦表(1197,建久,8,[]). 西暦和暦表(1198,建久,9,[]). 西暦和暦表(1199,建久,10,[]). 西暦和暦表(1199,正治,1,4 / 27). 西暦和暦表(1200,正治,2,[]). 西暦和暦表(1201,正治,3,[]). 西暦和暦表(1201,建仁,1,2 / 13). 西暦和暦表(1202,建仁,2,[]). 西暦和暦表(1203,建仁,3,[]). 西暦和暦表(1204,建仁,4,[]). 西暦和暦表(1204,元久,1,2 / 20). 西暦和暦表(1205,元久,2,[]). 西暦和暦表(1206,元久,3,[]). 西暦和暦表(1206,建永,1,4 / 27). 西暦和暦表(1207,建永,2,[]). 西暦和暦表(1207,承元,1,10 / 25). 西暦和暦表(1208,承元,2,[]). 西暦和暦表(1209,承元,3,[]). 西暦和暦表(1210,承元,4,[]). 西暦和暦表(1211,承元,5,[]). 西暦和暦表(1211,建暦,1,3 / 9). 西暦和暦表(1212,建暦,2,[]). 西暦和暦表(1213,建暦,3,[]). 西暦和暦表(1213,建保,1,12 / 6). 西暦和暦表(1214,建保,2,[]). 西暦和暦表(1215,建保,3,[]). 西暦和暦表(1216,建保,4,[]). 西暦和暦表(1217,建保,5,[]). 西暦和暦表(1218,建保,6,[]). 西暦和暦表(1219,建保,7,[]). 西暦和暦表(1219,承久,1,4 / 12). 西暦和暦表(1220,承久,2,[]). 西暦和暦表(1221,承久,3,[]). 西暦和暦表(1222,承久,4,[]). 西暦和暦表(1222,貞応,1,4 / 13). 西暦和暦表(1223,貞応,2,[]). 西暦和暦表(1224,貞応,3,[]). 西暦和暦表(1224,元仁,1,11 / 20). 西暦和暦表(1225,元仁,2,[]). 西暦和暦表(1225,嘉祿,1,4 / 20). 西暦和暦表(1226,嘉祿,2,[]). 西暦和暦表(1227,嘉祿,3,[]). 西暦和暦表(1227,安貞,1,12 / 10). 西暦和暦表(1228,安貞,2,[]). 西暦和暦表(1229,安貞,3,[]). 西暦和暦表(1229,寛喜,1,3 / 5). 西暦和暦表(1230,寛喜,2,[]). 西暦和暦表(1231,寛喜,3,[]). 西暦和暦表(1232,寛喜,4,[]). 西暦和暦表(1232,貞永,1,4 / 2). 西暦和暦表(1233,貞永,2,[]). 西暦和暦表(1233,天福,1,4 / 15). 西暦和暦表(1234,天福,2,[]). 西暦和暦表(1234,文暦,1,11 / 5). 西暦和暦表(1235,文暦,2,[]). 西暦和暦表(1235,嘉禎,1,9 / 19). 西暦和暦表(1236,嘉禎,2,[]). 西暦和暦表(1237,嘉禎,3,[]). 西暦和暦表(1238,嘉禎,4,[]). 西暦和暦表(1238,暦仁,1,11 / 23). 西暦和暦表(1239,暦仁,2,[]). 西暦和暦表(1239,延応,1,2 / 7). 西暦和暦表(1240,延応,2,[]). 西暦和暦表(1240,仁治,1,7 / 16). 西暦和暦表(1241,仁治,2,[]). 西暦和暦表(1242,仁治,3,[]). 西暦和暦表(1243,仁治,4,[]). 西暦和暦表(1243,寛元,1,2 / 26). 西暦和暦表(1244,寛元,2,[]). 西暦和暦表(1245,寛元,3,[]). 西暦和暦表(1246,寛元,4,[]). 西暦和暦表(1247,寛元,5,[]). 西暦和暦表(1247,宝治,1,2 / 28). 西暦和暦表(1248,宝治,2,[]). 西暦和暦表(1249,宝治,3,[]). 西暦和暦表(1249,建長,1,3 / 18). 西暦和暦表(1250,建長,2,[]). 西暦和暦表(1251,建長,3,[]). 西暦和暦表(1252,建長,4,[]). 西暦和暦表(1253,建長,5,[]). 西暦和暦表(1254,建長,6,[]). 西暦和暦表(1255,建長,7,[]). 西暦和暦表(1256,建長,8,[]). 西暦和暦表(1256,康元,1,10 / 5). 西暦和暦表(1257,康元,2,[]). 西暦和暦表(1257,正嘉,1,3 / 14). 西暦和暦表(1258,正嘉,2,[]). 西暦和暦表(1259,正嘉,3,[]). 西暦和暦表(1259,正元,1,3 / 26). 西暦和暦表(1260,正元,2,[]). 西暦和暦表(1260,文応,1,4 / 23). 西暦和暦表(1261,文応,2,[]). 西暦和暦表(1261,弘長,1,2 / 20). 西暦和暦表(1262,弘長,2,[]). 西暦和暦表(1263,弘長,3,[]). 西暦和暦表(1264,弘長,4,[]). 西暦和暦表(1264,文永,1,2 / 28). 西暦和暦表(1265,文永,2,[]). 西暦和暦表(1266,文永,3,[]). 西暦和暦表(1267,文永,4,[]). 西暦和暦表(1268,文永,5,[]). 西暦和暦表(1269,文永,6,[]). 西暦和暦表(1270,文永,7,[]). 西暦和暦表(1271,文永,8,[]). 西暦和暦表(1272,文永,9,[]). 西暦和暦表(1273,文永,10,[]). 西暦和暦表(1274,文永,11,[]). 西暦和暦表(1275,文永,12,[]). 西暦和暦表(1275,建治,1,4 / 25). 西暦和暦表(1276,建治,2,[]). 西暦和暦表(1277,建治,3,[]). 西暦和暦表(1278,建治,4,[]). 西暦和暦表(1278,弘安,1,2 / 29). 西暦和暦表(1279,弘安,2,[]). 西暦和暦表(1280,弘安,3,[]). 西暦和暦表(1281,弘安,4,[]). 西暦和暦表(1282,弘安,5,[]). 西暦和暦表(1283,弘安,6,[]). 西暦和暦表(1284,弘安,7,[]). 西暦和暦表(1285,弘安,8,[]). 西暦和暦表(1286,弘安,9,[]). 西暦和暦表(1287,弘安,10,[]). 西暦和暦表(1288,弘安,11,[]). 西暦和暦表(1288,正応,1,4 / 28). 西暦和暦表(1289,正応,2,[]). 西暦和暦表(1290,正応,3,[]). 西暦和暦表(1291,正応,4,[]). 西暦和暦表(1292,正応,5,[]). 西暦和暦表(1293,正応,6,[]). 西暦和暦表(1293,永仁,1,8 / 5). 西暦和暦表(1294,永仁,2,[]). 西暦和暦表(1295,永仁,3,[]). 西暦和暦表(1296,永仁,4,[]). 西暦和暦表(1297,永仁,5,[]). 西暦和暦表(1298,永仁,6,[]). 西暦和暦表(1299,永仁,7,[]). 西暦和暦表(1299,正安,1,4 / 25). 西暦和暦表(1300,正安,2,[]). 西暦和暦表(1301,正安,3,[]). 西暦和暦表(1302,正安,4,[]). 西暦和暦表(1302,乾元,1,11 / 21). 西暦和暦表(1303,乾元,2,[]). 西暦和暦表(1303,嘉元,1,8 / 5). 西暦和暦表(1304,嘉元,2,[]). 西暦和暦表(1305,嘉元,3,[]). 西暦和暦表(1306,嘉元,4,[]). 西暦和暦表(1306,徳治,1,12 / 14). 西暦和暦表(1307,徳治,2,[]). 西暦和暦表(1308,徳治,3,[]). 西暦和暦表(1308,延慶,1,10 / 9). 西暦和暦表(1309,延慶,2,[]). 西暦和暦表(1310,延慶,3,[]). 西暦和暦表(1311,延慶,4,[]). 西暦和暦表(1311,応長,1,4 / 28). 西暦和暦表(1312,応長,2,[]). 西暦和暦表(1312,正和,1,3 / 20). 西暦和暦表(1313,正和,2,[]). 西暦和暦表(1314,正和,3,[]). 西暦和暦表(1315,正和,4,[]). 西暦和暦表(1316,正和,5,[]). 西暦和暦表(1317,正和,6,[]). 西暦和暦表(1317,文保,1,2 / 3). 西暦和暦表(1318,文保,2,[]). 西暦和暦表(1319,文保,3,[]). 西暦和暦表(1319,元応,1,4 / 28). 西暦和暦表(1320,元応,2,[]). 西暦和暦表(1321,元応,3,[]). 西暦和暦表(1321,元亨,1,2 / 23). 西暦和暦表(1322,元亨,2,[]). 西暦和暦表(1323,元亨,3,[]). 西暦和暦表(1324,元亨,4,[]). 西暦和暦表(1324,正中,1,12 / 9). 西暦和暦表(1325,正中,2,[]). 西暦和暦表(1326,正中,3,[]). 西暦和暦表(1326,嘉暦,1,4 / 26). 西暦和暦表(1327,嘉暦,2,[]). 西暦和暦表(1328,嘉暦,3,[]). 西暦和暦表(1329,嘉暦,4,[]). 西暦和暦表(1329,元徳,1,8 / 29). 西暦和暦表(1330,元徳,2,[]). 西暦和暦表(1331,元徳,3,[]). 西暦和暦表(1331,元弘,1,8 / 9). 西暦和暦表(1332,元弘,2,[]). 西暦和暦表(1332,正慶,1,4 / 28). 西暦和暦表(1333,正慶,2,[]). 西暦和暦表(1334,正慶,3,[]). 西暦和暦表(1334,建武,1,1 / 29). 西暦和暦表(1335,建武,2,[]). 西暦和暦表(1336,建武,3,[]). 西暦和暦表(1337,建武,4,[]). 西暦和暦表(1338,建武,5,[]). 西暦和暦表(1338,暦応,1,8 / 28). 西暦和暦表(1339,暦応,2,[]). 西暦和暦表(1340,暦応,3,[]). 西暦和暦表(1341,暦応,4,[]). 西暦和暦表(1342,暦応,5,[]). 西暦和暦表(1342,康永,1,4 / 27). 西暦和暦表(1343,康永,2,[]). 西暦和暦表(1344,康永,3,[]). 西暦和暦表(1345,康永,4,[]). 西暦和暦表(1345,貞和,1,10 / 21). 西暦和暦表(1346,貞和,2,[]). 西暦和暦表(1347,貞和,3,[]). 西暦和暦表(1348,貞和,4,[]). 西暦和暦表(1349,貞和,5,[]). 西暦和暦表(1350,貞和,6,[]). 西暦和暦表(1350,観応,1,2 / 27). 西暦和暦表(1351,観応,2,[]). 西暦和暦表(1352,観応,3,[]). 西暦和暦表(1352,文和,1,9 / 27). 西暦和暦表(1353,文和,2,[]). 西暦和暦表(1354,文和,3,[]). 西暦和暦表(1355,文和,4,[]). 西暦和暦表(1356,文和,5,[]). 西暦和暦表(1356,延文,1,3 / 28). 西暦和暦表(1357,延文,2,[]). 西暦和暦表(1358,延文,3,[]). 西暦和暦表(1359,延文,4,[]). 西暦和暦表(1360,延文,5,[]). 西暦和暦表(1361,延文,6,[]). 西暦和暦表(1361,康安,1,3 / 29). 西暦和暦表(1362,康安,2,[]). 西暦和暦表(1362,貞治,1,9 / 23). 西暦和暦表(1363,貞治,2,[]). 西暦和暦表(1364,貞治,3,[]). 西暦和暦表(1365,貞治,4,[]). 西暦和暦表(1366,貞治,5,[]). 西暦和暦表(1367,貞治,6,[]). 西暦和暦表(1368,貞治,7,[]). 西暦和暦表(1368,応安,1,2 / 18). 西暦和暦表(1369,応安,2,[]). 西暦和暦表(1370,応安,3,[]). 西暦和暦表(1371,応安,4,[]). 西暦和暦表(1372,応安,5,[]). 西暦和暦表(1373,応安,6,[]). 西暦和暦表(1374,応安,7,[]). 西暦和暦表(1375,応安,8,[]). 西暦和暦表(1375,永和,1,5 / 27). 西暦和暦表(1376,永和,2,[]). 西暦和暦表(1377,永和,3,[]). 西暦和暦表(1378,永和,4,[]). 西暦和暦表(1379,永和,5,[]). 西暦和暦表(1379,康暦,1,3 / 22). 西暦和暦表(1380,康暦,2,[]). 西暦和暦表(1381,康暦,3,[]). 西暦和暦表(1381,永徳,1,2 / 10). 西暦和暦表(1382,永徳,2,[]). 西暦和暦表(1383,永徳,3,[]). 西暦和暦表(1384,永徳,4,[]). 西暦和暦表(1384,至徳,1,4 / 28). 西暦和暦表(1385,至徳,2,[]). 西暦和暦表(1386,至徳,3,[]). 西暦和暦表(1387,至徳,4,[]). 西暦和暦表(1387,嘉慶,1,8 / 23). 西暦和暦表(1388,嘉慶,2,[]). 西暦和暦表(1389,嘉慶,3,[]). 西暦和暦表(1389,康応,1,2 / 9). 西暦和暦表(1390,康応,2,[]). 西暦和暦表(1390,明徳,1,3 / 26). 西暦和暦表(1391,明徳,2,[]). 西暦和暦表(1392,明徳,3,[]). 西暦和暦表(1393,明徳,4,[]). 西暦和暦表(1394,明徳,5,[]). 西暦和暦表(1394,応永,1,7 / 5). 西暦和暦表(1395,応永,2,[]). 西暦和暦表(1396,応永,3,[]). 西暦和暦表(1397,応永,4,[]). 西暦和暦表(1398,応永,5,[]). 西暦和暦表(1399,応永,6,[]). 西暦和暦表(1400,応永,7,[]). 西暦和暦表(1401,応永,8,[]). 西暦和暦表(1402,応永,9,[]). 西暦和暦表(1403,応永,10,[]). 西暦和暦表(1404,応永,11,[]). 西暦和暦表(1405,応永,12,[]). 西暦和暦表(1406,応永,13,[]). 西暦和暦表(1407,応永,14,[]). 西暦和暦表(1408,応永,15,[]). 西暦和暦表(1409,応永,16,[]). 西暦和暦表(1410,応永,17,[]). 西暦和暦表(1411,応永,18,[]). 西暦和暦表(1412,応永,19,[]). 西暦和暦表(1413,応永,20,[]). 西暦和暦表(1414,応永,21,[]). 西暦和暦表(1415,応永,22,[]). 西暦和暦表(1416,応永,23,[]). 西暦和暦表(1417,応永,24,[]). 西暦和暦表(1418,応永,25,[]). 西暦和暦表(1419,応永,26,[]). 西暦和暦表(1420,応永,27,[]). 西暦和暦表(1421,応永,28,[]). 西暦和暦表(1422,応永,29,[]). 西暦和暦表(1423,応永,30,[]). 西暦和暦表(1424,応永,31,[]). 西暦和暦表(1425,応永,32,[]). 西暦和暦表(1426,応永,33,[]). 西暦和暦表(1427,応永,34,[]). 西暦和暦表(1428,応永,35,[]). 西暦和暦表(1428,正長,1,4 / 27). 西暦和暦表(1429,正長,2,[]). 西暦和暦表(1429,永享,1,9 / 5). 西暦和暦表(1430,永享,2,[]). 西暦和暦表(1431,永享,3,[]). 西暦和暦表(1432,永享,4,[]). 西暦和暦表(1433,永享,5,[]). 西暦和暦表(1434,永享,6,[]). 西暦和暦表(1435,永享,7,[]). 西暦和暦表(1436,永享,8,[]). 西暦和暦表(1437,永享,9,[]). 西暦和暦表(1438,永享,10,[]). 西暦和暦表(1439,永享,11,[]). 西暦和暦表(1440,永享,12,[]). 西暦和暦表(1441,永享,13,[]). 西暦和暦表(1441,嘉吉,1,2 / 17). 西暦和暦表(1442,嘉吉,2,[]). 西暦和暦表(1443,嘉吉,3,[]). 西暦和暦表(1444,嘉吉,4,[]). 西暦和暦表(1444,文安,1,2 / 5). 西暦和暦表(1445,文安,2,[]). 西暦和暦表(1446,文安,3,[]). 西暦和暦表(1447,文安,4,[]). 西暦和暦表(1448,文安,5,[]). 西暦和暦表(1449,文安,6,[]). 西暦和暦表(1449,宝徳,1,7 / 28). 西暦和暦表(1450,宝徳,2,[]). 西暦和暦表(1451,宝徳,3,[]). 西暦和暦表(1452,宝徳,4,[]). 西暦和暦表(1452,享徳,1,7 / 25). 西暦和暦表(1453,享徳,2,[]). 西暦和暦表(1454,享徳,3,[]). 西暦和暦表(1455,享徳,4,[]). 西暦和暦表(1455,康正,1,7 / 25). 西暦和暦表(1456,康正,2,[]). 西暦和暦表(1457,康正,3,[]). 西暦和暦表(1457,長祿,1,9 / 28). 西暦和暦表(1458,長祿,2,[]). 西暦和暦表(1459,長祿,3,[]). 西暦和暦表(1460,長祿,4,[]). 西暦和暦表(1460,寛正,1,12 / 21). 西暦和暦表(1461,寛正,2,[]). 西暦和暦表(1462,寛正,3,[]). 西暦和暦表(1463,寛正,4,[]). 西暦和暦表(1464,寛正,5,[]). 西暦和暦表(1465,寛正,6,[]). 西暦和暦表(1466,寛正,7,[]). 西暦和暦表(1466,文正,1,2 / 28). 西暦和暦表(1467,文正,2,[]). 西暦和暦表(1467,応仁,1,3 / 5). 西暦和暦表(1468,応仁,2,[]). 西暦和暦表(1469,応仁,3,[]). 西暦和暦表(1469,文明,1,4 / 28). 西暦和暦表(1470,文明,2,[]). 西暦和暦表(1471,文明,3,[]). 西暦和暦表(1472,文明,4,[]). 西暦和暦表(1473,文明,5,[]). 西暦和暦表(1474,文明,6,[]). 西暦和暦表(1475,文明,7,[]). 西暦和暦表(1476,文明,8,[]). 西暦和暦表(1477,文明,9,[]). 西暦和暦表(1478,文明,10,[]). 西暦和暦表(1479,文明,11,[]). 西暦和暦表(1480,文明,12,[]). 西暦和暦表(1481,文明,13,[]). 西暦和暦表(1482,文明,14,[]). 西暦和暦表(1483,文明,15,[]). 西暦和暦表(1484,文明,16,[]). 西暦和暦表(1485,文明,17,[]). 西暦和暦表(1486,文明,18,[]). 西暦和暦表(1487,文明,19,[]). 西暦和暦表(1487,長享,1,7 / 20). 西暦和暦表(1488,長享,2,[]). 西暦和暦表(1489,長享,3,[]). 西暦和暦表(1489,延徳,1,8 / 21). 西暦和暦表(1490,延徳,2,[]). 西暦和暦表(1491,延徳,3,[]). 西暦和暦表(1492,延徳,4,[]). 西暦和暦表(1492,明応,1,7 / 19). 西暦和暦表(1493,明応,2,[]). 西暦和暦表(1494,明応,3,[]). 西暦和暦表(1495,明応,4,[]). 西暦和暦表(1496,明応,5,[]). 西暦和暦表(1497,明応,6,[]). 西暦和暦表(1498,明応,7,[]). 西暦和暦表(1499,明応,8,[]). 西暦和暦表(1500,明応,9,[]). 西暦和暦表(1501,明応,10,[]). 西暦和暦表(1501,文龜,1,2 / 29). 西暦和暦表(1502,文龜,2,[]). 西暦和暦表(1503,文龜,3,[]). 西暦和暦表(1504,文龜,4,[]). 西暦和暦表(1504,永正,1,2 / 30). 西暦和暦表(1505,永正,2,[]). 西暦和暦表(1506,永正,3,[]). 西暦和暦表(1507,永正,4,[]). 西暦和暦表(1508,永正,5,[]). 西暦和暦表(1509,永正,6,[]). 西暦和暦表(1510,永正,7,[]). 西暦和暦表(1511,永正,8,[]). 西暦和暦表(1512,永正,9,[]). 西暦和暦表(1513,永正,10,[]). 西暦和暦表(1514,永正,11,[]). 西暦和暦表(1515,永正,12,[]). 西暦和暦表(1516,永正,13,[]). 西暦和暦表(1517,永正,14,[]). 西暦和暦表(1518,永正,15,[]). 西暦和暦表(1519,永正,16,[]). 西暦和暦表(1520,永正,17,[]). 西暦和暦表(1521,永正,18,[]). 西暦和暦表(1521,大永,1,8 / 23). 西暦和暦表(1522,大永,2,[]). 西暦和暦表(1523,大永,3,[]). 西暦和暦表(1524,大永,4,[]). 西暦和暦表(1525,大永,5,[]). 西暦和暦表(1526,大永,6,[]). 西暦和暦表(1527,大永,7,[]). 西暦和暦表(1528,大永,8,[]). 西暦和暦表(1528,享祿,1,8 / 20). 西暦和暦表(1529,享祿,2,[]). 西暦和暦表(1530,享祿,3,[]). 西暦和暦表(1531,享祿,4,[]). 西暦和暦表(1532,享祿,5,[]). 西暦和暦表(1532,天文,1,7 / 29). 西暦和暦表(1533,天文,2,[]). 西暦和暦表(1534,天文,3,[]). 西暦和暦表(1535,天文,4,[]). 西暦和暦表(1536,天文,5,[]). 西暦和暦表(1537,天文,6,[]). 西暦和暦表(1538,天文,7,[]). 西暦和暦表(1539,天文,8,[]). 西暦和暦表(1540,天文,9,[]). 西暦和暦表(1541,天文,10,[]). 西暦和暦表(1542,天文,11,[]). 西暦和暦表(1543,天文,12,[]). 西暦和暦表(1544,天文,13,[]). 西暦和暦表(1545,天文,14,[]). 西暦和暦表(1546,天文,15,[]). 西暦和暦表(1547,天文,16,[]). 西暦和暦表(1548,天文,17,[]). 西暦和暦表(1549,天文,18,[]). 西暦和暦表(1550,天文,19,[]). 西暦和暦表(1551,天文,20,[]). 西暦和暦表(1552,天文,21,[]). 西暦和暦表(1553,天文,22,[]). 西暦和暦表(1554,天文,23,[]). 西暦和暦表(1555,天文,24,[]). 西暦和暦表(1555,弘治,1,10 / 23). 西暦和暦表(1556,弘治,2,[]). 西暦和暦表(1557,弘治,3,[]). 西暦和暦表(1558,弘治,4,[]). 西暦和暦表(1558,永祿,1,2 / 28). 西暦和暦表(1559,永祿,2,[]). 西暦和暦表(1560,永祿,3,[]). 西暦和暦表(1561,永祿,4,[]). 西暦和暦表(1562,永祿,5,[]). 西暦和暦表(1563,永祿,6,[]). 西暦和暦表(1564,永禄,7,[]). 西暦和暦表(1565,永禄,8,[]). 西暦和暦表(1566,永禄,9,[]). 西暦和暦表(1567,永禄,10,[]). 西暦和暦表(1568,永禄,11,[]). 西暦和暦表(1569,永禄,12,[]). 西暦和暦表(1570,永禄,13,[]). 西暦和暦表(1570,元龜,1,4 / 23). 西暦和暦表(1571,元龜,2,[]). 西暦和暦表(1572,元龜,3,[]). 西暦和暦表(1573,元龜,4,[]). 西暦和暦表(1573,天正,1,7 / 28). 西暦和暦表(1574,天正,2,[]). 西暦和暦表(1575,天正,3,[]). 西暦和暦表(1576,天正,4,[]). 西暦和暦表(1577,天正,5,[]). 西暦和暦表(1578,天正,6,[]). 西暦和暦表(1579,天正,7,[]). 西暦和暦表(1580,天正,8,[]). 西暦和暦表(1581,天正,9,[]). 西暦和暦表(1582,天正,10,[]). 西暦和暦表(1583,天正,11,[]). 西暦和暦表(1584,天正,12,[]). 西暦和暦表(1585,天正,13,[]). 西暦和暦表(1586,天正,14,[]). 西暦和暦表(1587,天正,15,[]). 西暦和暦表(1588,天正,16,[]). 西暦和暦表(1589,天正,17,[]). 西暦和暦表(1590,天正,18,[]). 西暦和暦表(1591,天正,19,[]). 西暦和暦表(1592,天正,20,[]). 西暦和暦表(1592,文禄,1,12 / 8). 西暦和暦表(1593,文禄,2,[]). 西暦和暦表(1594,文禄,3,[]). 西暦和暦表(1595,文禄,4,[]). 西暦和暦表(1596,文禄,5,[]). 西暦和暦表(1596,慶長,1,10 / 27). 西暦和暦表(1597,慶長,2,[]). 西暦和暦表(1598,慶長,3,[]). 西暦和暦表(1599,慶長,4,[]). 西暦和暦表(1600,慶長,5,[]). 西暦和暦表(1601,慶長,6,[]). 西暦和暦表(1602,慶長,7,[]). 西暦和暦表(1603,慶長,8,[]). 西暦和暦表(1604,慶長,9,[]). 西暦和暦表(1605,慶長,10,[]). 西暦和暦表(1606,慶長,11,[]). 西暦和暦表(1607,慶長,12,[]). 西暦和暦表(1608,慶長,13,[]). 西暦和暦表(1609,慶長,14,[]). 西暦和暦表(1610,慶長,15,[]). 西暦和暦表(1611,慶長,16,[]). 西暦和暦表(1612,慶長,17,[]). 西暦和暦表(1613,慶長,18,[]). 西暦和暦表(1614,慶長,19,[]). 西暦和暦表(1615,慶長,20,[]). 西暦和暦表(1615,元和,1,7 / 13). 西暦和暦表(1616,元和,2,[]). 西暦和暦表(1617,元和,3,[]). 西暦和暦表(1618,元和,4,[]). 西暦和暦表(1619,元和,5,[]). 西暦和暦表(1620,元和,6,[]). 西暦和暦表(1621,元和,7,[]). 西暦和暦表(1622,元和,8,[]). 西暦和暦表(1623,元和,9,[]). 西暦和暦表(1624,元和,10,[]). 西暦和暦表(1624,寛永,1,2 / 30). 西暦和暦表(1625,寛永,2,[]). 西暦和暦表(1626,寛永,3,[]). 西暦和暦表(1627,寛永,4,[]). 西暦和暦表(1628,寛永,5,[]). 西暦和暦表(1629,寛永,6,[]). 西暦和暦表(1630,寛永,7,[]). 西暦