このディレクトリの索引

% 以下のサイトは ヒストグラムを出力する(_標本ならび) :- ヒストグラムの用意(_標本ならび,LL1), 転置して出力する(LL1). ヒストグラムの用意(_標本ならび,LL1) :- '標本の最大値要素数のリストを作る'(_標本ならび,L1), findall(L1,( 星のリストに変換(_標本ならび,L1)),LL1). '標本の最大値要素数のリストを作る'(_標本ならび,L1) :- 最大値(_標本ならび,_最大値), length(L1,_最大値). 星のリストに変換(_標本ならび,L1) :- member(_標本値,_標本ならび), length(_星のリスト,_標本値), 空白リストと星のリスト(_星のリスト,L1). 空白リストと星のリスト(_星のリスト,L1) :- append(_空白リスト,_星のリスト,L1), all(_空白リスト,' '), all(_星のリスト,*). 転置して出力する(LL1) :- 転置(LL1,LL2), 出力する(LL2). 出力する(LL) :- forall( ならび要素を文字列に変換して(LL,_出力行文字列), writef('%w\n',[_出力行文字列])). ならび要素を文字列に変換して(LL,_出力行文字列) :- member(L,LL), atomic_list_concat(L,_出力行文字列). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). all([],_). all([V|R],V) :- all(R,V). 最大値([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値(_ならび,_最大値_1,_最大値) :- '_ならびの先頭要素の値によって_最大値_1を置き換えて行く'(_ならび,_最大値_1,_最大値). '_ならびの先頭要素の値によって_最大値_1を置き換えて行く'(_ならび,_最大値_1,_最大値) :- '_ならびの先頭要素が_最大値_1より大きい場合、_最大値_1を置き換える'(_ならび,_最大値_1,_最大値). '_ならびの先頭要素の値によって_最大値_1を置き換えて行く'(_ならび,_最大値_1,_最大値) :- '_ならびの先頭要素が_最大値_1と等しいか小さい場合、_最大値_1を置き換えない'(_ならび,_最大値_1,_最大値). '_ならびの先頭要素が_最大値_1より大きい場合、_最大値_1を置き換える'([_先頭要素|R],_最大値_1,_最大値) :- _先頭要素 @> _最大値_1, 最大値(R,_先頭要素,_最大値). '_ならびの先頭要素が_最大値_1と等しいか小さい場合、_最大値_1を置き換えない'([_先頭要素|R],_最大値_1,_最大値) :- _先頭要素 @=< _最大値_1, 最大値(R,_最大値_1,_最大値). % 以下のサイトは 先頭から同一要素の最長ならび(_対象ならび,_先頭から同一要素の最長ならび,_残りならび) :- 先頭から同一要素の最長ならび(_対象ならび,_同一要素,_先頭から同一要素の最長ならび,_残りならび), 残りならびの先頭要素は同一要素と異なる(_残りならび,_同一要素). 先頭から同一要素の(_対象ならび,_同一要素,_先頭から同一要素の最長ならび,_残りならび) :- append(_先頭から同一要素の最長ならび,_残りならび,_対象ならび), 全て同一要素(_先頭から同一要素の最長ならび,_同一要素). 全て同一要素([V],V). 全て同一要素([V|R],V) :- 全て同一要素(R,V). 残りならびの先頭要素は同一要素と異なる(_残りならび,_同一要素). \+(_残りならび = [_同一要素|_]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 先頭から同一要素の最長ならび([_先頭要素|R],_先頭から同一要素の最長ならび,_残りならび) :- append(_先頭から同一要素の最長ならび,_残りならび,[_先頭要素|R]), forall(member(A,_先頭から同一要素の最長ならび),A = _先頭要素), \+(_残りならび = [_先頭要素|_]),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 先頭から同一要素の最長ならび([_先頭要素|R],_先頭から同一要素の最長ならび,_残りならび) :- 先頭から同一要素の最長ならび(R,_先頭要素,L2,_残りならび), _先頭から同一要素の最長ならび = [_先頭要素|L2]. 先頭から同一要素の最長ならび([_先頭要素|R],_先頭要素,[_先頭要素|R2],_残りならび) :- 先頭から同一要素の最長ならび(R,_先頭要素,R2,_残りならび),!. 先頭から同一要素の最長ならび(_残りならび,_先頭要素,[],_残りならび). % 以下のサイトは # 出典 :: CodeIQ q1365 # # 成績の分布などを表すのに使われる度数分布表。 # ひと目で全体の散らばり具合がわかって便利です。 # # 【問題】 # 今回は素数の度数分布表を作ってみます。 # 入力として2つの正の整数が与えられます。 # 一つ目は分布させる素数の最大値、二つ目は区切りの大きさです。 # 例えば、30と5が与えられたとき、30までの素数を5で区切って出力します。 # 30までの素数は2, 3, 5, 7, 11, 13, 17, 19, 23, 29ですので、 # 出力内容は以下のようになります。 # 01-05:*** # 06-10:* # 11-15:** # 16-20:** # 21-25:* # 26-30:* # 同様に、40と7が与えられると、以下のように出力されます。 # 01-07:**** # 08-14:** # 15-21:** # 22-28:* # 29-35:** # 36-42:* # 上記のように出力するプログラムを作成してください。 # なお、最低限、以下の入力に対して正常に動作することを確認してください。 # 入力1:100 15 # 入力2:1200 25 # 入力3:12345 789 # '今回は素数の度数分布表を作ってみます。'(_最大値,_区切り) :- 素数の度数分布表(_最大値,_区切り,_度数分布表), 度数分布図として表示する(_度数分布表). 素数の度数分布表(_最大値,_区切り,_度数分布表) :- 素数を生成する(_最大値,_素数ならび), 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表). 素数を生成する(_最大値,_素数ならび) :- findall(_自然数,between(2,_最大値,_自然数),L), エラトステネスの篩(L,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- エラトステネスの篩(M,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(M,R1,L) :- findall(N,( member(N,R1), \+(0 is N mod M)),L). 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表) :- findall([_範囲下限,_範囲上限,_度数],( 素数の度数分布(_素数ならび,_最大値,_区切り,1,_区切り,_範囲下限,_範囲上限,_度数)),_度数分布表). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限,_範囲上限,_範囲下限,_範囲上限,_度数) :- 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数). 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数) :- _範囲下限 =< _最大値, 度数((between(_範囲下限,_範囲上限,_素数),member(_素数,_素数ならび)),_度数). '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- _範囲下限_1 =< _最大値, 次の範囲を確定する(_最大値,_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限), 素数の度数分布(_素数ならび,_最大値,_区切り,_次の範囲下限,_次の範囲上限,_範囲下限,_範囲上限,_度数). 次の範囲を確定する(_最大値,_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限) :- 次の範囲下限(_区切り,_範囲下限_1,_次の範囲下限), 次の範囲上限(_最大値,_区切り,_範囲上限_1,_次の範囲上限). 次の範囲下限(_区切り,_範囲下限_1,_次の範囲下限) :- _次の範囲下限 is _範囲下限_1 + _区切り. 次の範囲上限(_最大値,_区切り,_範囲上限_1,_最大値) :- _最大値 < _範囲上限_1 + _区切り,!. 次の範囲上限(_最大値,_区切り,_範囲上限_1,_次の範囲上限) :- _次の範囲上限 is _範囲上限_1 + _区切り. 度数(_目標,_度数) :- findall(_,_目標,L), length(L,_度数). 度数分布図として表示する(_度数分布表) :- 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数), 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数). 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数), 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲上限の表示桁数). 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数) :- findall(_桁数,範囲下限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲下限の表示桁数). 範囲下限値の桁数(_度数分布表,_下限桁数) :- member([_範囲下限,_,_],_度数分布表), number_chars(_範囲下限,Chars), length(Chars,_下限桁数). 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲の表示桁数) :- findall(_桁数,範囲上限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲の表示桁数). 範囲上限値の桁数(_度数分布表,_上限桁数) :- member([_,_範囲上限,_],_度数分布表), number_chars(_範囲上限,Chars), length(Chars,_上限桁数). 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- forall( member([_範囲下限,_範囲上限,_度数],_度数分布表), 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数)). 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数) :- ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列), 星文字列(_度数,_星文字列), writef('%w:%w\n',[_範囲表現文字列,_星文字列]). ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列) :- ヘッドゼロサプライ(_範囲下限の表示桁数,_範囲下限,_表示範囲下限), ヘッドゼロサプライ(_範囲上限の表示桁数,_範囲上限,_表示範囲上限), atomic_list_concat([_表示範囲下限,'-',_表示範囲上限],_範囲表現文字列). ヘッドゼロサプライ(_桁数,_数値,_ヘッドゼロサプライ数値表現) :- ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト), 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト), 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現). ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト) :- length(_ヘッドゼロサプライされたリスト,_桁数). 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト) :- number_chars(_数値,_数字のリスト), append(_頭部の枠リスト,_数字のリスト,_ヘッドゼロサプライされたリスト), 全ての要素が同じ(_頭部の枠リスト,'0'). 全ての要素が同じ([],_). 全ての要素が同じ([V|R],V) :- 全ての要素が同じ(R,V). 星文字列(_度数,_星文字列) :- findall(*,between(1,_度数,_),L), atomic_list_concat(L,_星文字列). 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現) :- atom_chars(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒の成績を管理するプログラムを作成する。 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 内容は 数学:70 英語:80 国語:75 理科:80 社会:60 となっている このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(_テキストファイル名ならび), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(_テキストファイル名ならび,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(_テキストファイル名ならび) :- shs('ls -N *.txt',_テキストファイル名ならび). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する([],_,_) :- !. 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(_テキストファイル名,_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の場合は出席番号を表示して行く(_テキストファイル名,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の場合は出席番号を表示して行く([_テキストファイル名|R],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の場合は出席番号を表示する([_テキストファイル名|R],_指定した科目,_指定した点数), 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(R,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の場合は出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数) :- forall(指定した科目で指定した点数の(_テキストファイル名,_指定した科目,_指定した点数), 生徒の出席番号を表示する(_テキストファイル名)). 指定した科目で指定した点数の(_テキストファイル名,_指定した科目,_指定した点数) :- get_split_lines(_テキストファイル名,[' ',':'],_行ならび), member([_指定した科目,_指定した点数],_行ならび). 生徒の出席番号を表示する(_テキストファイル名) :- 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(L1,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1) :- shs('ls -N *.txt',L1). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([],_,_). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_テキストファイル名|R1],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_|R1],_指定した科目,_指定した点数) :- 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(R1,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号) :- get_split_lines(_テキストファイル名,[' ',':'],L), member([_指定した科目,_指定した点数],L), 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは '父方先祖、母方先祖の集合を作り、クロスがある共通先祖の血量合計が最大である先祖を得る。'(_本人,_血量が最大である先祖) :- '父方と母方のふたつの集合を作り、'(_本人,_父方集合,_母方集合,_共通先祖ならび), 'クロスがある共通先祖の血量合計が最大である先祖を得る。'(_父方集合,_母方集合,_共通先祖ならび,_血量が最大である先祖). '父方と母方のふたつの集合を作り、'(_本人,_父方集合,_母方集合,_共通先祖ならび) :- 父方集合を得る(_本人,_父方集合), 母方集合を得る(_本人,_母方集合), 父方集合と母方集合を先祖で集約して共通先祖ならびを得る(_父方集合,_母方集合,_共通先祖ならび). 父方集合を得る(_本人,_父方_世代_先祖集合) :- 父(_本人,_父), findall([_世代,_先祖],世代を数えながら先祖を得る(_父,0,_世代,_先祖),_父方_世代_先祖集合). 母方集合を得る(_本人,_母方_世代_先祖集合) :- 母(_本人,_母), findall([_世代,_先祖],世代を数えながら先祖を得る(_母,0,_世代,_先祖),_母方_世代_先祖集合). 世代を数えながら先祖を得る(_子,_世代_1,_世代,_先祖) :- 父または母(_子,_父または母), succ(_世代_1,_世代_2), 先祖を得る(_父または母,_世代_2,_世代,_先祖). 父または母(_子,_父または母) :- 父(_子,_父). 父または母(_子,_父または母) :- 母(_子,_母). 先祖を得る(_父または母,_世代,_世代,_父または母). 先祖を得る(_父または母,_世代_2,_世代,_先祖) :- 世代を数えながら先祖を得る(_父または母,_世代_2,_世代,_先祖). 父方集合と母方集合を先祖で集約して共通先祖ならびを得る(_父方集合,_母方集合,_共通先祖ならび) :- 父方集合を先祖で集約(_父方集合,_父方先祖ならび), 母方集合を先祖で集約(_母方集合,_母方先祖ならび), intersection(_父方先祖ならび,_母方先祖ならび,_共通先祖ならび). 父方集合を先祖で集約(_父方集合,_父方先祖ならび) :- setof(_先祖,[_世代,_先祖] ^ member([_世代,_先祖],_父方集合),_父方先祖ならび). 母方集合を先祖で集約(_母方集合,_母方先祖ならび) :- setof(_先祖,[_世代,_先祖] ^ member([_世代,_先祖],_母方集合),_母方先祖ならび). 'クロスがある共通先祖の血量合計が最大である先祖を得る。'(_父方集合,_母方集合,_共通先祖ならび,_血量が最大である先祖) :- 先祖_血量ならびを得る(_共通先祖ならび,_父方集合,_母方集合,_先祖_血量ならび), 血量が最大である先祖を取り出す(_先祖_血量ならび,_血量が最大である先祖). 先祖_血量ならびを得る(_共通先祖ならび,_父方集合,_母方集合,_先祖_血量ならび) :- append(_父親集合,_母親集合,_親集合), findall([_先祖,_血量],共通先祖ならびから先祖の血量を得る(_共通先祖ならび,_親集合,_先祖,_血量),_先祖_血量ならび). 共通先祖ならびから先祖の血量を得る(_共通先祖ならび,_親集合,_先祖,_血量) :- member(_先祖,_共通先祖ならび), 血量を得る(_先祖,_親集合,_血量). 血量を得る(_先祖,_親集合,_血量) :- findsum(_血量,( 先祖が現れるごとにその部分血量を計算する(_先祖,_親集合,_血量)),_血量合計). 先祖が現れるごとにその部分血量を計算する(_先祖,_親集合,_血量) :- member([_世代,_先祖],_親集合), 血量計算(_世代,_血量). 血量計算(_世代,_血量) :- _血量 is 1 rdiv (2 ^ _世代). 血量が最大である先祖を取り出す(_先祖_血量ならび,_血量が最大である先祖) :- findmax(_血量,member([_,_血量],_先祖_血量ならび),_最大血量), member([_血量が最大である先祖,_最大血量],_先祖_血量ならび). findmax(A,P,Max) :- findall(A,P,L), max_list(L,Max). findsum(A,P,Sum) :- findall(A,P,L), sum_list(L,Sum). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/887 # # (1)c言語(2)問題:ベースを基にビットを左に回転させるleft_rottate関数を追加しプログラムを完成させよ。 # 実行結果: # 数値f0f0のビット状態 # 1111000011110000 # 3ビット回転させました # 数値8787のビット状態 # 1000011110000111 # ベース # #include <stdio.h> # void print_bit(unsigned short int x); //プロトタイプ宣言 # int main(){ # unsigned short int usi; # usi = 0xf0f0 ; # print_bit(usi); # return 0; //システムに値0を返す # } # void print_bit(unsigned short int x){ # int length , i , mask ; # mask = 1; # length = sizeof(x) *8; # mask =mask << (length -1); # printf("数値%xのビット状態\n",x); # for(i = 1;i<= length ; i++){ # if(x & mask){ # printf("1"); # }else{ # printf("0"); # } # mask =mask >> 1; # } # printf("\n"); # } # # '2進ならびの左回転'(_ベース桁数,_数,_Nビット回転) :- 'ベース桁数を確保して数2進数変換'(_ベース桁数,_数,_2進数ならび), '2進数を_Nビット左回転して、それを16進数と2進数で表示する'(_ベース桁数,_Nビット回転,_2進数ならび),!. 'ベース桁数を確保して数2進数変換'(_ベース桁数,_数,_ベース桁数で規定された2進数ならび) :- 数2進数変換(_数,_2進数ならび), ベース桁数付き二進数(_ベース桁数,_2進数ならび,_ベース桁数で規定された2進数ならび). '数2進数変換'(_数,_2進数ならび) :- '数2進数変換'(_数,[],_2進数ならび). '数2進数変換'(0,_2進数ならび,_2進数ならび). '数2進数変換'(N,L,_2進数ならび) :- '数2進数変換して行く'(N,L,_2進数ならび). '数2進数変換して行く'(N,L,_2進数ならび) :- M is N mod 2, N_1 is N // 2, '数2進数変換'(N_1,[M|L],_2進数ならび). '2進数を_Nビット左回転して、それを16進数と2進数で表示する'(_ベース桁数,_Nビット回転,_2進数ならび) :- '2進数を_Nビット左回転して、'(_Nビット回転,_2進数ならび,L,_2進表示), それを16進数と2進数で表示する(_Nビット回転,L,_2進表示). '2進数を_Nビット左回転して、'(_Nビット回転,_ベース桁数2進数ならび,L,_2進表示) :- ならびの左回転(1,_Nビット回転,_ベース桁数2進数ならび,L), atomic_list_concat(L,_2進表示). ベース桁数付き二進数(_ベース桁数,_2進数ならび,_ベース桁数で規定された2進数ならび) :- length(_2進数ならび,_桁), _0を付加するべき数 is _ベース桁数 - _桁, 頭部に0を付加する(_0を付加するべき数,_2進数ならび,_ベース桁数で規定された2進数ならび). 頭部に0を付加する(0,_ベース桁数で規定された2進数ならび,_ベース桁数で規定された2進数ならび). 頭部に0を付加する(N,_2進数ならび,_ベース桁数で規定された2進数ならび) :- N \== 0, 'N桁の0ならび'(N,_N桁の0ならび), append(_N桁の0ならび,_2進数ならび,_ベース桁数で規定された2進数ならび). 'N桁の0ならび'(N,_N桁の0ならび) :- length(_N桁の0ならび,N), all(_N桁の0ならび,0). all([],_). all([N|R],N) :- all(R,N). ならびの左回転(N,N,[A|R],L) :- append(R,[A],L),!. ならびの左回転(M,N,[A|R],L) :- append(R,[A],L1), M2 is M + 1, ならびの左回転(M2,N,L1,L). それを16進数と2進数で表示する(_Nビット回転,L,_2進表示) :- writef('%wビット回転しました\n数値 ',[_Nビット回転]), '16進数で表示する'(L), '2進数で表示する'(_2進表示). '16進数で表示する'(_2進ならび) :- '桁数が4の倍数になるように頭部を整形'(_2進ならび,_整形された2進ならび), '2進数16進数表示'(_整形された2進ならび). '桁数が4の倍数になるように頭部を整形'(_2進ならび,_整形された2進ならび) :- length(_2進ならび,_桁), _余り is _桁 mod 4, '頭部に0を付加する'(_余り,_2進ならび,_整形された2進ならび). '頭部に0を付加する'(0,L,L). '頭部に0を付加する'(1,L,[0,0,0|L]). '頭部に0を付加する'(2,L,[0,0|L]). '頭部に0を付加する'(3,L,[0|L]). '2進数で表示する'(_2進表示) :- write('のビット状態\n'), writef('%w\n',[_2進表示]). '2進数16進数表示'([]) :- write('\n'),!. '2進数16進数表示'([_b1,_b2,_b3,_b4|R]) :- '4ビット数ならび16進表記'([_b1,_b2,_b3,_b4],_16進表記), writef('%w',[_16進表記]), '2進数16進数表示'(R). '4ビット数ならび16進表記'([0,0,0,0],'0'). '4ビット数ならび16進表記'([0,0,0,1],'1'). '4ビット数ならび16進表記'([0,0,1,0],'2'). '4ビット数ならび16進表記'([0,0,1,1],'3'). '4ビット数ならび16進表記'([0,1,0,0],'4'). '4ビット数ならび16進表記'([0,1,0,1],'5'). '4ビット数ならび16進表記'([0,1,1,0],'6'). '4ビット数ならび16進表記'([0,1,1,1],'7'). '4ビット数ならび16進表記'([1,0,0,0],'8'). '4ビット数ならび16進表記'([1,0,0,1],'9'). '4ビット数ならび16進表記'([1,0,1,0],'a'). '4ビット数ならび16進表記'([1,0,1,1],'b'). '4ビット数ならび16進表記'([1,1,0,0],'c'). '4ビット数ならび16進表記'([1,1,0,1],'d'). '4ビット数ならび16進表記'([1,1,1,0],'e'). '4ビット数ならび16進表記'([1,1,1,1],'f'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/887 # # (1)c言語(2)問題:ベースを基にビットを左に回転させるleft_rottate関数を追加しプログラムを完成させよ。 # 実行結果: # 数値f0f0のビット状態 # 1111000011110000 # 3ビット回転させました # 数値8787のビット状態 # 1000011110000111 # ベース # #include <stdio.h> # void print_bit(unsigned short int x); //プロトタイプ宣言 # int main(){ # unsigned short int usi; # usi = 0xf0f0 ; # print_bit(usi); # return 0; //システムに値0を返す # } # void print_bit(unsigned short int x){ # int length , i , mask ; # mask = 1; # length = sizeof(x) *8; # mask =mask << (length -1); # printf("数値%xのビット状態\n",x); # for(i = 1;i<= length ; i++){ # if(x & mask){ # printf("1"); # }else{ # printf("0"); # } # mask =mask >> 1; # } # printf("\n"); # } # # '2進ならびの左回転'(_ベース桁数,_数,_Nビット回転) :- 'ベース桁数を確保して数2進数変換'(_ベース桁数,_数,_2進数ならび), '2進数を_Nビット左回転して、それを16進数と2進数で表示する'(_ベース桁数,_Nビット回転,_2進数ならび),!. 'ベース桁数を確保して数2進数変換'(_ベース桁数,_数,_ベース桁数で規定された2進数ならび) :- 数2進数変換(_数,_2進数ならび), ベース桁数付き二進数(_ベース桁数,_2進数ならび,_ベース桁数で規定された2進数ならび). '数2進数変換'(_数,_2進数ならび) :- '数2進数変換'(_数,[],_2進数ならび). '数2進数変換'(0,_2進数ならび,_2進数ならび). '数2進数変換'(N,L,_2進数ならび) :- '数2進数変換して行く'(N,L,_2進数ならび). '数2進数変換して行く'(N,L,_2進数ならび) :- M is N mod 2, N_1 is N // 2, '数2進数変換'(N_1,[M|L],_2進数ならび). '2進数を_Nビット左回転して、それを16進数と2進数で表示する'(_ベース桁数,_Nビット回転,_2進数ならび) :- '2進数を_Nビット左回転して、'(_Nビット回転,_2進数ならび,L,_2進表示), それを16進数と2進数で表示する(_Nビット回転,L,_2進表示). '2進数を_Nビット左回転して、'(_Nビット回転,_ベース桁数2進数ならび,L,_2進表示) :- ならびの左回転(1,_Nビット回転,_ベース桁数2進数ならび,L), atomic_list_concat(L,_2進表示). ベース桁数付き二進数(_ベース桁数,_2進数ならび,_ベース桁数で規定された2進数ならび) :- length(_2進数ならび,_桁), _0を付加するべき数 is _ベース桁数 - _桁, 頭部に0を付加する(_0を付加するべき数,_2進数ならび,_ベース桁数で規定された2進数ならび). 頭部に0を付加する(0,_ベース桁数で規定された2進数ならび,_ベース桁数で規定された2進数ならび). 頭部に0を付加する(N,_2進数ならび,_ベース桁数で規定された2進数ならび) :- N \== 0, 'N桁の0ならび'(N,_N桁の0ならび), append(_N桁の0ならび,_2進数ならび,_ベース桁数で規定された2進数ならび). 'N桁の0ならび'(N,_N桁の0ならび) :- length(_N桁の0ならび,N), all(_N桁の0ならび,0). all([],_). all([N|R],N) :- all(R,N). ならびの左回転(N,N,[A|R],L) :- append(R,[A],L),!. ならびの左回転(M,N,[A|R],L) :- append(R,[A],L1), M2 is M + 1, ならびの左回転(M2,N,L1,L). それを16進数と2進数で表示する(_Nビット回転,L,_2進表示) :- writef('%wビット回転しました\n数値 ',[_Nビット回転]), '16進数で表示する'(L), '2進数で表示する'(_2進表示). '16進数で表示する'(_2進ならび) :- '桁数が4の倍数になるように頭部を整形'(_2進ならび,_整形された2進ならび), '2進数16進数表示'(_整形された2進ならび). '桁数が4の倍数になるように頭部を整形'(_2進ならび,_整形された2進ならび) :- length(_2進ならび,_桁), _余り is _桁 mod 4, '頭部に0を付加する'(_余り,_2進ならび,_整形された2進ならび). '頭部に0を付加する'(0,L,L). '頭部に0を付加する'(1,L,[0,0,0|L]). '頭部に0を付加する'(2,L,[0,0|L]). '頭部に0を付加する'(3,L,[0|L]). '2進数で表示する'(_2進表示) :- write('のビット状態\n'), writef('%w\n',[_2進表示]). '2進数16進数表示'([]) :- write('\n'),!. '2進数16進数表示'([_b1,_b2,_b3,_b4|R]) :- '4ビット数ならび16進表記'([_b1,_b2,_b3,_b4],_16進表記), writef('%w',[_16進表記]), '2進数16進数表示'(R). '4ビット数ならび16進表記'([0,0,0,0],'0'). '4ビット数ならび16進表記'([0,0,0,1],'1'). '4ビット数ならび16進表記'([0,0,1,0],'2'). '4ビット数ならび16進表記'([0,0,1,1],'3'). '4ビット数ならび16進表記'([0,1,0,0],'4'). '4ビット数ならび16進表記'([0,1,0,1],'5'). '4ビット数ならび16進表記'([0,1,1,0],'6'). '4ビット数ならび16進表記'([0,1,1,1],'7'). '4ビット数ならび16進表記'([1,0,0,0],'8'). '4ビット数ならび16進表記'([1,0,0,1],'9'). '4ビット数ならび16進表記'([1,0,1,0],'a'). '4ビット数ならび16進表記'([1,0,1,1],'b'). '4ビット数ならび16進表記'([1,1,0,0],'c'). '4ビット数ならび16進表記'([1,1,0,1],'d'). '4ビット数ならび16進表記'([1,1,1,0],'e'). '4ビット数ならび16進表記'([1,1,1,1],'f'). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #880 # [1]授業単元:C言語 # [2]問題文 # マインスイーパのような爆弾ゲームプログラムを作成する。 # 1. マス目を8× 8に設定する。 # 2. 爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)。 # 3.まだ指定していないマス目には数字の0の代わりに記号'-'を表示する。 # 4.爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を # 表示する(最小で0、最大で8)。 # 5. 爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字 # の'x'を表示し、"Bomb!"と表示して終了する。 # # [3]環境 # [3.1]windows7 # [3.2]gcc # [3.3]C/C++ # [4]7月20日 # よろしくお願いします。 # マインスイーパ :- 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面). 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面) :- 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面), '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(_平坦なならびで表現された盤面). マインスイーパ(_平坦なならびで表現された盤面) :- 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面),!. マインスイーパ(_平坦なならびで表現された盤面) :- マインスイーパを継続する(_平坦なならびで表現された盤面). 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面) :- 度数((member(A,_平坦なならびで表現された盤面),atom(A)),64), write('あなたの勝ちです。\n'). マインスイーパを継続する(_平坦なならびで表現された盤面) :- '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置), マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置) :- 爆弾を隠して盤面を表示する(_平坦なならびで表現された盤面), マス目を選択させる(_行位置,_列位置). マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面),!. マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面), 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面) :- 平坦化した位置に変換(_行位置,_列位置,_nth1), nth1(_nth1,_平坦なならびで表現された盤面,0). 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面) :- 爆弾は周囲にいくつあるか(_nth1,_平坦なならびで表現された盤面,_個数), writef('周囲に爆弾は %w 個あります\n',[_個数]),!. '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面) :- 得点は(_平坦なならびで表現された盤面,_得点), 爆弾が置かれたすべてのマス目に小文字のxを表示し(_平坦なならびで表現された盤面), writef('\n Bomb! \n\n\n あなたの得点は %t です\n',[_得点]). 得点は(_平坦なならびで表現された盤面,_得点) :- 度数((member(A,_平坦なならびで表現された盤面),\+(var(A)),A==0),_得点). 爆弾が置かれたすべてのマス目に小文字のxを表示し([]) :- !. 爆弾が置かれたすべてのマス目に小文字のxを表示し(L) :- 爆弾が置かれたすべてのマス目に小文字のxを表示して行く(L). 爆弾が置かれたすべてのマス目に小文字のxを表示して行く([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾が置かれたすべてのマス目に小文字のxを表示し(R). 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 行末まで表示する(A,R). 行末まで表示する(A,R) :- 爆弾を含むマス目表示文字(A,_表示文字), 爆弾を含むマス目表示(R,_表示文字). 爆弾を含むマス目表示(R,_表示文字) :- writef('%w',[_表示文字]), R = [], write('\n'). マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R) :- append(_,[A|R],[_1,_2,_3,_4,_5,_6,_7,_8]). 爆弾を含むマス目表示文字(V,'-') :- var(V),!. 爆弾を含むマス目表示文字('x','x') :- !. 爆弾を含むマス目表示文字(_,0). 爆弾を隠して盤面を表示する([]). 爆弾を隠して盤面を表示する([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を隠して盤面を表示する(R). 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 爆弾を隠して行末まで表示する(A,R). 爆弾を隠して行末まで表示する(A,R) :- 爆弾を隠すマス目表示文字(A,_表示文字), 爆弾を隠すマス目表示(_表示文字,R). 爆弾を隠すマス目表示(_表示文字,R) :- writef('%w',[_表示文字]), R = [], write('\n'). 爆弾を隠すマス目表示文字(V,'-') :- var(V),!. 爆弾を隠すマス目表示文字('x','-') :- !. 爆弾を隠すマス目表示文字(_,0). 平坦化した位置に変換(_行位置,_列位置,_nth1) :- _nth1 is (_行位置-1) * 8 + _列位置. 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面) :- length(_平坦なならびで表現された盤面,64). '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(L) :- 爆弾は10個にし(Lp), 同じマス目に重ならないようにランだけに配置する(Lp,L). 爆弾は10個にし(Lp) :- length(Lp,10). 同じマス目に重ならないようにランだけに配置する([],L) :- !. 同じマス目に重ならないようにランだけに配置する([_|R1],L) :- 同じマス目に重ならないようにランダムに一個爆弾を設置する(L), 同じマス目に重ならないようにランだけに配置する(R1,L). 同じマス目に重ならないようにランダムに一個爆弾を設置する(L) :- ランダムに(L,_nth0), 同じマス目に重ならないように一個爆弾を設置する(_nth0,L),!. ランダムに(L,_nth0) :- repeat, _nth0 is random(64). 同じマス目に重ならないように一個爆弾を設置する(_nth0,L) :- 同じマス目に重ならないように(_nth0,L,V), 一個爆弾を設置する(V). 同じマス目に重ならないように(_nth0,L,V) :- nth0(_nth0,L,V), var(V). 一個爆弾を設置する(x). 爆弾は周囲にいくつあるか(N,L,_個数) :- 度数(周囲の八箇所の中で爆弾があるのは(N,L),_個数). 周囲の八箇所の中で爆弾があるのは(N,L) :- 周辺の八箇所の中で(N,_nth1), '_nth1には爆弾がある'(_nth1,L). 周辺の八箇所の中で(N,_nth1) :- member(_式,[N-9,N-8,N-7,N-1,N,N+1,N+7,N+8,N+9]), _nth1 is _式. '_nth1には爆弾がある'(_nth1,L) :- nth1(_nth1,L,V), 変数ではなく爆弾がある(V). 変数ではなく爆弾がある(V) :- 変数ではなく(V), V = x. 変数ではなく(V) :- \+(var(V)). マス目を選択させる(_行位置,_桁位置) :- 整数を得る('マス目の行位置(1-8) ',between(1,8,_行位置),_行位置), 整数を得る('マス目の桁位置(1-8) ',between(1,8,_桁位置),_桁位置),!. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数),!. 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- catch(_条件,E,fail),!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは # 出題 :: プログラミングのお題スレ Part3 #482 # # お題:二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。 # 例 # aabaabbab -> a '二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_多数派の文字) :- 文字ならびに変換して二種の文字を得る(_二種類の文字からなる長さが奇数の文字列,_文字ならび,_甲,_乙), 多数派の文字を求める(_文字ならび,_甲,_乙,_多数派の文字). 文字ならびに変換して二種の文字を得る(_二種類の文字からなる長さが奇数の文字列,_文字ならび,_甲,_乙) :- atom_chars(_二種類の文字からなる長さが奇数の文字列,_文字ならび), ふたつの文字は異なる(_文字ならび,_甲,_乙),!. ふたつの文字は異なる(_文字ならび,_甲,_乙) :- append([_甲|_],[_乙|_],_文字ならび), _甲 \== _乙. 多数派の文字を求める(_文字ならび,_甲,_乙,_多数派の文字) :- 度数を得る(_文字ならび,_甲,_甲の度数,_乙の度数), 多数派の文字を得る(_甲,_乙,_甲の度数,_乙の度数,_多数派の文字). 度数を得る(_文字ならび,_甲,_甲の度数,_乙の度数) :- length(_文字ならび,_文字数), 度数(member(_甲,_文字ならび),_甲の度数), _乙の度数 is _文字数 - _甲の度数. 多数派の文字を得る(_甲,_,_甲の度数,_乙の度数,_甲) :- _甲の度数 > _乙の度数. 多数派(_,_乙,_,_,_乙). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 134代目 #554 # [1] 授業単元:プログラミング 1 # [2] 問題文(含コード&リンク): # /************************* # ある二つの文字列str1,str2 の編集距離はつぎの3つの操作を行うことによりstr1 をstr2 に変換するのに要する操作の最低回数である # ・ 1文字挿入する # ・ 1文字削除する # ・ 1文字を他の1文字に置き換える # たとえば str1="sport" はstr2="sort" に, 文字 'p' を削除することによりstr2 に変換できるため編集距離は 1 である # # str_n を文字列str の頭からn 番目までの部分列としm(i,j)をstr i とstr j の編集距離を表すものとする.m(i,j)とm(i+1,j),m(i,j+1),m(i+1,j+1)の間に成り立つ再帰式を記述しなさい # # この再帰式に基づき効率良く編集距離を計算するプログラムを2次元配列を利用して作成しなさい.ただし,関数m(i,j)はint型の編集距離を返り値とする. # ******************************/ # 編集距離(_str1,_str2,_編集距離) :- 文字列をならびに変換して編集距離を計算する(_str1,_str2,_編集距離),!. 文字列をならびに変換して編集距離を計算する(_str1,_str2,_編集距離) :- 文字列をならびに変換して(_str1,_str2,L1,L2), 編集距離を計算する(L1,L2,0,_編集距離). 文字列をならびに変換して(_str1,_str2,L1,L2) :- atom_chars(_str1,L1), atom_chars(_str2,L2). 編集距離を計算する(L1,L2,M1,_編集距離) :- 一致する部分がない時はその部分の距離計算を加算して停止する(L1,L2,M1,_編集距離). 編集距離を計算する(L1,L2,M1,_編集距離) :- 一致する部分までの距離を加算して行く(L1,L2,M1,_編集距離). 一致する部分がない時はその部分の距離計算を加算して停止する(L1,L2,M1,_編集距離) :- 一致する部分がない時は(L1,L2), その部分の距離計算を加算して(L1,L2,M1,_編集距離). その部分の距離計算を加算して(L1,L2,M1,_編集距離) :- 距離計算(L1,L2,M1,_編集距離). 一致する部分がない時は(L1,L2) :- \+(一致する部分(L1,L2)). 一致する部分(L1,L2) :- append(_,[X|_],L1), append(_,[X|_],L2). 一致する部分までの距離を加算して行く(L1,L2,M1,_編集距離) :- 一致部分までの編集距離(L1,L2,M1,R1,R2,_一致部分までの編集距離), 編集距離を計算する(R1,R2,_一致部分までの編集距離,_編集距離). 一致部分までの編集距離(L1,L2,M1,R1,R2,_一致部分までの編集距離) :- 一致部分までの(L1,L2,L0_1,L0_2,R1,R2), 距離計算(L0_1,L0_2,M1,_一致部分までの編集距離). 一致部分までの(L1,L2,L0_1,L0_2,R1,R2) :- append(L0_1,[X|R1],L1), append(L0_2,[X|R2],L2). 距離計算(L1,L2,M1,M2) :- 'L1,L2の長さを取り'(L1,L2,Len1,Len2), 距離に加算する(Len1,Len2,M1,M2). 'L1,L2の長さを取り'(L1,L2,Len1,Len2) :- length(L1,Len1), length(L2,Len2). 距離に加算する(Len1,Len2,M1,M2) :- 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離より短い時は、Len2を加算する'(Len1,Len2,M1,M2). 距離に加算する(Len1,Len2,M1,M2) :- 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離と等しいか長い時は、Len1を加算する'(Len1,Len2,M1,M2). 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離より短い時は、Len2を加算する'(Len1,Len2,M1,M2) :- Len1 =< Len2, M2 is M1 + Len2. 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離と等しいか長い時は、Len1を加算する'(Len1,Len2,M1,M2) :- Len1 > Len2, M2 is M1 + Len1. % 以下のサイトは # [1] 授業単元: 基礎プログラミング # [2] 問題文(含コード&リンク): # いま、要素数Nのならび(リスト)に整数がセットされている。 # # 1) 直前・直後の要素が存在し、それら2つの値の平均よりも大きな値を # 持つ要素をすべて印字する。 # 2) ならびからi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が # 等しいとき、iをを印字する。 # ただし出力される要素位置は重複しないこと。 :- op(500,xfx,すべて). P すべて Q :- forall(P,Q). '直前・直後のならび要素が存在し、それら2つの値の平均よりも大きな値を持つ要素をすべて印字する'(_ならび) :- '直前・直後のならび要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) すべて 印字する(_現在の要素). '直前・直後のならび要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) :- '直前・直後のならび要素が存在する現在の要素は'(_ならび,_直前の要素,_現在の要素,_直後の要素), '直前・直後の値の平均よりも大きな値を持つ'(_直前の要素,_現在の要素,_直後の要素). '直前・直後のならび要素が存在する現在の要素は'(_ならび,_直前の要素,_現在の要素,_直後の要素) :- append([_,[_直前の要素,_現在の要素,_直後の要素],_],_ならび). '直前・直後の値の平均よりも大きな値を持つ'(_直前の要素,_現在の要素,_直後の要素) :- _現在の要素 * 1.0 > (_直前の要素 + _直後の要素) / 2. 印字する(_現在の要素) :- writef('%t\n',[_現在の要素]). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、それらの要素の添え字のうち小さな方を印字する'(_ならび) :- forall('ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目), それらの要素の添字の小さな方を印字する(_i番目,_j番目)). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目) :- 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_要素の値), '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_要素の値). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_値) :- append(L1,[_値|_],_ならび), length(L1,_i番目). '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_値) :- append(L3,[_値|L4],_ならび), length(L4,_i番目), length(L3,_j番目). それらの要素の添字の小さな方を印字する(_i番目,_j番目) :- _小さな方 is min(_i番目,_j番目), writef('%w\n',[_小さな方]). % 以下のサイトは # [1] 授業単元: 基礎プログラミング # [2] 問題文(含コード&リンク): # いま、要素数Nのならび(リスト)に整数がセットされている。 # # 1) 直前・直後の要素が存在し、それら2つの値の平均よりも大きな値を # 持つ要素をすべて印字する。 # 2) ならびからi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が # 等しいとき、iをを印字する。 # ただし出力される要素位置は重複しないこと。 :- op(500,xfx,すべて). P すべて Q :- forall(P,Q). '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素をすべて印字する'(_ならび) :- '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) すべて 印字する(_現在の要素). '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) :- append([_,[_直前の要素,_現在の要素,_直後の要素],_],_ならび), _現在の要素 * 1.0 > (_直前の要素 + _直後の要素) / 2. 印字する(_現在の要素) :- writef('%t\n',[_現在の要素]). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、それらの要素の添え字のうち小さな方を印字する'(_ならび) :- forall('ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目), それらの要素の添字の小さな方を印字する(_i番目,_j番目)). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目) :- 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_要素の値), '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_要素の値). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_値) :- append(L1,[_値|_],_ならび), length(L1,_i番目). '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_値) :- append(L3,[_値|L4],_ならび), length(L4,_i番目), length(L3,_j番目). それらの要素の添字の小さな方を印字する(_i番目,_j番目) :- _小さな方 is min(_i番目,_j番目), writef('%w\n',[_小さな方]). % 以下のサイトは # [1] 授業単元: 基礎プログラミング # [2] 問題文(含コード&リンク): # いま、要素数Nのならび(リスト)に整数がセットされている。 # # 1) 直前・直後の要素が存在し、それら2つの値の平均よりも大きな値を # 持つ要素をすべて印字する。 # 2) ならびからi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が # 等しいとき、iをを印字する。 # ただし出力される要素位置は重複しないこと。 '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素をすべて印字する'(_ならび) :- forall('直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素), すべて印字する(_現在の要素)). '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) :- append(_,[_直前の要素,_現在の要素,_直後の要素|_],_ならび), _現在の要素 * 1.0 > (_直前の要素 + _直後の要素) / 2. すべて印字する(_現在の要素) :- writef('%t\n',[_現在の要素]). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、それらの要素の添え字のうち小さな方を印字する'(_ならび) :- forall('ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目), それらの要素の添字の小さな方を印字する(_i番目)). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目) :- 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_要素の値), '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_要素の値), _i番目 =< _j番目. 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_値) :- append(L1,[_値|_],_ならび), length(L1,_i番目). '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_値) :- append(L3,[_値|L4],_ならび), length(L4,_i番目), length(L3,_j番目). それらの要素の添字の小さな方を印字する(_i番目) :- writef('%w\n',[_i番目]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/db/1402919549/310 # SQLServer2012です # 日々の売上の合計が一定額を越えた日を知るにはどうすればいいでしょうか? # # 10/1 |\100 # 10/2 |\200 # 10/3 |\300 # 10/4 |\200 # 10/5 |\400 # 10/6 |\100 # # 上記で\1000を越えた日=10/5と出したいです # 売上(10/1,100). 売上(10/2,200). 売上(10/3,300). 売上(10/4,200). 売上(10/5,400). 売上(10/6,100). '日々の売上の合計が一定額を越えた日を知る'(_一定額,_日々の売上の合計が一定額を越えた日) :- 日付を鍵とする(_日付ならび), 日々の売上の合計が一定額を越えた日(_一定額,_日付ならび,_日々の売上の合計,_日々の売上の合計が一定額を越えた日). 日付を鍵とする(_日付ならび) :- setof(_日付,[_日付,_売上] ^ 売上(_日付,_売上),_日付ならび). 日々の売上の合計が一定額を越えた日(_一定額,_日付ならび,_日々の売上の合計,_日々の売上の合計が一定額を越えた日) :- '日々の売上の合計'(_日付ならび,_日々の,_日々の売上の合計), 一定額を越えた日(_一定額,_日々の,_日々の売上の合計,_日々の売上の合計が一定額を越えた日),!. '日々の売上の合計'(_日付ならび,_日々の,_日々の売上の合計) :- 日々の(_日付ならび,_日々の), 売上の合計(_日々の,_日々の売上の合計). 日々の(_日付ならび,_日々の) :- append(_日々の,_,_日付ならび). 売上の合計(_日々の,_日々の売上の合計) :- findsum(_売上,( 日々の売上(_日々の,_売上)),_日々の売上の合計). 日々の売上(_日々の,_売上) :- member(_日付,_日々の), 売上(_日付,_売上). 一定額を越えた日(_一定額,_日々の,_日々の売上の合計,_日々の売上の合計が一定額を越えた日) :- 一定額を越えた(_一定額,_日々の売上の合計), 日(_日々の,_日々の売上の合計が一定額を越えた日). 一定額を越えた(_一定額,_日々の売上の合計) :- _日々の売上の合計 > _一定額. 日(_日々の,_日々の売上の合計が一定額を越えた日) :- last(_日々の,_日々の売上の合計が一定額を越えた日). findsum(A,P,Sum) :- findall(A,P,L), sum_list(L,Sum). % 以下のサイトは # # Prologで、 f(X1, X2, X3, X4 ・・・Xn) のX1〜Xnまでダブりがないのを簡単に書く # 方法が絶対にありそうなのに見つからない。X1 \= X2, を延々と書くのは無謀すぎる。 # 'Prologで、 f(X1, X2, X3, X4 ・・・Xn) のX1〜Xnまでダブりがないのを簡単に書く 方法が絶対にありそうなのに見つからない。X1 \= X2, を延々と書くのは無謀すぎる。'(_関数) :- 関数の引数にダブリがない(_関数). 関数の引数にダブリがない(_関数) :- _関数 =.. [_|_関数の引数ならび], 全ての要素は後続要素に等しいものがない(_関数引数のならび). 全ての要素は後続要素に等しいものがない(_ならび) :- forall(要素は後続要素に(_ならび,_要素,_後続要素に),等しくない(_要素,_後続に)). 要素は後続要素に(_ならび,_要素は,_後続要素に) :- append(_,[_要素は|_残りならび],_ならび), member(_後続要素に,_残りならび). 等しくない(A,B) :- \+(A == B). % 以下のサイトは # 出題 :: プログラミングのお題スレ Part3 #482 # # お題:二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。 # 例 # aabaabbab -> a '二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_多数派の文字) :- 二種類の文字からなる長さが奇数の文字列があるとき(_二種類の文字からなる長さが奇数の文字列,_文字種_1,_文字種_2,Ln1,Ln2), 多数派の文字を求める(_文字種_1,_文字種_2,Ln1,Ln2,_多数派の文字). 二種類の文字からなる長さが奇数の文字列があるとき(_二種類の文字からなる長さが奇数の文字列,_文字種_1,_文字種_2,Ln1,Ln2) :- atom_chars(_二種類の文字からなる長さが奇数の文字列,Chars), 二種類の文字に分類して度数を示すならびを得る(Chars,_文字種_1,_文字種_2,Ln1,Ln2). 二種類の文字に分類して度数を示すならびを得る([],_,_,[],[]) :- !. 二種類の文字に分類して度数を示すならびを得る(L,A,B,Ln1,Ln2) :- 二種類の文字に分類して度数を示すならびを作って行く(L,A,B,Ln1,Ln2). 二種類の文字に分類して度数を示すならびを作って行く(L,A,B,Ln1,Ln2) :- 文字の度数を進める(L,A,B,Ln1_2,Ln2_2,R,Ln1,Ln2), 二種類の文字に分類して度数を示すならびを得る(R,A,B,Ln1_2,Ln2_2). 文字の度数を進める([A|R],A,_,Ln1,Ln2,R,[_|Ln1],Ln2) :- !. 文字の度数を進める([B|R],_,B,Ln1,Ln2,R,Ln1,[_|Ln2]). 多数派の文字を求める(_,B,Ln1,Ln2,B) :- append(Ln1,[_|_],Ln2),!. 多数派の文字を求める(A,_,_,_,A). % 以下のサイトは ある行に実数倍した他の行を加える(_行列,_ある行の位置,_実数,_他の行の位置,_ある行に実数倍した他の行を加えた行列) :- ある行に実数倍した他の行を加えた行で(_行列,_ある行の位置,_実数,_他の行の位置,L1,_ある行に実数倍した他の行を加えた行,R1), ある行を置き換える(L1,_ある行に実数倍した他の行を加えた行,R1,_ある行に実数倍した行を加えた行列). ある行に実数倍した他の行を加えた行で(_行列,_ある行の位置,_実数,_他の行の位置,L1,_ある行に実数倍した他の行を加えた行,R1) :- ある行に(_行列,_ある行の位置,L1,_ある行,R1), 実数倍した他の行(_行列,_他の行の位置,_実数倍した他の行), 行と行との加算(_ある行,_実数倍した他の行,_ある行に実数倍した他の行を加えた行). ある行に(_行列,_ある行の位置,L1,_ある行,R1) :- append(L1,[_ある行|R1],_行列), length([_|L1],_ある行の位置). 実数倍した他の行(_行列,_他の行の位置,_実数倍した他の行) :- 他の行に(_行列,_他の行の位置,_他の行), 行に実数を掛ける(_他の行,_実数,_実数倍した他の行). 他の行に(_行列,_他の行の位置,_他の行) :- append(L2,[_他の行|R2],_行列), length([_|L2],_他の行の位置). 行に実数を掛ける([],_,[]). 行に実数を掛ける(L1,_実数,L2) :- 行に実数を掛けて行く(L1,_実数,L2). 行に実数を掛けて行く([A|R1],_実数,[B|R2]) :- B is A * _実数, 行に実数を掛ける(R1,_実数,R2). 行と行との加算([],[],[]). 行と行との加算(L1,L2,L3) :- 行と行を加算して行く(L1,L2,L3). 行と行を加算して行く([A|R1],[B|R2],[C|R3]) :- C is A + B, 行と行との加算(R1,R2,R3). ある行を置き換える(L1,_ある行に実数倍した他の行を加えた行,R1,_ある行に実数倍した行を加えた行列) :- append(L1,[_ある行に実数倍した他の行を加えた行|R1],_ある行に実数倍した他の行を加えた行列). % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 - 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]-R[i] (ただし、j>i とする) の最大値を求めてください。' :- 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび), 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび) :- 時系列数を得る(_時系列数), 時刻tに於ける価格ならびを得る(_時系列数,_時刻tに於ける価格ならび). 時刻tに於ける価格ならびを得る(_時系列数,_時刻tに於ける価格ならび) :- findall(_価格,( 時刻tに於ける価格(_時系列数,_価格)),_時刻tに於ける価格ならび). 時刻tに於ける価格(_時系列数,_価格) :- between(1,_時系列数,_t), 価格を得る(_価格). 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大価格差,( 為替差の利益(_時刻tに於ける価格ならび,_時刻tの投資に対する最大価格差)),_最大の為替差の利益). 為替差の利益(_時刻tに於ける価格ならび,_時刻tの投資に対する最大価格差) :- append(_,[_時刻tの価格|_その後の価格ならび],_時刻tに於ける価格ならび), 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差). 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差) :- findmax(_時刻tの価格との価格差,( 時刻tの投資に対する価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差)),_時刻tの投資に対する最大価格差). 時刻tの投資に対する価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差) :- member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格. 時系列数を得る(_時系列数) :- 数を得る(_時系列数). 価格を得る(_価格) :- 数を得る(_価格). 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). 数を得る(_数) :- 行入力(_行), 数入力検査(_行,_数). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 数入力検査(_行,_数) :- read_term_from_atom(_行,_数,[]), number(_数). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは % 非決定性 シャッフルして一枚取り出す/4 シャッフルして一枚取り出す(_札,_既に取り出した札,_取り出す札,_残り札) :- シャッフル(_札,_シャッフルした札), append(_既に取り出した札,[_取り出す札|_残り札],_シャッフルした札). % 決定性 シャッフル/2 シャッフル([],[]) :- !. シャッフル(L,[A|R2]) :- 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2). 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2) :- 位置を示す乱数を使い(L,_乱数), 一個ずつ取り出して行く(L,_乱数,A,R2). 位置を示す乱数を使い(L,_乱数) :- length(L,Len), _乱数 is random(Len). 一個ずつ取り出して行く(L,_乱数,A,R2) :- 取り出して行く(L,_乱数,A,R1), シャッフル(R1,R2). 取り出して行く(L,_乱数,A,R1) :- nth0(_乱数,L,A), select(A,L,R1). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 134代目 #154 # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/www.acm-japan.org/past-icpc/domestic2008/problems/all_ja.html # 等しい合計点 # # 太郎と花子はそれぞれカードを何枚か持っている. # 各カードには点数が書かれている.太郎のカードと花子のカードを 1 枚ずつ交換して, # それぞれの持つカードの合計点数が等しくなるようにしたい. # どのカードとどのカードを交換したらよいか. # # ただし,カードを交換しなくても合計点数が等しい場合でも,必ずカードの交換を行うものとする. # Input # 入力は,いくつかのデータセットからなる.各データセットは次の形式で与えられ # # n m # s1 # s2 # ... # 各データセットの最初の行は空白ひとつで区切られたふたつの数 n と m を含み, # n は太郎のカードの枚数,m は花子のカードの枚数を表す.続く n+m 行には, # 各カードの点数が 1 行にひとつずつ並ぶ. # 最初の n 個の点数 (s1 から sn まで) は太郎のカードの点数, # 残りの m 個の点数 (sn+1 から sn+m まで) は花子のカードの点数を表す. # n および m は 100 以下の正の整数とし,カードの点数は 0 以上 100 以下の整数値とする. # # 入力の終わりは,空白ひとつで区切られたふたつの 0 を含む 1 行で示される. '太郎の手札と花子の手札を 1 枚ずつ交換して,それぞれの持つ手札の合計点数が等しくなるようにしたい' :- 太郎と花子の手札を読み込む(_太郎の手札ならび,_花子の手札ならび), '太郎の手札と花子の手札を 1 枚ずつ交換して,それぞれの持つ手札の合計点数が等しくする'(_太郎の手札ならび,_花子の手札ならび,_太郎の手札から抜いた手札,_花子の手札から抜いた手札). 太郎と花子の手札を読み込む(_太郎の手札ならび,_花子の手札ならび) :- '行を入力し、空白を区切りに太郎の手札の枚数と花子の手札の枚数を得る'(_太郎の手札の枚数,_花子の手札の枚数), '点数を入力し、太郎と花子に分配する'(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札ならび,_花子の手札ならび). '行を入力し、空白を区切りに太郎の手札の枚数と花子の手札の枚数を得る'(_太郎の手札の枚数,_花子の手札の枚数) :- 行を文字コードとして読み取る(_文字コードならび), '空白のコードを区切りに、文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(_文字コードならび,_太郎の手札の枚数,_花子の手札の枚数). '空白を区切りに太郎の手札の枚数と花子の手札の枚数を得る'(_太郎の手札の枚数,_花子の手札の枚数) :- 行を文字コードとして読み取る(_文字コードならび), '空白のコードを区切りに、文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(_文字コードならび,_太郎の手札の枚数,_花子の手札の枚数). 行を文字コードとして読み取る(_文字コード) :- get_line_to_codes(user_input,_文字コード). 整数を得る(_整数) :- 行を得る(_行), 行を整数に変換する(_行,_整数). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). 行を得る(_行) :- get_line_to_codes(user_input,_文字コードならび), atom_codes(_行,文字コードならび). '空白のコードを区切りに、文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(_文字コードならび,_太郎の手札の枚数,_花子の手札の枚数) :- '空白のコードを区切りに、'(_文字コードならび,L1,L2), '文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(L1,L2,_太郎の手札の枚数,_花子の手札の枚数). '空白のコードを区切りに、'(_文字コードならび,L1,L2) :- append(L1,[32|L2],_文字コードならび). '文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(L1,L2,_太郎の手札の枚数,_花子の手札の枚数) :- number_codes(_太郎の手札の枚数,L1), number_codes(_花子の手札の枚数,L2). '点数を入力し、太郎と花子に分配する'(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札,_花子の手札) :- 太郎と花子の手札を読み込む(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札,_花子の手札). 太郎と花子の手札を読み込む(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札,_花子の手札) :- 太郎の手札を読み込む(_太郎の手札の枚数,_太郎の手札), 花子の手札を読み込む(_花子の手札の枚数,_花子の手札),!. 太郎の手札を読み込む(_太郎の手札の枚数,_太郎の手札) :- findnsols(_整数,_太郎の手札の枚数,( 連続して整数を読み込む(_整数)),_太郎の手札). 花子の手札を読み込む(_花子の手札の枚数,_花子の手札) :- findnsols(_整数,_花子の手札の枚数,( 連続して整数を読み込む(_整数)),_花子の手札). 連続して整数を読み込む(_整数) :- repeat, 整数を得る(_整数). '太郎の手札と花子の手札を 1 枚ずつ交換して,それぞれの持つ手札の合計点数が等しくする'(_太郎の手札,_差し替える太郎の手札,_花子の手札,_差し替える花子の手札,_等しい合計) :- '太郎の手札と花子の手札を 1 枚ずつ交換して'(_太郎の手札,_花子の手札,_差し替える太郎の手札,_差し替える花子の手札,_差し替えた太郎の手札,_差し替えた花子の手札), 合計点数が等しい(_差し替えた太郎の手札,_差し替えた花子の手札,_等しい合計). '太郎の手札と花子の手札を 1 枚ずつ交換して'(_太郎の手札,_花子の手札,_太郎の手札から抜いた手札,_花子の手札から抜いた手札,_差し替えた太郎の手札,_差し替えた花子の手札) :- select(_太郎の手札から抜いた手札,_太郎の手札ならび,_花子の手札から抜いた手札,_差し替えた太郎の手札ならび), select(_花子の手札から抜いた手札,_花子の手札,_太郎の手札から抜いた手札,_差し替えた花子の手札). 合計点数が等しい(_差し替えた太郎の手札,_差し替えた花子の手札,_等しい合計) :- sum_list(_差し替えた太郎の手札,_等しい合計), sum_list(_差し替えた花子の手札,_等しい合計). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/505 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): #  キーボードから正負の整数をデタラメに入力し、整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ # 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数の和,_5つの正の整数の平均) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'([],_5つの正の整数ならび), 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均). 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび,_正の整数ならび) :- 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび),!. 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび). 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび) :- length(_正の整数ならび,5). 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数), '正の整数のみをリストに格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2), 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_2,_正の整数ならび). 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 整数を入力する(_整数),!. 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数). 整数を入力する(_整数) :- 行入力(_行), '診断 :: 整数'(_行,_整数). '診断 :: 整数'(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). '正の整数のみをリストに格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2) :- _整数 >= 0, append(_正の整数ならび_1,[_整数],_正の整数ならび_2). '正の整数のみをリストに格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_1) :- _整数 < 0. 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均) :- sum_list(_5つの正の整数ならび,_5つの正の整数の和), _5つの正の整数の平均 is floor((_5つの正の整数の和 / 5) * 10 + 0.5) / 10. 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典::プログラミングのお題スレ Part5 #644 # # お題:硬貨がn枚あり、合計金額がk円のとき、その内訳を求める。 # 硬貨の種類は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉である。 # 内訳は各硬貨の枚数を並べたものとする。 # 複数の解がある場合はすべてを求める。 # 例 # 11枚で1082円のとき # 2 0 1 0 6 2 # # 12枚で777円のとき # 1 0 5 1 3 2 # 1 1 3 0 5 2 # # 25枚で4999円のとき # 9 2 5 4 1 4 # 9 3 3 3 3 4 # 9 4 1 2 5 4 '硬貨がn枚あり、合計金額がk円のとき、その内訳を求める。 硬貨の種類は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉である。 内訳は各硬貨の枚数を並べたものとする。 複数の解がある場合はすべてを求める。'(_n,_k,_500,_100,_50,_10,_5,_1) :- '硬貨がn枚あり、'(_n,_硬貨ならび), 'その内訳を求める。'(_硬貨ならび,_500,_100,_50,_10,_5,_1), '合計金額がk円のとき、'(_k,_500,_100,_50,_10,_5,_1). '硬貨がn枚あり、'(_n,_硬貨ならび) :- findall(_,between(1,_n,_),_硬貨ならび). 'その内訳を求める。'(_硬貨ならび,_500,_100,_50,_10,_5,_1) :- '6種類に分割された'(_硬貨ならび,L1,L2,L3,L4,L5,L6), '6種類に分割された硬貨の内訳'([L1,L2,L3,L4,L5,L6],[_500,_100,_50,_10,_5,_1]). '6種類に分割された'(_硬貨ならび,L1,L2,L3,L4,L5,L6) :- append([L1,L2,L3,L4,L5,L6],_硬貨ならび). '6種類に分割された硬貨の内訳'([],[]). '6種類に分割された硬貨の内訳'([L|R1],[_枚数|R2]) :- length(L,_枚数), '6種類に分割された硬貨の内訳'(R1,R2). '合計金額がk円のとき、'(_k,_500,_100,_50,_10,_5,_1) :- _k is 500 * _500 + 100 * _100 + 50 * _50 + 10 * _10 + 5 * _5 + 1 * _1. % 以下のサイトは # # Prologで、 f(X1, X2, X3, X4 ・・・Xn) のX1〜Xnまでダブりがないのを簡単に書く # 方法が絶対にありそうなのに見つからない。X1 \= X2, を延々と書くのは無謀すぎる。 # 'Prologで、 f(X1, X2, X3, X4 ・・・Xn) のX1〜Xnまでダブりがないのを簡単に書く 方法が絶対にありそうなのに見つからない。X1 \= X2, を延々と書くのは無謀すぎる。'(_関数) :- 関数の引数にダブリがない(_関数). 関数の引数にダブリがない(_関数) :- _関数 =.. [_|L], forall((append(_,[A|R],L),member(B,R)),\+(A==B)). % 以下のサイトは # # Prologで、 f(X1, X2, X3, X4 ・・・Xn) のX1〜Xnまでダブりがないのを簡単に書く # 方法が絶対にありそうなのに見つからない。X1 \= X2, を延々と書くのは無謀すぎる。 # 'Prologで、 f(X1, X2, X3, X4 ・・・Xn) のX1〜Xnまでダブりがないのを簡単に書く 方法が絶対にありそうなのに見つからない。X1 \= X2, を延々と書くのは無謀すぎる。'(_関数) :- 関数の引数にダブリがない(_関数). 関数の引数にダブリがない(_関数) :- 関数から引数ならびを取り出す(_関数,_引数ならび), 引数ならびにダブリがない(_引数ならび). 関数から引数ならびを取り出す(_関数,_引数ならび) :- _関数 =.. [_関数名|_引数ならび]. 引数ならびにダブリがない(_引数ならび) :- 全ての引数は後続引数に一致するものがない(_引数ならび). 全ての引数は後続引数に一致するものがない(_引数ならび) :- forall( 引数と後続引数は(_引数ならび,_引数,_後続引数), 一致しない(_引数,_後続引数)). 引数と後続引数は(_引数ならび,_引数,_後続引数) :- append(_,[_引数|_後続引数ならび],_引数ならび), member(_後続引数,_後続引数ならび). 一致しない(_引数_1,_引数_2) :- \+(_引数_1 == _引数_2). % 以下のサイトは # 10個の桃を6人で分ける時、分け方のパターンをすべて出力する :- op(750,xfx,すべて). :- op(600,xfx,を). :- op(500,xf,で). :- op(650,xf,分ける). '10個の桃を6人で分ける時、分け方のパターンをすべて出力する' :- '10個の桃を6人で分ける時、分け方のパターンを'(_6人) すべて 出力する(_6人). '10個の桃を6人で分ける時、分け方のパターンを'(_6人) :- '10個の桃'(_10個の桃), '6人'(_6人), _10個の桃 を _6人 で 分ける. '10個の桃'([桃,桃,桃,桃,桃,桃,桃,桃,桃,桃]). '6人'([_1,_2,_3,_4,_5,_6]). 出力する(_6人) :- writef('%w, %w, %w, %w, %w, %w\n',_6人). Q1 すべて Q2 :- forall(Q1,Q2). L を LL で 分ける :- append(LL,L). % 以下のサイトは # 10個の桃を6人で分ける時、分け方のパターンをすべて出力する :- op(750,xfx,すべて). '10個の桃を6人で分ける時、分け方のパターンをすべて出力する' :- '10個の桃を6人で分ける時、分け方のパターンを'(_1,_2,_3,_4,_5,_6) すべて 出力する(_1,_2,_3,_4,_5,_6). '10個の桃を6人で分ける時、分け方のパターンを'(_1,_2,_3,_4,_5,_6) :- append([_1,_2,_3,_4,_5,_6],[桃,桃,桃,桃,桃,桃,桃,桃,桃,桃]). 出力する(_1,_2,_3,_4,_5,_6) :- writef('%w, %w, %w, %w, %w, %w\n',[_1,_2,_3,_4,_5,_6]). Q1 すべて Q2 :- forall(Q1,Q2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/456 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10195.txt # # 今回はナップサック問題について考えプログラムを作成する。N個の荷物があって、個々の荷物の重さをWi、値段をPiとする。但しiは1からNの整数を意味する。 # 袋には最大Wの重さまで入れられるとすると、最大でいくら分を入れることができるか?という問題。 # データファイルは、始めの一行に荷物の個数Nが書かれており、次に重さが整数でN行分書かれている。その次の行からN行分、それぞれの荷物の価値が書かれているとする。 # 下のデータファイルの場合は、3個の荷物があり、重みは10、20、13、で # それぞれの値段は23、23、10という状況を表す。 # ------------------- # 3 # 10 # 20 # 13 # 23 # 23 # 10 # ------------------- # 荷物の重みと値段はともに、1から100までの乱数で与えることとする。 # void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている # ファイル名のファイルを開き、そこにデータを記録する。void_read_data_file(char*file)という関数を呼ぶと、文字列変数fileによって名前が指定されたファイルを開き、大域変数の荷物の重み配列W[]と値段配列[]\\\\\にデータを入力する。 '荷物の重みと値段はともに、1から100までの乱数で与えることとする。 void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている ファイル名のファイルを開き、そこにデータを記録する。'(_ファイル名,N) :- ファイル名のファイルを開き(_ファイル名), 'そこにデータを記録する。'(N), ファイルを閉じる. ファイル名のファイルを開き(_ファイル名) :- tell(_ファイル名). 'そこにデータを記録する。'(N) :- writef('%w\n',[N]), forall((between(1,N,_),X is random(100) + 1),writef('%w\n',[X])), forall((between(1,N,_),Y is random(100) + 1),writef('%w\n',[Y])). ファイルを閉じる :- told. ナップサック問題(_ファイル名,N,_許容最大重量,_詰めることのできる最高合計金額) :- データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび), findmax(_合計価格,詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_,_合計価格),_詰めることのできる最高合計金額). データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび) :- データファイルから読み出す(_ファイル名,N,_整数ならび), 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび). データファイルから読み出す(_ファイル名,N,L1) :- see(_ファイル名), get_integer(N), get_integers(L1), seen. 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび) :- length(_重さならび,N), length(_価格ならび,N), append(_重さならび,_価格ならび,_整数ならび). 詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_集合,_合計価格) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格). 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格) :- 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合), 集合の合計価格(_集合,_価格ならび,_合計価格). 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合) :- member(_集合,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合) :- '集合の重量合計は'(_集合,_重さならび,_合計重量), _合計重量 =< _許容最大重量. '集合の重量合計は'(_集合,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_集合), nth1(_要素,_重さならび,Wi)),_合計重量). 集合の合計価格(_集合,_価格ならび,_合計価格) :- findsum(Pi,( member(_要素,_集合), nth1(_要素,_価格ならび,Pi)),_合計価格). get_integers(L) :- findall(I,(repeat,get_line(Line),(Line=end_of_file,!,fail;read_term_from_atom(Line,I,[]))),L),!. 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). get_integer(N) :- get_line(Line), read_term_from_atom(Line,N,[]). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは # 出典::C/C++の宿題片付けます 127代目 #650 # [1] 授業単元: C # [2] 問題文(含コード&リンク):キーボードから入力された1以上の整数nについて、 # 次の例に示すように行番号と*を表示するプログラムを作成せよ。 # なお、*の数は、1行目はn個とし、1行毎に1ずつへっていくこととする。 # 表示結果の例 # 正の整数:7 # 1******* # 2****** # 3***** # 4**** # 5*** # 6** # 7* # のように作れとのことです。 # # [3] 環境 # [3.1]linux # [3.2] gcc # [3.3]C # [4]6月20日 # [5]繰り返しまでです、関数まではいっていません、お願いします 'キーボードから入力された1以上の整数nについて、 次の例に示すように行番号と*を表示するプログラムを作成せよ。 なお、*の数は、1行目はn個とし、1行毎に1ずつへっていくこととする。 また、0や負の数が入力された場合はプログラムが終了するようにせよ。 表示結果の例 正の整数:7 1******* 2****** 3***** 4**** 5*** 6** 7* のように作れとのことです。' :- 'キーボードから入力された1以上の整数nについて、例に示すように行番号と星を表示する'. 'キーボードから入力された1以上の整数nについて、例に示すように行番号と星を表示する' :- 'キーボードから入力された1以上の整数nによって、n個の星ならびを用意する'(_n個の星ならび), '行番号と星文字列を表示する'(_n個の星ならび). 'キーボードから入力された1以上の整数nによって、n個の星ならびを用意する'(_n個の星ならび) :- 'キーボードから入力された1以上の整数nによって(_n), n個の星ならびを用意する(_n,_n個の星ならび). 'キーボードから入力された1以上の整数nによって(_n) :- 整数を得る('1以上の整数n',_n >= 1,_n). n個の星ならびを用意する(_n,_n個の星ならび) :- findall(*,between(1,_n,_),_n個の星ならび). '行番号と星文字列を表示する'(_n個の星ならび) :- forall('行番号と星文字列を'(_n個の星ならび,_行番号と星文字列),表示する(_行番号と星文字列)). '行番号と星文字列を'(_n個の星ならび,_行番号と星文字列) :- append(L1,[_星ならびの最初の要素|_星ならびの残りの要素],_n個の星ならび), length([_|L1],_行番号), 行番号と星ならびを文字列(_行番号,[_星ならびの最初の要素|_星ならびの残りの要素],_行番号と星文字列). 行番号と星ならびを文字列(_行番号,_星ならび,_行番号と星文字列) :- atomic_list_concat([_行番号|_星ならび],_行番号と星文字列). 表示する(_行番号と星文字列) :- writef('%w\n',[_行番号と星文字列]). % 整数を得る/3 % 以下のサイトは # 出典::スレ立てるまでもない質問はここで 105匹目 #516 # 文字列をひっくり返す関数下さい # # in→あいうえお # out→おえうあい # # こんな感じのです # # # 文字列をひっくり返す関数下さい(_in,_out) :- 仕様に勘違いがある(_in,_out). 文字列をひっくり返す関数下さい(_in,_out) :- 仕様には深淵なるルールがある(_in,_out). 仕様に勘違いがある(_in,_out) :- 勘違い(おえうあい,おえういあ), '勘違いだと分かったら最も常識的な解決、乃ち文字列を単に反転する'(_in,_out). 勘違い(おえうあい,おえういあ). '勘違いだと分かったら最も常識的な解決、乃ち文字列を単に反転する'(_in,_out) :- atom_chars(_in,_文字ならび), reverse(_文字ならび,_反転した文字ならび), atom_chars(_out,_反転した文字ならび). 仕様には深淵なるルールがある(_in,_out) :- 仕様には深遠なるルールがある(_in,_out). 仕様には深遠なるルールがある(_in,_out) :- atom_chars(_in,Chars), 深遠なるルールを文字のならびで(Chars,Chars2), atom_chars(_out,Chars2). 深遠なるルールを文字のならびで(Chars,Chars2) :- 第三要素から残り最後までを反転し最初の二要素を付加する(Chars,Chars2). 深遠なるルールを文字のならびで(Chars,Chars2) :- 一旦反転して最終二要素を置換する(Chars,Chars2). 深遠なるルールを文字のならびで(Chars,Chars2) :- 文字置換ルールに従って文字を置換する(Chars,Chars2). 第三要素から残り最後までを反転し最初の二要素を付加する(Chars,Chars2) :- 最初の二要素(Chars,_最初のに要素,_第三要素から残り最後まで), 第三要素から残り最後までを反転し(_第三要素から残りの最後まで,_反転した第三要素から残りの最後まで), 最初の二要素を付加する(_反転した第三要素から残りの最後まで,_最初の二要素,Chars2). 最初の二要素(Chars,_最初の二要素,_第三要素から残り最後まで) :- length(_最初の二要素,2), append(_最初の二要素,_第三要素から残り最後まで,Chars). 第三要素から残り最後までを反転し(_第三要素から最後まで,_反転した第三要素から最後まで) :- reverse(_第三要素から最後まで,_反転した第三要素から最後まで). 最初の二要素を付加する(_反転した第三要素から最後まで,_最初の二要素,Chars2) :- append(_反転した第三要素から最後まで,_最初の二要素,Chars2). 一旦反転して最終二要素を置換する(_文字ならび,_一旦反転して最終二要素を置換した文字ならび) :- 一旦反転して(_文字ならび,_反転した文字ならび), 最終二要素を置換する(_反転した文字ならび,_一旦反転して最終二要素を置換した文字ならび). 一旦反転して(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 最終二要素を置換する(_反転した文字ならび,_一旦反転して最終二要素を置換した文字ならび) :- append(L,[A,B],_反転した文字ならび), append(L,[B,A],_一旦反転して最終二要素を置換した文字ならび). 文字置換ルールに従って文字を置換する(_文字ならび,_置換された文字ならび) :- findall(_置換文字, 置換文字を取り出す(_文字ならび,_置換文字),_置換された文字ならび). 置換文字を取り出す(_文字ならび,_置換文字) :- member(_文字,_文字ならび), 文字置換ルール(_文字,_置換文字). 文字置換ルール(あ,お). 文字置換ルール(い,え). 文字置換ルール(う,う). 文字置換ルール(え,あ). 文字置換ルール(お,い). % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([],[],_n),!. '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L,Ls_1,_n) :- 加算するとならび要素が1000を超える(L,Ls_1,_n). '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L1,Ls_1,_n) :- append([_|L1],Ls_1,Ls_2), '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([_|L1],Ls_2,_n). 加算するとならび要素が1000を超える(L,Ls_1,_n) :- append([_|L],Ls_1,Lx), length(Lx,X), X >= 1000, length(L,_n). % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- length(Ln,1000), '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([],Ln,[],L), length(L,_n). '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L,Ln,Ls_1,L) :- 加算するとならび要素が1000を超える(L,Ln,Ls_1),!. '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L1,Ln,Ls_1,L) :- append([_|L1],Ls_1,Ls_2), '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([_|L1],Ln,Ls_2,L). 加算するとならび要素が1000を超える(L,Ln,Ls_1) :- append([_|L],Ls_1,Lx), append(Ln,_,Lx). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/db/1402919549/310 # SQLServer2012です # 日々の売上の合計が一定額を越えた日を知るにはどうすればいいでしょうか? # # 10/1 |\100 # 10/2 |\200 # 10/3 |\300 # 10/4 |\200 # 10/5 |\400 # 10/6 |\100 # # 上記で\1000を越えた日=10/5と出したいです # 売上(10/1,100). 売上(10/2,200). 売上(10/3,300). 売上(10/4,200). 売上(10/5,400). 売上(10/6,100). '日々の売上の合計が一定額を越えた日を知る'(_一定額,_日々の売上の合計が一定額を越えた日) :- 日付を鍵とする(_日付ならび), 日々の売上の合計が一定額を越えた日(_一定額,_日付ならび,_日々の売上の合計,_日々の売上の合計が一定額を越えた日). 日付を鍵とする(_日付ならび) :- setof(_日付,[_日付,_売上] ^ 売上(_日付,_売上),_日付ならび). 日々の売上の合計が一定額を越えた日(_一定額,_日付ならび,_日々の売上の合計,_日々の売上の合計が一定額を越えた日) :- '日々の売上の合計'(_日付ならび,_日々の,_日々の売上の合計), 一定額を越えた日(_一定額,_日々の,_日々の売上の合計,_日々の売上の合計が一定額を越えた日),!. '日々の売上の合計'(_日付ならび,_日々の,_日々の売上の合計) :- 日々の(_日付ならび,_日々の), 売上の合計(_日々の,_日々の売上の合計). 日々の(_日付ならび,_日々の) :- append(_日々の,_,_日付ならび). 売上の合計(_日々の,_日々の売上の合計) :- findsum(_売上,( 日々の売上(_日々の,_売上)),_日々の売上の合計). 日々の売上(_日々の,_売上) :- member(_日付,_日々の), 売上(_日付,_売上). 一定額を越えた日(_一定額,_日々の,_日々の売上の合計,_日々の売上の合計が一定額を越えた日) :- 一定額を越えた(_一定額,_日々の売上の合計), 日(_日々の,_日々の売上の合計が一定額を越えた日). 一定額を越えた(_一定額,_日々の売上の合計) :- _日々の売上の合計 > _一定額. 日(_日々の,_日々の売上の合計が一定額を越えた日) :- last(_日々の,_日々の売上の合計が一定額を越えた日). findsum(A,P,Sum) :- findall(A,P,L), sum_list(L,Sum). % 以下のサイトは # 出典::C/C++の宿題片付けます 128代目 #222 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9599.txt # “パスカルの三角形”を表示するプログラムを作ってください。 # ただし、表示する段数はキー入力するようにします。 # # 実行の様子はこのような感じです。 # # [b8000@localhost]$ ./main # 何段表示しますか?: 13 # 1 # 1 1 # 1 2 1 # 1 3 3 1 # 1 4 6 4 1 # 1 5 10 10 5 1 # 1 6 15 20 15 6 1 # 1 7 21 35 35 21 7 1 # 1 8 28 56 70 56 28 8 1 # 1 9 36 84 126 126 84 36 9 1 # 1 10 45 120 210 252 210 120 45 10 1 # 1 11 55 165 330 462 462 330 165 55 11 1 # 1 12 66 220 495 792 924 792 495 220 66 12 1 # # # この問題は、calloc() を使って領域確保をしてください。 # 段数を入力した後、calloc() を使って、必要分の領域確保をします。 # # 表示の体裁は大まかに二等辺三角形の形になっていればOKです。 # なお、上の実行例のプログラムでは、 # # printf("%3d ", 〜); # ↑ # ここは半角スペース3個 # # という記述で表示を行なっています。 パスカルの三角形(_段) :- パスカルの三角形(_段,LL), パスカルの三角形_表示(_段,LL). パスカルの三角形(_段,[[1]|LL]) :- length([_|Ln],_段), パスカルの三角形加算(Ln,[1,1],LL). パスカルの三角形加算([],_,[]). パスカルの三角形加算([_|Ln],L,[L|R2]) :- 指定された段に達するまでパスカルの三角形加算を続ける(Ln,L,R2). 指定された段に達するまでパスカルの三角形加算を続ける(Ln,L,R2) :- パスカルの三角形一行計算(L,L1), パスカルの三角形加算(Ln,L1,R2). パスカルの三角形一行計算(L,L1) :- 上の行の隣り合う二項の合計を取っていく(L,L0), 両端に1を付加する(L0,L1). 上の行の隣り合う二項の合計を取っていく(L,L0) :- findall(N,( append(_,[A,B|_],L),N is A + B),L0). 両端に1を付加する(L0,L1) :- append([1|L0],[1],L1). パスカルの三角形_表示(0,_) :- !. パスカルの三角形_表示(N,[L|R]) :- 'N>0の間、パスカルの三角形の表示'(N,L,R). 'N>0の間、パスカルの三角形の表示'(N,L,R) :- N > 0, succ(N_1,N), パスカルの三角形一行表示(N_1,L), パスカルの三角形_表示(N_1,R). パスカルの三角形一行表示(N_1,L) :- 左端からの空白表示(N_1), パスカルの三角形部分表示(L), write('\n'). 左端からの空白表示(N_1) :- 左端からの空白文字列の生成(N_1,_空白文字列), writef('%w',[_空白文字列]). 左端からの空白文字列の生成(N_1,_空白文字列) :- 左端からの空白文字ならびの生成(N_1,_空白ならび), atomic_list_concat(_空白ならび,_空白文字列). 左端からの空白文字ならびの生成(N_1,_空白ならび) :- Len is 3 * N_1, length(_空白ならび,Len), all(_空白ならび,' '). all([],_). all([V|R],V) :- all(R,V). パスカルの三角形部分表示(L) :- forall(member(A,L), writef('%5r ',[A])). % 以下のサイトは # # 出典::SQL質疑応答スレ 11問目 #535 # # 関連性がないけど取得したデータ型が同じ2つのSELECT文を結合させるにはどうしたらいいでしょうか? # # SELECT 1 # SELECT int_column AS A, timestamp_column AS B FROM table1 # # A     B # 10 2011-07-11 # # SELECT 2 # SELECT int_column AS A timestamp_column AS B FROM table2 # # A     B # 5  2011-07-10 # 10 2011-07-13 # # これをA-Bの順番にソートして # # A     B # 5  2011-07-10 # 10  2011-07-11 # 10  2011-07-13 # # こんな感じの1つのテーブルにしたいのですが、よろしくお願いします。 # # :- dynamic(table3/2). '関連性がないけど取得したデータ型が同じ2つのSELECT文を結合する これをA-Bの順番にソートして1つのテーブルにしたい'(_順番にソートして結合された表) :- '関連性がないけど取得したデータ型が同じ2つのSELECT文を結合する'(_結合された表), 'これをA-Bの順番にソートして1つのテーブルにしたい'(_順番にソートして結合された表). '関連性がないけど取得したデータ型が同じ2つのSELECT文を結合する'(LL3) :- 同じ形式の照会で得られた(LL1,LL2), '2つを結合する'(LL1,LL2,LL3). 同じ形式の照会で得られた(LL1,LL2) :- 'table1をならびに取得する'(LL1), 'table2をならびに取得する'(LL2). 'table1をならびに取得する'(LL1) :- findall([_table1_A,_table1_B],table1(_table1_A,_table1_B),LL1). 'table2をならびに取得する'(LL2) :- findall([_table2_A,_table2_B],table2(_table2_A,_table2_B),LL2). '2つを結合する'(LL1,LL2,LL3) :- append(LL1,LL2,LL3). 'これをA-Bの順番にソートして1つのテーブルにしたい'(_結合された表,_順番にソートして結合された表) :- sort(_結合された表,_順番にソートして結合された表), '1つのテーブルにしたい'(_順番にソートして結合された表). '1つのテーブルにしたい'(_順番にソートして結合された表) :- forall( member([_table3_A,_table3_B],_順番にソートして結合された表), assertz(table3(_table3_A,_table3_B))). % 以下のサイトは # # sudo ifdown _有線LANのデバイス; ネットワーク設定ファイルに追加する ; sudo ifup _有線LANのデバイス # ネットワーク設定ファイルに追加してデバイスを起動する(_有線LANのデバイス,_固定IPアドレス,_ネットマスク,_ブロードキャスト,_ゲートウェイ) :- デバイスを停止する(_有線LANのデバイス), ネットワーク設定ファイルに追加する(_有線LANのデバイス,_固定IPアドレス,_ネットマスク,_ブロードキャスト,_ゲートウェイ), デバイスを起動する(_有線LANのデバイス). デバイスを停止する(_有線LANのデバイス) :- atomic_list_concat(['sudo,ifdown',_有線LANのデバイス],' ',_ifdown), shell(_ifdown,_). デバイスを起動する(_有線LANのデバイス) :- atomic_list_concat(['sudo,ifup',_有線LANのデバイス],' ',_ifup), shell(_ifup,_). ネットワーク設定ファイルに追加する(_有線LANのデバイス,_固定IPアドレス,_ネットマスク,_ブロードキャスト,_ゲートウェイ) :- open('/etc/network/interfaces',append,Outstream), ネットワーク設定ファイルに追加する(Outstream,_有線LANのデバイス,_固定IPアドレス,_ネットマスク,_ブロードキャスト,_ゲートウェイ), close(Outstream). ネットワーク設定ファイルに追加する(Outstream,_有線LANのデバイス,_固定IPアドレス,_ネットマスク,_ブロードキャスト,_ゲートウェイ) :- 固定IPアドレスとネットマスクの追加(Outstream,_有線LANのデバイス,_固定IPアドレス,_ネットマスク), ブロードキャストとゲートウェイとDNSの追加(Outstream,_ブロードキャスト,_ゲートウェイ), システムの起動時にデバイスを有効にする(Outstream,_有線LANのデバイス). 固定IPアドレスとネットマスクの追加(Outstream,_有線LANのデバイス,_固定IPアドレス,_ネットマスク) :- 有線LANのデバイスの追加(Outstream,_有線LANのデバイス), 固定IPアドレスの追加(Outstream,_固定IPアドレス), ネットマスクの追加(Outstream,_ネットマスク). 有線LANのデバイスの追加(Outstream,_有線LANのデバイス) :- writef(Outstream,'iface %w inet static\n',[_有線LANのデバイス]). 固定IPアドレスの追加(Outstream,_固定IPアドレス) :- writef(Outstream,'address %w\n',[_固定IPアドレス,_ネットマスク]). ネットマスクの追加(Outstream,_ネットマスク) :- writef(Outstream,'netmask %w\n',[_ネットマスク]). ブロードキャストとゲートウェイとDNSの追加(Outstream,_ブロードキャスト,_ゲートウェイ) :- ブロードキャストの追加(Outstream,_ブロードキャスト), ゲートウェイの追加(Outstream,_ゲートウェイ), 'DNSの追加'(Outstream). ブロードキャストの追加(Outstream,_ブロードキャスト) :- writef(Outstream,,'broadcast %w\n',[_ブロードキャスト]). ゲートウェイの追加(Outstream,_ゲートウェイ) :- swritef(Outstream,'broadcast %w\n',[_ゲートウェイ]). 'DNSの追加'(Outstream) :- write(Outstream,'dns-nameservers 8.8.8.8\n'). システムの起動時にデバイスを有効にする(Outstream,_有線LANのデバイス) :- writef(Outstream,'auto %w\n',[_有線LANのデバイス]). writef(Stream,P,L) :- swritef(A,P,L), write(Stream,A). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #111 # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '"CGUU"をギャップ("-")を含んでいても検出'(_文字列,_前文字列,_CGUU,_後文字列) :- atom_chars(_文字列,_文字ならび), 'CGUUを確定する'(_文字ならび,L1,R1,R2,R3,R4), '_前文字列・_後文字列を取りだす'(L1,R4,_前文字列,_後文字列). 'CGUUを確定する'(_文字ならび,L1,R1,R2,R3,R4) :- append([L1,['C'|R1],['G'|R2],['U'|R3],['U'|R4]],_文字ならび), 'R1,R2,R3は全てギャップで満されているか[]である'(R1,R2,R3), 'CGUU'(R1,R2,R3,_CGUU). 'R1,R2,R3は全てギャップで満されているか[]である'(R1,R2,R3) :- forall(member(_ギャップならび,[R1,R2,R3]),'全てギャップで満たされているか[]である'(_ギャップならび)). '全てギャップで満たされているか[]である'([]), '全てギャップで満たされているか[]である'(['-'|R]) :- '全てギャップで満たされているか[]である'(R). 'CGUU'(R1,R2,R3,_CGUU) :- append([['C'|R1],['G'|R2],['U|R3],['U']],L2), atom_chars(_CGUU,L2). '_前文字列・_後文字列を取りだす'(L1,R4,_前文字列,_後文字列) :- atom_chars(_前文字列,L1), atom_chars(_後文字列,R4). % 以下のサイトは % % カレンダーの形式(何曜日から始まるか)と % 月日数と1日の曜日が分かっている時 % カレンダーをならびに得る。 % 第一週と最終週を変数で補正した曜日起点月カレンダー補正(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー_1), 第一週と最終週を変数で補正した(_カレンダー_1,_カレンダー). 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- findall(N,between(1,_月日数,N),_日ならび), 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号), 曜日番号からカレンダーを作成する(_起点曜日番号,_日ならび,_カレンダー). 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号) :- 曜日番号(_曜日番号_1,_起点曜日形式), 曜日番号(_曜日番号,_1日の曜日), _起点曜日番号 is (7 - (_曜日番号 - _曜日番号_1)) mod 7. 曜日番号からカレンダーを作成する(0,_日ならび,_カレンダー) :- 'N個組'(7,_日ならび,_カレンダー),!. 曜日番号からカレンダーを作成する(_曜日番号,_日ならび,_カレンダー) :- 先頭に変数日を付加して曜日番号からカレンダーを作成する(_曜日番号,_日ならび,_カレンダー). 先頭に変数日を付加して曜日番号からカレンダーを作成する(_曜日番号,_日ならび,[L0|LL]) :- length(L0,_曜日番号), append(L0,L1,_日ならび), 'N個組'(7,L1,LL). 曜日番号(0,日曜) :- !. 曜日番号(1,月曜) :- !. 曜日番号(2,火曜) :- !. 曜日番号(3,水曜) :- !. 曜日番号(4,木曜) :- !. 曜日番号(5,金曜) :- !. 曜日番号(6,土曜) :- !. 'N個組'(_,[],[]) :- !. 'N個組'(N,L,[U|R]) :- 先頭からN個(N,L,U,R1), 'N個組'(N,R1,R). 先頭からN個(N,L1,L2,R) :- 'L1の要素数はN個以上'(N,L1,L2,R),!. 先頭からN個(_,L,L,[]). 'L1の要素数はN個以上'(N,L1,L2,R) :- length(L2,N), append(L2,R,L1). 第一週と最終週を変数で補正した([L|LL1],[[_1,_2,_3,_4,_5,_6,_7]|LL2]) :- 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]), 最終週を変数で補正(LL1,LL2). 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]) :- append(_,L,[_1,_2,_3,_4,_5,_6,_7]). 最終週を変数で補正(LL1,LL2) :- append(LL1_1,[L_2],LL1), append(L_2,_,[_11,_12,_13,_14,_15,_16,_17]), append(LL1_1,[[_11,_12,_13,_14,_15,_16,_17]],LL2). 変数だけ値を詰める([],_). 変数だけ値を詰める([A|R],V) :- 変数だけ値を詰める(A,R,V). 変数だけ値を詰める(A,R,V) :- '_1が変数の場合は_2になる'(A,V), 変数だけ値を詰める(R,V). '_1が変数の場合は_2になる'(V,V) :- !. '_1が変数の場合は_2になる'(_,_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/689 # # すみません。 # 高専機械科卒なんですがお願いいたします。 # # 以下のようなテーブルにて、あかさたなでGROUP BYしてそれぞれの件数を出力できないかどうか悩んでおります。 # # CREATE TABLE `name_list` ( # kanji varchar(64), # yomi varchar(64) # ) # # INSERT INTO name_list (kanji,yomi) VALUES # ('安部','あべ'), # ('井口','いぐち'), # ('臼井','うすい'), # ('江本','えもと'), # ('小川','おがわ'), # ('柿本','かきもと'), # ('木島','きじま'), # ('九条','くじょう'), # ('毛森','けもり'), # ('小島','こじま'), # ('佐藤','さとう'), # ('しみず','')・・・・・・ # # 勿論、各頭文字で一件ずつじゃないのですが # これを # # あ行 5件 # か行 5件 # さ行 8件 # # のように集計をかけたいと思っておりますが # よい方法が思いつかず… # # 出力結果は、例でして出力した左側のフィールドはなんでもOKです。 # 右側のあかさたな行のそれぞれのレコード数がチェックできればOKです。 # # なにとぞよろしくお願いいたします。 # 名簿(安部,あべ). 名簿(井口,いぐち). 名簿(臼井,うすい). 名簿(江本,えもと). 名簿(小川,おがわ). 名簿(柿本,かきもと). 名簿(木島,きじま). 名簿(九条,くじょう). 名簿(毛森,けもり). 名簿(小島,こじま). 名簿(佐藤,さとう). 名簿(しみず,''). '各頭文字で一件ずつじゃないのですが、これを あ行 5件 か行 5件 さ行 8件 のように集計をかけたい'(_行,_件数) :- append(_,[_行|R],[あ,か,さ,な,ま,や,ら,わ,ん]), '件数(但し0件は除く)'('_行の読み範囲の中に名簿の_ひらがな読みは入っている'(_行,R),_件数). '_行の読み範囲の中に名簿の_ひらがな読みは入っている'(_行,_残りの行) :- '名簿の_ひらがな読みの一字目は行の範囲'(_行,_残りの行). '名簿の_ひらがな読みの一字目は行の範囲'(_行,[]) :- '名簿の_ひらがな読みの一字目は「ん」'. '名簿の_ひらがな読みの一字目は行の範囲'(_行,[_次の行|_]) :- '名簿の一字目は行の範囲'(_行,_次の行). '名簿の一字目は行の範囲'(_行,_次の行) :- 名簿(_,_ひらがな読み), _ひらがな読み @>= _行, _ひらがな読み @< _次の行. '名簿の_ひらがな読みの一字目は「ん」' :- 名簿(_,_ひらがな読み), sub_atom(_ひらがな読み,0,1,_,ん). '件数(但し0件は除く)'(_目標,_件数) :- findall(1,_目標,[_|L]), length([_|L],_件数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/689 # # すみません。 # 高専機械科卒なんですがお願いいたします。 # # 以下のようなテーブルにて、あかさたなでGROUP BYしてそれぞれの件数を出力できないかどうか悩んでおります。 # # CREATE TABLE `name_list` ( # kanji varchar(64), # yomi varchar(64) # ) # # INSERT INTO name_list (kanji,yomi) VALUES # ('安部','あべ'), # ('井口','いぐち'), # ('臼井','うすい'), # ('江本','えもと'), # ('小川','おがわ'), # ('柿本','かきもと'), # ('木島','きじま'), # ('九条','くじょう'), # ('毛森','けもり'), # ('小島','こじま'), # ('佐藤','さとう'), # ('しみず','')・・・・・・ # # 勿論、各頭文字で一件ずつじゃないのですが # これを # # あ行 5件 # か行 5件 # さ行 8件 # # のように集計をかけたいと思っておりますが # よい方法が思いつかず… # # 出力結果は、例でして出力した左側のフィールドはなんでもOKです。 # 右側のあかさたな行のそれぞれのレコード数がチェックできればOKです。 # # なにとぞよろしくお願いいたします。 # 名簿(安部,あべ). 名簿(井口,いぐち). 名簿(臼井,うすい). 名簿(江本,えもと). 名簿(小川,おがわ). 名簿(柿本,かきもと). 名簿(木島,きじま). 名簿(九条,くじょう). 名簿(毛森,けもり). 名簿(小島,こじま). 名簿(佐藤,さとう). 名簿(しみず,''). '各頭文字で一件ずつじゃないのですが、これを あ行 5件 か行 5件 さ行 8件 のように集計をかけたい'(_行,_件数) :- append(_,[_行,_次の行|_],[あ,か,さ,た,な,は,ま,や,ら,わ,ん]), '件数(但し0件は除く)'('_行の読み範囲の中に名簿の_ひらがな読みは入っている'(_行,_次の行),_件数). '_行の読み範囲の中に名簿の_ひらがな読みは入っている'(_行,_次の行) :- 名簿(_,_ひらがな読み), _ひらがな読み @>= _行, _ひらがな読み @< _次の行. '件数(但し0件は除く)'(_目標,_件数) :- findall(1,_目標,[_|L]), length([_|L],_件数). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 165代目 #321 # 総当りをする関数を作成して下さい # # VC++2010 # Windows Vista Home SP2 # # 例 # 第1引数 総当りの初めの文字 # 第2引数 総当りの最後の文字 # 第3引数 総当りする桁数 # func('a', 'z', 3); # とした時の動作は # aaa〜zzz、aa〜zz、a〜z # の全てを出力するようにしたいです # # よろしくお願いします # # 総当り(_総当りの初めの文字,_総当りの最後の文字,_総当りする桁数,_総当り) :- 文字ならびを確定する(_総当りの初めの文字,_総当りの最後の文字,_文字ならび), 総当り(_総当りする桁数,_文字ならび,_総当り). 総当り(1,_文字ならび,_文字ならび). 総当り(_桁数,_文字ならび,_総当り) :- 桁数を減じて(_桁数,_桁数_1), 低位桁から総当りを成長させる(_桁数_1,_文字ならび,_総当り). 桁数を減じて(_桁数,_桁数_1) :- _桁数 > 1, succ(_桁数_1,_桁数). 低位桁から総当りを成長させる(_桁数_1,_文字ならび,_総当り) :- 総当り(_桁数_1,_文字ならび,_総当り_2), 総当り_1(_文字ならび,_総当り_2,_総当り_1), append(_総当り_1,_総当り_2,_総当り). 総当り_1(_文字ならび,_総当り_2,_総当り_1) :- findall(_文字列,( 文字列の先頭文字は文字ならび中の一文字(_文字ならび,_総当り_2,_文字列)),_総当り_1). 文字列の先頭文字は文字ならび中の一文字(_文字ならび,_総当り_2,_文字列) :- member(_文字_1,_文字ならび), member(_文字列_2,_総当り_2), atom_concat(_文字_1,_文字列_2,_文字列). 文字ならびを確定する(_総当りの初めの文字,_総当りの最後の文字,_文字ならび) :- 文字範囲を文字コード範囲に変換(_総当りの初めの文字,_総当りの最後の文字,_総当りの初めの文字コード,_総当りの最後の文字コード), findall(_文字,( 一文字を得る(_総当りの初めの文字コード,_総当りの最後の文字コード,_文字)),_文字ならび). 文字範囲を文字コード範囲に変換(_総当りの初めの文字,_総当りの最後の文字,_総当りの初めの文字コード,_総当りの最後の文字コード) :- char_code(_総当りの初めの文字,_総当りの初めの文字コード), char_code(_総当りの最後の文字,_総当りの最後の文字コード). 一文字を得る(_総当りの初めの文字コード,_総当りの最後の文字コード,_文字) :- between(_総当りの初めの文字コード,_総当りの最後の文字コード,_文字コード), char_code(_文字,_文字コード). % 以下のサイトは 軸要素の選定([_最初の位置の値|R],_軸要素,_残りならび) :- 軸要素の選定([_最初の位置の値|R],_軸要素), select(_軸要素,[_最初の位置の値|R],_残りならび),!. 軸要素の選定([_最初の位置の値|R],_軸要素) :- 中間位置の値([_最初の位置の値|R],_中間位置の値), last([_最初の位置の値|R],_最終位置の値), 三値の中央値(_最初の位置の値,_中間位置の値,_最終位置の値,_軸要素). 中間位置の値(L,_中間位置の値) :- length(L,Length), Length_1 is Length // 2, length(L1,Length_1), append(L1,[_中間位置の値|_],L). 三値の中央値(_1,_2,_3,_中央値) :- 順列([_1,_2,_3],3,[_中央値,A,B]), A @>= _中央値, B @=< _中央値. 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), succ(M,N), 順列(Z,M,X). % 以下のサイトは 軸要素の選定(_対象ならび,_軸要素) :- '最初の位置の値、中間位置の値、最終位置の値、三値の中央値を取る'(_対象ならび,_軸要素),!. '最初の位置の値、中間位置の値、最終位置の値、三値の中央値を取る'([_最初の位置の値|R],_軸要素) :- 中間位置の値([_最初の位置の値|R],_中間位置の値), last([_最初の位置の値|R],_最終位置の値), 三値の中央値(_最初の位置の値,_中間位置の値,_最終位置の値,_軸要素). 中間位置の値(_値ならび,_中間位置の値) :- '_前ならびを作り'(_値ならび,_前ならび), append(_前ならび,[_中間位置の値|_],_値ならび),!. '_前ならびを作り'(_値ならび,_前ならび) :- length(_値ならび,_ならびの要素数), _前ならびの要素数 is _ならびの要素数 // 2, length(_前ならび,_前ならびの要素数). 三値の中央値(_1,_2,_3,_三値の中央値) :- select(_三値の中央値,[_1,_2,_3],_残り値ならび), '残り値ならびの値の全てが三値の中央値より小さいことはなく、残り値ならびの値の全てが三値の中央値より大きいこともない'(_残り値ならび,_三値の中央値),!. '残り値ならびの値の全てが三値の中央値より小さいことはなく、残り値ならびの値の全てが三値の中央値より大きいこともない'(_残り値ならび,_三値の中央値) :- 残り値ならびの値の全てが三値の中央値より小さいことはなく(_残り値ならび,_三値の中央値), 残り値ならびの値の全てが三値の中央値より大きいこともない(_残り値ならび,_三値の中央値). 残り値ならびの値の全てが三値の中央値より小さいことはなく(_残り値ならび,_三値の中央値) :- \+(残り値ならびの値の全てが三値の中央値より小さい(_残り値ならび,_三値の中央値)). 残り値ならびの値の全てが三値の中央値より小さい(_残り値ならび,_三値の中央値) :- forall(member(_値,_残り値ならび),_値 @< _三値の中央値)). 残り値ならびの値の全てが三値の中央値より大きいこともない(_残り値ならび,_三値の中央値) :- \+(残り値ならびの値の全てが三値の中央値より大きい(_残り値ならび,_三値の中央値)). 残り値ならびの値の全てが三値の中央値より大きい(_残り値ならび,_三値の中央値) :- forall(member(_値,_残り値ならび),_値 @> _三値の中央値)). % 以下のサイトは 軸要素の選定(_対象ならび,_軸要素) :- '最初の位置の値、中間位置の値、最終位置の値、三値の中央値を取る'(_対象ならび,_軸要素),!. '最初の位置の値、中間位置の値、最終位置の値、三値の中央値を取る'([_最初の位置の値|R],_軸要素) :- 中間位置の値([_最初の位置の値|R],_中間位置の値), last([_最初の位置の値|R],_最終位置の値), 三値の中央値(_最初の位置の値,_中間位置の値,_最終位置の値,_軸要素). 中間位置の値(_値ならび,_中間位置の値) :- '_前ならびを作り'(_値ならび,_前ならび), append(_前ならび,[_中間位置の値|_],_値ならび),!. '_前ならびを作り'(_値ならび,_前ならび) :- length(_値ならび,_ならびの要素数), _前ならびの要素数 is _ならびの要素数 // 2, length(_前ならび,_前ならびの要素数). 三値の中央値(_1,_2,_3,_三値の中央値) :- select(_三値の中央値,[_1,_2,_3],_残り値ならび), '残り値ならびの値の全てが中央値より小さいことはなく、残り値ならびの値の全てが中央値より大きいこともない'(_残り値ならび,_三値の中央値),!. '残り値ならびの値の全てが中央値より小さいことはなく、残り値ならびの値の全てが中央値より大きいこともない'(_残り値ならび,_三値の中央値) :- 残り値ならびの値の全てが中央値より小さいことはなく(_残り値ならび,_三値の中央値), 残り値ならびの値の全てが中央値より大きいこともない(_残り値ならび,_三値の中央値). 残り値ならびの値の全てが中央値より小さいことはなく(_残り値ならび,_三値の中央値) :- \+(forall(member(A,_残り値ならび),A @< _三値の中央値)). 残り値ならびの値の全てが中央値より大きいこともない(_残り値ならび,_三値の中央値) :- \+(forall(member(A,_残り値ならび),A @> _三値の中央値)). % 以下のサイトは # 出典 :: SQL質疑応答スレ 12問目 #365 # ・DB名:Firebird1.03 # ・テーブル #  ■メイン #   受注番号 受注日 注文社 #   11    2011/12/20 A社 #   12    2011/12/21 B社 #  ■サブ #   連番 受注番号 商品コード 数 #   50  11    A10    100 #   51  11    C30    20 #   52  12    A10    10 #  ■商品 #   商品コード 商品名 カテゴリ 納品番号(商品ごとで重複していません) #   A10     コート 洋服   100 #   C30     帯   和服   504 # # メインの受注番号とサブの受注番号、サブの商品コードと商品の商品コードで # リンクしています。 # # 欲しい結果 # 受注日の期間(いつからいつまで)と、商品のカテゴリと納品番号で、 # 受注の全内容(商品)が知りたいです。 # 受注日:2011/12/01から12/31まで # カテゴリ:洋服 納品番号:100で検索をして # # 受注番号 受注日 注文者 商品コード 商品名 数量 # 11    2011/12/20 A社 A10    コート 100 # 11    2011/12/20 A社 C30    帯   20----★ # 12    2011/12/21 B社 A10    コート 10 # ★受注の全内容が知りたいので、該当する受注番号のサブはすべて表示 # したい。メインの内容は重複表示となります。 # # 丸投げですみませんが、どなたかSQL文をお願いできませんでしょうか。 # テーブルが3つになるとどうしてよいものかわからないです。 # よろしくお願いします。 # # # '受注日の期間(いつからいつまで)と、商品の商品カテゴリと納品番号で、受注の全内容(商品)が知りたい'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号) :- '受注番号候補を得て、それを鍵に、データベースから選択する'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号,LL1), 受注番号順に表示する(LL1). '受注番号候補を得て、それを鍵に、データベースから選択する'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号,LL1) :- 受注番号候補を得る(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号,_受注番号ならび), 'それを鍵に、データベースから選択する'(_受注番号ならび,LL1). 受注番号候補を得る(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号,_受注番号ならび) :- setof(_受注番号, [_受注番号,_受注日,_注文社,_受注日,_受注日下限,_受注日上限,_連番,_受注番号,_商品コード,_数量,_商品名,_商品カテゴリ,_納品番号] ^ ( '受注日範囲のメインの受注番号からサブ・商品を結合可能な受注番号'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号)),_受注番号ならび). '受注日範囲のメインの受注番号からサブ・商品を結合可能な受注番号'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号) :- 受注日範囲のメインの受注番号から(_受注日下限,_受注日上限,_受注番号,_受注日,_注文社), 'サブ・商品を結合可能な受注番号'(_受注番号,_受注日,_注文社,_連番,_受注番号,_商品コード,_数量,_商品名,_商品カテゴリ,_納品番号). 受注日範囲のメインの受注番号から(_受注日下限,_受注日上限,_受注番号,_受注日,_注文社) :- メイン(_受注番号,_受注日,_注文社), _受注日 @>= _受注日下限, _受注日 @=< _受注日上限. 'サブ・商品を結合可能な受注番号'(_受注番号,_受注日,_注文社,_連番,_受注番号,_商品コード,_数量,_商品名,_商品カテゴリ,_納品番号) :- サブ(_連番,_受注番号,_商品コード,_数量), 商品(_商品コード,_商品名,_商品カテゴリ,_納品番号). 'それを鍵に、データベースから選択する'(_受注番号ならび,LL1) :- findall([_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量],( append(_,[_受注番号|_],_受注番号ならび), 受注番号を鍵にデータベースからの選択(_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量)),LL1). 受注番号を鍵にデータベースを結合(_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量) :- メイン(_受注番号,_受注日,_注文社), サブ(_連番,_受注番号,_商品コード,_数量), 商品(_商品コード,_商品名,_商品カテゴリ,_納品番号). 受注番号順に表示する(LL1) :- 整列(LL1,LL2), 表示する(LL2). 表示する(LL) :- 見出しを表示する, forall(append(_,[[_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量]|_],LL), writef('%10l %8l %8c %8c %8c %14l %8r\n',[_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量])). 見出しを表示する :- write('受注番号 受注日 注文者 商品コード 商品名 数量\n'). % 以下のサイトは '13桁のISBNコードを検査せよ。'(_13桁のISBNコード) :- '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(_13桁のISBNコード,_12要素の数値ならび,_最終桁の数), '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_12要素の数値ならび,_加算された数), '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数). '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(_13桁のISBNコード,_12要素の数値ならび,_最終桁の数) :- 各桁を数値に変換した上で(_13桁のISBNコード,_13要素の数値ならび), '12要素の数値ならびと最終桁の数に分離し'(_13要素の数値ならび,_12要素の数値ならび,_最終桁の数). 各桁を数値に変換した上で(_13桁のISBNコード,_13要素の数値ならび) :- findall(_数値,各桁を数値に変換する(_13桁のISBNコード,_数値),_13要素の数値ならび). 各桁を数値に変換する(_13桁のISBNコード,_数値) :- sub_atom(_13桁のISBNコード,_,1,_,_数字), atom_number(_数字,_数値). '12要素の数値ならびと最終桁の数に分離し'(_13要素の数値ならび,_12要素の数値ならび,_最終桁の数) :- append(_12要素の数値ならび,[_最終桁の数],_13要素の数値ならび). '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_12要素の数値ならび,_加算された数) :- '12要素の数値ならびを逆順にして'(_12要素の数値ならび,_反転した12要素の数値ならび), '順に3,1を掛けて加算し'(_反転した12要素の数値ならび,_加算された数). '12要素の数値ならびを逆順にして'(_12要素の数値ならび,_反転した12要素の数値ならび) :- reverse(_12要素の数値ならび,_反転した12要素の数値ならび). '順に3,1を掛けて加算し'(_反転した12要素の数値ならび,_加算された数) :- findsum(S,'順に3,1を掛けて'(_反転した12要素の数値ならび,S),_加算された数). '順に3,1を掛けて'(_反転した12要素の数値ならび,S) :- 順に(_反転した12要素の数値ならび,N1,N2), '3,1を掛けて'(N1,N2,S). 順に(_反転した12要素の数値ならび,N1,N2) :- append(L0,[N1,N2|_],_反転した12要素の数値ならび), 要素数が偶数(L0). 要素数が偶数(L) :- length(L,_要素数), 0 is _要素数 mod 2. '3,1を掛けて'(N1,N2,S) :- S is N1 * 3 + N2 * 1. '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数) :- _最終桁の数 is 10 - (_加算された数 mod 10). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # append/3 に細工してみて、appendの性質を考えてみる。 append([],L,L). append([U|X],Y,[U|Z]) :- append(X,Y,Z). % ご存知 append/3 だが、このコードをちょっと細工する。 ap([],L1,L2) :- ap_1(L1,L2). ap([U|X],Y,[W|Z]) :- ap_2(U,W), ap(X,Y,Z). ap_1([],[]). ap_1([U|R1],[W|R2]) :- ap_2(U,W), ap_1(R1,R2). ap_2(U,W) :- succ(U,W). % これで、 ?- ap(L1,[A|L2],[3,4,5]). L1 = [], A = 2, L2 = [3, 4] ; L1 = [2], A = 3, L2 = [4] ; L1 = [2, 3], A = 4, L2 = [] ; false. % 注目するべきことは、A,L1,L2に5という値は出てこない。 % つまり、ap_2/2 の処理結果のみが現れるということだ。 % succ(U,W) 乃ち、 U is W - 1, が実行された結果のみ現れている。 % % 当たり前といえば当たり前のことではあるが、 % 中間的な結果表示ではなく、全て実行結果が現れるのがこの述語の特徴である。 % 以下のサイトは 同一要素数ならびを要素の出現順に得る(_ならび,_同一要素数ならび) :- findall([_要素,_度数],( 同一要素数を得る(_ならび,_要素,_度数)),_同一要素数ならび). 同一要素数を得る(_ならび,_要素,_度数) :- 最初の要素を得る(_ならび,_残りならび,_要素), 度数(member(_要素,[_要素|_残りならび]),_度数). 最初の要素を得る(_ならび,_残りならび,_要素) :- append(_前ならび,[_要素|_残りならび],_ならび), '_前ならびは_要素を含まない'(_前ならび,_要素). '_前ならびは_要素を含まない'(_前ならび,_要素) :- \+(member(_要素,_前ならび)). 度数(_目標,_度数) :- findall(1,_目標,_目標が真になった数だけ整数1を要素とするならび), length(_目標が真になった数だけ整数1を要素とするならび,_度数). % 以下のサイトは 同一要素数ならび(_ならび,_同一要素数ならび) :- findall([_要素,_度数],( 同一要素数を得る(_ならび,_要素,_度数)),_同一要素数ならび). 同一要素数を得る(_ならび,_要素,_度数) :- 最終要素を得る(_ならび,_前要素ならび,_要素), 度数(member(_要素,[_要素|_前要素ならび]),_度数). 最終要素を得る(_ならび,_前要素ならび,_要素) :- append(_前要素ならび,[_要素|_残りならび],_ならび), '_残りならびは_要素を含まない'(_残りならび,_要素). '_残りならびは_要素を含まない'(_残りならび,_要素) :- \+(member(_要素,_残りならび)). 度数(_目標,_度数) :- findall(1,_目標,_目標が真になった数だけ整数1を要素とするならび), length(_目標が真になった数だけ整数1を要素とするならび,_度数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/111 # # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '"CGUU"をギャップ("-")を含んでいても検出'(_文字列,_前文字列,_CGUU,_後文字列) :- '"CGUU"が検出された場合のギャップ("-")と前後の文字ならび'(R1,R2,R3,L1,L2), 'R1,R2,R3は全て[]であるか全ての要素がギャップ("-")のリストである'(R1,R2,R3), '前文字列・ギャップ("-")を含んだ"CGUU"・後文字列を得る'(L1,R1,R2,R3,L2,_前文字列,_ギャップを含んだCGUU,_後文字列). '"CGUU"が検出された場合のギャップ("-")と前後の文字ならび'(R1,R2,R3,L1,L2) :- 文字列を文字ならびに変換し(_文字列,_文字ならび), 'ギャップ("-")と前後の文字ならびを得る'(_文字ならび,R1,R2,R3,L1,L2). 文字列を文字ならびに変換し(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 'ギャップ("-")と前後の文字ならびを得る'(_文字ならび,R1,R2,R3,L1,L2) :- append([L1,['C'|R1],['G'|R2],['U'|R3],['U'|L2]],_文字ならび). 'R1,R2,R3は全て[]であるか全ての要素がギャップ("-")のリストである'(R1,R2,R3) :- 'R1は[]であるか全ての要素がギャップ("-")のリストである'(R1), 'R2は[]であるか全ての要素がギャップ("-")のリストである'(R2), 'R3は[]であるか全ての要素がギャップ("-")のリストである'(R3). 'R1は[]であるか全ての要素がギャップ("-")のリストである'(R1) :- forall(member(_要素,R1),_要素='-'). 'R2は[]であるか全ての要素がギャップ("-")のリストである'(R2) :- forall(member(_要素,R2),_要素='-'). 'R3は[]であるか全ての要素がギャップ("-")のリストである'(R3) :- forall(member(_要素,R3),_要素='-'). '前文字列・ギャップ("-")を含んだ"CGUU"・後文字列を得る'(L1,R1,R2,R3,L2,_前文字列,_ギャップを含んだCGUU,_後文字列) :- 'L1から前文字列を得る'(L1,_前文字列), 'ギャップ("-")を含んだ"CGUU"'(R1,R2,R3,_ギャップを含んだCGUU), 'L2から後文字列を得る'(L2,_後文字列). 'L1から前文字列を得る'(L1,_前文字列) :- atom_chars(_前文字列,L1). 'ギャップ("-")を含んだ"CGUU"'(R1,R2,R3,_ギャップを含んだCGUU) :- 'ギャップ("-")を含んだ"CGUU"文字ならびを作り'(R1,R2,R3,_ギャップを含んだCGUU文字ならび), 'ギャップ("-")を含んだ"CGUU"に変換する'(_ギャップを含んだCGUU文字ならび,_ギャップを含んだCGUU). 'ギャップ("-")を含んだ"CGUU"文字ならびを作り'(R1,R2,R3,_ギャップを含んだCGUU文字ならび) :- append([['C'|R1],['G'|R2],['U'|R3],['U']],_ギャップを含んだCGUU文字ならび), 'ギャップ("-")を含んだ"CGUU"に変換する'(_ギャップを含んだCGUU文字ならび,_ギャップを含んだCGUU) :- atom_chars(_ギャップを含んだCGUU,_ギャップを含んだCGUU文字ならび). 'L2から後文字列を得る'(L2,_後文字列) :- atom_chars(_後文字列,L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/111 # # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '"CGUU"をギャップ("-")を含んでいても検出'(_文字列,_前文字列,_CGUU,_後文字列) :- '"CGUU"が検出された場合のギャップと前後の文字ならび'(R1,R2,R3,L1,L2), 'R1,R2,R3は全て[]であるか全ての要素がギャップ("-")のリストである'(R1,R2,R3), '前文字列・ギャップ("-")を含んだ"CGUU"・後文字列を得る'(L1,R1,R2,R3,L2,_前文字列,_ギャップを含んだCGUU,_後文字列). '"CGUU"が検出された場合のギャップと前後の文字ならび'(R1,R2,R3,L1,L2) :- atom_chars(_文字列,_文字ならび), append([L1,['C'|R1],['G'|R2],['U'|R3],['U'|L2]],_文字ならび). 'R1,R2,R3は全て[]であるか全ての要素がギャップ("-")のリストである'(R1,R2,R3) :- forall(member(_1,R1),_1='-'), forall(member(_2,R2),_2='-'), forall(member(_3,R3),_3='-'). '前文字列・ギャップ("-")を含んだ"CGUU"・後文字列を得る'(L1,R1,R2,R3,L2,_前文字列,_ギャップを含んだCGUU,_後文字列) :- atom_chars(_前文字列,L1), 'ギャップ("-")を含んだ"CGUU"'(R1,R2,R3,_ギャップを含んだCGUU), atom_chars(_後文字列,L2). 'ギャップ("-")を含んだ"CGUU"'(R1,R2,R3,_ギャップを含んだCGUU) :- append([['C'|R1],['G'|R2],['U'|R3],['U']],_ギャップを含んだCGUU文字ならび), atom_chars(_ギャップを含んだCGUU,_ギャップを含んだCGUU文字ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/111 # # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '"CGUU"をギャップ("-")を含んでいても検出' :- atom_chars(_文字列,_文字ならび), append([L1,['C'|R1],[G|R2],[U|R3],[G|_]],_文字ならび), '各リストの全ての要素がギャップ("-")である'(R1,R2,R3). '各リストの全ての要素がギャップ("-")である'(R1,R2,R3) :- forall(member(_1,R1),_1='-'), forall(member(_2,R2),_2='-'), forall(member(_3,R3),_3='-'). % 以下のサイトは mergesort([],[]) :- !. mergesort([A],[A]) :- !. mergesort(L, L3) :- ならびを二分する(L, L1, L2), mergesort(L1, L1_2), mergesort(L2, L2_2), merge(L1_2,L2_2,L3). merge([],L,L) :- !. merge(L,[],L) :- !. merge([A|R1],[B|R2],[A|R3]) :- A @=< B, merge(R1,[B|R2],R3). merge([A|R1],[B|R2],[B|R3]) :- A @> B, merge([A|R1],R2,R3). ならびを二分する([],[],[]) :- !. ならびを二分する(_ならび,_前半ならび,_後半ならび) :- 二分されたならびの要素数(_ならび,_二分されたならびの要素数), 二分されたならびを得る(_二分されたならびの要素数,_前半ならび,_後半ならび), append(_前半ならび,_後半ならび,_ならび),!. 二分されたならびの要素数(_ならび,_二分されたならびの要素数) :- length(_ならび,_ならびの長さ), _二分されたならびの要素数 is _ならびの長さ // 2. 二分されたならびを得る(_二分されたならびの要素数,_前半ならび,_後半ならび) :- length(_前半ならび,_二分されたならびの要素数), length(_後半ならび_1,_二分されたならびの要素数), append(_後半ならび_1,_,_後半ならび). % 以下のサイトは ならびを二分する(_ならび,_前半ならび,_後半ならび) :- 二分されたならびの要素数(_ならび,_二分されたならびの要素数), 二分されたならびを得る(_二分されたならびの要素数,_前半ならび,_後半ならび), append(_前半ならび,_後半ならび,_ならび),!. 二分されたならびの要素数(_ならび,_二分されたならびの要素数) :- length(_ならび,_ならびの長さ), _二分されたならびの要素数 is _ならびの長さ // 2. 二分されたならびを得る(_二分されたならびの要素数,_前半ならび,_後半ならび) :- length(_前半ならび,_二分されたならびの要素数), length(_後半ならび_1,_二分されたならびの要素数), append(_後半ならび_1,_,_後半ならび). % 以下のサイトは 整数から頭部零文字列(_桁,_整数,_数値を表す文字列) :- 整数を数字ならびに変換して桁数要素の変数ならびの後半に埋め込む(_桁,_整数,_頭部零文字ならび,_文字ならび), 頭部の零ならびは後から変数に零を埋める(_頭部零文字ならび,_文字ならび), 文字ならびを数値を表す文字列に変換する(_文字ならび,_数値を表す文字列). 整数を数字ならびに変換して桁数要素の変数ならびの後半に埋め込む(_桁,_整数,_頭部零文字ならび,_文字ならび) :- length(_文字ならび,_桁), number_chars(_整数,_数字ならび), append(_頭部零文字ならび,_数字ならび,_文字ならび). 頭部の零ならびは後から変数に零を埋める(_頭部零文字ならび) :- findall('0',( member(_要素,_頭部零文字ならび),var(_要素)),_頭部零文字ならび). 文字ならびを数値を表す文字列に変換する(_文字ならび,_数値を表す文字列) :- atom_chars(_数値を表す文字列,_文字ならび). % 以下のサイトは before(X,Y,Ls) :- append(Xの前方リスト,[X|Xの後方リスト],Ls), 'Xの前方リストにYは存在せず、Xの後方リストにYは存在する'(Xの前方リスト,Xの後方リスト,Y). 'Xの前方リストにYは存在せず、Xの後方リストにYは存在する'(Xの前方リスト,Xの後方リスト,Y) :- 'Xの前方リストにYは存在せず'(Xの前方リスト,Y), 'Xの後方リストにYは存在する'(Xの後方リスト,Y). 'Xの前方リストにYは存在せず'([],Y). 'Xの前方リストにYは存在せず'([Y|_],Y) :- !,fail. 'Xの前方リストにYは存在せず'([_|R],Y) :- 'Xの前方リストにYは存在せず'(R,Y). 'Xの後方リストにYは存在する'([Y|_],Y). 'Xの後方リストにYは存在する'([_|R],Y) :- 'Xの後方リストにYは存在する'(R,Y). % 以下のサイトは before(X,Y,Ls) :- append(Xの前方リスト,[X|Xの後方リスト],Ls), 'Xの前方リストにYは存在せず、Xの後方リストにYは存在する'(Xの前方リスト,Xの後方リスト,Y). 'Xの前方リストにYは存在せず、Xの後方リストにYは存在する'(Xの前方リスト,Xの後方リスト,Y) :- 'Xの前方リストにYは存在せず'(Xの前方リスト,Y), 'Xの後方リストにYは存在する'(Xの後方リスト,Y). 'Xの前方リストにYは存在せず'(Xの前方リスト,Y) :- \+(member(Y,Xの前方リスト)). 'Xの後方リストにYは存在する'(Xの後方リスト,Y) :- member(Y,Xの後方リスト). % 以下のサイトは % ?- append(L1,[E|L2],[1,2,3]). % L1 = [], E = 1, L2 = [2,3]; % L1 = [1], E = 2, L2 = [3]; % L1 = [1,2], E = 3, L2 = []. % % append/3の定義 % % append([],L,L). % append([U|L1],L2,[U|L3]) :- % append(L1,L2,L3). % % append/3 を 'リストを注目要素、その前リスト、後リストに分割する'/4 に変形。 % 'リストを注目リスト、その前リスト、後リストに分割する'(_リスト,_前リスト,_注目リスト,_後リスト) :- append([_前リスト,_注目リスト,_後リスト],_リスト). ?- 'リストを注目リスト、その前リスト、後リストに分割する'([1,2,3],_前リスト,_注目リスト,_後リスト). _前リスト = _注目リスト, _注目リスト = [], _後リスト = [1, 2, 3] ; _前リスト = [], _注目リスト = [1], _後リスト = [2, 3] ; _前リスト = [], _注目リスト = [1, 2], _後リスト = [3] ; _前リスト = _後リスト, _後リスト = [], _注目リスト = [1, 2, 3] ; _前リスト = [1], _注目リスト = [], _後リスト = [2, 3] ; _前リスト = [1], _注目リスト = [2], _後リスト = [3] ; _前リスト = [1], _注目リスト = [2, 3], _後リスト = [] ; _前リスト = [1, 2], _注目リスト = [], _後リスト = [3] ; _前リスト = [1, 2], _注目リスト = [3], _後リスト = [] ; _前リスト = [1, 2, 3], _注目リスト = _後リスト, _後リスト = [] ; false. % 以下のサイトは 'コールユーブンゲン No.45 a) の階名'(['ミ-1','ミ-1','ド-1','ソ-1','ファ-1','ミ-1','ファ-1','レ-1','ラ-1','ソ-1','ファ-1','ソ-1','ミ-1','シ-1','ド-2','ファ-1','ラ-1','レ-1','ファ-1','シ-0','ソ-1','ファ-1','ミ-1','ド-1','ソ-1','ファ-1','ミ-1','ラ-1','ファ-1','ド-2','シ-1','ラ-1','ソ-1','ド-2','ミ-1','ラ-1','レ-1','ファ-1','シ-0','レ-1','ソ-1','ド-1','ミ-1','ド-2','シ-1','ラ-1','ド-2','ラ-1','シ-1','ミ-1','シ-1','ド-2','シ-1','ラ-1','ソ-1','ファ-1','ラ-1','ファ-1','ソ-1','ド-1','ソ-1','ラ-1','シ-1','ド-2','ソ-1','レ-2','シ-1','ド-2','ラ-1','ド-2','ラ-1','シ-1','ラ-1','ミ-1','レ-1','ラ-1','ソ-1','ラ-1','ファ-1','ミ-1','ソ-1','ド-1','ド-1','レ-1','ミ-1','ファ-1','ソ-1','ラ-1','ファ-1','ド-2','ラ-1','ソ-1','ファ-1','ラ-1','レ-1','レ-1','ミ-1','ファ-1','ソ-1','ラ-1','シ-1','ソ-1','レ-2','ド-2','シ-1','ド-2','ミ-1','シ-1','ド-2','シ-1','ラ-1','ド-1','ソ-1','ラ-1','ソ-1','ファ-1','ラ-1','ミ-1','ファ-1','ド-1','レ-1','シ-0','レ-1','ソ-1','ド-1']). 'この練習曲がコールユーブンゲンの代表曲だという根拠として、音階の出現数が最も多いことが挙げられる。それではそのことを示す資料を作っておくことにしよう。' :- 'コールユーブンゲン No.45 a) の音階出現表'. 'コールユーブンゲン No.45 a) の音階出現表' :- forall(('コールユーブンゲン No.45 a) に出現する音階とその出現数'(A,B,_出現数),_出現数 > 0), writef('%t,%t,%t\n',[A,B,_出現数])). 'コールユーブンゲン No.45 a) に出現する音階とその出現数'(A,B,_出現数) :- 'コールユーブンゲン No.45 a) に出現する音階と'(L,A,B), その出現数(L,A,B,_出現数). 'コールユーブンゲン No.45 a) に出現する音階と'(L,A,B) :- 'コールユーブンゲン No.45 a) の階名'(L), setof(A,member(A,L),L2), 順列(L2,2,[A,B]). その出現数(L,A,B,_出現数) :- count(append(_,[A,B|_],L),_出現数). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは # 出典 :: CodeIQ q1533 # # 中学数学のひとつの山ともいえる、因数分解。 # 数学を嫌いになるきっかけとなってしまった人も多いのではないでしょうか? # そんな因数分解を、プログラミングで解いてみましょう! # # ■問題 # 二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 # これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。 # # # ■例 # 【入力】 # 4, -23, 15 # 【出力】 # 4, -3, 1, -5 # # つまり、4x2-23x+15=(4x-3)(x-5)という因数分解を行った結果を出力するプログラムです。 # (出力は、順番を入れ替えた1, -5, 4, -3でも正解となりますが、いずれか一方を出力するものとします。) # なお、α、β、γとして与えられる数字は互いに素な整数であるものとします。 # ※出力エラーの表記は、エラーとわかる何らかの出力で構いません。(※2015年4月20日13:30追記) # # # 最低限、以下のテストデータで正しい出力が得られることを確認してください。 # # 【テストデータ1:入力】 # 3, 10, 3 # 【出力】 # 1, 3, 3, 1 または 3, 1, 1, 3 # # 【テストデータ2:入力】 # 6, -1, -15 # 【出力】 # 2, 3, 3, -5 または 3, -5, 2, 3 # # 【テストデータ3:入力】 # 12, -1, -6 # 【出力】 # 3, 2, 4, -3 または 4, -3, 3, 2 # # 【テストデータ4:入力】 # 3, -8, 4 # 【出力】 # 1, -2, 3, -2 または 3, -2, 1, -2 # # 【テストデータ5:入力】 # 3, 5, 7 # 【出力】 # エラー # '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。'(_α,_β,_γ,_a,_b,_c,_d) :- findall([_a,_b,_c,_d], '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d),_解ならび), 重複解を取り除く(_解ならび,_a,_b,_c,_d). '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d) :- '_a,_b,_c,_dの候補を得る'(_α,_γ,_a,_b,_c,_d), _β is _a * _d + _b * _c. '_a,_b,_c,_dの候補を得る'(_α,_γ,_a,_b,_c,_d) :- '_a,_c候補'(_α,_a,_c), '_b,_d候補'(_γ,_b,_d). '_a,_c候補'(_α,_a,_c) :- 因数に分解する(_α,_a,_c) . '_b,_d候補'(_γ,_b,_d) :- 因数に分解する(_γ,_b,_d) . 因数に分解する(A,B,C) :- 'Aの絶対値からB_1候補を得る'(A,_正のA,B_1), '因数B_1,C_1を得る'(_正のA,B_1,C_1), 符号の組合せ(A,B_1,C_1,B,C). 'Aの絶対値からB_1候補を得る'(A,_正のA,B_1) :- _正のA is abs(A), between(1,_正のA,B_1). '因数B_1,C_1を得る'(_正のA,B_1,C_1) :- 0 is _正のA mod B_1, C_1 is _正のA // B_1. 符号の組合せ(A,B_1,C_1,B,C) :- 'Aが正の時は二数の符号は同じになる'(A,B_1,C_1,B,C). 符号の組合せ(A,B_1,C_1,B,C) :- 'Aが負の時は二数の符号は異なる'(A,B_1,C_1,B,C). 'Aが正の時は二数の符号は同じになる'(A,B_1,C_1,B,C) :- A > 0, 二数の符号は同じになる(A,B_1,C_1,B,C). 二数の符号は同じになる(A,B,C,B,C). 二数の符号は同じになる(A,B_1,C_1,B,C) :- B is B_1 * -1, C is C_1 * -1. 'Aが負の時は二数の符号は異なる'(A,B_1,C_1,B,C) :- A < 0, 二数の符号は異なる(A,B_1,C_1,B,C). 二数の符号は異なる(A,B_1,C,B,C) :- B is B_1 * -1. 二数の符号は異なる(A,B,C_1,B,C) :- C is C_1 * -1. 重複解を取り除く(_解ならび,_a,_b,_c,_d) :- append(L0,[[_a,_b,_c,_d]|_],_解ならび), \+(member([_c,_d,_a,_b],L0)). % 以下のサイトは # 出典 :: CodeIQ q1533 # # 中学数学のひとつの山ともいえる、因数分解。 # 数学を嫌いになるきっかけとなってしまった人も多いのではないでしょうか? # そんな因数分解を、プログラミングで解いてみましょう! # # ■問題 # 二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 # これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。 # # # ■例 # 【入力】 # 4, -23, 15 # 【出力】 # 4, -3, 1, -5 # # つまり、4x2-23x+15=(4x-3)(x-5)という因数分解を行った結果を出力するプログラムです。 # (出力は、順番を入れ替えた1, -5, 4, -3でも正解となりますが、いずれか一方を出力するものとします。) # なお、α、β、γとして与えられる数字は互いに素な整数であるものとします。 # ※出力エラーの表記は、エラーとわかる何らかの出力で構いません。(※2015年4月20日13:30追記) # # # 最低限、以下のテストデータで正しい出力が得られることを確認してください。 # # 【テストデータ1:入力】 # 3, 10, 3 # 【出力】 # 1, 3, 3, 1 または 3, 1, 1, 3 # # 【テストデータ2:入力】 # 6, -1, -15 # 【出力】 # 2, 3, 3, -5 または 3, -5, 2, 3 # # 【テストデータ3:入力】 # 12, -1, -6 # 【出力】 # 3, 2, 4, -3 または 4, -3, 3, 2 # # 【テストデータ4:入力】 # 3, -8, 4 # 【出力】 # 1, -2, 3, -2 または 3, -2, 1, -2 # # 【テストデータ5:入力】 # 3, 5, 7 # 【出力】 # エラー # '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。'(_α,_β,_γ,_a,_b,_c,_d) :- findall([_a,_b,_c,_d], '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d),_解ならび), 重複解を取り除く(_解ならび,_a,_b,_c,_d). '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d) :- 検査範囲の確定(_α,_γ,S_1,E_1,S_2,E_2), '_a,_b,_c,_dの候補を得る'(_α,_γ,S_1,E_1,S_2,E_2,_a,_b,_c,_d), _β is _a * _d + _c * _b. '_a,_b,_c,_dの候補を得る'(_α,_γ,S_1,E_1,S_2,E_2,_a,_b,_c,_d) :- '_a,_c候補'(_α,S_1,E_1,_a,_c), '_b,_d候補'(_γ,S_2,E_2,_b,_d). '_a,_c候補'(_α,S_1,E_1,_a,_c) :- between(S_1,E_1,_a), between(S_1,E_1,_c), _α is _a * _c. '_b,_d候補'(_γ,S_2,E_2,_b,_d) :- between(S_2,E_2,_b), between(S_2,E_2,_d), _γ is _b * _d. 検査範囲の確定(_α,_γ,S_1,E_1,S_2,E_2) :- '_αの検査範囲'(_α,S_1,E_1), '_γの検査範囲'(_γ,S_2,E_2). '_αの検査範囲'(_α,S_1,E_1) :- E_1 is abs(_α), S_1 is -1 * E_1. '_γの検査範囲'(_γ,S_2,E_2) :- E_2 is abs(_γ), S_2 is -1 * E_2. 重複解を取り除く(_解ならび,_a,_b,_c,_d) :- append(L0,[[_a,_b,_c,_d]|_],_解ならび), \+(member([_c,_d,_a,_b],L0)), '_a,_cと_b,_dにそれぞれ-1を掛ける'(_a,_b,_c,_d,_a_1,_b_1,_c_1,_d_1), \+(member([_a_1,_b_1,_c_1,_d_1],L0)). '_a,_cと_b,_dにそれぞれ-1を掛ける'(_a,_b,_c,_d,_a_1,_b_1,_c_1,_d_1) :- _a_1 is _a * -1, _b_1 is _b * -1, _c_1 is _c * -1, _d_1 is _d * -1. % 以下のサイトは # 出典 :: CodeIQ q1365 # # 成績の分布などを表すのに使われる度数分布表。 # ひと目で全体の散らばり具合がわかって便利です。 # # 【問題】 # 今回は素数の度数分布表を作ってみます。 # 入力として2つの正の整数が与えられます。 # 一つ目は分布させる素数の最大値、二つ目は区切りの大きさです。 # 例えば、30と5が与えられたとき、30までの素数を5で区切って出力します。 # 30までの素数は2, 3, 5, 7, 11, 13, 17, 19, 23, 29ですので、 # 出力内容は以下のようになります。 # 01-05:*** # 06-10:* # 11-15:** # 16-20:** # 21-25:* # 26-30:* # 同様に、40と7が与えられると、以下のように出力されます。 # 01-07:**** # 08-14:** # 15-21:** # 22-28:* # 29-35:** # 36-42:* # 上記のように出力するプログラムを作成してください。 # なお、最低限、以下の入力に対して正常に動作することを確認してください。 # 入力1:100 15 # 入力2:1200 25 # 入力3:12345 789 # '今回は素数の度数分布表を作ってみます。'(_最大値,_区切り) :- 素数の度数分布表(_最大値,_区切り,_度数分布表), 度数分布図として表示する(_度数分布表). 素数の度数分布表(_最大値,_区切り,_度数分布表) :- 素数を生成する(_最大値,_素数ならび), 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表). 素数を生成する(_最大値,_素数ならび) :- findall(_自然数,between(2,_最大値,_自然数),L), エラトステネスの篩(L,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- エラトステネスの篩(M,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(M,R1,L) :- findall(N,( member(N,R1), \+(0 is N mod M)),L). 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表) :- findall([_範囲下限,_範囲上限,_度数],( 素数の度数分布(_素数ならび,_最大値,_区切り,1,_区切り,_範囲下限,_範囲上限,_度数)),_度数分布表). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限,_範囲上限,_範囲下限,_範囲上限,_度数) :- 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数). 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数) :- _範囲下限 =< _最大値, 度数((between(_範囲下限,_範囲上限,_素数),member(_素数,_素数ならび)),_度数). '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- _範囲下限_1 =< _最大値, 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限), 素数の度数分布(_素数ならび,_最大値,_区切り,_次の範囲下限,_次の範囲上限,_範囲下限,_範囲上限,_度数). 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限) :- _次の範囲下限 is _範囲下限_1 + _区切り, _次の範囲上限 is _範囲上限_1 + _区切り. 度数(_目標,_度数) :- findall(_,_目標,L), length(L,_度数). 度数分布図として表示する(_度数分布表) :- 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数), 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数). 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数), 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲上限の表示桁数). 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数) :- findall(_桁数,範囲下限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲下限の表示桁数). 範囲下限値の桁数(_度数分布表,_下限桁数) :- member([_範囲下限,_,_],_度数分布表), number_chars(_範囲下限,Chars), length(Chars,_下限桁数). 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲の表示桁数) :- findall(_桁数,範囲上限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲の表示桁数). 範囲上限値の桁数(_度数分布表,_上限桁数) :- member([_,_範囲上限,_],_度数分布表), number_chars(_範囲上限,Chars), length(Chars,_上限桁数). 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- forall( member([_範囲下限,_範囲上限,_度数],_度数分布表), 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数)). 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数) :- ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列), 星文字列(_度数,_星文字列), writef('%w:%w\n',[_範囲表現文字列,_星文字列]). ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列) :- ヘッドゼロサプライ(_範囲下限の表示桁数,_範囲下限,_表示範囲下限), ヘッドゼロサプライ(_範囲上限の表示桁数,_範囲上限,_表示範囲上限), atomic_list_concat([_表示範囲下限,'-',_表示範囲上限],_範囲表現文字列). ヘッドゼロサプライ(_桁数,_数値,_ヘッドゼロサプライ数値表現) :- ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト), 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト), 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現). ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト) :- length(_ヘッドゼロサプライされたリスト,_桁数). 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト) :- number_chars(_数値,_数字のリスト), append(_頭部の枠リスト,_数字のリスト,_ヘッドゼロサプライされたリスト), 全ての要素が同じ(_頭部の枠リスト,'0'). 全ての要素が同じ([],_). 全ての要素が同じ([V|R],V) :- 全ての要素が同じ(R,V). 星文字列(_度数,_星文字列) :- findall(*,between(1,_度数,_),L), atomic_list_concat(L,_星文字列). 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現) :- atom_chars(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは パターンで変数ならびを埋める(_変数ならび,_パターン) :- 停止条件は_変数ならびの長さが_パターンの長さに等しいか小さくなった時(_変数ならび,_パターン),!. パターンで変数ならびを埋める(_変数ならび,_パターン) :- パターンで順に単一化して行く(_変数ならび,_パターン). パターンで順に単一化して行く(_変数ならび_1,_パターン) :- copy_term(_パターン,_複写パターン), append(_複写パターン,_変数ならび_2,_変数ならび_1), パターンで変数ならびを埋める(_変数ならび_2,_パターン). 停止条件は_変数ならびの長さが_パターンの長さに等しいか小さくなった時(_変数ならび,_パターン) :- copy_term(_パターン,_複写パターン), append(_変数ならび,_,_複写パターン). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1197620454/699 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク): # 1.acをabbに置き換える最小のレーヴェンシュタイン距離を求めよ # 2.1をもとにdiffツールを作成せよ。なお、出力時の形式は以下のとおりとする # ac # ^ # # abb # || # レーベンシュタイン距離(_文字列1,_文字列2,_レーベンシュタイン距離) :- 編集距離(_文字列1,_文字列2,_レーベンシュタイン距離). 編集距離(S1,S2,_編集距離) :- atom_chars(S1,LX), atom_chars(S2,LY), ならびの編集距離(LX,LY,LZ), length(LZ,_編集距離),!. ならびの編集距離(LX,LY,LZ) :- 'ならびの編集距離の停止条件はLXかLYが[]'(LX,LY,LZ). ならびの編集距離(LX,LY,LZ) :- ならびの編集距離の共通部分を取り除いていく(LX,LY,LZ). ならびの編集距離(LX,LY,LZ) :- append(LX,LY,LZ). 'ならびの編集距離の停止条件はLXかLYが[]'([],LY,LY). 'ならびの編集距離の停止条件はLXかLYが[]'(LX,[],LX). ならびの編集距離の共通部分を取り除いていく(LX,LY,LZ) :- ならびの編集距離の共通部分と残りの部分に分離する(LX,LY,L0,L1,L2,L01,L21), append(L01,L21,LYR), append(L0,LZ_1,LZ), ならびの編集距離(L2,LYR,LZ_1). ならびの編集距離の共通部分と残りの部分に分離する(LX,LY,L0,L1,L2,L01,L21) :- append(L0,L1,L2,LX), \+(L1 = []), append(L01,L1,L21,LY). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出典 :: CodeIQ q1346 # # あるとき、マシューは美人な双子と出会った。お姉さん、妹さん、実に美しいのだ!この2人、双子でありつつ、とても仲が良い。仲が良すぎて、同じタイミングで話すという特技がある。 # # 姉&妹 「あ。マシューだ。」 # マシュー「いかにもマシューだ。」 # 姉&妹 「双子ならではのクイズを出してもいい?」 # マシュー「え、あ、いいよ。」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # マシュー「・・・え?」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # # なんだかとんでもないクイズに巻き込まれてしまった!プログラムを書いて答えてほしい。 # # 解き方だが、 (3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力して欲しい。 # '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する' :- '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび), '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび). '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび) :- findall(M,between(2,1000,M),_小さい順に並んだ2から1000までの整数ならび), '1000以下の素数ならびを小さい順に得る'(_小さい順に並んだ2から1000までの整数ならび,_1000以下の素数ならび). '1000以下の素数ならびを小さい順に得る'([],[]) :- !. '1000以下の素数ならびを小さい順に得る'([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), '1000以下の素数ならびを小さい順に得る'(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび) :- '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび), '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび). '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび) :- findall([_1,_2],'1000以下の双子素数の'(_1000以下の素数ならび,_1,_2),_1000以下の双子素数ならび). '1000以下の双子素数の'(_1000以下の素数ならび,_1,_2) :- append(_,[_1,_2|_],_1000以下の素数ならび), 2 is _2 - _1. '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび) :- 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R), 'カンマ区切りで標準出力する'(R,_1,_2), R = []. 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R) :- append(_,[[_1,_2]|R],_1000以下の双子素数ならび). 'カンマ区切りで標準出力する'(R,_1,_2) :- 'Rが[]の時は_1,_2出力後カンマは省略して改行する'(R,_1,_2). 'カンマ区切りで標準出力する'(R,_1,_2) :- 'Rが[]でない時は_1,_2出力後カンマを出力する'(R,_1,_2). 'Rが[]の時は_1,_2出力後カンマは省略して改行する'([],_1,_2) :- writef('(%t,%t)\n',[_1,_2]). 'Rが[]でない時は_1,_2出力後カンマを出力する'([_|_],_1,_2) :- writef('(%t,%t), ',[_1,_2]). :- '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する',halt. % 以下のサイトは # 出典 :: CodeIQ q1346 # # あるとき、マシューは美人な双子と出会った。お姉さん、妹さん、実に美しいのだ!この2人、双子でありつつ、とても仲が良い。仲が良すぎて、同じタイミングで話すという特技がある。 # # 姉&妹 「あ。マシューだ。」 # マシュー「いかにもマシューだ。」 # 姉&妹 「双子ならではのクイズを出してもいい?」 # マシュー「え、あ、いいよ。」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # マシュー「・・・え?」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # # なんだかとんでもないクイズに巻き込まれてしまった!プログラムを書いて答えてほしい。 # # 解き方だが、 (3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力して欲しい。 # '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する' :- '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび), '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび). '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび) :- findall(M,between(2,1000,M),_小さい順に並んだ2から1000までの整数ならび), エラトステネスの篩(_小さい順に並んだ2から1000までの整数ならび,_1000以下の素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), エラトステネスの篩(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,( 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの)),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび) :- '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび), '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび). '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび) :- findall([_1,_2],'1000以下の双子素数の'(_1000以下の素数ならび,_1,_2),_1000以下の双子素数ならび). '1000以下の双子素数の'(_1000以下の素数ならび,_1,_2) :- append(_,[_1,_2|_],_1000以下の素数ならび), 2 is _2 - _1. '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび) :- 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R), 'カンマ区切りで標準出力する'(R,_1,_2), R = []. 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R) :- append(_,[[_1,_2]|R],_1000以下の双子素数ならび). 'カンマ区切りで標準出力する'(R,_1,_2) :- 'Rが[]の時は_1,_2出力後カンマは省略して改行して終わる'(R,_1,_2),!. 'カンマ区切りで標準出力する'(_,_1,_2) :- writef('(%t,%t), ',[_1,_2]). 'Rが[]の時は_1,_2出力後カンマは省略して改行して終わる'([],_1,_2) :- writef('(%t,%t)\n',[_1,_2]). :- '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する',halt. % 以下のサイトは # # データベースに在る一日分売上データを給油所別月別ファイルに追加保存する。 # 保存ファイルは例えば "志村_売上_201501.pro" のようなファイル名である。 # 給油所(志村,'300203'). 給油所(上野毛,'300206'). 給油所(横浜南,'370113'). 給油所(熊谷,'370105'). 給油所(けやき台,'370109'). 給油所(秩父21,'370111'). 給油所(狭山ヶ丘,'370112'). 売上保存(_保存月,_保存日) :- '保存日から入力年月日を得て、一日分のデータを売上保存ファイルに書き足す。'(_保存月,_保存日). '保存日から入力年月日を得て、一日分のデータを売上保存ファイルに書き足す。'(_保存月,_保存日) :- '保存日から入力年月日を得て、'(_保存日,_入力年月日), '一日分のデータを売上保存ファイルに書き足す。'(_保存月,_入力年月日). '保存日から入力時刻下限、上限を得て、'(_保存日,_入力年月日) :- '売上保存_年-_月-_日'(_保存日,_年,_月,_日), 売上保存_入力年月日(_年,_月,_日,_入力年月日). '売上保存_年-_月-_日'(_保存日,_年,_月,_日) :- sub_atom(_保存日,0,4,_,_年), sub_atom(_保存日,4,2,_,_月), sub_atom(_保存日,6,2,_,_日). 売上保存_入力年月日(_年,_月,_日,_入力年月日) :- atomic_list_concat([_年,'-',_月,'-',_日],_入力年月日). '一日分のデータを売上保存ファイルに書き足す。'(_保存月,_入力年月日) :- forall(売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ), 売上保存の一日分データを書き出す(_出力,_一日分データ)). 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ) :- 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力), データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ). 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力) :- 給油所(_給油所,_出荷場所), atomic_list_concat([_給油所,'_売上_',_保存月,'.pro'],_保存ファイル名), open(_保存ファイル名,append,_出力). データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ) :- findall([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20],( 売上(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20), 出荷場所と入力時刻が指定と一致する(_16,_出荷場所,_20,_入力年月日)),_一日分データ). 出荷場所と入力時刻が指定と一致する(_出荷場所,_出荷場所,_入力時刻,_入力年月日) :- sub_atom(_入力時刻,0,10,_,_入力年月日). 売上保存の一日分データを書き出す(_出力,[]) :- close(_出力). 売上保存の一日分データを書き出す(_出力,[]) :- 売上保存の一日分データを書き出して行く(_出力,_一日分データ). 売上保存の一日分データを書き出して行く(_出力,_一日分データ) :- 売上保存一行表示(_出力,_組), 売上保存の一日分データを書き出す(_出力,_残り). 売上保存一行表示(_出力,_組) :- _売上 =.. [売上|_組], format(_出力,'~w.\n',[_売上]). % 以下のサイトは # # データベースに在る一日分売上データを給油所別月別ファイルに追加保存する。 # 保存ファイルは例えば "志村_売上_201501.pro" のようなファイル名である。 # 売上保存(_保存月,_保存日) :- '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日), 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ,_残り), 売上保存の一日分データを書き出す(_出力,_一日分データ), _残り = []. '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日) :- '売上保存_年-_月-_日'(_保存日,_年,_月,_日), 売上保存_入力年月日(_年,_月,_日,_入力年月日). '売上保存_年-_月-_日'(_保存日,_年,_月,_日) :- sub_atom(_保存日,0,4,_,_年), sub_atom(_保存日,4,2,_,_月), sub_atom(_保存日,6,2,_,_日). 売上保存_入力年月日(_年,_月,_日,_入力年月日) :- atomic_list_concat([_年,'-',_月,'-',_日],_入力年月日). 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ,_残り) :- 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力,_残り), データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ). 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力,_残り) :- append(_,[[_給油所,_出荷場所]|_残り],[[志村,'300203'],[上野毛,'300206'],[熊谷,'370105'],[けやき台,'370109'],[秩父21,'370111'],[狭山ヶ丘,'370112'],[横浜南,'370113']]), atomic_list_concat([_給油所,'_売上_',_保存月,'.pro'],_保存ファイル名), open(_保存ファイル名,append,_出力). データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ) :- findall([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20],( 売上(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20), 出荷場所と入力時刻から組を得る(_16,_出荷場所,_20,_入力年月日)),_一日データ). 出荷場所と入力時刻から組を得る(_出荷場所,_出荷場所,_入力時刻,_入力年月日,_組) :- sub_atom(_入力時刻,0,10,_,_入力年月日). 売上保存の一日分データを書き出す(_出力,_一日分データ) :- append(_,[_組|_残り],_一日分データ), 売上保存一行表示(_出力,_組), 売上保存の一日分書き出しを完了する(_出力,_残り). 売上保存一行表示(_出力,_組) :- _売上 =.. [売上|_組], writeq(_出力,_売上), write(_出力,'.\n'). 売上保存の一日分書き出しを完了する(_出力,[]) :- close(_出力). % 以下のサイトは # 出典 :: twitter_by_@a_hisame_20150219 # # "aがn回以上続いた直後にbがn回続く"ことを(拡張)正規表現で有限長で表現できるんでしたっけ? (nは0以上の任意の整数) # 'aがn回以上続いた直後にbがn回続く(nは0以上の任意の整数)'(_文字列,_n,_前文字列,_適合文字列,_後文字列) :- 'aがn回以上続いた'(_n,_文字列,_前文字列,L2,L3), '直後にbがn回続く'(_n,L2,L3,L2_2,L3_2), atom_chars(_適合文字列,L2_2), atom_chars(_後文字列,L3_2). 'aがn回以上続いた'(_n,_文字列,_前文字列,L2,L3) :- sub_atom(_文字列,_前文字列,_適合文字列_1,_後文字列_1,L1,L2,L3), all(L2,a), \+(last(L1,a)), \+(L3 = [a|_]), length(L2,Len_1), Len_1 >= _n. '直後にbがn回続く'(_n,L2,L3,L2_2,L3_2) :- findall(b,between(1,_n,_),L), append(L,L3_2,L3), \+(L3_2 = [b|_]), append(L2,L,L2_2). all([],A). all([A|R],A) :- all(R,A). sub_atom(A,H,X,T,HL,XL,TL) :- atomic(X), atom_chars(A,L), atom_chars(X,XL), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,H,X,T,HL,XL,TL) :- var(X), atom_chars(A,L), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), \+(XL = []), atom_chars(T,TL). % 以下のサイトは %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 情報をリストで保持する (Prologではあまり使いません) wrrior([[nagisa_misumi, futari_ha, black], [honoka_yukishiro, futari_ha, white], [hikari_kujo, max_heart, luminus], [saki_hyuga, splash_star, bloom], [mai_misho, splash_star, eaglette], [nozomi_yumehara, yes, dream], [rin_natsuki, yes, rouge], [urara_kasugano, yes, lemonade], [komachi_akimoto, yes, mint], [karen_minazuki, yes, aqua], [geki, juranger, tirano], [goushi, juranger, manmos], [dan, juranger, torikera], [boy, juranger, tiger], [mei, juranger, ptera], [burai, juranger, dragon]]). series([[precure, splash_star], [precure, futari_ha], [precure, yes], [super_squadron, juranger]]). ?- wrrior(L1),series(L2), member([Name,B,_],L1), member([precure,B],L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 先にfindall をしてしまうのもあります warrior(nagisa_misumi, futari_ha, black). warrior(honoka_yukishiro, futari_ha, white). warrior(hikari_kujo, max_heart, luminus). warrior(saki_hyuga, splash_star, bloom). warrior(mai_misho, splash_star, eaglette). warrior(nozomi_yumehara, yes, dream). warrior(rin_natsuki, yes, rouge). warrior(urara_kasugano, yes, lemonade). warrior(komachi_akimoto, yes, mint). warrior(karen_minazuki, yes, aqua). warrior(geki, juranger, tirano). warrior(goushi, juranger, manmos). warrior(dan, juranger, torikera). warrior(boy, juranger, tiger). warrior(mei, juranger, ptera). warrior(burai, juranger, dragon). series(precure, splash_star). series(precure, futari_ha). series(precure, yes). series(super_squadron, juranger). ?- findall([A,B],warrior(A,B,_),L1), findall([C],series(precure,C),L2), member([Name,Key],L1), member([Key],L2). ?- findall([A,B],warrior(A,B,_),L1), findall(C,series(precure,C),L2), member([Name,Key],L1), member(Key,L2). ?- findall([A,B],warrior(A,B,_),L1), findall(C,series(precure,C),L2), append(_,[[Name,Key]|_],L1), append(_,[C|_],L2). % 以下のサイトは たしざんの繰り上がり(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび) :- '繰り上がりの停止条件は_繰り上がりが0_又は_上位桁ならびが[]になった時である'(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび),!. たしざんの繰り上がり(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび) :- 下位桁から上位桁に向けて順に繰り上がりを再帰的に計算する(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび). '繰り上がりの停止条件は_繰り上がりが0_又は_上位桁ならびが[]になった時である'(0,L,L) :- !. '繰り上がりの停止条件は_繰り上がりが0_又は_上位桁ならびが[]になった時である'(N,[],[N]). 下位桁から上位桁に向けて順に繰り上がりを再帰的に計算する(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび) :- append(L1,[_最終桁],_上位桁ならび), たしざん(_最終桁,_繰り上がり,_最下位桁たしざん結果,_繰り上がり_1), たしざんの繰り上がり(_繰り上がり_1,L1,_繰り上がった上位桁ならび_1), append(_繰り上がった上位桁ならび_1,[_最下位桁たしざん結果],_繰り上がった上位桁ならび). たしざん(0,0,0,0). たしざん(0,1,1,0). たしざん(0,2,2,0). たしざん(0,3,3,0). たしざん(0,4,4,0). たしざん(0,5,5,0). たしざん(0,6,6,0). たしざん(0,7,7,0). たしざん(0,8,8,0). たしざん(0,9,9,0). たしざん(2,0,3,0). たしざん(2,1,4,0). たしざん(2,2,5,0). たしざん(2,3,6,0). たしざん(2,4,6,0). たしざん(2,5,7,0). たしざん(2,6,8,0). たしざん(2,7,9,0). たしざん(2,8,0,1). たしざん(2,9,1,1). たしざん(3,0,3,0). たしざん(3,1,4,0). たしざん(3,2,5,0). たしざん(3,3,6,0). たしざん(3,4,7,0). たしざん(3,5,8,0). たしざん(3,6,9,0). たしざん(3,7,0,1). たしざん(3,8,1,1). たしざん(3,9,2,1). たしざん(4,0,4,0). たしざん(4,1,5,0). たしざん(4,2,6,0). たしざん(4,3,7,0). たしざん(4,4,8,0). たしざん(4,5,9,0). たしざん(4,6,0,1). たしざん(4,7,1,1). たしざん(4,8,2,1). たしざん(4,9,3,1). たしざん(5,0,5,0). たしざん(5,1,6,0). たしざん(5,2,7,0). たしざん(5,3,8,0). たしざん(5,4,9,0). たしざん(5,5,0,1). たしざん(5,6,1,1). たしざん(5,7,2,1). たしざん(5,8,3,1). たしざん(5,9,4,1). たしざん(6,0,6,0). たしざん(6,1,7,0). たしざん(6,2,8,0). たしざん(6,3,9,0). たしざん(6,4,0,1). たしざん(6,5,1,1). たしざん(6,6,2,1). たしざん(6,7,3,1). たしざん(6,8,4,1). たしざん(6,9,5,1). たしざん(7,0,7,0). たしざん(7,1,8,0). たしざん(7,2,9,0). たしざん(7,3,0,1). たしざん(7,4,1,1). たしざん(7,5,2,1). たしざん(7,6,3,1). たしざん(7,7,4,1). たしざん(7,8,5,1). たしざん(7,9,6,1). たしざん(8,0,8,0). たしざん(8,1,9,0). たしざん(8,2,0,1). たしざん(8,3,1,1). たしざん(8,4,2,1). たしざん(8,5,3,1). たしざん(8,6,4,1). たしざん(8,7,5,1). たしざん(8,8,6,1). たしざん(8,9,7,1). たしざん(9,0,9,0). たしざん(9,1,0,1). たしざん(9,2,1,1). たしざん(9,3,2,1). たしざん(9,4,3,1). たしざん(9,5,4,1). たしざん(9,6,5,1). たしざん(9,7,6,1). たしざん(9,8,7,1). たしざん(9,9,8,1). % 以下のサイトは % [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(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは 繰り上がり(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび) :- '繰り上がりの停止条件は_繰り上がりが0_又は_上位桁ならびが[]になった時である'(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび),!. 繰り上がり(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび) :- 下位桁から上位桁に向けて順に繰り上がりを再帰的に計算する(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび). '繰り上がりの停止条件は_繰り上がりが0_又は_上位桁ならびが[]になった時である'(0,L,L) :- !. '繰り上がりの停止条件は_繰り上がりが0_又は_上位桁ならびが[]になった時である'(N,[],[N]). 下位桁から上位桁に向けて順に繰り上がりを再帰的に計算する(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび) :- append(L1,[_最終桁],_上位桁ならび), 加算(_最終桁,_繰り上がり,_最下位桁加算結果,_繰り上がり_1), 繰り上がり(_繰り上がり_1,L1,_繰り上がった上位桁ならび_1), append(_繰り上がった上位桁ならび_1,[_最下位桁加算結果],_繰り上がった上位桁ならび). 加算(M,N,_加算結果,_繰り上がり) :- _加算結果 is (M + N) mod 10, _繰り上がり is (M + N) // 10. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1295436346/173 # # 質問させてください # selectしたデータを一部だけ別のテーブルに入れる方法ってありますか? # # 例:insert into table2 (aaa,bbb,ccc) select aaa as aaa,bbb as bbb,ccc as ccc from table1 # この場合table1のデータがすべてtable2に入るのでaaaだけ別のデータを入れたいと思っています。 # よろしくお願いします。 # # 海に接していない都道府県名([栃木県,群馬県,埼玉県,山梨県,長野県,岐阜県,滋賀県,奈良県]). table1(奈良県,1000,aa). table1(埼玉県,2000,ab). selectしたデータを一部だけ別のテーブルに入れる方法 :- 海に接していない都道府県名(_海に接していない都道府県名ならび), table1(_都道府県名の一,_bbb,_ccc), 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二), assertz(table2(_都道府県名の二,_bbb,_ccc)), fail. selectしたデータを一部だけ別のテーブルに入れる方法. 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二) :- M is (random mod 8) + 1, list_nth(M,_海に接していない道府県名ならび,_都道府県名の二), \+(_都道府県名の一 = _都道府県名の二), \+(table2(_都道府県名の二,_,_)). 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二) :- 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二). ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/584 # # MySQL 5.5.19 . 長くなりますので # テーブルの定義・内容と欲しい結果はここに # http://ime.nu/codepad.org/oe1jhVrF # # で、 # # create table a_tbl( # code int(9) not null, # input_date date not null, # data1 double(9,2) unsigned default 0 not null, # data2 double(9,2) unsigned default 0 not null, # primary key(code,input_date) # ) ; # # insert into a_tbl # values # (1111,'2012-02-01',10,12), # (1111,'2012-02-02',133,14), # (1111,'2012-02-04',13,15), # (1111,'2012-02-06',13,10); # # create table b_tbl( # code varchar(10) not null, # input_date date not null, # data1 double(9,2) unsigned default 0 not null, # data2 double(9,2) unsigned default 0 not null, # primary key(code,input_date) # ) ; # # insert into b_tbl # values # ('ddd','2012-02-01',122,13), # ('ddd','2012-02-03',127,18), # ('ddd','2012-02-04',11,14), # ('ddd','2012-02-05',16,95), # ('ddd','2012-02-06',13,10); # # 欲しい結果 # input_date a.data1 a.data2 b.data2 # 2012-02-01 10 12 13 # 2012-02-02 133 14 null # 2012-02-03 null null 18 # 2012-02-04 13 15 14 # 2012-02-05 null null 95 # 2012-02-06 13 10 10 # # # select a.input_date,b.input_date,a.data1,a.data2,b.data2 # from a_tbl a # right join b_tbl b # on a.input_date = b.input_date; とすると、結果が # +------------+------------+-------+-------+-------+ # | input_date | input_date | data1 | data2 | data2 | # +------------+------------+-------+-------+-------+ # | 2012-02-01 | 2012-02-01 | 10 | 12 | 13 | # | NULL | 2012-02-03 | NULL | NULL | 18 | # | 2012-02-04 | 2012-02-04 | 13 | 15 | 14 | # | NULL | 2012-02-05 | NULL | NULL | 95 | # | 2012-02-06 | 2012-02-06 | 13 | 10 | 10 | # +------------+------------+-------+-------+-------+ # なんですが、実際にはいろんなコードが入っているので、コードも抽出条件に入れたら # select a.input_date,b.input_date,a.data1,a.data2,b.data2 # from a_tbl a # right join b_tbl b # on a.input_date = b.input_date # where # a.code=1111 and b.code='ddd'; # +------------+------------+-------+-------+-------+ # | input_date | input_date | data1 | data2 | data2 | # +------------+------------+-------+-------+-------+ # | 2012-02-01 | 2012-02-01 | 10 | 12 | 13 | # | 2012-02-04 | 2012-02-04 | 13 | 15 | 14 | # | 2012-02-06 | 2012-02-06 | 13 | 10 | 10 | # +------------+------------+-------+-------+-------+ # になってしまいました。 # コードを抽出条件に入れた状態で望ましい結果または上の方の結果になるようなSQLを教えて下さい。 # 'input_dateの集合を得る'(_input_dateの集合) :- findall(_input_date,a_tbl(_input_date,_,_),L1), findall(_input_date,b_tbl(_input_date,_,_),L2), append(L1,L2,L3), setof(_input_date,member(_input_date,L3),_input_dateの集合). 抽出(_input_date,_tbl_aのdata1ならび,_tbl_aのdata2ならび,_tbl_bのdata2ならび) :- 'input_dateの集合を得る'(_input_dateの集合), member(_input_date,_input_dateの集合), findall([_data1],tbl_a(_,_input_date,_data1,_),_tbl_aのdata1ならび), findall([_data2],tbl_a(_,_input_date,_,_data2),_tbl_aのdata2ならび), findall([_data2],tbl_b(_,_input_date,_,_data2),_tbl_bのdata2ならび). # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/633 # # MySQL 5.1です。 # # create table staff_list( # staff_id int(5) primary key //社員番号 # staff_name varchar(8) //社員名 # unit varchar(8) primary key //部署名 # ) # # insert into staff_list (staff_id,staff_name,unit) values # (1,'範馬','総務'), # (2,'愚地','総務'), # (3,'花山','総務'), # (1,'高津','企画'), # (2,'池谷','企画'), # (3,'長嶋','企画'), # (1,'鳩山','営業'), # (2,'野田','営業'), # (3,'小沢','営業'), # (4,'枝野','営業') # # # # このようなテーブルに対してSELECTをかける際、一度のクエリーで # 部署別にソートしたうえで、総務だけstaff_id降順で他を昇順で出したいと思っています。 # # order by unit,IF(staff_name='総務',staff_id desc,staff_id asc) # などと試行してみているのですがうまくできません。 # # どなたかうまい方法をご存じないでしょうか。 # # よろしくお願いいたします。 # スタッフリスト(1,範馬,総務). スタッフリスト(2,愚地,総務). スタッフリスト(3,花山,総務). スタッフリスト(1,高津,企画). スタッフリスト(2,池谷,企画). スタッフリスト(3,長嶋,企画). スタッフリスト(1,鳩山,営業). スタッフリスト(2,野田,営業). スタッフリスト(3,小沢,営業). スタッフリスト(4,枝野,営業). 'このようなテーブルを選択する際、一度部署別にソートしたうえで、総務だけ社員番号降順で出したいと思っています。'(_部署名,_社員番号,_社員名) :- 一度部署別にソートしたうえで(_部署名ならび), 総務だけ社員番号降順で出したい(_部署名ならび,_部署名,_社員番号,_社員名). 一度部署別にソートしたうえで(_部署名ならび) :- findsetof(_部署名,( スタッフリスト(_社員番号,_社員名,_部署名)), _部署名ならび). 総務だけ社員番号降順で出したい(_部署名ならび,_部署名,_社員番号,_社員名) :- member(_部署名,_部署名ならび), 総務だけ社員番号降順で出したい(_部署名,_社員番号,_社員名). 総務だけ社員番号降順で出したい(総務,_社員番号,_社員名) :- 総務だけ社員番号降順で(_社員番号,_社員名). 総務だけ社員番号降順で出したい(_部署名,_社員番号,_社員名) :- \+(_部署名 == 総務), スタッフリスト(_社員番号,_社員名,_部署名). 総務だけ社員番号降順で(_社員番号,_社員名) :- findall([_社員番号,_社員名],( スタッフリスト(_社員番号,_社員名,総務)), L1), 降順でソート(L1,L2), member([社員番号,_社員名],L2). 降順でソート(L1,L2) :- sort(L1,L3), reverse(L3,L2). % % findsetof/3 % # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/666 # # SQLite3を使っています。 # # カラムがなかったらinsert # あったらupdateしたいのですが、 # どういうSQLをかけばいいのでしょうか? # # insert into t1(c1, c2) values("hoge",10) # update t1 set c2=10 WHERE c1="hoge" # このときc1はuniqueです。 # # よろしくお願いします。 # # 'カラムがなかったらinsert あったらupdateしたい'(_テーブル,_カラムならび,_鍵カラム,_鍵値) :- findall(_カラム,( テーブル定義(_テーブル,_番目,_カラム)), L1), 鍵値をセットする(_テーブル,_鍵カラム,_鍵値,P), 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび). 鍵値をセットする(_テーブル,L1,_鍵カラム,_鍵値,P) :- length(L1,Len), length(L2,Len), nth1(Nth,L1,_鍵カラム), nth1(Nth,L2,_鍵値), P =.. [_テーブル|L2]. 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび) :- call(P),!, ( retract(P), Q =.. [_テーブル|_カラムならび], asserta(Q), fail; true). 'カラムがなかったらinsert あったらupdateしたい'(_,_テーブル,_カラムならび) :- Q =.. [_テーブル|_カラムならび], asserta(Q). # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/684 # # ・DBMS名とバージョン # Oracle 10g # ・テーブルデーた # create table aaa ( # id number(5,0) primary key, -- 主キー # nendo char(4), -- 年度 # tsuki char(2) -- 月 # ); # insert into aaa values (1, '2012', '01'); # insert into aaa values (2, '2012', '02'); # insert into aaa values (3, '2012', '03'); # insert into aaa values (4, '2012', '04'); # insert into aaa values (5, '2012', '05'); # ・欲しい結果 # id, nendo, tsuki # -------------------- # 4, '2012', '04' # 5, '2012', '05, # 1, '2012', '01' # 2, '2012', '02' # 3, '2012', '03' # # ・説明 # 年度/月の昇順に並べたいです。 # 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。 # '・テーブルデータ create table aaa ( id number(5,0) primary key, -- 主キー nendo char(4), -- 年度 tsuki char(2) -- 月 ); insert into aaa values (1, '2012', '01'); insert into aaa values (2, '2012', '02'); insert into aaa values (3, '2012', '03'); insert into aaa values (4, '2012', '04'); insert into aaa values (5, '2012', '05'); ・欲しい結果 id, nendo, tsuki -------------------- 4, '2012', '04' 5, '2012', '05, 1, '2012', '01' 2, '2012', '02' 3, '2012', '03' ・説明 年度/月の昇順に並べたいです。 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。'(_id,_年度,_月) :- 欲しい結果(_id,_年度,_月). 年度の場合の月順('04','05'). 年度の場合の月順('05','06'). 年度の場合の月順('06','07'). 年度の場合の月順('07','08'). 年度の場合の月順('08','09'). 年度の場合の月順('09','10'). 年度の場合の月順('10','11'). 年度の場合の月順('11','12'). 年度の場合の月順('12','01'). 年度の場合の月順('01','02'). 年度の場合の月順('02','03'). 年度の場合の月順('03','04'). 欲しい結果(_id,_年度,_月) :- findsetof(_年度,aaa(_,_年度,_),_年度ならび), member(_年度,_年度ならび), 年度順に並べる('04',_id,_年度,_月). 年度順に並べる(_月,_id,_年度,_月) :- aaa(_id,_年度,_月). 年度順に並べる(_月_1,_id,_年度,_月) :- \+(_月_1 = '03'), 年度の場合の月順(_月,_次の月), 年度順に並べる(_次の月,_id,_年度,_月). # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/684 # # ・DBMS名とバージョン # Oracle 10g # ・テーブルデーた # create table aaa ( # id number(5,0) primary key, -- 主キー # nendo char(4), -- 年度 # tsuki char(2) -- 月 # ); # insert into aaa values (1, '2012', '01'); # insert into aaa values (2, '2012', '02'); # insert into aaa values (3, '2012', '03'); # insert into aaa values (4, '2012', '04'); # insert into aaa values (5, '2012', '05'); # ・欲しい結果 # id, nendo, tsuki # -------------------- # 4, '2012', '04' # 5, '2012', '05, # 1, '2012', '01' # 2, '2012', '02' # 3, '2012', '03' # # ・説明 # 年度/月の昇順に並べたいです。 # 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。 # '・テーブルデータ create table aaa ( id number(5,0) primary key, -- 主キー nendo char(4), -- 年度 tsuki char(2) -- 月 ); insert into aaa values (1, '2012', '01'); insert into aaa values (2, '2012', '02'); insert into aaa values (3, '2012', '03'); insert into aaa values (4, '2012', '04'); insert into aaa values (5, '2012', '05'); ・欲しい結果 id, nendo, tsuki -------------------- 4, '2012', '04' 5, '2012', '05, 1, '2012', '01' 2, '2012', '02' 3, '2012', '03' ・説明 年度/月の昇順に並べたいです。 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。'(_id,_年度,_月) :- 欲しい結果(_id,_年度,_月). 欲しい結果(_id,_年度,_月) :- findsetof(_年度,aaa(_,_年度,_),_年度ならび), member(_年度,_年度ならび), 年度順に並べる(['04','05','06','07','08','09','10','11','12','01','02','03'],_id,_年度,_月). 年度順に並べる([_月|R],_id,_年度,_月) :- aaa(_id,_年度,_月). 年度順に並べる([_|R],_id,_年度,_月) :- 年度順に並べる(R,_id,_年度,_月). # 質問です。 # MySQL5です。 # テーブルデータはDATE(YYYYMMの6けたのint型),CODE(varchar型),VALUE(varchar型) の3カラムからなります。 # 各日付順の降順にしたいのですが、スレッドのように、同じコードの場合、その下に日付順でソートしたいです。 # 言っていることが、よくわからなくてすみません。 # # 元テーブル # DATE, CODE, VALUE # .... # 20140401, 11, A # 20140402, 12, B # 20140403, 11, C # 20140404, 13, D # 20140405, 12, E # 20140406, 11, F # .... # # 欲しい結果 # 20140401, 11, A # 20140403, 11, C # 20140406, 11, F # 20140402, 12, B # 20140405, 12, E # 20140404, 13, D # # 宜しくお願い致します。 # # # 879 名前:NAME IS NULL [sage]: 2014/04/25(金) 17:41:21.67 ID:??? # >>877 # どうも質問が明確じゃないけど、 # insert into tname select 〜 # の形式にすればとりあえず解決しそうな話に見える。 # # >>878 # order by code, date ということ? # # # 880 名前:NAME IS NULL []: 2014/04/25(金) 17:47:38.30 ID:+Fb19Efw (3) # 879 # 分かりずらい # 欲しい結果にしてしまいました。 # # 第1キーは、日付です。 # # 元テーブル # DATE, CODE, VALUE # 20140401, 13, A # 20140402, 11, B # 20140403, 12, C # 20140404, 13, D # 20140405, 12, E # 20140406, 11, F # # 欲しい結果 # 20140401, 13, A # 20140404, 13, D # 20140402, 11, B # 20140406, 11, F # 20140403, 12, C # 20140405, 12, E # # 宜しくお願い致します。 # # # 要するに第一キーは降順、第二キーは昇順で整列する。 # 'テーブルデータはDATE(YYYYMMの6けたのint型),CODE(varchar型),VALUE(varchar型) の3カラムからなります。各日付順の降順にしたいのですが、スレッドのように、同じコードの場合、その下に日付順でソートしたいです。'(_DATE,_CODE,_VALUE) :- '要するに第一キーは降順、第二キーは昇順で整列する。'(_DATE,_CODE,_VALUE). '要するに第一キーは降順、第二キーは昇順で整列する。'(_DATE,_CODE,_VALUE) :- 第一キー順序(_CODE), 第二キー順序(_CODE,_DATE), 元テーブル(_DATE,_CODE,_VALUE). 第一キー順序(_CODE) :- findsetof(_CODE,( 元テーブル(_DATE,_CODE,_VALUE)), L1), reverse(L1,L2), member(_CODE,L2). 第二キー順序(_CODE,_DATE) :- findsetof(_DATE,( 元テーブル(_DATE,_CODE,_VALUE)), L1), member(_DATE,L1). % 以下のサイトは % % 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). % % 以下のサイトは % 使用言語 SWI-Prolog % 以下、ソースコード :- op(400,xfx,だけ). :- op(300,xf,分). :- op(400,xfx,が真になる全ての場合). :- op(500,xfx,を). :- op(600,xf,に収集する). :- op(400,xfx,を結合して). :- op(600,xf,を得る). 行のずれを意味する空白文字列(' '). 項表示形式('%6c'). パスカルの三角形 :- パスカルの三角形([_,_,_,_,_,_,_,_,_,_],[1]),!. パスカルの三角形([_],_上の行) :- '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行). パスカルの三角形([_|_行数],_上の行) :- パスカルの三角形の行を順に表示する([_|_行数],_上の行). '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行) :- パスカルの三角形の上の行を表示([],_上の行). パスカルの三角形の行を順に表示する([_|_行数],_上の行) :- 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行), パスカルの三角形(_行数,_現在行). 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行) :- 上の行の二項の和(_上の行,_上の行の二項の和) が真になる全ての場合 _上の行の二項の和 を _両端の1が落ちた計算された行 に収集する, パスカルの三角形の上の行を表示(_行数,_上の行), 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行). 上の行の二項の和(_上の行,_上の行の二項の和) :- append(_,[_左上の項,_右上の項|_],_上の行), _上の行の二項の和 is _左上の項 + _右上の項. パスカルの三角形の上の行を表示(_行数,_上の行) :- '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列), 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列), 表示する('%t%t\n',[_行頭からの空白文字列,_上の行の数字表示文字列]). '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列) :- 行のずれを意味する空白文字列(_行のずれを意味する空白文字列), _行数 分 だけ _行のずれを意味する空白文字列 を _空白文字列ならび に収集する, _空白文字列ならび を結合して _行頭からの空白文字列 を得る. 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列) :- 上の行の数字表示部分(_上の行,_上の行の数字表示部分), _上の行の数字表示部分 を結合して _上の行の数字表示文字列 を得る. 上の行の数字表示部分(_上の行,_上の行の数字表示部分) :- 項表示形式(_項表示形式), 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) が真になる全ての場合 _上の行の数字文字列 を _上の行の数字表示部分 に収集する. 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) :- member(_項,_上の行), swritef(_上の行の数字文字列,_項表示形式,[_項]). 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行) :- append([1|_両端の1が落ちた計算された行],[1],_現在行). _行数 分 だけ _行のずれを意味する空白文字列 を _空白文字列ならび に収集する :- findall(_行のずれを意味する空白文字列,member(_,_行数),_空白文字列ならび). _目標 が真になる全ての場合 _収集項 を _収集項ならび に収集する :- findall(_収集項,_目標,_収集項ならび). 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) が真になる全ての場合 _上の行の数字文字列 を _上の行の数字表示部分 に収集する :- findall(_上の行の数字文字列,( 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列)),_上の行の数字表示部分). _上の行の数字表示部分 を結合して _上の行の数字表示文字列 を得る :- atomic_list_concat(_上の行の数字表示部分,_上の行の数字表示文字列). 表示する(_表示形式項,_値ならび) :- writef(_表示形式項,_値ならび). :- nl,パスカルの三角形,nl,halt. % 以下、実行結果 # swipl -f temp1.pl 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 % 以下のサイトは # 最近、マシューはポエマーな女子高生に恋をしている。彼女は詩人なんだが、パーコさんと言うんだ。 # # パーコ :「あらゆる物体、すなわち大空、星、大地、その王国などは、精神の最も小さいものにもおよばない。なぜなら、精神はそれらのすべてと自身とを認識するが、物体は何も認識しないからである。」 # # マシュー:「それは新しい詩かい?」 # # パーコ :「違う。パスカルの『パンセ』に記載された有名な一節。知らない人がいるんだ。」 # # マシュー:「Oh...ごめんよ。」 # # パーコ :「人間は自然の中では矮小な生き物にすぎないが、考えることによって宇宙を超える、というパスカルの考え方には実に共感するものがある。」 # # マシュー:「そうだなあ。確かに、マシューの肉体は小さいが、妄想だけはいつもビッグサイズだ!・・・さて、パーコ、デートに行かないか?」 # # パーコ :「うん、そうね。じゃあ、パスカルにちなんで、パスカルの三角形をプログラムで表示して欲しい。もちろん、数学の美しさを生かした記述の仕方をしてね。」 # # 以下の三角形が10行分のパスカルの三角形だ。こちらを再現して欲しい。 # # 1 # 1 1 # 1 2 1 # 1 3 3 1 # 1 4 6 4 1 # 1 5 10 10 5 1 # 1 6 15 20 15 6 1 # 1 7 21 35 35 21 7 1 # 1 8 28 56 70 56 28 8 1 # 1 9 36 84 126 126 84 36 9 1 # # 動作確認はideoneで行う。 # ideoneで正しく動作しない場合は不正解となりますので注意してくれよ。 # 言語は40種類以上サポートしているぞ。 # # ・使用した言語 # ・ソースコード # ・答え # の3つを合わせて記述して欲しい。 % 使用言語 SWI-Prolog % 以下、ソースコード :- op(400,xfx,だけ). :- op(300,xf,分). :- op(400,xfx,が真になる全ての場合). :- op(500,xfx,を). :- op(600,xf,に収集する). :- op(400,xfx,を結合して). :- op(600,xf,を得る). 行のずれを意味する空白文字列(' '). 項表示形式('%6c'). パスカルの三角形 :- パスカルの三角形([_,_,_,_,_,_,_,_,_,_],[1]),!. パスカルの三角形([_],_上の行) :- '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行). パスカルの三角形([_|_行数],_上の行) :- パスカルの三角形の行を順に表示する([_|_行数],_上の行). '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行) :- パスカルの三角形の上の行を表示([],_上の行). パスカルの三角形の行を順に表示する([_|_行数],_上の行) :- 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行), パスカルの三角形(_行数,_現在行). 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行) :- 上の行の二項の和(_上の行,_上の行の二項の和) が真になる全ての場合 _上の行の二項の和 を _両端の1が落ちた計算された行 に収集する, パスカルの三角形の上の行を表示(_行数,_上の行), 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行). 上の行の二項の和(_上の行,_上の行の二項の和) :- append(_,[_左上の項,_右上の項|_],_上の行), _上の行の二項の和 is _左上の項 + _右上の項. パスカルの三角形の上の行を表示(_行数,_上の行) :- '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列), 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列), 表示する('%t%t\n',[_行頭からの空白文字列,_上の行の数字表示文字列]). '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列) :- 行のずれを意味する空白文字列(_行のずれを意味する空白文字列), _行数 分 だけ _行のずれを意味する空白文字列 を _空白文字列ならび に収集する, _空白文字列ならび を結合して _行頭からの空白文字列 を得る. 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列) :- 上の行の数字表示部分(_上の行,_上の行の数字表示部分), _上の行の数字表示部分 を結合して _上の行の数字表示文字列 を得る. 上の行の数字表示部分(_上の行,_上の行の数字表示部分) :- 項表示形式(_項表示形式), 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) が真になる全ての場合 _上の行の数字文字列 を _上の行の数字表示部分 に収集する. 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) :- member(_項,_上の行), swritef(_上の行の数字文字列,_項表示形式,[_項]). 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行) :- append([1|_両端の1が落ちた計算された行],[1],_現在行). _行数 分 だけ _収集項 を _収集項ならび に収集する :- findall(_収集項,member(_,_行数),_収集項ならび). _目標 が真になる全ての場合 _収集項 を _収集項ならび に収集する :- findall(_収集項,_目標,_収集項ならび). L を結合して A を得る :- atomic_list_concat(L,A). 表示する(_表示形式項,_値ならび) :- writef(_表示形式項,_値ならび). :- nl,パスカルの三角形,nl,halt. % 以下、実行結果 # swipl -f temp1.pro 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 % 以下のサイトは 有限個のデータを小さい順に並べた時中央に位置する値(_有限個のデータ,_中央値) :- 小さい順に並べた時(_有限個のデータ,_小さい順に並べた有限個のデータ), 中央に位置する値(_小さい順に並べた有限個のデータ,_中央値). 中央に位置する値(_小さい順に並べた有限個のデータ,_中央値) :- length(_小さい順に並べた有限個のデータ,_データ数), 中央に位置する値(_小さい順に並べた有限個のデータ,_データ数,_中央値). 中央に位置する値(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 'データが奇数個の場合は、中央の位置にある値'(_小さい順に並べた有限個のデータ,_データ数,_中央値). 中央に位置する値(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 'データが偶数個の場合は、中央に近い2つの値の算術平均をとる'(_小さい順に並べた有限個のデータ,_データ数,_中央値). 'データが奇数個の場合は、中央の位置にある値'(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 奇数(_データ数), _中央の位置 is (_データ数 // 2) + 1, nth1(_中央の位置,_小さい順に並べた有限個のデータ,_中央値). 'データが偶数個の場合は、中央に近い2つの値の算術平均をとる'(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 偶数(_データ数), 中央に近い2つの値の(_小さい順に並べた有限個のデータ,_データ数,_値_1,_値_2), 算術平均をとる(_値_1,_値_2,_中央値). 偶数(_整数) :- 0 is _整数 mod 2. 奇数(_整数) :- 1 is _整数 mod 2. 中央に近い2つの値の(_小さい順に並べた有限個のデータ,_データ数,_値_1,_値_2) :- _中央に近い位置_1 is _データ数 // 2, succ(_中央に近い位置_1,_中央に近い位置_2), nth1(_中央に近い位置_1,_小さい順に並べた有限個のデータ,_値_1), nth1(_中央に近い位置_2,_小さい順に並べた有限個のデータ,_値_2). 算術平均をとる(_値_1,_値_2,_中央値) :- _中央値 is ( _値_1 + _値_2 ) / 2. 小さい順に並べた時([],[]). 小さい順に並べた時(_有限個のデータ,_小さい順に並べた有限個のデータ) :- 軸要素の選定(_有限個のデータ,_軸要素,_軸要素を除いたならび), 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,_軸要素を除いたならび,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび), '軸要素で分割した二つの要素ならびを それぞれ小さい順に並べて結合する'(_軸要素,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび,_小さい順に並べた有限個のデータ). '軸要素で分割した二つの要素ならびを それぞれ小さい順に並べて結合する'(_軸要素,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび,_小さい順に並べた有限個のデータ) :- 小さい順に並べた時(_軸要素より小さい要素ならび,_小さい順にならべた軸要素より小さい要素ならび), 小さい順に並べた時(_軸要素に等しいか大きい要素ならび,_小さい順にならべた軸要素に等しいか大きい要素ならび), append(_小さい順にならべた軸要素より小さい要素ならび,[_軸要素|_小さい順にならべた軸要素に等しいか大きい要素ならび],_小さい順に並べた有限個のデータ). 軸要素の選定([_軸要素|_軸要素を除いたならび],_軸要素,_軸要素を除いたならび). 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_,[],[],[]). 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,[A|R],[A|_軸要素より小さい要素ならび],_軸要素に等しいか大きい要素ならび) :- A @< _軸要素, 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,R,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび). 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,[A|R],_軸要素より小さい要素ならび,[A|_軸要素に等しいか大きい要素ならび]) :- A @>= _軸要素, 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,R,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび). % 以下のサイトは # # qsort # 昇順整列([],[]). 昇順整列(_要素ならび,_昇順に整列した要素ならび) :- 軸要素(_要素ならび,_軸要素,_軸要素を除いた要素ならび), '軸要素より小さい要素ならびを昇順に整列したものと,軸要素に等しいか大きい要素ならびを昇順に整列したものを軸要素を挟んで結合する'(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した要素ならび). 軸要素(_要素ならび,_軸要素,_軸要素を除いた要素ならび) :- select(_軸要素,_要素ならび,_軸要素を除いた要素ならび),!. '軸要素より小さい要素ならびを昇順に整列したものと,軸要素に等しいか大きい要素ならびを昇順に整列したものを軸要素を挟んで結合する'(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した要素ならび) :- 軸要素より小さい要素ならびを昇順に整列したものと(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素より小さい要素ならび), 軸要素に等しいか大きい要素ならびを昇順に整列したものを(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび), 軸要素を挟んで結合する(_昇順に整列した軸要素より小さい要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび,_昇順に整列した要素ならび). 軸要素より小さい要素ならびを昇順に整列したものと(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素より小さい要素ならび) :- findall(_軸要素より小さい要素,( member(_軸要素より小さい要素,_軸要素を除いた要素ならび), _軸要素より小さい要素 @< _軸要素),_軸要素より小さい要素ならび), 昇順整列(_軸要素より小さい要素ならび,_昇順に整列した軸要素より小さい要素ならび). 軸要素に等しいか大きい要素ならびを昇順に整列したものを(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび) :- findall(_軸要素に等しいか大きい要素,( member(_軸要素に等しいか大きい要素,_軸要素を除いた要素ならび), _軸要素に等しいか大きい要素 @>= _軸要素),_軸要素に等しいか大きい要素ならび), 昇順整列(_軸要素に等しいか大きい要素ならび,_昇順に整列した軸要素に等しいか大きい要素ならび). 軸要素を挟んで結合する(_昇順に整列した軸要素より小さい要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび,_昇順に整列した要素ならび) :- append(_昇順に整列した軸要素より小さい要素ならび,[_軸要素|_昇順に整列した軸要素に等しいか大きい要素ならび],_昇順に整列した要素ならび). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/db/1402919549/310 # SQLServer2012です # 日々の売上の合計が一定額を越えた日を知るにはどうすればいいでしょうか? # # 10/1 |\100 # 10/2 |\200 # 10/3 |\300 # 10/4 |\200 # 10/5 |\400 # 10/6 |\100 # # 上記で\1000を越えた日=10/5と出したいです # 売上(10/1,100). 売上(10/2,200). 売上(10/3,300). 売上(10/4,200). 売上(10/5,400). 売上(10/6,100). '日々の売上の合計が一定額を越えた日を知る'(_一定額,_日々の売上の合計が一定額を越えた日) :- 整列した_日付_売上ならび(_整列した_日付_売上ならび), 日々の売上の合計が(_整列した_日付_売上ならび,_日々の売上の合計,_日々の売上の合計が一定額を越えた日), 一定額を越えた(_一定額,_日々の売上の合計),!. 整列した_日付_売上ならび(_整列した_日付_売上ならび) :- findall([_日付,_売上],売上(_日付,_売上),_日付_売上ならび), sort(_日付_売上ならび,_整列した_日付_売上ならび). 日々の売上の合計が(_整列した_日付_売上ならび,_日々の売上の合計,_一定額を越えた日) :- append(LL1,_,_整列した_日付_売上ならび), findsum(_売上,member([_,_売上],LL1),_日々の売上の合計), last(LL1,[_一定額を越えた日,_]). 一定額を越えた(_一定額,_日々の売上の合計) :- _日々の売上の合計 > _一定額. findsum(A,P,Sum) :- findall(A,P,L), sum_list(L,Sum). % 以下のサイトは # # 出典::増井技術士事務所 今週のアルゴリズムの@masuipeoさんからのアルゴリズムの問題 # # 有名な「パスカルの三角形」は「右上の数と左上の数の和」を配置していきますが、 ここでは単純な「和」ではなく、「排他的論理和」を使うことを考えます。 # 1段目から順に配置してみると、以下の図のようになります。 # # 上から順番に配置していったとき、2014番目の「0」が出力されるのは何段目になるかを求めてください。 # # 1番めの「0」は、3段目、2・3・4番目の「0」は5段目に出力されています。 # # 【解答方法】 # 解答フォームの1行目に答えを記入してください。 # 2行目以降はあなたが求めた方法を記入してください。プログラムを書いた場合はコードを貼り付けてください。 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目) :- 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_],[1],[],_何行目),!. 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(Ln,_,_0ならび,_何行目) :- '0ならびの要素数が2014以上の時は何行目'(Ln,_0ならび,_何行目). 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(Ln,_パスカルの三角形の行,_0ならび_1,_何行目) :- パスカルの三角形の次の行(_パスカルの三角形の行,_パスカルの三角形の次の行), '0ならびの更新'(_パスカルの三角形の次の行,_0ならび_1,_0ならび_2), 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_|Ln],_パスカルの三角形の次の行,_0ならび_2,_何行目). '0ならびの要素数が2014以上の時は何行目'(Ln,_0ならび,_何行目) :- length(_0ならび,_要素数), _要素数 >= 2014, length(Ln,_何行目). パスカルの三角形の次の行(_パスカルの三角形の行,_パスカルの三角形の次の行) :- findall(N,( append(_,[A,B|_],_パスカルの三角形の行), 排他的論理和(A,B,N)),_上段の対の値から排他的論理和を取ったならび), 上段の対の値から排他的論理和を取ったならびの両端に1を付加する(_上段の対の値から排他的論理和を取ったならび,_パスカルの三角形の次の行). 上段の対の値から排他的論理和を取ったならびの両端に1を付加する(_上段の対の値から排他的論理和を取ったならび,_パスカルの三角形の次の行) :- append([1|_上段の対の値から排他的論理和を取ったならび],[1],_パスカルの三角形の次の行). 排他的論理和(0,0,0). 排他的論理和(0,1,1). 排他的論理和(1,0,1). 排他的論理和(1,1,0). '0ならびの更新'([],_0ならび_1,_0ならび_1). '0ならびの更新'([0|R1],_0ならび_1,[0|_0ならび_2]) :- '0ならびの更新'(R1,_0ならび_1,_0ならび_2). '0ならびの更新'([1|R1],_0ならび_1,_0ならび_2) :- '0ならびの更新'(R1,_0ならび_1,_0ならび_2). % 以下のサイトは 等差数列([_],_公差) :- var(_公差),!,fail. 等差数列(_等差数列,_公差) :- 等差数列とは公差確定問題である(_等差数列,_公差). 等差数列とは公差確定問題である([_],_公差). 等差数列とは公差確定問題である([V|_等差数列],_公差) :- '先頭要素が変数の時、後続の数列が等差数列で公差が決まれば、後続の等差数列の先頭要素と公差からVが求まる'([V|_等差数列],_公差). 等差数列とは公差確定問題である([A,B|_等差数列],_公差) :- 先頭要素と公差が変数でない時は後続の等差数列は順に解決できる([A,B|_等差数列],_公差). 等差数列とは公差確定問題である([A|_等差数列],_公差) :- '公差が変数でAは変数でない時は、次の変数でない要素とそれまでの要素数から公差を推計して、等差数列部分を確定していく'([A|_等差数列],_公差). '先頭要素が変数の時、後続の数列が等差数列で公差が決まれば、後続の等差数列の先頭要素と公差からVが求まる'([V|_等差数列],_公差) :- 変数である(V), 等差数列(_等差数列,_公差), _等差数列 = [_後続の等差数列の先頭要素|_], V is _後続の等差数列の先頭要素 - _公差. 先頭要素と公差が変数でない時は後続の等差数列は順に解決できる([A,B|_等差数列],_公差) :- 先頭要素と公差が変数でない時は(A,_公差), 後続ならびは順に解決できる([A,B|_等差数列],_公差). 先頭要素と公差が変数でない時は(A,_公差) :- 変数ではない(A), 変数ではない(_公差). 後続ならびは順に解決できる([A,B|_等差数列],_公差) :- B is A + _公差, 等差数列([B|_等差数列],_公差). '公差が変数でAは変数でない時は、次の変数でない要素とそれまでの要素数から公差を推計して、等差数列部分を確定していく'([A|_等差数列],_公差) :- 公差が変数でAは変数でない時は(A,_公差), 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,_次の変数でない要素,_変数ならび,_残り等差数列,_公差), 等差数列部分を確定していく(A,_次の変数でない要素,_変数ならび,_残り等差数列,_公差). 公差が変数でAは変数でない時は(A,_公差) :- 変数である(_公差), 変数ではない(A). 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,A,[],[],_公差) :- '等差数列が全て変数の時は変数は全てAとなり公差は0'(A,_等差数列,_公差),!. 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,_次の変数でない要素,_変数ならび,_残りならび,_公差) :- 次の変数でない要素とそれまでの要素数から(_等差数列,_次の変数でない要素,_変数ならび,_残りならび), 公差を推計して(A,_次の変数でない要素,_変数ならび,_公差). 等差数列が全て変数の時は変数は全てAとなり公差は0(A,_等差数列,0) :- 等差数列が全て変数の時は(_等差数列), 変数は全てAとなり(A,_等差数列). 等差数列が全て変数の時は(_等差数列) :- forall(member(V,_等差数列),var(V)). 変数は全てAとなり(_等差数列,A) :- findall(A,member(_,_等差数列),_等差数列). 次の変数でない要素とそれまでの要素数から(_等差数列,_次の変数でない要素,_変数ならび,_残りならび) :- append(_変数ならび,[_次の変数でない要素|_残りならび],_等差数列), 要素は全て変数である(_変数ならび), 変数ではない(_次の変数でない要素). 要素は全て変数である(_変数ならび) :- forall(member(_変数,_変数ならび),変数である(_変数)). 公差を推計して(A,_次の変数でない要素,_変数ならび,_公差) :- length([_|_変数ならび],_分割数), _公差 is (_次の変数でない要素 - A) / _分割数. 等差数列部分を確定していく(A,B,L1,R2,_公差) :- 等差数列([A|L1],_公差), 等差数列([B|R2],_公差). 変数である(_変数) :- var(_変数). 変数ではない(_変数ではない項) :- \+(var(_変数ではない項)). % 以下のサイトは 等差数列([_],_公差) :- var(_公差),!,fail. 等差数列(_等差数列,_公差) :- 等差数列とは公差確定問題である(_等差数列,_公差),!. 等差数列とは公差確定問題である([_],_公差). 等差数列とは公差確定問題である([V|R],_公差) :- var(V), 等差数列(R,_公差), R = [B|_], V is B - _公差,!. 等差数列とは公差確定問題である([A,B|R],_公差) :- 変数ではない(A), 変数ではない(_公差), B is A + _公差, 等差数列([B|R],_公差). 等差数列とは公差確定問題である([A|R],_公差) :- var(_公差), 変数ではない(A), append(L1,[B|R2],R), forall(member(V,L1),var(V)), 変数ではない(B), length([_|L1],N), _公差 is (B - A) / N,!, 等差数列([A|L1],_公差), 等差数列([B|R2],_公差),!. 変数ではない(A) :- \+(var(A)). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(0,[0]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(1,[0,1]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(N,_フィボナッチ数列) :- 初期化(N,L), 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N), findall(_フィボナッチ数,フィボナッチ数(_,_フィボナッチ数),_フィボナッチ数列). 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C), L1=[],!. フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C) :- フィボナッチ数(B,_一つ前のフィボナッチ数), フィボナッチ数(C,_二つ前のフィボナッチ数), _フィボナッチ数 is _一つ前のフィボナッチ数 + _二つ前のフィボナッチ数, フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数). フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数) :- \+(フィボナッチ数(A,_)), assertz(フィボナッチ数(A,_フィボナッチ数)). 初期化(N,L) :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)), 'Nから0までの逆順リストを用意する'(N,L). 'Nから0までの逆順リストを用意する'(N,L) :- findall(M,between(0,N,M),L1), reverse(L1,L). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(0,[0]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(1,[0,1]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(N,_) :- 初期化(N,L), 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N). 'repeat-failループでのフィボナッチ数列の計算'(_,_フィボナッチ数列) :- findall(M,フィボナッチ数(_,M),_フィボナッチ数列). 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C), (L1=[],!,fail;fail). フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C) :- フィボナッチ数(B,_一つ前のフィボナッチ数), フィボナッチ数(C,_二つ前のフィボナッチ数), _フィボナッチ数 is _一つ前のフィボナッチ数 + _二つ前のフィボナッチ数, フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数). フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数) :- \+(フィボナッチ数(A,_)), assertz(フィボナッチ数(A,_フィボナッチ数)). 初期化(N,L) :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)), 'Nから0までの逆順リストを用意する'(L). 'Nから0までの逆順リストを用意する'(N,L) :- findall(M,between(0,N,M),L1), reverse(L1,L). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(N,_) :- 初期化, findall(M,between(0,N,M),L1), reverse(L1,L2), フィボナッチ数の解決(L2,N). 'repeat-failループでのフィボナッチ数列の計算'(_,_フィボナッチ数列) :- findall(M,フィボナッチ数(_,M),_フィボナッチ数列). 初期化 :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)). フィボナッチ数の解決(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数(B,V_1), フィボナッチ数(C,V_2), V is V_1 + V_2, \+(フィボナッチ数(A,V)), assertz(フィボナッチ数(A,V)), (L1=[],!,fail;fail). % 以下のサイトは # # 匿名変数リストを使った割り算 # 匿名変数リストを使った割り算(L1,L2,_商,_剰余) :- 匿名変数リストを使った割り算(L1,L2,[],_商,_剰余). 匿名変数リストを使った割り算(_剰余,L2,_商,_商,_剰余) :- \+((append(L2,R,L2_R),_剰余 = L2_R)). 匿名変数リストを使った割り算(L1,L2,L3,_商,_剰余) :- append(L2,R,L2_R), L1 = L2_R, 匿名変数リストを使った割り算(R,L2,[_|L3],_商,_剰余). % 以下のサイトは # # ガリ夫くん:スマ子さん、最近実は数字萌えに目覚めたんです! # # スマ子さん: 藪から棒にアブノーマル宣言をされても困るのだけれども……。 # # ガリ夫くん:特に1ちゃんと0ちゃんは最高っすよ! 長女として他の数字子ちゃん達を一生懸命支える1ちゃん。全てを無に帰す力を持ったミステリアス美少女の0ちゃん。……かわええ〜。 # # スマ子さん:……もう帰っていいかしら。 # # ガリ夫:もう数の世界には1ちゃんと0ちゃん以外要りません! 1ちゃんと0ちゃんさえいれば、それで満足です! # # スマ子さん:あら、それはなかなか鋭い指摘ね。 # # ガリ夫くん:……と言いますと? # # スマ子さん:実は、私たちが普段使っている数は、勝手に0〜9までの数を使いますよと決めているに過ぎないの。実際には0と1だけでも数を表すことは可能なのよ。 # # ガリ夫くん:ほうほう……。 # # スマ子さん:これを2進法って言うんだけれどもね。一の位が1になったら、その次の位は一の位を0に戻して、その上の位を1増やして……ってしていくとあらゆる数を表すことができるわ。例えば、1,10,11,100,101,110,111……ってな具合にね。 # # ガリ夫くん:なるほど! と言うことは全ての数は1ちゃんと0ちゃんのハーレムと化すんですね! ここは天国か! # # スマ子さん:……。ところでガリ夫くん、1ちゃんと0ちゃんはどちらがお好き? # # ガリ夫くん:う〜〜〜ん……甲乙つけ難いですが、やっぱり健気な1ちゃんですかね〜。 # # スマ子さん:じゃあその1ちゃん、ハーレムの中にどれぐらいいるのか、知りたくない? # # ガリ夫くん:知りたい知りたい! 1ちゃんのこと、もっと知りたい! # # スマ子さん:うわあ……。ま、まあいいわ! 1ちゃんの数を数えて、それじゃあ2014年にちなんでこんな問題を解いてみましょう! そう、スマートにね! # # # 【問】 # 1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか、答えてください。 # # 解答用テキストファイルに問題の答えと、その答えを導出したプロセスを記述して、提出してください。 # また、プログラムを使用した場合はソースコードを解答用テキストファイルに貼り付けてください。言語は問いませんが、ideone(http://ideone.com/)で実行できるものを解答として提出してください。 # '1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか、答えてください。'(_ペアの組数) :- findall(_2進法で表した時に1の登場する回数,( '1〜2014までの数を2進法で表した時に1の登場する回数'(_数を2進法で表した時に1の登場する回数)),_2進法で表した時に1の登場する回数ならび), 度数(append(_,[_1の回数,_1の回数|_],_数を2進法で表した時に1の登場する回数ならび),_ペアの組数). '1〜2014までの数を2進法で表した時に1の登場する回数'(_数を2進法で表した時に1の登場する回数) :- between(1,2014,_数), '数を2進法で表した時に1の登場する回数'(_数,_数を2進法で表した時に1の登場する回数). '数を2進法で表した時に1の登場する回数'(_実,_数を2進法で表した時に1の登場する回数) :- '数を2進法で表した時に1の登場する回数'(_実,0,_数を2進法で表した時に1の登場する回数). '数を2進法で表した時に1の登場する回数'(0,_1の回数,_1の回数) :- !. '数を2進法で表した時に1の登場する回数'(_実,_1の累積回数,_1の回数) :- _剰余 is _実 mod 2, _商 is _実 // 2, '剰余が1ならば加算'(_剰余,_商,_1の累積回数,_1の回数). '剰余が1ならば加算'(1,_商,_1の累積回数_1,_1の回数) :- succ(_1の累積回数_1,_1の累積回数_2), '数を2進法で表した時に1の登場する回数'(_商,_1の累積回数_2,_1の回数). '剰余が1ならば加算'(0,_商,_1の累積回数_1,_1の回数) :- '数を2進法で表した時に1の登場する回数'(_商,_1の累積回数_1,_1の回数). 度数(_目標,_度数) :- findall(1,_目標,_度数を示す1のならび), length(_度数を示す1のならび,_度数). % 以下のサイトは 昇順鍵整列(L1,_鍵ならび,L2) :- 昇順鍵整列(1,_鍵ならび,L1,KL,L3), 昇順整列(KL,KL2), findall(L,( member(L4,KL2), last(L4,K), member([K|L],L3)),L2). 昇順鍵整列(_,_,[],[],[]) :- !. 昇順鍵整列(N,KL,[L1|R1],[KL_1|KR],[[N|L1]|R3]) :- 鍵生成(N,KL,L1,KL_1), succ(N,N_2), 昇順鍵整列(N_2,KL,R1,KR,R3). 鍵生成(N,KL,L1,KR_2) :- findall(A,( member(K,KL), nth1(K,L1,A)),KR_1), append(KR_1,[N],KR_2). 昇順整列([],[]). 昇順整列([_軸要素|L1],L2) :- 昇順分割(_軸要素,L1,L1_2,L2_2), 昇順整列(L1_2,L1_3), 昇順整列(L2_2,L2_3), append(L1_3,[_軸要素|L2_3],L2). 昇順分割(_,[],[],[]). 昇順分割(A,[B|R2],[B|R3],R4) :- A @>= B, 昇順分割(A,R2,R3,R4). 昇順分割(A,[B|R2],R3,[B|R4]) :- A @< B, 昇順分割(A,R2,R3,R4). % 以下のサイトは 日曜起点カレンダー(_一日の曜日,_末日整数,_カレンダー) :- findall(_日,between(1,_末日整数,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), '第二週以後(最終週の整形)'(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). '第二週以後(最終週の整形)'([],[]) :- !. '第二週以後(最終週の整形)'([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- '第二週以後(最終週の整形)'(R1,R2),!. '第二週以後(最終週の整形)'(L1,[_最終週]) :- 一週間は七日だ(_最終週), append(L1,_,_最終週). 一週間は七日だ([_,_,_,_,_,_,_]). % 以下のサイトは 連立一次方程式の解(_拡大係数行列,_解ならび) :- ガウス行列に変形(_拡大係数行列,_ガウス行列,_), 連立一次方程式の一般解(_ガウス行列,_解ならび). 連立一次方程式の一般解(_ガウス行列,_解ならび) :- 解が1つだけ存在する場合(_ガウス行列,_解ならび),!. 連立一次方程式の一般解(_ガウス行列,解は無数に存在する) :- 解が無数にある場合(_ガウス行列),!. 連立一次方程式の一般解(_ガウス行列,解は存在しない) :- 解がない場合(_ガウス行列). 解が1つだけ存在する場合(_ガウス行列,_解ならび) :- '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(0,_ガウス行列), 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列), 既約ガウス行列の各行の最終要素が解である(_既約ガウス行列,_解ならび). '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(_,[]) :- !. '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(N,[L|R]) :- 先頭から0がN要素(N,L), succ(N,N_2), '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(N_2,R). 先頭から0がN要素(N,L) :- append(L1,[A|_],L), \+(A=0),!, length(L1,N). 既約ガウス行列の各行の最終要素が解である(_既約ガウス行列,_解ならび) :- findall(_解,( member(_行,_既約ガウス行列), last(_行,_解)),_解ならび). 解が無数にある場合(_ガウス行列) :- length(_ガウス行列,N), 行列の階数(_ガウス行列,_ガウス行列の階数), \+(N = _ガウス行列の階数). 解がない場合(_ガウス行列). % 以下のサイトは '0でない実数をかけた行に、他の行を実数倍したものを加える'(_行列,_行目_1,_行目_2,_実数_1,_実数_2,_行列_2) :- '0でない実数をかけた行に'(_行列,_行目_1,_実数_1,_行ならび_1,_行_1,_残り行ならび), '他の行を実数倍したものを'(_行列,_行目_2,_実数_2,_行_2), 行を加算する(_行_1,_行_2,_行_3), append(_行ならび_1,[_行_3|_残り行ならび],_行列_2). '0でない実数をかけた行に'(_行列,_行目_1,_実数_1,_行ならび_1,_行_1,_残り行ならび) :- append(_行ならび_1,[_行|_残り行ならび],_行列), length([_|_行ならび_1],_行目_1), 実数をかける(_実数_1,_行,_行_1). '他の行を実数倍したものを'(_行列,_行目_2,_実数_2,_行_2) :- append(_行ならび_1,[_行|_残りならび],_行列), length([_|_行ならび_1],_行目_2), 実数をかける(_実数_2,_行,_行_2). 行を加算する([],[],[]). 行を加算する([A|R1],[B|R2],[C|R3]) :- C is A + B, 行を加算する(R1,R2,R3). 実数をかける(_行,_実数,_実数をかけた行) :- 行に実数をかける(_行,_実数,_実数をかけた行). 行に実数をかける([],_,[]). 行に実数をかける([A|R1],_実数,[B|R2]) :- B is A * _実数, 行に実数をかける(R1,_実数,R2). % 以下のサイトは ある行に実数倍した他の行を加える(_行列,_ある行,_実数,_他の行,_ある行に実数倍した他の行を加えた行列) :- append(L1,[_行_1|R1],_行列), length([_|L1],_ある行), append(L2,[_行_2|R2],_行列), length([_|L2],_他の行), 行に実数をかける(_行_2,_実数,_実数をかけた行), 行と行との加算(_ある行,_実数をかけた行,_ある行に実数倍した他の行を加えた行), append(L1,[_ある行に実数倍した他の行を加えた行|R1],_ある行に実数倍した他の行を加えた行列). 行に実数をかける([],_,[]). 行に実数をかける([A|R1],_実数,[B|R2]) :- B is A * _実数, 行に実数をかける(R1,_実数,R2). 行と行との加算([],[],[]). 行と行との加算([A|R1],[B|R2],[C|R3]) :- C is A + B, 行と行との加算(R1,R2,R3). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- M is _第何行_2 - _第何行_1, '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1), '_第何行_2まで切り取る'(R1,M,A,B,R3), append(L1,[B|R3],_2つの行を交換した行列). '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1) :- append(L1,[A|R1],_行列), length([_|L1],_第何行_1). '_第何行_2まで切り取る'(R1,M,A,B,R3) :- append(L2,[B|R2],R1), length([_|L2],M), append(L2,[A|R2],R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,M,_n_2,[A|R1],A,B,[B|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,M,_n_2,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,M,[B|R1],A,B,[A|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,M,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,_n_2,[U|R1],A,B,[U|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,_n_1,_n_2,[C|R1],A,B,[D|R2]) :- 交換の選択(M,_n_1,_n_2,C,A,B,D), succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). 交換の選択(M,M,_n_2,A,A,B,B) :- !. 交換の選択(M,_n_1,M,B,A,B,A) :- !. 交換の選択(M,_n_1,_n_2,U,A,B,U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- M is _第何行_2 - _第何行_1, '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1), '_第何行_2まで切り取る'(R1,M,A,B,R3), append(L1,[B|R3],_2つの行を交換した行列). '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1) :- append(L1,[A|R1],_行列), length([_|L1],_第何行_1). '_第何行_2まで切り取る'(R1,M,A,B,R3) :- append(L2,[B|R2],R1), length([_|L2],M), append(L2,[A|R2],R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,M,_n_2,[A|R1],A,B,[B|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,M,_n_2,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,M,[B|R1],A,B,[A|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,M,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,_n_2,[U|R1],A,B,[U|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,_n_1,_n_2,[C|R1],A,B,[D|R2]) :- 交換の選択(M,_n_1,_n_2,C,A,B,D), succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). 交換の選択(M,M,_n_2,A,A,B,B) :- !. 交換の選択(M,_n_1,M,B,A,B,A) :- !. 交換の選択(M,_n_1,_n_2,U,A,B,U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは # 出典::プログラミングのお題スレ Part5 #644 # # お題:硬貨がn枚あり、合計金額がk円のとき、その内訳を求める。 # 硬貨の種類は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉である。 # 内訳は各硬貨の枚数を並べたものとする。 # 複数の解がある場合はすべてを求める。 # 例 # 11枚で1082円のとき # 2 0 1 0 6 2 # # 12枚で777円のとき # 1 0 5 1 3 2 # 1 1 3 0 5 2 # # 25枚で4999円のとき # 9 2 5 4 1 4 # 9 3 3 3 3 4 # 9 4 1 2 5 4 '硬貨がn枚あり、合計金額がk円のとき、その内訳を求める。 硬貨の種類は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉である。 内訳は各硬貨の枚数を並べたものとする。 複数の解がある場合はすべてを求める。'(_n,_k,_500,_100,_50,_10,_5,_1) :- '硬貨がn枚あり、'(_n,L), '合計金額がk円のとき、その内訳を求める。'(L,_k,_500,_100,_50,_10,_5,_1). '硬貨がn枚あり、'(_n,L) :- findall(_,between(1,_n,_),L). '合計金額がk円のとき、その内訳を求める。'(L,_k,_500,_100,_50,_10,_5,_1) :- append([L1,L2,L3,L4,L5,L6],L), 硬貨の枚数([L1,L2,L3,L4,L5,L6],[_500,_100,_50,_10,_5,_1]), _k is 500 * _500 + 100 * _100 + 50 * _50 + 10 * _10 + 5 * _5 + 1 * _1. 硬貨の枚数([],[]). 硬貨の枚数(L1,L2) :- 硬貨ごとの枚数を数え上げる(L1,L2). 硬貨ごとの枚数を数え上げる([L|R1],[_枚数|R2]) :- length(L,_枚数), 硬貨の枚数(R1,R2). % 以下のサイトは # 出典:: プログラミングのお題スレ Part5 # お題:自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。 # # 例1:14,17,50,25,29,85,89,145,190,730,730,... # 例2:59,106,217,352,160,217,352,160,... # # この操作によるループ(上記の例では[730],[160,217,352])を好きなだけ求めよ。 '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,L,_ループ) :- '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,[],L,_ループ). '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,L1,L,_ループ) :- ループが発生したら終了する(L1,L,_ループ). '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,L1,L,_ループ) :- '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返す'(N,_Nの各桁のk乗の和), '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(_Nの各桁のk乗の和,[_Nの各桁のk乗の和|L1],L,_ループ). ループが発生したら終了する(L1,L,_ループ) :- L1 = [N1|R], append(L0,[N1|_],R), reverse(L1,L), reverse([N1|L0],_ループ). '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返す'(N,_Nの各桁のk乗の和) :- 各桁の数ならびを得る(N,_数ならび), length(Chars,_k), findsum(_nの各桁のk乗,( member(_数,_数ならび), _nの各桁のk乗 is _数 ^ _k),_Nの各桁のk乗の和). 各桁の数ならびを得る(N,_数ならび) :- number_chars(N,Chars), findall(_数,( member(A,Chars), number_chars(_数,[A])),_数ならび). % 以下のサイトは # # append/1 は append/4-n をabolishした後に定義する。 # ただし、_nはappend/1の引数の要素数。 # # ?- append([[1,2],[3,4],[a],[b,c,d],X]). # X = [1,2,3,4,a,b,c,d]. # # ?- append([X,[3,4],[a],Y],[1,2,3,4,a,b,c,d]]). # X = [1,2], # Y = [b,c,d]. # append(LL) :- length(LL,_n), abolish_append_n(_n), append_n_の定義(_n), P =.. [append|LL], call(P). abolish_append_n(_n) :- between(4,_n,M), abolish(append/M), _n = M. append_n_の定義(3) :- !. append_n_の定義(_n) :- succ(_n_1,_n), append_n_の定義(_n_1), append_n_の第一節定義(_n_1), append_n_の第二節定義(_n). append_n_の第一節定義(_n_1) :- findall(_,between(1,_n_1,_),L1), P_1 =.. [append,[]|L1], P_1_1 =.. [append|L1], assertz((P_1 :- P_1_1)). append_n_の第二節定義(_n) :- findall(_,between(1,_n,_),_本体引数ならび), append_n_の第二節頭部引数(_本体引数ならび,_頭部引数ならび), _頭部 =.. [append|_頭部引数ならび], _本体 =.. [append|_本体引数ならび], assertz((_頭部 :- _本体)). append_n_の第二節頭部引数([V|R1],[[U|V]|R2]) :- append_n_の第二節頭部引数(R1,U,R2). append_n_の第二節頭部引数([V],U,[[U|V]]) :- !. append_n_の第二節頭部引数([V|R1],U,[V|R2]) :- append_n_の第二節頭部引数(R1,U,R2). % 以下のサイトは # 出題::プログラミングのお題スレ Part5#459 # お題:ふたつの自然数を連結してひとつの自然数にする。 # たとえば123と56なら123456になる。 'ふたつの自然数を連結してひとつの自然数にする。'(_一つ目の自然数,_二つ目の自然数,_連結された自然数) :- number_chars(_一つ目の自然数,_一つ目の自然数ならび), number_chars(_二つ目の自然数,_二つ目の自然数ならび), append(_一つ目の自然数ならび,_二つ目の自然数ならび,_連結された自然数ならび), number_chars(_連結された自然数,_連結された自然数ならび). % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。' :- ある通貨の時系列為替価格ならびを得る(_ある通貨の時系列為替価格ならび), 最大の為替差の利益(_ある通貨の時系列為替価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). ある通貨の時系列為替価格ならびを得る(_ある通貨の時系列価格ならび) :- 時系列数を得る(_時系列数), findall(_価格,( 価格を得る(_時系列数,_価格)), _ある通貨の時系列価格ならび). 時系列数を得る(_時系列数) :- 整数を得る(_時系列数). 価格を得る(_時系列数,_価格) :- between(1,_時系列数,_t), 整数を得る(_価格). 最大の為替差の利益(_ある通貨の時系列価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大利益,( 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益)), _最大の為替差の利益). 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益) :- append(_,[_時刻tの価格|_その後の価格ならび],_ある通貨の時系列価格ならび), 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益). 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益) :- findmax(_時刻tの価格との価格差,( 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差)), _時刻tの投資に対する最大利益). 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差) :- member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格. 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % % 整数を入力する場合の一般型 % 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。' :- 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび), 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび) :- 時系列数を得る(_時系列数), findall(_価格,( between(1,_時系列数,_t), 価格を得る(_価格)), _時刻tに於ける価格ならび). 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大価格差,( append(_,[_時刻tの価格|_その後価格ならび],_時刻tに於ける価格ならび), 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差)), _最大の為替差の利益). 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差) :- findmax(_時刻tの価格との価格差,( member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格), _時刻tの投資に対する最大価格差). 時系列数を得る(_時系列数) :- 整数を得る(_時系列数). 価格を得る(_価格) :- 整数を得る(_価格). 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). % 以下のサイトは 日曜起点カレンダー(_年,_月) :- 一日の曜日(_年,_月,_一日の曜日), 月末日の曜日(_年,_月,_月末日,_), 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー), カレンダー表示(_カレンダー). 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー) :- findall(_日,between(1,_月末日,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), 最終週の整形(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). 最終週の整形([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 最終週の整形(R1,R2),!. 最終週の整形([],[]) :- !. 最終週の整形(L1,[L2]) :- length(L2,7), append(L1,_,L2). カレンダー表示([]). カレンダー表示([_週|R]) :- カレンダー週表示(_週), カレンダー表示(R). カレンダー週表示([]) :- write('\n'). カレンダー週表示([A|R]) :- 表示項(A,_表示項), writef('%3R',[_表示項]), カレンダー週表示(R). 表示項(' ',' ') :- !. 表示項(N,N). 一日の曜日(1970,1,木曜). 一日の曜日(1970,2,日曜). 一日の曜日(1970,3,日曜). 一日の曜日(1970,4,水曜). 一日の曜日(1970,5,金曜). 一日の曜日(1970,6,月曜). 一日の曜日(1970,7,水曜). 一日の曜日(1970,8,土曜). 一日の曜日(1970,9,火曜). 一日の曜日(1970,10,木曜). 一日の曜日(1970,11,日曜). 一日の曜日(1970,12,火曜). 一日の曜日(1971,1,金曜). 一日の曜日(1971,2,月曜). 一日の曜日(1971,3,月曜). 一日の曜日(1971,4,木曜). 一日の曜日(1971,5,土曜). 一日の曜日(1971,6,火曜). 一日の曜日(1971,7,木曜). 一日の曜日(1971,8,日曜). 一日の曜日(1971,9,水曜). 一日の曜日(1971,10,金曜). 一日の曜日(1971,11,月曜). 一日の曜日(1971,12,水曜). 一日の曜日(1972,1,土曜). 一日の曜日(1972,2,火曜). 一日の曜日(1972,3,水曜). 一日の曜日(1972,4,土曜). 一日の曜日(1972,5,月曜). 一日の曜日(1972,6,木曜). 一日の曜日(1972,7,土曜). 一日の曜日(1972,8,火曜). 一日の曜日(1972,9,金曜). 一日の曜日(1972,10,日曜). 一日の曜日(1972,11,水曜). 一日の曜日(1972,12,金曜). 一日の曜日(1973,1,月曜). 一日の曜日(1973,2,木曜). 一日の曜日(1973,3,木曜). 一日の曜日(1973,4,日曜). 一日の曜日(1973,5,火曜). 一日の曜日(1973,6,金曜). 一日の曜日(1973,7,日曜). 一日の曜日(1973,8,水曜). 一日の曜日(1973,9,土曜). 一日の曜日(1973,10,月曜). 一日の曜日(1973,11,木曜). 一日の曜日(1973,12,土曜). 一日の曜日(1974,1,火曜). 一日の曜日(1974,2,金曜). 一日の曜日(1974,3,金曜). 一日の曜日(1974,4,月曜). 一日の曜日(1974,5,水曜). 一日の曜日(1974,6,土曜). 一日の曜日(1974,7,月曜). 一日の曜日(1974,8,木曜). 一日の曜日(1974,9,日曜). 一日の曜日(1974,10,火曜). 一日の曜日(1974,11,金曜). 一日の曜日(1974,12,日曜). 一日の曜日(1975,1,水曜). 一日の曜日(1975,2,土曜). 一日の曜日(1975,3,土曜). 一日の曜日(1975,4,火曜). 一日の曜日(1975,5,木曜). 一日の曜日(1975,6,日曜). 一日の曜日(1975,7,火曜). 一日の曜日(1975,8,金曜). 一日の曜日(1975,9,月曜). 一日の曜日(1975,10,水曜). 一日の曜日(1975,11,土曜). 一日の曜日(1975,12,月曜). 一日の曜日(1976,1,木曜). 一日の曜日(1976,2,日曜). 一日の曜日(1976,3,月曜). 一日の曜日(1976,4,木曜). 一日の曜日(1976,5,土曜). 一日の曜日(1976,6,火曜). 一日の曜日(1976,7,木曜). 一日の曜日(1976,8,日曜). 一日の曜日(1976,9,水曜). 一日の曜日(1976,10,金曜). 一日の曜日(1976,11,月曜). 一日の曜日(1976,12,水曜). 一日の曜日(1977,1,土曜). 一日の曜日(1977,2,火曜). 一日の曜日(1977,3,火曜). 一日の曜日(1977,4,金曜). 一日の曜日(1977,5,日曜). 一日の曜日(1977,6,水曜). 一日の曜日(1977,7,金曜). 一日の曜日(1977,8,月曜). 一日の曜日(1977,9,木曜). 一日の曜日(1977,10,土曜). 一日の曜日(1977,11,火曜). 一日の曜日(1977,12,木曜). 一日の曜日(1978,1,日曜). 一日の曜日(1978,2,水曜). 一日の曜日(1978,3,水曜). 一日の曜日(1978,4,土曜). 一日の曜日(1978,5,月曜). 一日の曜日(1978,6,木曜). 一日の曜日(1978,7,土曜). 一日の曜日(1978,8,火曜). 一日の曜日(1978,9,金曜). 一日の曜日(1978,10,日曜). 一日の曜日(1978,11,水曜). 一日の曜日(1978,12,金曜). 一日の曜日(1979,1,月曜). 一日の曜日(1979,2,木曜). 一日の曜日(1979,3,木曜). 一日の曜日(1979,4,日曜). 一日の曜日(1979,5,火曜). 一日の曜日(1979,6,金曜). 一日の曜日(1979,7,日曜). 一日の曜日(1979,8,水曜). 一日の曜日(1979,9,土曜). 一日の曜日(1979,10,月曜). 一日の曜日(1979,11,木曜). 一日の曜日(1979,12,土曜). 一日の曜日(1980,1,火曜). 一日の曜日(1980,2,金曜). 一日の曜日(1980,3,土曜). 一日の曜日(1980,4,火曜). 一日の曜日(1980,5,木曜). 一日の曜日(1980,6,日曜). 一日の曜日(1980,7,火曜). 一日の曜日(1980,8,金曜). 一日の曜日(1980,9,月曜). 一日の曜日(1980,10,水曜). 一日の曜日(1980,11,土曜). 一日の曜日(1980,12,月曜). 一日の曜日(1981,1,木曜). 一日の曜日(1981,2,日曜). 一日の曜日(1981,3,日曜). 一日の曜日(1981,4,水曜). 一日の曜日(1981,5,金曜). 一日の曜日(1981,6,月曜). 一日の曜日(1981,7,水曜). 一日の曜日(1981,8,土曜). 一日の曜日(1981,9,火曜). 一日の曜日(1981,10,木曜). 一日の曜日(1981,11,日曜). 一日の曜日(1981,12,火曜). 一日の曜日(1982,1,金曜). 一日の曜日(1982,2,月曜). 一日の曜日(1982,3,月曜). 一日の曜日(1982,4,木曜). 一日の曜日(1982,5,土曜). 一日の曜日(1982,6,火曜). 一日の曜日(1982,7,木曜). 一日の曜日(1982,8,日曜). 一日の曜日(1982,9,水曜). 一日の曜日(1982,10,金曜). 一日の曜日(1982,11,月曜). 一日の曜日(1982,12,水曜). 一日の曜日(1983,1,土曜). 一日の曜日(1983,2,火曜). 一日の曜日(1983,3,火曜). 一日の曜日(1983,4,金曜). 一日の曜日(1983,5,日曜). 一日の曜日(1983,6,水曜). 一日の曜日(1983,7,金曜). 一日の曜日(1983,8,月曜). 一日の曜日(1983,9,木曜). 一日の曜日(1983,10,土曜). 一日の曜日(1983,11,火曜). 一日の曜日(1983,12,木曜). 一日の曜日(1984,1,日曜). 一日の曜日(1984,2,水曜). 一日の曜日(1984,3,木曜). 一日の曜日(1984,4,日曜). 一日の曜日(1984,5,火曜). 一日の曜日(1984,6,金曜). 一日の曜日(1984,7,日曜). 一日の曜日(1984,8,水曜). 一日の曜日(1984,9,土曜). 一日の曜日(1984,10,月曜). 一日の曜日(1984,11,木曜). 一日の曜日(1984,12,土曜). 一日の曜日(1985,1,火曜). 一日の曜日(1985,2,金曜). 一日の曜日(1985,3,金曜). 一日の曜日(1985,4,月曜). 一日の曜日(1985,5,水曜). 一日の曜日(1985,6,土曜). 一日の曜日(1985,7,月曜). 一日の曜日(1985,8,木曜). 一日の曜日(1985,9,日曜). 一日の曜日(1985,10,火曜). 一日の曜日(1985,11,金曜). 一日の曜日(1985,12,日曜). 一日の曜日(1986,1,水曜). 一日の曜日(1986,2,土曜). 一日の曜日(1986,3,土曜). 一日の曜日(1986,4,火曜). 一日の曜日(1986,5,木曜). 一日の曜日(1986,6,日曜). 一日の曜日(1986,7,火曜). 一日の曜日(1986,8,金曜). 一日の曜日(1986,9,月曜). 一日の曜日(1986,10,水曜). 一日の曜日(1986,11,土曜). 一日の曜日(1986,12,月曜). 一日の曜日(1987,1,木曜). 一日の曜日(1987,2,日曜). 一日の曜日(1987,3,日曜). 一日の曜日(1987,4,水曜). 一日の曜日(1987,5,金曜). 一日の曜日(1987,6,月曜). 一日の曜日(1987,7,水曜). 一日の曜日(1987,8,土曜). 一日の曜日(1987,9,火曜). 一日の曜日(1987,10,木曜). 一日の曜日(1987,11,日曜). 一日の曜日(1987,12,火曜). 一日の曜日(1988,1,金曜). 一日の曜日(1988,2,月曜). 一日の曜日(1988,3,火曜). 一日の曜日(1988,4,金曜). 一日の曜日(1988,5,日曜). 一日の曜日(1988,6,水曜). 一日の曜日(1988,7,金曜). 一日の曜日(1988,8,月曜). 一日の曜日(1988,9,木曜). 一日の曜日(1988,10,土曜). 一日の曜日(1988,11,火曜). 一日の曜日(1988,12,木曜). 一日の曜日(1989,1,日曜). 一日の曜日(1989,2,水曜). 一日の曜日(1989,3,水曜). 一日の曜日(1989,4,土曜). 一日の曜日(1989,5,月曜). 一日の曜日(1989,6,木曜). 一日の曜日(1989,7,土曜). 一日の曜日(1989,8,火曜). 一日の曜日(1989,9,金曜). 一日の曜日(1989,10,日曜). 一日の曜日(1989,11,水曜). 一日の曜日(1989,12,金曜). 一日の曜日(1990,1,月曜). 一日の曜日(1990,2,木曜). 一日の曜日(1990,3,木曜). 一日の曜日(1990,4,日曜). 一日の曜日(1990,5,火曜). 一日の曜日(1990,6,金曜). 一日の曜日(1990,7,日曜). 一日の曜日(1990,8,水曜). 一日の曜日(1990,9,土曜). 一日の曜日(1990,10,月曜). 一日の曜日(1990,11,木曜). 一日の曜日(1990,12,土曜). 一日の曜日(1991,1,火曜). 一日の曜日(1991,2,金曜). 一日の曜日(1991,3,金曜). 一日の曜日(1991,4,月曜). 一日の曜日(1991,5,水曜). 一日の曜日(1991,6,土曜). 一日の曜日(1991,7,月曜). 一日の曜日(1991,8,木曜). 一日の曜日(1991,9,日曜). 一日の曜日(1991,10,火曜). 一日の曜日(1991,11,金曜). 一日の曜日(1991,12,日曜). 一日の曜日(1992,1,水曜). 一日の曜日(1992,2,土曜). 一日の曜日(1992,3,日曜). 一日の曜日(1992,4,水曜). 一日の曜日(1992,5,金曜). 一日の曜日(1992,6,月曜). 一日の曜日(1992,7,水曜). 一日の曜日(1992,8,土曜). 一日の曜日(1992,9,火曜). 一日の曜日(1992,10,木曜). 一日の曜日(1992,11,日曜). 一日の曜日(1992,12,火曜). 一日の曜日(1993,1,金曜). 一日の曜日(1993,2,月曜). 一日の曜日(1993,3,月曜). 一日の曜日(1993,4,木曜). 一日の曜日(1993,5,土曜). 一日の曜日(1993,6,火曜). 一日の曜日(1993,7,木曜). 一日の曜日(1993,8,日曜). 一日の曜日(1993,9,水曜). 一日の曜日(1993,10,金曜). 一日の曜日(1993,11,月曜). 一日の曜日(1993,12,水曜). 一日の曜日(1994,1,土曜). 一日の曜日(1994,2,火曜). 一日の曜日(1994,3,火曜). 一日の曜日(1994,4,金曜). 一日の曜日(1994,5,日曜). 一日の曜日(1994,6,水曜). 一日の曜日(1994,7,金曜). 一日の曜日(1994,8,月曜). 一日の曜日(1994,9,木曜). 一日の曜日(1994,10,土曜). 一日の曜日(1994,11,火曜). 一日の曜日(1994,12,木曜). 一日の曜日(1995,1,日曜). 一日の曜日(1995,2,水曜). 一日の曜日(1995,3,水曜). 一日の曜日(1995,4,土曜). 一日の曜日(1995,5,月曜). 一日の曜日(1995,6,木曜). 一日の曜日(1995,7,土曜). 一日の曜日(1995,8,火曜). 一日の曜日(1995,9,金曜). 一日の曜日(1995,10,日曜). 一日の曜日(1995,11,水曜). 一日の曜日(1995,12,金曜). 一日の曜日(1996,1,月曜). 一日の曜日(1996,2,木曜). 一日の曜日(1996,3,金曜). 一日の曜日(1996,4,月曜). 一日の曜日(1996,5,水曜). 一日の曜日(1996,6,土曜). 一日の曜日(1996,7,月曜). 一日の曜日(1996,8,木曜). 一日の曜日(1996,9,日曜). 一日の曜日(1996,10,火曜). 一日の曜日(1996,11,金曜). 一日の曜日(1996,12,日曜). 一日の曜日(1997,1,水曜). 一日の曜日(1997,2,土曜). 一日の曜日(1997,3,土曜). 一日の曜日(1997,4,火曜). 一日の曜日(1997,5,木曜). 一日の曜日(1997,6,日曜). 一日の曜日(1997,7,火曜). 一日の曜日(1997,8,金曜). 一日の曜日(1997,9,月曜). 一日の曜日(1997,10,水曜). 一日の曜日(1997,11,土曜). 一日の曜日(1997,12,月曜). 一日の曜日(1998,1,木曜). 一日の曜日(1998,2,日曜). 一日の曜日(1998,3,日曜). 一日の曜日(1998,4,水曜). 一日の曜日(1998,5,金曜). 一日の曜日(1998,6,月曜). 一日の曜日(1998,7,水曜). 一日の曜日(1998,8,土曜). 一日の曜日(1998,9,火曜). 一日の曜日(1998,10,木曜). 一日の曜日(1998,11,日曜). 一日の曜日(1998,12,火曜). 一日の曜日(1999,1,金曜). 一日の曜日(1999,2,月曜). 一日の曜日(1999,3,月曜). 一日の曜日(1999,4,木曜). 一日の曜日(1999,5,土曜). 一日の曜日(1999,6,火曜). 一日の曜日(1999,7,木曜). 一日の曜日(1999,8,日曜). 一日の曜日(1999,9,水曜). 一日の曜日(1999,10,金曜). 一日の曜日(1999,11,月曜). 一日の曜日(1999,12,水曜). 一日の曜日(2000,1,土曜). 一日の曜日(2000,2,火曜). 一日の曜日(2000,3,水曜). 一日の曜日(2000,4,土曜). 一日の曜日(2000,5,月曜). 一日の曜日(2000,6,木曜). 一日の曜日(2000,7,土曜). 一日の曜日(2000,8,火曜). 一日の曜日(2000,9,金曜). 一日の曜日(2000,10,日曜). 一日の曜日(2000,11,水曜). 一日の曜日(2000,12,金曜). 一日の曜日(2001,1,月曜). 一日の曜日(2001,2,木曜). 一日の曜日(2001,3,木曜). 一日の曜日(2001,4,日曜). 一日の曜日(2001,5,火曜). 一日の曜日(2001,6,金曜). 一日の曜日(2001,7,日曜). 一日の曜日(2001,8,水曜). 一日の曜日(2001,9,土曜). 一日の曜日(2001,10,月曜). 一日の曜日(2001,11,木曜). 一日の曜日(2001,12,土曜). 一日の曜日(2002,1,火曜). 一日の曜日(2002,2,金曜). 一日の曜日(2002,3,金曜). 一日の曜日(2002,4,月曜). 一日の曜日(2002,5,水曜). 一日の曜日(2002,6,土曜). 一日の曜日(2002,7,月曜). 一日の曜日(2002,8,木曜). 一日の曜日(2002,9,日曜). 一日の曜日(2002,10,火曜). 一日の曜日(2002,11,金曜). 一日の曜日(2002,12,日曜). 一日の曜日(2003,1,水曜). 一日の曜日(2003,2,土曜). 一日の曜日(2003,3,土曜). 一日の曜日(2003,4,火曜). 一日の曜日(2003,5,木曜). 一日の曜日(2003,6,日曜). 一日の曜日(2003,7,火曜). 一日の曜日(2003,8,金曜). 一日の曜日(2003,9,月曜). 一日の曜日(2003,10,水曜). 一日の曜日(2003,11,土曜). 一日の曜日(2003,12,月曜). 一日の曜日(2004,1,木曜). 一日の曜日(2004,2,日曜). 一日の曜日(2004,3,月曜). 一日の曜日(2004,4,木曜). 一日の曜日(2004,5,土曜). 一日の曜日(2004,6,火曜). 一日の曜日(2004,7,木曜). 一日の曜日(2004,8,日曜). 一日の曜日(2004,9,水曜). 一日の曜日(2004,10,金曜). 一日の曜日(2004,11,月曜). 一日の曜日(2004,12,水曜). 一日の曜日(2005,1,土曜). 一日の曜日(2005,2,火曜). 一日の曜日(2005,3,火曜). 一日の曜日(2005,4,金曜). 一日の曜日(2005,5,日曜). 一日の曜日(2005,6,水曜). 一日の曜日(2005,7,金曜). 一日の曜日(2005,8,月曜). 一日の曜日(2005,9,木曜). 一日の曜日(2005,10,土曜). 一日の曜日(2005,11,火曜). 一日の曜日(2005,12,木曜). 一日の曜日(2006,1,日曜). 一日の曜日(2006,2,水曜). 一日の曜日(2006,3,水曜). 一日の曜日(2006,4,土曜). 一日の曜日(2006,5,月曜). 一日の曜日(2006,6,木曜). 一日の曜日(2006,7,土曜). 一日の曜日(2006,8,火曜). 一日の曜日(2006,9,金曜). 一日の曜日(2006,10,日曜). 一日の曜日(2006,11,水曜). 一日の曜日(2006,12,金曜). 一日の曜日(2007,1,月曜). 一日の曜日(2007,2,木曜). 一日の曜日(2007,3,木曜). 一日の曜日(2007,4,日曜). 一日の曜日(2007,5,火曜). 一日の曜日(2007,6,金曜). 一日の曜日(2007,7,日曜). 一日の曜日(2007,8,水曜). 一日の曜日(2007,9,土曜). 一日の曜日(2007,10,月曜). 一日の曜日(2007,11,木曜). 一日の曜日(2007,12,土曜). 一日の曜日(2008,1,火曜). 一日の曜日(2008,2,金曜). 一日の曜日(2008,3,土曜). 一日の曜日(2008,4,火曜). 一日の曜日(2008,5,木曜). 一日の曜日(2008,6,日曜). 一日の曜日(2008,7,火曜). 一日の曜日(2008,8,金曜). 一日の曜日(2008,9,月曜). 一日の曜日(2008,10,水曜). 一日の曜日(2008,11,土曜). 一日の曜日(2008,12,月曜). 一日の曜日(2009,1,木曜). 一日の曜日(2009,2,日曜). 一日の曜日(2009,3,日曜). 一日の曜日(2009,4,水曜). 一日の曜日(2009,5,金曜). 一日の曜日(2009,6,月曜). 一日の曜日(2009,7,水曜). 一日の曜日(2009,8,土曜). 一日の曜日(2009,9,火曜). 一日の曜日(2009,10,木曜). 一日の曜日(2009,11,日曜). 一日の曜日(2009,12,火曜). 一日の曜日(2010,1,金曜). 一日の曜日(2010,2,月曜). 一日の曜日(2010,3,月曜). 一日の曜日(2010,4,木曜). 一日の曜日(2010,5,土曜). 一日の曜日(2010,6,火曜). 一日の曜日(2010,7,木曜). 一日の曜日(2010,8,日曜). 一日の曜日(2010,9,水曜). 一日の曜日(2010,10,金曜). 一日の曜日(2010,11,月曜). 一日の曜日(2010,12,水曜). 一日の曜日(2011,1,土曜). 一日の曜日(2011,2,火曜). 一日の曜日(2011,3,火曜). 一日の曜日(2011,4,金曜). 一日の曜日(2011,5,日曜). 一日の曜日(2011,6,水曜). 一日の曜日(2011,7,金曜). 一日の曜日(2011,8,月曜). 一日の曜日(2011,9,木曜). 一日の曜日(2011,10,土曜). 一日の曜日(2011,11,火曜). 一日の曜日(2011,12,木曜). 一日の曜日(2012,1,日曜). 一日の曜日(2012,2,水曜). 一日の曜日(2012,3,木曜). 一日の曜日(2012,4,日曜). 一日の曜日(2012,5,火曜). 一日の曜日(2012,6,金曜). 一日の曜日(2012,7,日曜). 一日の曜日(2012,8,水曜). 一日の曜日(2012,9,土曜). 一日の曜日(2012,10,月曜). 一日の曜日(2012,11,木曜). 一日の曜日(2012,12,土曜). 一日の曜日(2013,1,火曜). 一日の曜日(2013,2,金曜). 一日の曜日(2013,3,金曜). 一日の曜日(2013,4,月曜). 一日の曜日(2013,5,水曜). 一日の曜日(2013,6,土曜). 一日の曜日(2013,7,月曜). 一日の曜日(2013,8,木曜). 一日の曜日(2013,9,日曜). 一日の曜日(2013,10,火曜). 一日の曜日(2013,11,金曜). 一日の曜日(2013,12,日曜). 一日の曜日(2014,1,水曜). 一日の曜日(2014,2,土曜). 一日の曜日(2014,3,土曜). 一日の曜日(2014,4,火曜). 一日の曜日(2014,5,木曜). 一日の曜日(2014,6,日曜). 一日の曜日(2014,7,火曜). 一日の曜日(2014,8,金曜). 一日の曜日(2014,9,月曜). 一日の曜日(2014,10,水曜). 一日の曜日(2014,11,土曜). 一日の曜日(2014,12,月曜). 一日の曜日(2015,1,木曜). 一日の曜日(2015,2,日曜). 一日の曜日(2015,3,日曜). 一日の曜日(2015,4,水曜). 一日の曜日(2015,5,金曜). 一日の曜日(2015,6,月曜). 一日の曜日(2015,7,水曜). 一日の曜日(2015,8,土曜). 一日の曜日(2015,9,火曜). 一日の曜日(2015,10,木曜). 一日の曜日(2015,11,日曜). 一日の曜日(2015,12,火曜). 一日の曜日(2016,1,金曜). 一日の曜日(2016,2,月曜). 一日の曜日(2016,3,火曜). 一日の曜日(2016,4,金曜). 一日の曜日(2016,5,日曜). 一日の曜日(2016,6,水曜). 一日の曜日(2016,7,金曜). 一日の曜日(2016,8,月曜). 一日の曜日(2016,9,木曜). 一日の曜日(2016,10,土曜). 一日の曜日(2016,11,火曜). 一日の曜日(2016,12,木曜). 一日の曜日(2017,1,日曜). 一日の曜日(2017,2,水曜). 一日の曜日(2017,3,水曜). 一日の曜日(2017,4,土曜). 一日の曜日(2017,5,月曜). 一日の曜日(2017,6,木曜). 一日の曜日(2017,7,土曜). 一日の曜日(2017,8,火曜). 一日の曜日(2017,9,金曜). 一日の曜日(2017,10,日曜). 一日の曜日(2017,11,水曜). 一日の曜日(2017,12,金曜). 一日の曜日(2018,1,月曜). 一日の曜日(2018,2,木曜). 一日の曜日(2018,3,木曜). 一日の曜日(2018,4,日曜). 一日の曜日(2018,5,火曜). 一日の曜日(2018,6,金曜). 一日の曜日(2018,7,日曜). 一日の曜日(2018,8,水曜). 一日の曜日(2018,9,土曜). 一日の曜日(2018,10,月曜). 一日の曜日(2018,11,木曜). 一日の曜日(2018,12,土曜). 一日の曜日(2019,1,火曜). 一日の曜日(2019,2,金曜). 一日の曜日(2019,3,金曜). 一日の曜日(2019,4,月曜). 一日の曜日(2019,5,水曜). 一日の曜日(2019,6,土曜). 一日の曜日(2019,7,月曜). 一日の曜日(2019,8,木曜). 一日の曜日(2019,9,日曜). 一日の曜日(2019,10,火曜). 一日の曜日(2019,11,金曜). 一日の曜日(2019,12,日曜). 一日の曜日(2020,1,水曜). 一日の曜日(2020,2,土曜). 一日の曜日(2020,3,日曜). 一日の曜日(2020,4,水曜). 一日の曜日(2020,5,金曜). 一日の曜日(2020,6,月曜). 一日の曜日(2020,7,水曜). 一日の曜日(2020,8,土曜). 一日の曜日(2020,9,火曜). 一日の曜日(2020,10,木曜). 一日の曜日(2020,11,日曜). 一日の曜日(2020,12,火曜). 月末日の曜日(1970,1,31,土曜). 月末日の曜日(1970,2,28,土曜). 月末日の曜日(1970,3,31,火曜). 月末日の曜日(1970,4,30,木曜). 月末日の曜日(1970,5,31,日曜). 月末日の曜日(1970,6,30,火曜). 月末日の曜日(1970,7,31,金曜). 月末日の曜日(1970,8,31,月曜). 月末日の曜日(1970,9,30,水曜). 月末日の曜日(1970,10,31,土曜). 月末日の曜日(1970,11,30,月曜). 月末日の曜日(1970,12,31,木曜). 月末日の曜日(1971,1,31,日曜). 月末日の曜日(1971,2,28,日曜). 月末日の曜日(1971,3,31,水曜). 月末日の曜日(1971,4,30,金曜). 月末日の曜日(1971,5,31,月曜). 月末日の曜日(1971,6,30,水曜). 月末日の曜日(1971,7,31,土曜). 月末日の曜日(1971,8,31,火曜). 月末日の曜日(1971,9,30,木曜). 月末日の曜日(1971,10,31,日曜). 月末日の曜日(1971,11,30,火曜). 月末日の曜日(1971,12,31,金曜). 月末日の曜日(1972,1,31,月曜). 月末日の曜日(1972,2,29,火曜). 月末日の曜日(1972,3,31,金曜). 月末日の曜日(1972,4,30,日曜). 月末日の曜日(1972,5,31,水曜). 月末日の曜日(1972,6,30,金曜). 月末日の曜日(1972,7,31,月曜). 月末日の曜日(1972,8,31,木曜). 月末日の曜日(1972,9,30,土曜). 月末日の曜日(1972,10,31,火曜). 月末日の曜日(1972,11,30,木曜). 月末日の曜日(1972,12,31,日曜). 月末日の曜日(1973,1,31,水曜). 月末日の曜日(1973,2,28,水曜). 月末日の曜日(1973,3,31,土曜). 月末日の曜日(1973,4,30,月曜). 月末日の曜日(1973,5,31,木曜). 月末日の曜日(1973,6,30,土曜). 月末日の曜日(1973,7,31,火曜). 月末日の曜日(1973,8,31,金曜). 月末日の曜日(1973,9,30,日曜). 月末日の曜日(1973,10,31,水曜). 月末日の曜日(1973,11,30,金曜). 月末日の曜日(1973,12,31,月曜). 月末日の曜日(1974,1,31,木曜). 月末日の曜日(1974,2,28,木曜). 月末日の曜日(1974,3,31,日曜). 月末日の曜日(1974,4,30,火曜). 月末日の曜日(1974,5,31,金曜). 月末日の曜日(1974,6,30,日曜). 月末日の曜日(1974,7,31,水曜). 月末日の曜日(1974,8,31,土曜). 月末日の曜日(1974,9,30,月曜). 月末日の曜日(1974,10,31,木曜). 月末日の曜日(1974,11,30,土曜). 月末日の曜日(1974,12,31,火曜). 月末日の曜日(1975,1,31,金曜). 月末日の曜日(1975,2,28,金曜). 月末日の曜日(1975,3,31,月曜). 月末日の曜日(1975,4,30,水曜). 月末日の曜日(1975,5,31,土曜). 月末日の曜日(1975,6,30,月曜). 月末日の曜日(1975,7,31,木曜). 月末日の曜日(1975,8,31,日曜). 月末日の曜日(1975,9,30,火曜). 月末日の曜日(1975,10,31,金曜). 月末日の曜日(1975,11,30,日曜). 月末日の曜日(1975,12,31,水曜). 月末日の曜日(1976,1,31,土曜). 月末日の曜日(1976,2,29,日曜). 月末日の曜日(1976,3,31,水曜). 月末日の曜日(1976,4,30,金曜). 月末日の曜日(1976,5,31,月曜). 月末日の曜日(1976,6,30,水曜). 月末日の曜日(1976,7,31,土曜). 月末日の曜日(1976,8,31,火曜). 月末日の曜日(1976,9,30,木曜). 月末日の曜日(1976,10,31,日曜). 月末日の曜日(1976,11,30,火曜). 月末日の曜日(1976,12,31,金曜). 月末日の曜日(1977,1,31,月曜). 月末日の曜日(1977,2,28,月曜). 月末日の曜日(1977,3,31,木曜). 月末日の曜日(1977,4,30,土曜). 月末日の曜日(1977,5,31,火曜). 月末日の曜日(1977,6,30,木曜). 月末日の曜日(1977,7,31,日曜). 月末日の曜日(1977,8,31,水曜). 月末日の曜日(1977,9,30,金曜). 月末日の曜日(1977,10,31,月曜). 月末日の曜日(1977,11,30,水曜). 月末日の曜日(1977,12,31,土曜). 月末日の曜日(1978,1,31,火曜). 月末日の曜日(1978,2,28,火曜). 月末日の曜日(1978,3,31,金曜). 月末日の曜日(1978,4,30,日曜). 月末日の曜日(1978,5,31,水曜). 月末日の曜日(1978,6,30,金曜). 月末日の曜日(1978,7,31,月曜). 月末日の曜日(1978,8,31,木曜). 月末日の曜日(1978,9,30,土曜). 月末日の曜日(1978,10,31,火曜). 月末日の曜日(1978,11,30,木曜). 月末日の曜日(1978,12,31,日曜). 月末日の曜日(1979,1,31,水曜). 月末日の曜日(1979,2,28,水曜). 月末日の曜日(1979,3,31,土曜). 月末日の曜日(1979,4,30,月曜). 月末日の曜日(1979,5,31,木曜). 月末日の曜日(1979,6,30,土曜). 月末日の曜日(1979,7,31,火曜). 月末日の曜日(1979,8,31,金曜). 月末日の曜日(1979,9,30,日曜). 月末日の曜日(1979,10,31,水曜). 月末日の曜日(1979,11,30,金曜). 月末日の曜日(1979,12,31,月曜). 月末日の曜日(1980,1,31,木曜). 月末日の曜日(1980,2,29,金曜). 月末日の曜日(1980,3,31,月曜). 月末日の曜日(1980,4,30,水曜). 月末日の曜日(1980,5,31,土曜). 月末日の曜日(1980,6,30,月曜). 月末日の曜日(1980,7,31,木曜). 月末日の曜日(1980,8,31,日曜). 月末日の曜日(1980,9,30,火曜). 月末日の曜日(1980,10,31,金曜). 月末日の曜日(1980,11,30,日曜). 月末日の曜日(1980,12,31,水曜). 月末日の曜日(1981,1,31,土曜). 月末日の曜日(1981,2,28,土曜). 月末日の曜日(1981,3,31,火曜). 月末日の曜日(1981,4,30,木曜). 月末日の曜日(1981,5,31,日曜). 月末日の曜日(1981,6,30,火曜). 月末日の曜日(1981,7,31,金曜). 月末日の曜日(1981,8,31,月曜). 月末日の曜日(1981,9,30,水曜). 月末日の曜日(1981,10,31,土曜). 月末日の曜日(1981,11,30,月曜). 月末日の曜日(1981,12,31,木曜). 月末日の曜日(1982,1,31,日曜). 月末日の曜日(1982,2,28,日曜). 月末日の曜日(1982,3,31,水曜). 月末日の曜日(1982,4,30,金曜). 月末日の曜日(1982,5,31,月曜). 月末日の曜日(1982,6,30,水曜). 月末日の曜日(1982,7,31,土曜). 月末日の曜日(1982,8,31,火曜). 月末日の曜日(1982,9,30,木曜). 月末日の曜日(1982,10,31,日曜). 月末日の曜日(1982,11,30,火曜). 月末日の曜日(1982,12,31,金曜). 月末日の曜日(1983,1,31,月曜). 月末日の曜日(1983,2,28,月曜). 月末日の曜日(1983,3,31,木曜). 月末日の曜日(1983,4,30,土曜). 月末日の曜日(1983,5,31,火曜). 月末日の曜日(1983,6,30,木曜). 月末日の曜日(1983,7,31,日曜). 月末日の曜日(1983,8,31,水曜). 月末日の曜日(1983,9,30,金曜). 月末日の曜日(1983,10,31,月曜). 月末日の曜日(1983,11,30,水曜). 月末日の曜日(1983,12,31,土曜). 月末日の曜日(1984,1,31,火曜). 月末日の曜日(1984,2,29,水曜). 月末日の曜日(1984,3,31,土曜). 月末日の曜日(1984,4,30,月曜). 月末日の曜日(1984,5,31,木曜). 月末日の曜日(1984,6,30,土曜). 月末日の曜日(1984,7,31,火曜). 月末日の曜日(1984,8,31,金曜). 月末日の曜日(1984,9,30,日曜). 月末日の曜日(1984,10,31,水曜). 月末日の曜日(1984,11,30,金曜). 月末日の曜日(1984,12,31,月曜). 月末日の曜日(1985,1,31,木曜). 月末日の曜日(1985,2,28,木曜). 月末日の曜日(1985,3,31,日曜). 月末日の曜日(1985,4,30,火曜). 月末日の曜日(1985,5,31,金曜). 月末日の曜日(1985,6,30,日曜). 月末日の曜日(1985,7,31,水曜). 月末日の曜日(1985,8,31,土曜). 月末日の曜日(1985,9,30,月曜). 月末日の曜日(1985,10,31,木曜). 月末日の曜日(1985,11,30,土曜). 月末日の曜日(1985,12,31,火曜). 月末日の曜日(1986,1,31,金曜). 月末日の曜日(1986,2,28,金曜). 月末日の曜日(1986,3,31,月曜). 月末日の曜日(1986,4,30,水曜). 月末日の曜日(1986,5,31,土曜). 月末日の曜日(1986,6,30,月曜). 月末日の曜日(1986,7,31,木曜). 月末日の曜日(1986,8,31,日曜). 月末日の曜日(1986,9,30,火曜). 月末日の曜日(1986,10,31,金曜). 月末日の曜日(1986,11,30,日曜). 月末日の曜日(1986,12,31,水曜). 月末日の曜日(1987,1,31,土曜). 月末日の曜日(1987,2,28,土曜). 月末日の曜日(1987,3,31,火曜). 月末日の曜日(1987,4,30,木曜). 月末日の曜日(1987,5,31,日曜). 月末日の曜日(1987,6,30,火曜). 月末日の曜日(1987,7,31,金曜). 月末日の曜日(1987,8,31,月曜). 月末日の曜日(1987,9,30,水曜). 月末日の曜日(1987,10,31,土曜). 月末日の曜日(1987,11,30,月曜). 月末日の曜日(1987,12,31,木曜). 月末日の曜日(1988,1,31,日曜). 月末日の曜日(1988,2,29,月曜). 月末日の曜日(1988,3,31,木曜). 月末日の曜日(1988,4,30,土曜). 月末日の曜日(1988,5,31,火曜). 月末日の曜日(1988,6,30,木曜). 月末日の曜日(1988,7,31,日曜). 月末日の曜日(1988,8,31,水曜). 月末日の曜日(1988,9,30,金曜). 月末日の曜日(1988,10,31,月曜). 月末日の曜日(1988,11,30,水曜). 月末日の曜日(1988,12,31,土曜). 月末日の曜日(1989,1,31,火曜). 月末日の曜日(1989,2,28,火曜). 月末日の曜日(1989,3,31,金曜). 月末日の曜日(1989,4,30,日曜). 月末日の曜日(1989,5,31,水曜). 月末日の曜日(1989,6,30,金曜). 月末日の曜日(1989,7,31,月曜). 月末日の曜日(1989,8,31,木曜). 月末日の曜日(1989,9,30,土曜). 月末日の曜日(1989,10,31,火曜). 月末日の曜日(1989,11,30,木曜). 月末日の曜日(1989,12,31,日曜). 月末日の曜日(1990,1,31,水曜). 月末日の曜日(1990,2,28,水曜). 月末日の曜日(1990,3,31,土曜). 月末日の曜日(1990,4,30,月曜). 月末日の曜日(1990,5,31,木曜). 月末日の曜日(1990,6,30,土曜). 月末日の曜日(1990,7,31,火曜). 月末日の曜日(1990,8,31,金曜). 月末日の曜日(1990,9,30,日曜). 月末日の曜日(1990,10,31,水曜). 月末日の曜日(1990,11,30,金曜). 月末日の曜日(1990,12,31,月曜). 月末日の曜日(1991,1,31,木曜). 月末日の曜日(1991,2,28,木曜). 月末日の曜日(1991,3,31,日曜). 月末日の曜日(1991,4,30,火曜). 月末日の曜日(1991,5,31,金曜). 月末日の曜日(1991,6,30,日曜). 月末日の曜日(1991,7,31,水曜). 月末日の曜日(1991,8,31,土曜). 月末日の曜日(1991,9,30,月曜). 月末日の曜日(1991,10,31,木曜). 月末日の曜日(1991,11,30,土曜). 月末日の曜日(1991,12,31,火曜). 月末日の曜日(1992,1,31,金曜). 月末日の曜日(1992,2,29,土曜). 月末日の曜日(1992,3,31,火曜). 月末日の曜日(1992,4,30,木曜). 月末日の曜日(1992,5,31,日曜). 月末日の曜日(1992,6,30,火曜). 月末日の曜日(1992,7,31,金曜). 月末日の曜日(1992,8,31,月曜). 月末日の曜日(1992,9,30,水曜). 月末日の曜日(1992,10,31,土曜). 月末日の曜日(1992,11,30,月曜). 月末日の曜日(1992,12,31,木曜). 月末日の曜日(1993,1,31,日曜). 月末日の曜日(1993,2,28,日曜). 月末日の曜日(1993,3,31,水曜). 月末日の曜日(1993,4,30,金曜). 月末日の曜日(1993,5,31,月曜). 月末日の曜日(1993,6,30,水曜). 月末日の曜日(1993,7,31,土曜). 月末日の曜日(1993,8,31,火曜). 月末日の曜日(1993,9,30,木曜). 月末日の曜日(1993,10,31,日曜). 月末日の曜日(1993,11,30,火曜). 月末日の曜日(1993,12,31,金曜). 月末日の曜日(1994,1,31,月曜). 月末日の曜日(1994,2,28,月曜). 月末日の曜日(1994,3,31,木曜). 月末日の曜日(1994,4,30,土曜). 月末日の曜日(1994,5,31,火曜). 月末日の曜日(1994,6,30,木曜). 月末日の曜日(1994,7,31,日曜). 月末日の曜日(1994,8,31,水曜). 月末日の曜日(1994,9,30,金曜). 月末日の曜日(1994,10,31,月曜). 月末日の曜日(1994,11,30,水曜). 月末日の曜日(1994,12,31,土曜). 月末日の曜日(1995,1,31,火曜). 月末日の曜日(1995,2,28,火曜). 月末日の曜日(1995,3,31,金曜). 月末日の曜日(1995,4,30,日曜). 月末日の曜日(1995,5,31,水曜). 月末日の曜日(1995,6,30,金曜). 月末日の曜日(1995,7,31,月曜). 月末日の曜日(1995,8,31,木曜). 月末日の曜日(1995,9,30,土曜). 月末日の曜日(1995,10,31,火曜). 月末日の曜日(1995,11,30,木曜). 月末日の曜日(1995,12,31,日曜). 月末日の曜日(1996,1,31,水曜). 月末日の曜日(1996,2,29,木曜). 月末日の曜日(1996,3,31,日曜). 月末日の曜日(1996,4,30,火曜). 月末日の曜日(1996,5,31,金曜). 月末日の曜日(1996,6,30,日曜). 月末日の曜日(1996,7,31,水曜). 月末日の曜日(1996,8,31,土曜). 月末日の曜日(1996,9,30,月曜). 月末日の曜日(1996,10,31,木曜). 月末日の曜日(1996,11,30,土曜). 月末日の曜日(1996,12,31,火曜). 月末日の曜日(1997,1,31,金曜). 月末日の曜日(1997,2,28,金曜). 月末日の曜日(1997,3,31,月曜). 月末日の曜日(1997,4,30,水曜). 月末日の曜日(1997,5,31,土曜). 月末日の曜日(1997,6,30,月曜). 月末日の曜日(1997,7,31,木曜). 月末日の曜日(1997,8,31,日曜). 月末日の曜日(1997,9,30,火曜). 月末日の曜日(1997,10,31,金曜). 月末日の曜日(1997,11,30,日曜). 月末日の曜日(1997,12,31,水曜). 月末日の曜日(1998,1,31,土曜). 月末日の曜日(1998,2,28,土曜). 月末日の曜日(1998,3,31,火曜). 月末日の曜日(1998,4,30,木曜). 月末日の曜日(1998,5,31,日曜). 月末日の曜日(1998,6,30,火曜). 月末日の曜日(1998,7,31,金曜). 月末日の曜日(1998,8,31,月曜). 月末日の曜日(1998,9,30,水曜). 月末日の曜日(1998,10,31,土曜). 月末日の曜日(1998,11,30,月曜). 月末日の曜日(1998,12,31,木曜). 月末日の曜日(1999,1,31,日曜). 月末日の曜日(1999,2,28,日曜). 月末日の曜日(1999,3,31,水曜). 月末日の曜日(1999,4,30,金曜). 月末日の曜日(1999,5,31,月曜). 月末日の曜日(1999,6,30,水曜). 月末日の曜日(1999,7,31,土曜). 月末日の曜日(1999,8,31,火曜). 月末日の曜日(1999,9,30,木曜). 月末日の曜日(1999,10,31,日曜). 月末日の曜日(1999,11,30,火曜). 月末日の曜日(1999,12,31,金曜). 月末日の曜日(2000,1,31,月曜). 月末日の曜日(2000,2,29,火曜). 月末日の曜日(2000,3,31,金曜). 月末日の曜日(2000,4,30,日曜). 月末日の曜日(2000,5,31,水曜). 月末日の曜日(2000,6,30,金曜). 月末日の曜日(2000,7,31,月曜). 月末日の曜日(2000,8,31,木曜). 月末日の曜日(2000,9,30,土曜). 月末日の曜日(2000,10,31,火曜). 月末日の曜日(2000,11,30,木曜). 月末日の曜日(2000,12,31,日曜). 月末日の曜日(2001,1,31,水曜). 月末日の曜日(2001,2,28,水曜). 月末日の曜日(2001,3,31,土曜). 月末日の曜日(2001,4,30,月曜). 月末日の曜日(2001,5,31,木曜). 月末日の曜日(2001,6,30,土曜). 月末日の曜日(2001,7,31,火曜). 月末日の曜日(2001,8,31,金曜). 月末日の曜日(2001,9,30,日曜). 月末日の曜日(2001,10,31,水曜). 月末日の曜日(2001,11,30,金曜). 月末日の曜日(2001,12,31,月曜). 月末日の曜日(2002,1,31,木曜). 月末日の曜日(2002,2,28,木曜). 月末日の曜日(2002,3,31,日曜). 月末日の曜日(2002,4,30,火曜). 月末日の曜日(2002,5,31,金曜). 月末日の曜日(2002,6,30,日曜). 月末日の曜日(2002,7,31,水曜). 月末日の曜日(2002,8,31,土曜). 月末日の曜日(2002,9,30,月曜). 月末日の曜日(2002,10,31,木曜). 月末日の曜日(2002,11,30,土曜). 月末日の曜日(2002,12,31,火曜). 月末日の曜日(2003,1,31,金曜). 月末日の曜日(2003,2,28,金曜). 月末日の曜日(2003,3,31,月曜). 月末日の曜日(2003,4,30,水曜). 月末日の曜日(2003,5,31,土曜). 月末日の曜日(2003,6,30,月曜). 月末日の曜日(2003,7,31,木曜). 月末日の曜日(2003,8,31,日曜). 月末日の曜日(2003,9,30,火曜). 月末日の曜日(2003,10,31,金曜). 月末日の曜日(2003,11,30,日曜). 月末日の曜日(2003,12,31,水曜). 月末日の曜日(2004,1,31,土曜). 月末日の曜日(2004,2,29,日曜). 月末日の曜日(2004,3,31,水曜). 月末日の曜日(2004,4,30,金曜). 月末日の曜日(2004,5,31,月曜). 月末日の曜日(2004,6,30,水曜). 月末日の曜日(2004,7,31,土曜). 月末日の曜日(2004,8,31,火曜). 月末日の曜日(2004,9,30,木曜). 月末日の曜日(2004,10,31,日曜). 月末日の曜日(2004,11,30,火曜). 月末日の曜日(2004,12,31,金曜). 月末日の曜日(2005,1,31,月曜). 月末日の曜日(2005,2,28,月曜). 月末日の曜日(2005,3,31,木曜). 月末日の曜日(2005,4,30,土曜). 月末日の曜日(2005,5,31,火曜). 月末日の曜日(2005,6,30,木曜). 月末日の曜日(2005,7,31,日曜). 月末日の曜日(2005,8,31,水曜). 月末日の曜日(2005,9,30,金曜). 月末日の曜日(2005,10,31,月曜). 月末日の曜日(2005,11,30,水曜). 月末日の曜日(2005,12,31,土曜). 月末日の曜日(2006,1,31,火曜). 月末日の曜日(2006,2,28,火曜). 月末日の曜日(2006,3,31,金曜). 月末日の曜日(2006,4,30,日曜). 月末日の曜日(2006,5,31,水曜). 月末日の曜日(2006,6,30,金曜). 月末日の曜日(2006,7,31,月曜). 月末日の曜日(2006,8,31,木曜). 月末日の曜日(2006,9,30,土曜). 月末日の曜日(2006,10,31,火曜). 月末日の曜日(2006,11,30,木曜). 月末日の曜日(2006,12,31,日曜). 月末日の曜日(2007,1,31,水曜). 月末日の曜日(2007,2,28,水曜). 月末日の曜日(2007,3,31,土曜). 月末日の曜日(2007,4,30,月曜). 月末日の曜日(2007,5,31,木曜). 月末日の曜日(2007,6,30,土曜). 月末日の曜日(2007,7,31,火曜). 月末日の曜日(2007,8,31,金曜). 月末日の曜日(2007,9,30,日曜). 月末日の曜日(2007,10,31,水曜). 月末日の曜日(2007,11,30,金曜). 月末日の曜日(2007,12,31,月曜). 月末日の曜日(2008,1,31,木曜). 月末日の曜日(2008,2,29,金曜). 月末日の曜日(2008,3,31,月曜). 月末日の曜日(2008,4,30,水曜). 月末日の曜日(2008,5,31,土曜). 月末日の曜日(2008,6,30,月曜). 月末日の曜日(2008,7,31,木曜). 月末日の曜日(2008,8,31,日曜). 月末日の曜日(2008,9,30,火曜). 月末日の曜日(2008,10,31,金曜). 月末日の曜日(2008,11,30,日曜). 月末日の曜日(2008,12,31,水曜). 月末日の曜日(2009,1,31,土曜). 月末日の曜日(2009,2,28,土曜). 月末日の曜日(2009,3,31,火曜). 月末日の曜日(2009,4,30,木曜). 月末日の曜日(2009,5,31,日曜). 月末日の曜日(2009,6,30,火曜). 月末日の曜日(2009,7,31,金曜). 月末日の曜日(2009,8,31,月曜). 月末日の曜日(2009,9,30,水曜). 月末日の曜日(2009,10,31,土曜). 月末日の曜日(2009,11,30,月曜). 月末日の曜日(2009,12,31,木曜). 月末日の曜日(2010,1,31,日曜). 月末日の曜日(2010,2,28,日曜). 月末日の曜日(2010,3,31,水曜). 月末日の曜日(2010,4,30,金曜). 月末日の曜日(2010,5,31,月曜). 月末日の曜日(2010,6,30,水曜). 月末日の曜日(2010,7,31,土曜). 月末日の曜日(2010,8,31,火曜). 月末日の曜日(2010,9,30,木曜). 月末日の曜日(2010,10,31,日曜). 月末日の曜日(2010,11,30,火曜). 月末日の曜日(2010,12,31,金曜). 月末日の曜日(2011,1,31,月曜). 月末日の曜日(2011,2,28,月曜). 月末日の曜日(2011,3,31,木曜). 月末日の曜日(2011,4,30,土曜). 月末日の曜日(2011,5,31,火曜). 月末日の曜日(2011,6,30,木曜). 月末日の曜日(2011,7,31,日曜). 月末日の曜日(2011,8,31,水曜). 月末日の曜日(2011,9,30,金曜). 月末日の曜日(2011,10,31,月曜). 月末日の曜日(2011,11,30,水曜). 月末日の曜日(2011,12,31,土曜). 月末日の曜日(2012,1,31,火曜). 月末日の曜日(2012,2,29,水曜). 月末日の曜日(2012,3,31,土曜). 月末日の曜日(2012,4,30,月曜). 月末日の曜日(2012,5,31,木曜). 月末日の曜日(2012,6,30,土曜). 月末日の曜日(2012,7,31,火曜). 月末日の曜日(2012,8,31,金曜). 月末日の曜日(2012,9,30,日曜). 月末日の曜日(2012,10,31,水曜). 月末日の曜日(2012,11,30,金曜). 月末日の曜日(2012,12,31,月曜). 月末日の曜日(2013,1,31,木曜). 月末日の曜日(2013,2,28,木曜). 月末日の曜日(2013,3,31,日曜). 月末日の曜日(2013,4,30,火曜). 月末日の曜日(2013,5,31,金曜). 月末日の曜日(2013,6,30,日曜). 月末日の曜日(2013,7,31,水曜). 月末日の曜日(2013,8,31,土曜). 月末日の曜日(2013,9,30,月曜). 月末日の曜日(2013,10,31,木曜). 月末日の曜日(2013,11,30,土曜). 月末日の曜日(2013,12,31,火曜). 月末日の曜日(2014,1,31,金曜). 月末日の曜日(2014,2,28,金曜). 月末日の曜日(2014,3,31,月曜). 月末日の曜日(2014,4,30,水曜). 月末日の曜日(2014,5,31,土曜). 月末日の曜日(2014,6,30,月曜). 月末日の曜日(2014,7,31,木曜). 月末日の曜日(2014,8,31,日曜). 月末日の曜日(2014,9,30,火曜). 月末日の曜日(2014,10,31,金曜). 月末日の曜日(2014,11,30,日曜). 月末日の曜日(2014,12,31,水曜). 月末日の曜日(2015,1,31,土曜). 月末日の曜日(2015,2,28,土曜). 月末日の曜日(2015,3,31,火曜). 月末日の曜日(2015,4,30,木曜). 月末日の曜日(2015,5,31,日曜). 月末日の曜日(2015,6,30,火曜). 月末日の曜日(2015,7,31,金曜). 月末日の曜日(2015,8,31,月曜). 月末日の曜日(2015,9,30,水曜). 月末日の曜日(2015,10,31,土曜). 月末日の曜日(2015,11,30,月曜). 月末日の曜日(2015,12,31,木曜). 月末日の曜日(2016,1,31,日曜). 月末日の曜日(2016,2,29,月曜). 月末日の曜日(2016,3,31,木曜). 月末日の曜日(2016,4,30,土曜). 月末日の曜日(2016,5,31,火曜). 月末日の曜日(2016,6,30,木曜). 月末日の曜日(2016,7,31,日曜). 月末日の曜日(2016,8,31,水曜). 月末日の曜日(2016,9,30,金曜). 月末日の曜日(2016,10,31,月曜). 月末日の曜日(2016,11,30,水曜). 月末日の曜日(2016,12,31,土曜). 月末日の曜日(2017,1,31,火曜). 月末日の曜日(2017,2,28,火曜). 月末日の曜日(2017,3,31,金曜). 月末日の曜日(2017,4,30,日曜). 月末日の曜日(2017,5,31,水曜). 月末日の曜日(2017,6,30,金曜). 月末日の曜日(2017,7,31,月曜). 月末日の曜日(2017,8,31,木曜). 月末日の曜日(2017,9,30,土曜). 月末日の曜日(2017,10,31,火曜). 月末日の曜日(2017,11,30,木曜). 月末日の曜日(2017,12,31,日曜). 月末日の曜日(2018,1,31,水曜). 月末日の曜日(2018,2,28,水曜). 月末日の曜日(2018,3,31,土曜). 月末日の曜日(2018,4,30,月曜). 月末日の曜日(2018,5,31,木曜). 月末日の曜日(2018,6,30,土曜). 月末日の曜日(2018,7,31,火曜). 月末日の曜日(2018,8,31,金曜). 月末日の曜日(2018,9,30,日曜). 月末日の曜日(2018,10,31,水曜). 月末日の曜日(2018,11,30,金曜). 月末日の曜日(2018,12,31,月曜). 月末日の曜日(2019,1,31,木曜). 月末日の曜日(2019,2,28,木曜). 月末日の曜日(2019,3,31,日曜). 月末日の曜日(2019,4,30,火曜). 月末日の曜日(2019,5,31,金曜). 月末日の曜日(2019,6,30,日曜). 月末日の曜日(2019,7,31,水曜). 月末日の曜日(2019,8,31,土曜). 月末日の曜日(2019,9,30,月曜). 月末日の曜日(2019,10,31,木曜). 月末日の曜日(2019,11,30,土曜). 月末日の曜日(2019,12,31,火曜). 月末日の曜日(2020,1,31,金曜). 月末日の曜日(2020,2,29,土曜). 月末日の曜日(2020,3,31,火曜). 月末日の曜日(2020,4,30,木曜). 月末日の曜日(2020,5,31,日曜). 月末日の曜日(2020,6,30,火曜). 月末日の曜日(2020,7,31,金曜). 月末日の曜日(2020,8,31,月曜). 月末日の曜日(2020,9,30,水曜). 月末日の曜日(2020,10,31,土曜). 月末日の曜日(2020,11,30,月曜). 月末日の曜日(2020,12,31,木曜). % 以下のサイトは % % 年、月が与えられた時、日曜日から始まるカレンダーを表示する。 % 日曜起点カレンダー(_年,_月) :- 月末日(_年,_月,_月末日), 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,1,_曜日を表す値,_曜日), 日曜起点カレンダー(_曜日,_月末日,_カレンダー), カレンダー表示(_カレンダー). 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー) :- findall(_日,between(1,_月末日,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), 最終週の整形(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). 最終週の整形([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 最終週の整形(R1,R2),!. 最終週の整形([],[]) :- !. 最終週の整形(L1,[L2]) :- length(L2,7), append(L1,_,L2). 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, 'Zellerの公式'(_年,_月,_日,_曜日を表す値), 'Zellerの公式で曜日を表す値と曜日'(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 'Zellerの公式'(_年,_月,_日,_曜日を表す値) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7. 'Zellerの公式で曜日を表す値と曜日'(0,日曜). 'Zellerの公式で曜日を表す値と曜日'(1,月曜). 'Zellerの公式で曜日を表す値と曜日'(2,火曜). 'Zellerの公式で曜日を表す値と曜日'(3,水曜). 'Zellerの公式で曜日を表す値と曜日'(4,木曜). 'Zellerの公式で曜日を表す値と曜日'(5,金曜). 'Zellerの公式で曜日を表す値と曜日'(6,土曜). 月末日(_年,2,29) :- うるう年(_年),!. 月末日(_年,2,28) :- !. 月末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). 月末日(_,_月,30) :- member(_月,[4,6,9,11]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. カレンダー表示([]). カレンダー表示([_週|R]) :- カレンダー週表示(_週), カレンダー表示(R). カレンダー週表示([]) :- write('\n'). カレンダー週表示([A|R]) :- 表示項(A,_表示項), writef('%3R',[_表示項]), カレンダー週表示(R). 表示項(' ',' ') :- !. 表示項(N,N). % 以下のサイトは 日曜起点カレンダー(_一日の曜日,_末日整数,_カレンダー) :- findall(_日,between(1,_末日整数,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), 最終週の整形(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). 最終週の整形([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 最終週の整形(R1,R2),!. 最終週の整形(L1,[L2]) :- length(L2,7), append(L1,_,L2). % 以下のサイトは ならびの右回転([],[]) :- !. ならびの右回転([A|R1],[E|R2]) :- ならびの右回転(R1,A,E,R2). ならびの右回転([E],A,E,[A]) :- !. ならびの右回転([B|R1],A,E,[B|R2]) :- ならびの右回転(R1,A,E,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの右回転([],[]) :- !. ならびの右回転([A|R],_右回転したならび) :- append(R,[A],_右回転したならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 文字列の右回転 % 文字列の右回転(_文字列,_右回転した文字列) :- sub_atom(_文字列,0,1,_残り文字数,_文字), sub_atom(_文字列,1,_残り文字数,0,_残り文字列), atomic_list_concat([_残り文字列,_文字],_右回転した文字列). % 以下のサイトは ならびの右ローテイト([],[]) :- !. ならびの右ローテイト([A|R1],[E|R2]) :- ならびの右ローテイト(R1,A,E,R2). ならびの右ローテイト([E],A,E,[A]) :- !. ならびの右ローテイト([B|R1],A,E,[B|R2]) :- ならびの右ローテイト(R1,A,E,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの右ローテイト([],[]) :- !. ならびの右ローテイト([A|R],_右ローテイトしたならび) :- append(R,[A],_右ローテイトしたならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 文字列の右ローテイト % 文字列の右ローテイト(_文字列,_右ローテイトした文字列) :- sub_atom(_文字列,0,1,_残り文字数,_文字), sub_atom(_文字列,1,_残り文字数,0,_残り文字列), atomic_list_concat([_残り文字列,_文字],_右ローテイトした文字列). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/206 # お題:文字列中の数字が一文字以上連続する部分を右ローテイトする。 # 例 # "2014-10-03 00:17:21" -> "21-2014-10 03:00:17" # "1 2 3 4" -> "4 1 2 3" # "a0=0;a1=1;a2=2;a3=3" -> "a3=0;a0=1;a1=2;a2=3" # # '文字列中の数字が一文字以上連続する部分を右ローテイトする。'(_文字列,_数字が一文字以上連続する部分を右ローテイトした文字列) :- atom_chars(_文字列,_文字ならび), '文字列ならびの数字が一文字以上連続する部分を右ローテイトする。'(_文字ならび,_数字列部分が右ローテイトしたならび), atomic_list_concat(_数字列部分が右ローテイトしたならび,_数字が一文字以上連続する部分を右ローテイトした文字列). '文字列ならびの数字が一文字以上連続する部分を右ローテイトする。'(_文字ならび,_数字列部分が右ローテイトしたならび) :- '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(_文字ならび,_数字列ならび,_数字列部分が右ローテイトしたならび), 右ローテイトしてから変数部分を埋める(_数字列ならび,_数字列部分が右ローテイトしたならび). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'([],[],[]). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(L1,[_数字列|R2],[_|R3]) :- 先頭からの数字ならびを数字列に変換(L1,_数字列,R1), '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(R1,R2,R3). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(L1,R2,[_文字列|R3]) :- 先頭からの数字以外の文字ならびを文字列に変換(L1,_文字列,R1), '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(R1,R2,R3), 先頭からの数字ならびを数字列に変換(L1,_数字列,R1) :- 先頭からの数字ならびを(L1,_数字ならび,R1), 数字列に変換(_数字ならび,_数字列). 先頭からの数字ならびを(L1,_数字ならび,R1) :- append(_数字ならび,R1,L1), 要素の全てが数字(_数字ならび), 'R1の最初の要素があればそれは数字ではない'(R1). 'R1の最初の要素があればそれは数字ではない'(R1) :- \+((R1 = [_文字|_],member(_文字,['0','1','2','3','4','5','6','7','8','9'])). 要素の全てが数字(_数字ならび) :- forall(member(_数字,_数字ならび),member(_数字,['0','1','2','3','4','5','6','7','8','9'])). 数字列に変換(_数字ならび,_数字列) :- atom_chars(_数字列,_数字ならび). 先頭からの数字以外の文字ならびを文字列に変換(L1,_文字列,R1) :- append(_文字ならび,R1,L1), 要素の全てが数字ではない(_文字ならび), 'R1の最初の要素があればそれは数字以外の文字ではない'(R1). 要素の全てが数字ではない(_文字ならび) :- forall(member(_文字,_文字ならび),\+(member(_文字,['0','1','2','3','4','5','6','7','8','9']))). 'R1の最初の要素があればそれは数字以外の文字ではない'(R1) :- \+((R1 = [A|_],\+(member(A,['0','1','2','3','4','5','6','7','8','9'])))). 右ローテイトしてから変数を埋める([],L2) :- !. 右ローテイトしてから変数を埋める(L1,L2) :- 右ローテイトしてから(L1,L3), 変数を埋める(L3,L2). 右ローテイトしてから([A|R],L3) :- append(R,[A],L3). 変数を埋める([],[]) :- !. 変数を埋める([_数字列|R1],[_数字列|R2]) :- 変数を埋める(R1,R2). 変数を埋める(R1,[_文字列|R2]) :- 変数を埋める(R1,R2). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/89 # 0と1のみでランダムに生成した文字列Sがある # 長さは2<=S<=1000である # 11001010110100011001011011111111111111000000000010111000000 # # 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX # 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN # としたときのMXとMNを求めよ # 見当たらない場合はFALSEを出力しろ # # S=110001010100 # MX=3 (000が一番長い) # MN=2 (11または00が二番目に長い) # # S=111111 # MX=3 (111111が一番長い) # MN=FALSE (2番目に短いものが存在しない) # # S=10 # MX=FALSE (1番長いのが存在しない) # MX=FALSE (2番目に短いものが存在しない) # # '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- '0と1のみでランダムに生成した文字列Sがある'(_文字列), forall('同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列), write('S=%t\nMX=%t,MN=%t\n',[_文字列,_最長文字列,_短い方から二番目の文字列])),!. '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- write('FALSE\n'). '0と1のみでランダムに生成した文字列Sがある'(_文字列) :- R is random(999) + 2, findall(_0または1,( between(2,R,_), _0または1 is random(3341) mod 2), _0または1ならび), atomic_list_concat(_0または1ならび,_文字列). '同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列) :- 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび), 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列). 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび) :- findall([_連続した文字列,_文字数],( 連続した文字列と文字数(_文字列,_連続した文字列,_文字数)), _連続した文字列_文字数ならび). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '0の連続したの文字列'(_文字列,_連続した文字列,_文字数). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '1の連続したの文字列と文字数'(_文字列,_連続した文字列,_文字数). '0の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='0'). '1の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='1'). 前後に0の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'0')), \+(sub_atom(_文字列,_開始点_2,1,_,'0')). 前後に1の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'1')), \+(sub_atom(_文字列,_開始点_2,1,_,'1')). 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列) :- 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数), 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列). 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数) :- 文字列長ならび(_連続した文字列と文字数ならび,_文字列長ならび), sort(_文字列長ならび,_整列した文字列長ならび), nth1(2,_整列した文字列長ならび,_短い方から二番目に短い文字数), append(_,[_最長文字数],_整列した文字列長ならび). 文字数ならび(_連続した文字列と文字数ならび,_文字数ならび) :- findall(_文字数,( member([_,_文字数],_連続した文字列と文字列数ならび)), _文字数ならび). 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列) :- member([_最長文字列,_最長文字数],_連続した文字列と文字数ならび), member([_短い方から二番目に短い文字列,_短い方から二番目に短い文字数],_連続した文字列と文字数ならび). % 以下のサイトは % ?- append(L1,[E|L2],[1,2,3]). % L1 = [], E = 1, L2 = [2,3]; % L1 = [1], E = 2, L2 = [3]; % L1 = [1,2], E = 3, L2 = []. % % append/3の定義 % % append([],L,L). % append([U|L1],L2,[U|L3]) :- % append(L1,L2,L3). % % append/3 を 'リストを注目要素、その前リスト、後リストに分割する'/4 に変形。 % 'リストを注目要素、その前リスト、後リストに分割する'([_注目要素|R],[],_注目要素,R). 'リストを注目要素、その前リスト、後リストに分割する'([U|R],[U|L1],_注目要素,L2) :- 'リストを注目要素、その前リスト、後リストに分割する'( R , L1 ,_注目要素,L2). ?- 'リストを注目要素、その前リスト、後リストに分割する'([1,2,3],_前リスト,_注目要素,_後リスト). _前リスト = [], _注目要素 = 1, _後リスト = [2,3]; _前リスト = [1], _注目要素 = 2, _後リスト = [3]; _前リスト = [1,2],_注目要素 = 3, _後リスト = []. % 以下のサイトは % 駒場東大前から下北沢までの距離を求めなさい 井の頭線(渋谷,500). 井の頭線(神泉,900). 井の頭線(駒場東大前,1000). 井の頭線(池ノ上,600). 井の頭線(下北沢,500). 井の頭線(新代田,500). 駒場東大前から下北沢までの距離(_駒場東大前から下北沢までの距離) :- 井の頭線リスト(_井の頭線リスト), 駒場東大前から下北沢の区間の距離リスト(_井の頭線リスト,_駅間距離のリスト), sum_list(_駅間距離のリスト,_駒場東大前から下北沢までの距離). 井の頭線リスト(_井の頭線リスト) :- findall((_駅,_次の駅までの距離),井の頭線(_駅,_次の駅までの距離),_井の頭線リスト). 駒場東大前から下北沢の区間の距離リスト(_井の頭線リスト,_駅間距離のリスト) :- _駒場東大前から下北沢までのリスト = [(駒場東大前,_)|_], append(_,_駒場東大前から下北沢までのリスト,[(下北沢,_)|_],_井の頭線リスト), findall(_距離,member((_,_距離),_駒場東大前から下北沢までのリスト),_駅間距離のリスト). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは yes. % 駒場東大前から下北沢までの距離を求めなさい 井の頭線(渋谷,500). 井の頭線(神泉,900). 井の頭線(駒場東大前,1000). 井の頭線(池ノ上,600). 井の頭線(下北沢,500). 井の頭線(新代田,500). 駒場東大前から下北沢までの距離(_駒場東大前から下北沢までの距離) :- findall((_駅,_次の駅までの距離),井の頭線(_駅,_次の駅までの距離),_井の頭線リスト), append(_,[(駒場東大前,_距離_1)|R],[(下北沢,_)|_],_井の頭線リスト), findall(_距離,member((_,_距離),[(駒場東大前,_距離_1)|R]),_駅間距離のリスト), sum_list(_駅間距離のリスト,_駒場東大前から下北沢までの距離). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 問題文 # 高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k−1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 # # 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べたいと思いました。 # # 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # N # A1 # A2 # : # AN # 1 行目には、硬貨の種類数 N(1≦N≦50) が、1 行で与えられる。 # 2 行目から N 行では、高橋君が各硬貨を何枚持っているかが与えられる。 このうち i(1≦i≦N) 行目では、 i 番目の硬貨を、高橋君が何枚持っているかを表す整数 Ai(0≦Ai≦50000)が与えられる。 # 出力 # 高橋君が払える金額の種類数を、 1000000007 で割った余りを 1 行で出力せよ。出力の末尾は改行をいれること。 # # 入力例1 # 2 # 2 # 1 # 出力例1 # 5 # 払える金額は、1 円, 2 円, 10 円, 11 円, 12 円の 5 通りとなります。 # # 0 円は含まないことに注意してください。 # # 入力例2 # 2 # 32 # 3 # 出力例2 # 62 # 1 円から 62 円の 62 通りの金額を支払うことが出来ます。 # # 入力例3 # 4 # 12 # 3 # 7 # 34 # 出力例3 # 12039 # 入力例4 # 10 # 1234 # 2 # 857 # 3858 # 1 # 5000 # 32 # 4 # 1 # 857 # 出力例4 # 969347336 # 1000000007 で割った余りを出力してください。 # '高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k‐1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べた いと思いました。 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるた め、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。' :- 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_種類別枚数ならび), 最大何通り(_種類別枚数ならび,_最大何通り), 最大可能性から重複を差し引く(_種類別枚数ならび,_最大何通り,_何通り), '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り). 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび) :- 標準入力から整数を得る(_何種類), findall([M,_整数],( between(1,_何種類,N), succ(M,N), 標準入力から整数を得る(_整数)), _枚数ならび). 最大何通り(_種類別枚数ならび,_最大何通り) :- 最大何通り(_種類別枚数ならび,1,_最大何通り). 最大何通り([],_最大何通り,_最大何通り). 最大何通り([[_,0]|R]],_最大何通り,_最大何通り) :- 最大何通り(R,_最大何通り,_最大何通り),!. 最大何通り([[A,B]|R],N,_最大何通り) :- N_2 is B * N, 最大何通り(R,N_2,_最大何通り). 最大可能性から重複を差し引く(_種類別枚数ならび,_最大何通り,_何通り) :- findsum(_差し引き数,( append(L1,[[_種類,_枚数]|L2],_種類別枚数ならび), 差し引き数(_種類,_枚数,L1,_差し引き数)), _重複差し引き数), _何通り is _最大何通り - _重複差し引き数. 差し引き数(_種類_1,_枚数_1,L1,_差し引き数)) :- findsum(_差し引き数_3,( member([_種類,_枚数],L1), _差し引き数_1 is _枚数_1 // (_種類_1 // _種類), _差し引き数_2 is _枚数 // (_種類_1 // _種類), 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_3)), _差し引き数). 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_1) :- _差し引き数_1 =< _差し引き数_2,!. 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_2). '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り),!. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- writef('%t何通り\n',[_何通り]). '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- _何通り >= 1000000007, _何通りを1000000007で割った余り is _何通り mod 1000000007, writef('%t何通り\n',[_何通りを1000000007で割った余り]). 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # (21:13 追記) |A|=|B|=1のケースがテスト中に一つ含まれていましたので、リジャッジを行います。なお、このケースでNOを出力するプログラムに影響はありません。 # # 文字列 A の文字をちょうど 3 回スワップすることにより、文字列 B に変換できるとき、二つの文字列 A, B を、仲良し文字列と呼ぶことにします。 # # スワップとは、文字列に含まれる 2 つの文字を、入れ替えることを指します。 例えば、abcという文字列であれば、aとcを入れ替えて、cbaのように変換することが出来ます。 # # aaのような文字列に対し、 1 文字目のaと、 2 文字目のaを入れ替えることは許されていますが、同じ場所の文字を指定することはできません。 # # 文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # B # 1 行目には、文字列 A(2≦|A|≦1000) が与えられる。 # 2 行目には、文字列 B(|B|=|A|) が与えられる。 # A, B 共に、小文字アルファベットのみで構成されていることが保障されている。 # 出力 # 与えられた 2 つの文字列が、仲良し文字列であればYES、そうでなければNOを出力せよ。 出力の末尾には改行をいれること。 # # 入力例1 # abcdef # fedcba # 出力例1 # YES # まず、文字列 A のabcdefのaとfをスワップし、fbcdeaとします。 # # 次に、bとeをスワップし、fecdbaとします。 # # 最後に、cとdをスワップし、fedcbaとすると、文字列 B と一致します。 # # よって、この 2 つの文字列は、仲良し文字列となるため、YESと出力します。 # # 入力例2 # abababab # babababa # 出力例2 # NO # 使っている文字数が同じでも、 3 回のスワップでは同じ文字列にできないパターンも存在します。 # # 入力例3 # nt # nt # 出力例3 # NO # スワップの仕方が 1 通りしかなく、 3 回のスワップを繰り返すと、tnになってしまいます。 よって、同じ 2 つの文字列ですが、仲良し文字列ではありません。 # # 入力例4 # pqqq # pqqq # 出力例4 # YES # まず、 1 番目の文字と 2 番目の文字を入れ替え、qpqqとします。 次に、 3 番目の文字と 4 番目の文字を入れ替え、qpqqとします。この際、同じ文字を選んでいますが、場所が違うので問題ありません。 最後に、1番目の文字と、2番目の文字を入れ替え、pqqqとします。 # # 入力例5 # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyzw # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz # 出力例5 # YES # 長い文字列が与えらえれることがあることにも注意してください。 # # 入力例6 # abcdef # ghijkl # 出力例6 # NO '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- 標準入力から二つの文字列を得る(A,B), '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B). '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- 文字列と仲良し文字列(A,B), write('YES\n'),!. '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- write('NO\n'). 文字列と仲良し文字列(_文字列,_仲良し文字列) :- 二つの文字列をならびに変換する(_文字列,_仲良し文字列,L1,L2), '二つのならびの差分(L3,L4)と同一部分(L5)'(L1,L2,L3,L4,L5), 三組のスワップが存在する(L3,L4,L5,Len). 二つの文字列をならびに変換する(_文字列,_仲良し文字列,L1,L2) :- atom_chars(_文字列,L1), atom_chars(_仲良し文字列,L2). '二つのならびの差分(L3,L4)と同一部分(L5)'([],[],[],[],[]). '二つのならびの差分(L3,L4)と同一部分(L5)'([A|R1],[A|R2],R3,R4,[A|R5]) :- '二つのならびの差分(L3,L4)と同一部分(L5)'(R1,R2,R3,R4),!. '二つのならびの差分(L3,L4)と同一部分(L5)'([A|R1],[B|R2],[A|R3],[B|R4],R5) :- '二つのならびの差分(L3,L4)と同一部分(L5)'(R1,R2,R3,R4,R5). 三組のスワップが存在する(L3,L4,L5,Len) :- 二つのならびは同一要素からなる(L3,L4,Len), 整列(L5,L6), 同一文字のペアの可能性を含めて三組のスワップが存在するかどうかの検査(Len,L6). 二つのならびは同一要素からなる(L3,L4,Len) :- length(L3,Len), length(L4,Len). 同一の要素からなる(L3,L4). 同一の要素からなる([],[]). 同一の要素からなる([A|R1],L2) :- select(A,L2,R2), 同一の要素からなる(R1,R2). 同一文字のペアの可能性を含めて三組のスワップが存在するかどうかの検査(Len,L6) :- 同一文字ペアを数える(L6,_同一文字ペア数), 同一文字同士のスワップ検査(Len,_同一文字ペア数). 同一文字ペアの数を数える([],[]). 同一文字ペアの数を数える([A,A|R],[_|R2]) :- 同一文字ペアの数を数える(R1,R2),!. 同一文字ペアの数を数える([_|R1],R2) :- 同一文字ペアの数を数える(R1,R2). 同一文字同士のスワップ検査(3,_) :- !. 同一文字同士のスワップ検査(2,[_|_]) :- !. 同一文字同士のスワップ検査(1,[_,_|_]) :- !. 同一文字同士のスワップ検査(0,[_,_,_|_]). 整列([],[]). 整列([_軸要素|_残りならび],_整列したならび) :- 軸要素との大小で分割してそれぞれ整列する(_軸要素,_残りならび,_整列したL1,_整列したL2), append(_整列したL1,[_軸要素|_整列したL2],_整列したならび). 軸要素との大小で分割してそれぞれ整列する(_軸要素,_残りならび,_整列したL1,_整列したL2) :- 分割(_軸要素,_残りならび,L1,L2), 整列(L1,_整列したL1), 整列(L2,_整列したL2). 分割(_軸要素,[],[],[]). 分割(_軸要素,[A|R1],[A|R2],R3) :- 軸要素より大きい時は(_軸要素,A,R1,R2,R3). 分割(_軸要素,[A|R1],[A|R2],R3) :- 軸要素と等しいか小さい時は(_軸要素,A,R1,R2,R3). 軸要素より大きい時は(_軸要素,A,R1,R2,R3) :- _軸要素 @< A, 分割(_軸要素,R1,R2,R3). 軸要素と等しいか小さい時は(_軸要素,A,R1,R2,R3) :- _軸要素 @>= A, 分割(_軸要素,R1,R2,R3). 標準入力から二つの文字列を得る(A,B) :- 標準入力から文字列を得る(A), 標準入力から文字列を得る(B). 標準入力から文字列を得る(_文字列) :- findall(_文字,( 一文字を得る(_文字), (終了文字(_文字),!,fail;true)),_文字ならび), atom_chars(_文字列,_文字ならび). 一文字を得る(_文字) :- get_char(_文字). 一文字を得る(_文字) :- 一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 # # 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 # # この対面にある、底面に書かれた数字を出力してください。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # 1 行目には、サイコロの上の面に書かれている数字を表す 1 つの整数 A(1≦A≦6) が与えられる。 # 出力 # サイコロの底の面に書かれている数字を 1 行で出力せよ。出力の末尾には改行をいれること。 # # 入力例1 # 6 # 出力例1 # 1 # 6 の裏に書かれている数字は 1 です。 # # 入力例2 # 3 # 出力例2 # 4 # :- dynamic(対面にある数字/2). 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 この対面にある、底面に書かれた数字を出力してください。' :- 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。', '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A), 'この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字), 出力してください(_対面にある底面に書かれた数字). 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。' :- ' 1 から 6 までの数字が一つずつ書かれており、'(_1から6までの数字), 対面の和が 7 になるように作られています。'(_1から6までの数字). ' 1 から 6 までの数字が一つずつ書かれており、'(_1から6までの数字) :- between(1,6,_1から6までの数字). '対面の和が 7 になるように作られています。'(_1から6までの数字) :- '対面の和が 7 に'(_1から6までの数字,_対面にある数字), 'なるように作られています。'(_1から6までの数字,_対面にある数字). '対面の和が 7 に'(_1から6までの数字,_対面にある数字) :- length(L1,_1から6までの数字), length(_対面の和を表すならび,7), append(L1,L2,_対面の和を表すならび), length(L2,_対面にある数字). 'なるように作られています。'(_1から6までの数字,_対面にある数字) :- assertz(対面にある数字(_1から6までの数字,_対面にある数字)). '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A) :- 標準入力から整数を得る(_A). 'この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字) :- 対面にある数字(_A,_対面にある底面に書かれた数字). 出力してください(_対面にある底面に書かれた数字) :- writef('%t\n',[_対面にある底面に書かれた数字]). 標準入力から整数を得る(_A) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 # # 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 # # この対面にある、底面に書かれた数字を出力してください。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # 1 行目には、サイコロの上の面に書かれている数字を表す 1 つの整数 A(1≦A≦6) が与えられる。 # 出力 # サイコロの底の面に書かれている数字を 1 行で出力せよ。出力の末尾には改行をいれること。 # # 入力例1 # 6 # 出力例1 # 1 # 6 の裏に書かれている数字は 1 です。 # # 入力例2 # 3 # 出力例2 # 4 # 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 この対面にある、底面に書かれた数字を出力してください。' :- '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A), 'このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字), 出力してください(_対面にある底面に書かれた数字). '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A) :- 標準入力から整数を得る(_A). 'このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字) :- length(L1,_A), length(L2,_対面にある底面に書かれた数字), length(_対面の和を表すならび,7), append(L1,L2,_対面の和を表すならび). 出力してください(_対面にある底面に書かれた数字) :- writef('%t\n',[_対面にある底面に書かれた数字]). 標準入力から整数を得る(_A) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0.0,200.0,_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), read_term_from_atom(_身長文字列,_身長,[]), read_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重) :- 収束条件を満たす(_体重_下,_体重_上,_体重),!. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下_1,_体重_上_1,_身長,_BMI,_体重) :- '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重). 収束条件を満たす(_体重_下,_体重_上,_体重) :- (_体重_上 - _体重_下) < 0.1, _体重 is (_体重_上 + _体重_下) / 2. '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上) :- '新しい体重とその時のBMIを計算する'(_体重_下_1,_体重_上_1,_身長,_BMI_2,_体重_2), '次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_体重_2,_BMI,_BMI_2,_体重_下,_体重_上). '新しい体重とその時のBMIを計算する'(_体重_下,_体重_上,_身長,_BMI_2,_体重_2) :- _体重_2 is (_体重_下 + _体重_上) / 2, _BMI_2 is _体重_2 / ((_身長 / 100) ^ 2). '次の体重の計算区間を得る'(_体重_下,_,_体重_2,_BMI,_BMI_2,_体重_下,_体重_2) :- _BMI_2 =< _BMI,!. '次の体重の計算区間を得る'(_体重_下,_体重_上,_体重_2,_BMI,_BMI_2,_体重_2,_体重_上). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % これはsplitをわかりやすいように簡略化した定義です。 % より完全なsplit/3の定義はこちらをご覧ください % split(_文,_区切り語ならび,_区切られた語ならび) :- 区切り語ならびの変形(_区切り語ならび,SeparatersL), atom_chars(_文,_文字ならび), split_list_1(_文字ならび,SeparatersL,_区切られた語ならび). sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. 'SPLIT'(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Z), Z = X,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% split_list([],SeparatersL,[]). split_list(L1,SeparatersL,[L2|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), split_list(R2,SeparatersL,R). split_list(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list(R2,SeparatersL,X). split_list_1([],SeparatersL,[]). split_list_1(L1,SeparatersL,[A|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), atom_chars(A,L2), split_list_1(R2,SeparatersL,R). split_list_1(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list_1(R2,SeparatersL,X). split_list_2([],_,[],[]). split_list_2(L1,SeparatersL,[],R) :- member(L2,SeparatersL), append(L2,R,L1). split_list_2([A|R1],SeparatersL,[A|R2],R) :- \+((member(L2,SeparatersL),append(L2,_,[A|R1]))), split_list_2(R1,SeparatersL,R2,R). 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび), atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,NL), catch(atom_chars(C,NL),_,fail),!. split_5(B,C) :- concat_atom(B,C),!. split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42([],[],'',_,[]) :- !. numeric_list([],[]) :- !. numeric_list([A|R],[B|R1]) :- digit(A), char_code(A,B), numeric_list(R,R1),!. numeric_list(['.'|R],[46|R1]) :- numeric_list(R,R1),!. numeric_list([-|R],[45|R1]) :- numeric_list(R,R1),!. number(A,B) :- number_codes(A,B). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/db/1402919549/274 # よろしくお願いいたします。 # 【DBMS名とバージョン】Oracle 11g # 【テーブルデータ】 # ID   YMD # 1  20140101 # 1  20140102 # 1  20140103 # 1  20140105 # 1  20140106 # 2  20140101 # 2  20140102 # 【欲しい結果 】 # ID START_YMD END_YMD # 1 20140101 20140103 # 1 20140105 20140106 # 2 20140101 20140102 # 【説明】 # レコード単位で一日の日付を持つデータをグループかして、 # 開始日付と終了日付に集約したいです。 # ただし、一日でも間があれば、集約データ内では別レコードとして扱いたいです。 # # どなたかいいお知恵がございましたら、よろしくお願いいたしますm(_ _)m # # 'レコード単位で一日の日付を持つデータをグループかして、 開始日付と終了日付に集約したいです。 ただし、一日でも間があれば、集約データ内では別レコードとして扱いたいです。'(_id,_START_YMD,_END_YMD) :- setof(_ID,[_ID,_YMD] ^ table(_ID,_YMD),_ID候補), member(_ID,_ID候補), setof(_YMD,[_ID,_YMD] ^ table(_ID,_YMD),_YMD候補), 連続性検査(_YMD候補,_START_YMD,_END_YMD). 連続性検査(_YMD候補,_START_YMD,_END_YMD) :- append([L1,[_START_YMD|R2],L2],_YMD候補), 連続している([_START_YMD|R2],_END_YMD), 連続していない(L1,[_START_YMD]), 連続していない([_END_YMD],L2). 連続している([_END_YMD],_END_YMD) :- !. 連続している([_YMD_1,_YMD_2|R1],_END_YMD) :- 翌日(_YMD_1,_YMD_2), 連続している([_YMD_2|R1],_END_YMD). 連続していない(L1,L2) :- \+((last(L1,_YMD_1),L2 = [_YMD_2|_],翌日(_YMD_1,_YMD_2))). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 翌日(_YMD,_翌日) :- 年月日(_YMD,_年,_月,_日), 翌日(_年,_月,_日,_翌日). 年月日(_YMD,_年,_月,_日) :- sub_atom(_YMD,0,2,_,_年), sub_atom(_YMD,2,2,_,_月), sub_atom(_YMD,4,2,_,_日). 翌日(_年,_月,_日,_翌日) :- 年月換わり(年,_月,_日,_翌日),!. 翌日(_年,_月,_日,_翌日) :- 翌日の日(_日,_翌日の日), atomic_list_concat([_年,_月,_翌日の日],_翌日). 年月換わり(_年,'02',_月末日,_翌日) :- 二月月末(_年,'02',_月末日,_翌日). 年月換わり(_年,_月,_月末日,_翌日) :- 小の月の月末日の翌日(_月,_月末日,_翌日). 年月換わり(_年,_月,_月末日,_翌日) :- 大の月の月末日の翌日(_年,_月,_月末日,_翌日). 二月月末(_年,'02','29',_翌日) :- atomic_list_concat([_年,'03','01'],_翌日). 二月月末(_年,'02','28',_翌日) :- atom_number(_年,_年整数), \+(うるう年(_年整数)), atomic_list_concat([_年,'03','01'],_翌日). 小の月の月末日の翌日(_月,'30',_翌日) :- member(_月,['04','06','09','11']), 翌月(_月,_翌月), atomic_list_concat([_年,_翌月,'01'],_翌日). 大の月の月末日の翌日(_年,_月,'31',_翌日) :- member(_月,['01','03','05','07','08','10','12']), 翌月(_月,_翌月), 年換わり(_年,_月,_年_1), atomic_list_concat([_年_1,_翌月,'01'],_翌日). 年換わり(_年,'12',_翌年) :- 翌年(_年,_翌年). 年換わり(_年,_月,_年) :- \+(_月='12'). うるう年(_うるう年) :- 0 is mod _うるう年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_うるう年) :- 0 is _うるう年 mod 4. 翌月('01','02'). 翌月('02','03'). 翌月('03','04'). 翌月('04','05'). 翌月('05','06'). 翌月('06','07'). 翌月('07','08'). 翌月('08','09'). 翌月('09','10'). 翌月('10','11'). 翌月('11','12'). 翌月('12','01'). 翌日の日('01','02'). 翌日の日('02','03'). 翌日の日('03','04'). 翌日の日('04','05'). 翌日の日('05','06'). 翌日の日('06','07'). 翌日の日('07','08'). 翌日の日('08','09'). 翌日の日('09','10'). 翌日の日('10','11'). 翌日の日('11','12'). 翌日の日('12','13'). 翌日の日('13','14'). 翌日の日('14','15'). 翌日の日('15','16'). 翌日の日('16','17'). 翌日の日('17','18'). 翌日の日('18','19'). 翌日の日('19','20'). 翌日の日('20','21'). 翌日の日('21','22'). 翌日の日('22','23'). 翌日の日('23','24'). 翌日の日('24','25'). 翌日の日('25','26'). 翌日の日('26','27'). 翌日の日('27','28'). 翌日の日('28','29'). 翌日の日('29','30'). 翌日の日('30','31'). 翌年(_年,_翌年) :- atom_number(_年,_年整数), succ(_年整数,_翌年の年整数), atom_number(_翌年,_翌年の年整数). % 以下のサイトは # 問題文 # 天下一王国では整数は辞書順比較で表します。入国したばかりのダイキ君はとりあえず 1000 までの整数を書き出すことにしました。 # # 1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力してください。 # # 辞書順比較について # 文字列 A に対して、 Ai で i 番目の文字を表し、 |A| で文字列 A の文字数を表すことにすると、文字列 A と文字列 B を辞書順比較で比較するとは、 # # Ai≠Bi となる最小の i (1?i?min(|A|, |B|))に対して # AiBi であれば、文字列 A は文字列 B より大きい # そのような i が存在しなければ、文字数が少ない方を小さいとする # として文字列 A と文字列 B の大小関係を決めることである。 # # 例えば、 1, 2, 11, 12, 21 を辞書順比較で昇順にソートすると 1, 11, 12, 2, 21 となる。 # # 入力 # この問題では入力は与えられない。 # # # 出力 # 1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力せよ。 # # なお、行の終端には改行が必要である。 '1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力してください。' :- '1 以上 1000 以下のすべての整数を十進数で表した文字列を'(_十進文字列ならび), '辞書順比較で昇順にソートして、'(_十進文字列ならび,_辞書順比較で昇順にソートされた文字列ならび), '1 行ずつ出力してください。'(_辞書順比較で昇順にソートされた文字列ならび). '1 以上 1000 以下のすべての整数を十進数で表した文字列を'(_十進文字列ならび) :- findall(_十進文字列,'1 以上 1000 以下のすべての整数を十進数で表した'(_十進数文字列),_十進文字列ならび). '1 以上 1000 以下のすべての整数を十進数で表した'(_十進数文字列) :- '1 以上 1000 以下のすべての整数を'(_整数), 十進数で表した(_整数,_十進数で表した). '1 以上 1000 以下のすべての整数を'(_整数) :- between(1,1000,_整数). 十進数で表した文字列を(_整数,_十進数で表した文字列) :- number_chars(_整数,Chars), atom_chars(_十進数で表した文字列,Chars). '辞書順比較で昇順にソートして、'([],[]). '辞書順比較で昇順にソートして、'([_軸要素|L1],L2) :- '辞書順比較で軸要素との大小で分割'(_軸要素,L1,L1_1,L1_2), '辞書順比較で昇順にソートして、'(L1_1,L1_1_2), '辞書順比較で昇順にソートして、'(L1_2,L1_2_2), append(L1_1_2,[_軸要素|L1_2_2],L2). '辞書順比較で軸要素との大小で分割'(_,[],[],[]). '辞書順比較で軸要素との大小で分割'(_軸要素,[A|R2],[A|R3],R4) :- '辞書順に小さい'(A,_軸要素),!, '辞書順比較で軸要素との大小で分割'(_軸要素,R2,R3,R4). '辞書順比較で軸要素との大小で分割'(_軸要素,[A|R2],R3,[A|R4]) :- '辞書順比較で軸要素との大小で分割'(_軸要素,R2,R3,R4). '辞書順に小さい'(_文字列_1,_文字列_2) :- '文字列_1に小さい文字が先に出現した'(_文字列_1,_文字列_2),!. '辞書順に小さい'(_文字列_1,_文字列_2) :- 文字列の差分が文字列_2にある(_文字列_1,_文字列_2). '文字列_1に小さい文字が先に出現した'(_文字列_1,_文字列_2) :- 先頭から同一位置の文字を比較して(_文字列_1,_文字列_2,_文字_1,_文字_2), \+(_文字_1 = _文字_2),!, _文字_1 @< _文字_2. 先頭から同一位置の文字を比較して(_文字列_1,_文字列_2,_文字_1,_文字_2) :- sub_atom(_文字列_1,_同一位置,1,_,_文字_1), sub_atom(_文字列_2,_同一位置,1,_,_文字_2). '文字列の差分が文字列_2にある'(_文字列_1,_文字列_2) :- sub_atom(_文字列_2,0,_文字列_1の長さ,_差分文字数,_文字列_1), _差分文字数 > 0. '1 行ずつ出力してください。'(L2) :- forall(member(M,L2),writef('%t\n',[M])). % 以下のサイトは # 要件 # # ユーザーテーブル(users)は入会日(joined_on)と退会日(left_on)を持っている # 退会していないユーザーの場合、退会日にはNULLが入る # ユーザー数の増減を確認するために、日付単位で入会したユーザーの人数と退会したユーザーの人数を一覧化したい。どうすれば取得できるか? # 例 # # ユーザーテーブル(users) # # id joined_on left_on # 1 2014-08-01 2014-08-10 # 2 2014-08-01 2014-08-05 # 3 2014-08-03 NULL # 4 2014-08-03 2014-08-10 # 5 2014-08-10 NULL # 期待する出力結果 # # date joined_count left_count # 2014-08-01 2 0 # 2014-08-03 2 0 # 2014-08-05 0 1 # 2014-08-10 1 2 # ユーザーテーブル(1,'2014-08-01','2014-08-10'). ユーザーテーブル(2,'2014-08-01','2014-08-05'). ユーザーテーブル(3,'2014-08-03','NULL'). ユーザーテーブル(4,'2014-08-03','2014-08-10'). ユーザーテーブル(5,'2014-08-10','NULL'). 'ユーザーテーブル(users)は入会日(joined_on)と退会日(left_on)を持っている 退会していないユーザーの場合、退会日にはNULLが入る ユーザー数の増減を確認するために、日付単位で入会したユーザーの人数と 退会したユーザーの人数を一覧化したい。どうすれば取得できるか?' :- setof(_日付,[_日付] ^ 'joined_onの候補+left_offの候補'(_日付),_日付候補), '日付単位で入会したユーザーの人数と退会したユーザーの人数を一覧したい。'(_日付候補). 'joined_onの候補+left_offの候補'(_日付) :- ユーザーテーブル(_,_入会日付,_退会日付), member(_日付,[_入会日付,_退会日付]), \+(_日付 = 'NULL'). '日付単位で入会したユーザーの人数と退会したユーザーの人数を一覧したい。'(_日付候補) :- '日付単位で入会したユーザーの人数と退会したユーザーの人数を'(_日付候補,_日付,_入会したユーザーの人数,_退会したユーザーの人数,R), 表示する(_日付,_入会したユーザーの人数,_退会したユーザーの人数), R = []. '日付単位で入会したユーザーの人数と退会したユーザーの人数を'(_日付候補,_日付,_入会したユーザーの人数,_退会したユーザーの人数,R) :- append(_,[_日付|R],_日付候補), 度数(ユーザーテーブル(_,_日付,_),_入会したユーザーの人数), 度数(ユーザーテーブル(_,_,_日付),_退会したユーザーの人数). 表示する(_日付,_入会したユーザーの人数,_退会したユーザーの人数) :- writef('%t %3r %3r\n',[_日付,_入会したユーザーの人数,_退会したユーザーの人数]). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/555 # お題:全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら # 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。 # 例 # p=213, x=16 -> 13 # p=214, x=16 -> false # p=333, x=29 -> 27 # # '全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。'(_p,_x,_最小のn) :- 毎日読む(_p,_x,_最後の日の頁数,_全集), _最後の日の頁数 = [_], length(_全集,_最小のn). 毎日読む(_p,_x,_残り頁数,_全集) :- 頁をならびで表現する(_p,_x,_p頁,_x頁), '毎日読む'([_],_p頁,_p頁,_x頁,_全集,_残り頁数),!. 頁をならびで表現する(_p,_x,_p頁,_x頁) :- length(_p頁,_p), length(_x頁,_x). 毎日読む(_冊数,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数) :- '終了条件は_残り頁数が[]または[_]'(_冊数,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数). 毎日読む(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数) :- '一冊読み切れなかったら翌日に、読み切ったら次の本を'(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数). '一冊読み切れなかったら翌日に、読み切ったら次の本を'(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数) :- 一冊読み切れなかったら翌日に(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数). '一冊読み切れなかったら翌日に、読み切ったら次の本を'(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数) :- 読み切ったら次の本を(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数). 一冊読み切れなかったら翌日に(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数) :- append(_x頁,_現在の頁数_2,_現在の頁数), 毎日読む(_冊数_1,_現在の頁数_2,_p頁,_x頁,_冊数,_残り頁数). 読み切ったら次の本を(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数) :- append(_現在の頁数,_p頁,_現在の頁数_2), 毎日読む([_|_冊数_1],_現在の頁数_2,_p頁,_x頁,_冊数,_残り頁数). '終了条件は_残り頁数が[]または[_]'(_冊数,_現在の頁数,_p頁,_x頁,_冊数,[_]) :- append(_x頁,[_],_現在の頁数). '終了条件は_残り頁数が[]または[_]'(_冊数,[],_p頁,_x頁,_冊数,[]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/555 # お題:全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら # 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。 # 例 # p=213, x=16 -> 13 # p=214, x=16 -> false # p=333, x=29 -> 27 # # '全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。'(_p頁,_x頁,_n巻) :- '全n巻の全集があり'(_全集,_n巻), '各巻の頁数はすべてp頁である。'(_全集,_p頁), 毎日x頁づつ読んだら最後の日は(_全集,_x頁,_最後の日に読んだ頁数),!, '1頁だけだった。解がない場合は偽を返す。'(_最後の日に読んだ頁数). '全n巻の全集があり'(_全集,_n巻) :- length(_全集,_n巻). '各巻の頁数はすべてp頁である。'(_全集,_p頁) :- findall(_各巻,( member(_各巻,_全集), length(_各巻,_p頁)),_全集). 毎日x頁づつ読んだら最後の日は(_全集,_x頁,_最後の日に読んだ頁数) :- flatten(_全集,_全集の全頁数), length(_x頁ならび,_x頁), 最後の日は(_全集の全頁数,_x頁ならび,_最後の日に読んだ頁数). 最後の日は(_最後の日に読んだ頁数,_最後の日に読んだ頁数,_最後の日に読んだ頁数). 最後の日は([_],_,[_]). 最後の日は(L,_x頁ならび,_最後の日に読んだ頁数) :- append(_x頁ならび,L2,L), 最後の日は(L2,_x頁ならび,_最後の日に読んだ頁数). '1頁だけだった。解がない場合は偽を返す。'(_最後の日に読んだ頁数) :- _最後の日に読んだ頁数 = [_]. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/555 # お題:全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら # 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。 # 例 # p=213, x=16 -> 13 # p=214, x=16 -> false # p=333, x=29 -> 27 # # '全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。'(_p頁,_x頁,_n巻) :- '全n巻の全集があり'(_全集,_n巻), '各巻の頁数はすべてp頁である。'(_全集,_p頁), '毎日x頁づつ読んだら最後の日は1頁だけだった。'(_全集,_x頁,_最後の日に読んだ頁数),!, _最後の日に読んだ頁数 = [_]. '全n巻の全集があり'(_全集,_n巻) :- length(_全集,_n巻). '各巻の頁数はすべてp頁である。'(_全集,_p頁) :- findall(_各巻,( member(_各巻,_全集), length(_各巻,_p頁)), _全集). '毎日x頁づつ読んだら最後の日は1頁だけだった。'(_全集,_x頁,_最後の日に読んだ頁数) :- flatten(_全集,_全集の全頁数), length(_x頁ならび,_x頁), 最後の日は(_全集の全頁数,_x頁ならび,_最後の日に読んだ頁数). 最後の日は(_最後の日に読んだ頁数,_最後の日に読んだ頁数,_最後の日に読んだ頁数). 最後の日は([_],_,[_]). 最後の日は(L,_x頁ならび,_最後の日に読んだ頁数) :- append(_x頁ならび,L2,L), 最後の日は(L2,_x頁ならび,_最後の日に読んだ頁数). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/769 # [1] 授業単元:プログラミング # [2] 問題文 # 6人の学生の点数を読み込み、最高点を表示するプログラムを作成せよ # '6人の学生の点数を読み込み、最高点を表示するプログラムを作成せよ' :- '6人の学生の点数を読み込み、最高点を表示する'. '6人の学生の点数を読み込み、最高点を表示する' :- '6人の学生の点数を読み込み、'(_6人の学生の点数), 最高点を表示する(_6人の学生の点数). '6人の学生の点数を読み込み、'(_6人の学生の点数) :- '6人の学生の'(_6人の学生の点数), 点数を読み込み(_6人の学生の点数). '6人の学生の点数を読み込み、'(_6人の学生の点数) :- findall(_学生の点数,( between(1,6,_), 整数を得る(学生の点数,true,_学生の点数)), _6人の学生の点数). 最高点を表示する(_6人の学生の点数) :- 最高点を(_6人の学生の点数,_最高点), 表示する(_6人の学生の点数,_最高点). 最高点を(_6人の学生の点数,_最高点) :- append(L1,[_最高点|L2],_6人の学生の点数), \+((member(A,L1),A > _最高点)), \+((member(A,L2),A > _最高点)). 表示する(_6人の学生の点数,_最高点) :- writef('6人の学生の点数 = %t,%t,%t,%t,%t,%t\n',_6人の学生の点数), writef('最高点 = %t\n',[_最高点]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/757 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 担当者名が"end"になるまで、担当者名と売上を入力する。 # 売上合計、平均、最も売上が多い担当者名とその売上、 # 最も売上が低い担当者名とその売上を表示する。 # '担当者名が"end"になるまで、担当者名と売上を入力する。 売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。' :- '担当者名が"end"になるまで、担当者名と売上を入力する。'(_担当者名_売上ならび), '売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。'(_担当者_売上ならび). '担当者名が"end"になるまで、担当者名と売上を入力する。'(_担当者名_売上ならび) :- findall([_担当者名,_売上],( 担当者の入力(_担当者名), ( _担当者名 = end,!,fail; 売上の入力(_売上))), _担当者名_売上ならび). 担当者の入力(_担当者名) :- write('担当者名を入力してください (endで終了する) : '), get_line(_担当者名). 売上の入力(_売上) :- 整数を得る('売上を入力して下さい : ',true,_売上). '売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。'(_担当者_売上ならび) :- '売上合計、平均、'(_担当者_売上ならび,_売上合計,_平均), '最も売上が多い担当者名とその売上、最も売上が低い担当者名とその売上を'(_担当者_売上ならび,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上), 表示する(_売上合計,_平均,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上). '売上合計、平均、'(_担当者_売上ならび,_売上合計,_平均) :- findall(_売上,( member([_,_売上],_担当者名_売上ならび)), _売上ならび), sum_list(_売上ならび,_売上合計), length(_売上ならび,_要素数), _平均 is _売上合計 / _要素数. '最も売上が多い担当者名とその売上、最も売上が低い担当者名とその売上を'(_担当者_売上ならび,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上) :- setof(_担当者,[_担当者,_売上] ^ member([_担当者,_売上],_担当者_売上ならび),_担当者名ならび), 担当者別の売上合計(_担当者_売上ならび,_担当者名ならび,_担当者別売上合計ならび), '最も売上が多い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が多い担当者,_最も売上が多い担当者の売上), '最も売上が低い担当者名とその売上'(_担当者別売上合計ならび,_最も売上が低い担当者,_最も売上が低い担当者の売上). 担当者別の売上合計(_担当者_売上ならび,_担当者名ならび,_担当者別売上合計ならび) :- findall([_担当者名,_売上合計],( member(_担当者名,_担当者名ならび), findsum(_売上,( member([_担当者名,_売上],_担当者別売上ならび), _売上合計))), _担当者別売上合計ならび). '最も売上が多い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が多い担当者,_最も売上が多い担当者の売上) :- append(L1,[[_最も売上が多い担当者,_最も売上が多い担当者の売上]|L2],_担当者別売上合計ならび), \+((member([_,_売上合計],L1),_売上合計 > _最も売上が多い担当者の売上)), \+((member([_,_売上合計],L2),_売上合計 > _最も売上が多い担当者の売上)). '最も売上が低い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が低い担当者,_最も売上が低い担当者の売上) :- append(L1,[[_最も売上が低い担当者,_最も売上が低い担当者の売上]|L2],_担当者別売上合計ならび), \+((member([_,_売上合計],L1),_売上合計 < _最も売上が低い担当者の売上)), \+((member([_,_売上合計],L2),_売上合計 < _最も売上が低い担当者の売上)). 表示する(_売上合計,_平均,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上) :- writef('売上合計 = %t\n平均 = %t\n',[_売上合計,_平均]), writef('最も売上が多い担当者名 = %t\n最も売上が多い担当者の売上 = %t\n最も売上が低い担当者名 = %t\n',[_最も売上が多い担当者名,_最も売上が多い担当者の売上]), writef('最も売上が低い担当者名 = %t\n最も売上が低い担当者の売上 = %t\n',[_最も売上が低い担当者名,_最も売上が低い担当者の売上]). % 以下のサイトは # 出典 : http://peace.2ch.net/test/read.cgi/tech/1392388003/754 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。 # '点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。' :- '点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。'([]). '点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。'(_点数ならび) :- sum_list(_点数ならび,_合計), _合計 >= 999,!. '点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。'(_点数ならび) :- 新たな点数を入力する(_点数ならび,_新たな点数ならび), '合計、平均、最高点数、最低点数を表示する。'(_あらたな点数ならび). '合計、平均、最高点数、最低点数を表示する。'(_点数ならび) :- '合計、平均、最高点数、最低点数を表示する。'(_点数ならび), '点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。'(_点数ならび). '合計、平均、最高点数、最低点数を表示する。'(_点数合計,_点数ならび) :- length(_点数ならび,_要素数), _平均 is _点数合計 / _要素数, 最高点数(_点数ならび,_最高点数), 最低点数(_点数ならび,_最低点数), writef('合計 = %t\n平均 = %t\n最高点数 = %t\n最低点数 = %t\n',[_点数合計,_平均,_最高点数,_最低点数]). 新たな点数を入力する(_点数ならび,[_点数|_新たな点数ならび]) :- 整数を得る('点数を入力してください : ',(integer(_点数),_点数>=0),_点数),!. 最高点数(_点数ならび,_最高点数) :- append(L1,[_最高点数|L2],_点数ならび), \+((member(N,L1),N > _最高点数)), \+((member(N,L2),N > _最高点数)). 最低点数(_点数ならび,_最低点数) :- append(L1,[_最低点数|L2],_点数ならび), \+((member(N,L1),N < _最低点数)), \+((member(N,L2),N < _最低点数)). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/740 # [1] 授業単元: プログラミング基礎 # [2] 問題文、ブラックジャックの判定処理を行う # 1人目の数字列を入力(1個〜10個まで) # 2人目の数字列を入力(1個〜10個まで) # 数字は、1から13。 # 合計が21を超えたら点数は、0点。 # 1は、1点または、11点として使える。 # 11以上は10点として数える。 # それ以外は、数字がそのまま点数。 # 勝った方を番号で表示(1 or 2) # 引き分けは、2の勝ちとする # 実行例) # 1 5 8 入力1(14) # 5 7 4 入力2(16) # 2 出力 # 13 1 入力1(21) # 12 10 入力2(20) # 1 出力 # 13 8 入力1(18) # 1 9 入力2(20) # 2 出力 # 1 1 8 入力1(20) # 3 4 7 入力2(14) # 1 出力 # 10 8 7 入力1(25) # 3 5 8 入力2(16) # 2 出力 # 'ブラックジャックの判定処理を行う 合計が21を超えたら点数は、0点。 1は、1点または、11点として使える。 11以上は10点として数える。 それ以外は、数字がそのまま点数。 勝った方を番号で表示(1 or 2) 引き分けは、2の勝ちとする' :- ブラックジャックの札を配る(_1人目の数字ならび,_2人目の数字ならび), '合計が21を超えたら点数は、0点。 1は、1点または、11点として使える。 11以上は10点として数える。 それ以外は、数字がそのまま点数。'(_1人目の数字ならび,_2人目の数字ならび,_点数_1,_点数_2), ブラックジャックの判定(_点数_1,_点数_2,_勝者), 勝った方を番号で表示(_勝者). ブラックジャックの札を配る(_1人目の数字ならび,_2人目の数字ならび) :- カードの準備(_配り札_1), ブラックジャックの札を配る(_配り札_1,[],_1人目の数字ならび,_配り札_2), ブラックジャックの札を配る(_配り札_2,[],_2人目の数字ならび,_),!. カードの準備(_配り札) :- findall(N,( between(1,13,N), between(1,4,_)), _配り札). ブラックジャックの札を配る(_配り札,_数字ならび,_数字ならび,_配り札) :- 合計点の最高(_数字ならび,_合計点の最高), between(14,21,_合計点の最高),!. ブラックジャックの札を配る(_配り札_1,_現在までの数字ならび,_数字ならび,_残り配り札) :- 一枚配る(_配り札_1,_数字,_配り札_2), ブラックジャックの札を配る(_配り札_2,[_数字|_現在までの数字ならび],_数字ならび,_残り配り札). 一枚配る(_配り札_1,_数字,_配り札_2) :- length(_配り札_1,_配り札の枚数), _抜き位置 is random(_配り札の枚数), length(L1,_抜き位置), append(L1,[_数字|L2],_配り札_1), append(L1,L2,_配り札_2). '合計が21を超えたら点数は、0点。 1は、1点または、11点として使える。 11以上は10点として数える。 それ以外は、数字がそのまま点数。'(_1人目の数字ならび,_2人目の数字ならび,_点数_1,_点数_2) :- 合計点の最高(_1人目の数字ならび,_点数_1), 合計点の最高(_2人目の数字ならび,_点数_2). 合計点の最高(_数字ならび,_合計点の最高) :- findall(_合計点,( 合計点(_数字ならび,_合計点)), _合計点ならび), findmax(_合計点,( member(_合計点,_合計点ならび), _合計点 =< 21), _合計点の最高),!. 合計点の最高(_,0). 合計点([],0). 合計点([N|R],S) :- 合計点(R,S_2), 点数の数え方(N,N_2), S is N_2 + S_2. 点数の数え方(1,1). 点数の数え方(1,11). 点数の数え方(11,10). 点数の数え方(12,10). 点数の数え方(13,10). 点数の数え方(N,N) :- between(2,10,N). ブラックジャックの判定(_点数_1,_点数_2,2) :- _点数_2 >= _点数_1,!. ブラックジャックの判定(_,_,1). 勝った方を番号で表示(_勝者) :- writef('勝ったのは %t です\n',[_勝者]). % 以下のサイトは # 出典: 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代目 #698 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # ?以下のプログラムを作成しなさい. # 5件の数字を入力し、上位3位までの # 数字を順に表示する # (数字の大きい順) # # 実行例) # 22 入力1 # 30 入力2 # 10 入力3 # 40 入力4 # 2 入力5 # 40 30 22 出力 # 123 入力1 # 25 入力2 # 294 入力3 # -100 入力4 # 80 入力5 # 294 123 80 出力 # -20 入力1 # -25 入力2 # -394 入力3 # -50 入力4 # -80 入力5 # -20 -25 -50 出力 # [3] 環境 . #  [3.1] Windows 8.1 #  [3.2] Visual studio 2013 #  [3.3] C # [4] 期限:2014年7月14日0:00 '5件の数字を入力し、上位3位までの 数字を順に表示する (数字の大きい順)' :- '5件の数字を入力し、'(_5件の数字ならび), '上位3位までの数字を順に表示する(数字の大きい順)'(_5件の数字ならび). '5件の数字を入力し、'(_5件の数字ならび) :- findall(_数字,( 数字の入力(_数字)),_5件の数字ならび). 数字の入力(_数字) :- '_件目の入力を促す', 数字入力(_行,_数字). '_件目の入力を促す' :- append(L1,[_件目|R],[1,2,3,4,5]), length([_件目|R],_残り件数), writef('%w件目(残り%w件) の数字を入力して下さい : ',[_件目,_残り件数]). 数字入力(_行,_数字) :- 行入力し数字を得る(_行,_数字),!. 数字入力(_行,_数字) :- 数字入力(_行,_数字). 行入力し数字を得る(_行,_数字) :- 行入力(_行), 数字検査(_行,_数字). 行入力(_行) :- read_line_to_codes(user_input,_codes), atom_codes(_行,_codes). 数字検査(_行,_数字) :- 行を解析し数字を得る(_行,_数字),!. 数字検査(_行,_) :- 再入力を要請する(_行). 行を解析し数字を得る(_行,_数字) :- atom_number(_行,_数字). 再入力を要請する(_行) :- writef('入力された文字列 %w は数字ではありません。再入力をお願いします。\n',[_行]), fail. '上位3位までの数字を順に表示する(数字の大きい順)'(_5件の数字ならび) :- '上位3位までの数字を順に(数字の大きい順)'(_5件の数字ならび,[],_上位3位までの数字ならび), 表示する(_上位3位までの数字ならび). '上位3位までの数字を順に(数字の大きい順)'([],[_1,_2,_3|_],[_1,_2,_3]). '上位3位までの数字を順に(数字の大きい順)'([M|R1],L1,_上位3位までの数字ならび) :- 挿入する(M,L1,L2), '上位3位までの数字を順に(数字の大きい順)'(R1,L2,_上位3位までの数字ならび). 挿入する(M,L1,L2) :- 'L1が[]であるかL1の先頭要素よりMが大きい時停止する'(M,L1,L2). 挿入する(M,L1,L2) :- 挿入するべき位置を捜す(M,L1,L2). 'L1が[]であるかL1の先頭要素よりMが大きい時停止する'(M,[],[M]). 'L1が[]であるかL1の先頭要素よりMが大きい時停止する'(M,[N|R],[M,N|R]) :- M >= N,!. 挿入するべき位置を捜す(M,[N|R2],[N|R3]) :- M < N, 挿入する(M,R2,R3). 表示する(_上位3位までの数字ならび) :- writef('%w %w %w\n',_上位3位までの数字ならび). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #466 # お題 # 昇順の数列A[a0,a1,..,an]とAの要素amを一つ指定する # Aの要素からなる数列Bを与えて[am,am+1,..,an,a0,a1,..,am-1]の順番で整列させよう # 例 # 入: A = [2,3,5,7,9], a = 2, B = [9,2,5] # 出: [2,5,9] # 入: A = [2,3,5,7,9], a = 9, B = [9,2,5] # 出: [9,2,5] # 入: A = [2,3,5,7,9], a = 5, B = [9,2,5] # 出: [5,9,2] # 入: A = [2,3,5,7,9], a = 3, B = [9,2,5,5,2] # 出: [5,5,9,2,2] '昇順の数列A[a0,a1,..,an]とAの要素amを一つ指定する Aの要素からなる数列Bを与えて[am,am+1,..,an,a0,a1,..,am-1]の順番で整列させよう'(A,_am,B,_整列したならび) :- '[am,am+1,..,an,a0,a1,..,am-1]の順番で'(A,_am,_順番ならび), 整列させよう(B,_順番ならび,_整列したならび). '[am,am+1,..,an,a0,a1,..,am-1]の順番で'(A,_am,_順番ならび) :- append(L1,[_am|L2],A), append([_am|L2],L1,_順番ならび),!. 整列させよう(B,_順番ならび,_整列したならび) :- findall(_a,( append(L0,[_a|_],_順番ならび), \+(member(_a,L0)), member(_a,B)), _整列したならび). % 以下のサイトは p(A,B,L1,L2) :- append(L0,[B|R],L1), p(A,B,L0,R,L2). p(A,B,L0,R,L2) :- append(L0,[A,B|R],L2). p(A,B,L0,R,L2) :- p(A,B,R,R2), append(L0,[B|R2],L2). % 以下のサイトは p(A,B,L1,L2) :- append(L0,[B|R],L1),!, p(A,B,L0,R,L2). p(A,B,L0,R,L2) :- append(L0,[A,B|R],L2). p(A,B,L0,R,L2) :- p(A,B,R,R2), append(L0,[B|R2],L2). % 以下のサイトは p(A,B,L1,L2) :- append(L0,[B|R],L1),!, p(A,B,L0,R,L2). p(A,B,L0,R,L2) :- append(L0,[A,B|R],L2). p(A,B,L0,R,L2) :- p(A,B,R,R2), append(L0,[A,B|R2],L2). % 以下のサイトは p(A,B,L1,L2) :- append(L0,[B|R],L1), p(A,B,L0,R,L2). p(A,B,L0,R,L2) :- append(L0,[A,B|R],L2). p(A,B,L0,R,L2) :- p(A,B,R,R2), append(L0,[A,B|R2],L2). % 以下のサイトは p(A,B,L1,L2) :- append(L0,[B|R],L1),!, p(A,B,L0,R,L2). p(A,B,L1,L1) :- \+(append(_,[B|_],L1)). p(A,B,L0,R,L2) :- append(L0,[A,B|R],L2). p(A,B,L0,R,L2) :- p(A,B,R,R2), append(L0,[A,B|R2],L2),!. % 以下のサイトは p(A,B,L1,L2) :- append(L0,[B|R],L1),!, p(A,B,L0,R,L2). p(A,B,L0,R,L2) :- append(L0,[A,B|R],L2),!. p(A,B,L0,R,L2) :- p(A,B,R,R2), append(L0,[A,B|R2],L2). % 以下のサイトは p(A,B,L1,L2) :- append(L0,[B|R],L1),!, p(A,B,L0,R,L2). p(A,B,L0,R,L2) :- append(L0,[A,B|R],L2). p(A,B,L0,R,L2) :- p(A,B,R,R2), append(L0,[A,B|R2],L2). % 以下のサイトは p(A,B,L1,L2) :- append(L0,[B|R],L1),!, p(A,B,L0,R,L2). p(A,B,L0,R,L2) :- append(L0,[A,B|R],L2). p(A,B,L0,R,L2) :- p(A,B,R,R2), append(L0,[A,B|R2],L2). % 以下のサイトは 'AをL1の要素Bの前に挿入する'(A,B,L1,L2) :- append(L0,[B|R],L1), append(L0,[A,B|R],L2),!. % だが、'AをL1の全ての要素Bの前に挿入する'はこの発想ではできない。ここら辺はPrologの難しいところ % 以下のサイトは # # min-heapで以下のクエリを実装せよ # # 1.push(t, v) 時刻tに値vをpushするクエリがあったことにする # 2.pop(t) 時刻tにおける最小値をpopしたことにする # 3.min(t)時刻tにおける最小値を出力する # 時刻tに値vをpushするクエリがあったことにする(_t,_v,_stack,[[_t,_v]|_stack]). 時刻tにおける最小値をpopしたことにする(_t,_stack_1,_stack_2) :- findmin(_v,member([_t,_v],_stack_1),_min), append(L1,[[_t,_min]|L2],_stack_1), append(L1,L2,_stack_2). 時刻tにおける最小値を出力する(_t,_stack_1,_stack_2) :- findmin(_v,member([_t,_v],_stack_1),_min), writef('%t',[_min]). % 以下のサイトは '与えられた数値を先頭から順に桁ごとに区切って使って数列を作りる'(_与えられた数値,_全数値分割) :- number_chars(_与えられた数値,_数字ならび), findall(_数値分割,( 数字ならびから数値分割(_数字ならび,_数値分割)), _全数値分割). 数字ならびから数値分割([],[]). 数字ならびから数値分割(_数字ならび,[N|LL2]) :- append(L1,L2,_数字ならび), number_chars(N,L1), 数字ならびから数値分割(L2,LL2). % 以下のサイトは # お題:与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。 # 例:123は、1,23 1,2,3 12,3のように分割出来る。 # 1,23 ---> 22*22 ---> 484 # 1,2,3 ---> 1*1+1*1 --> 2 # 12,3 ---> 9*9 ---> 81 # です。 '与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、 隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。'(_与えられた数値列,_隣り合う数の差の二乗の合計が最大になるような分割) :- '与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、'(_与えられた数値,_全数値分割), '隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。'(_全数値分割,_隣り合う数の差の二乗の合計が最大になるような分割). '与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、'(_与えられた数値,_全数値分割) :- number_chars(_与えられた数値,_数字ならび), findall(_数値分割,( 数字ならびから数値分割(_数字ならび,_数値分割)), _全数値分割). 数字ならびから数値分割([],[]). 数字ならびから数値分割(_数字ならび,[N|LL2]) :- append(L1,L2,_数字ならび), number_chars(N,L1), 数字ならびから数値分割(L2,LL2). '隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。'(_全数値分割,_隣り合う数の差の二乗の合計が最大になるような分割) :- findall(_隣り合う数の差の二乗の合計,( member(_分割,_全数値分割), '隣り合う数の「差の二乗」の合計が'(_分割,_隣り合う数の差の二乗の合計)), _隣り合う数の差の二乗の合計ならび), 最大になるような分割(_全数値分割,_隣り合う数の差の二乗の合計ならび,_合計の最大値). '隣り合う数の「差の二乗」の合計が'(_全数値分割,_隣り合う数の差の二乗の合計) :- findsum(_隣り合う数の差の二乗,( append(_,[N1,N2|_],_全数値分割), _隣り合う数の差の二乗 is (N1 - N2) ^ 2), _隣り合う数の差の二乗の合計). 最大になるような分割(_全数値分割,_隣り合う数の差の二乗の合計ならび,_隣り合う数の差の二乗の合計が最大になるような分割) :- 最大になる(_隣り合う数の差の二乗の合計ならび,_位置,_合計の最大値), nth1(_位置,_全数値分割,_隣り合う数の差の二乗の合計が最大になるような分割). 最大になる(_隣り合う数の差の二乗の合計ならび,_位置,_合計の最大値) :- append(L1,[_合計の最大値|L2],_隣り合う数の差の二乗の合計ならび), forall(member(N1,L1),N1 =< _合計の最大値), forall(member(N2,L2),N2 =< _合計の最大値), length([_|L1],_位置). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # # member(A,[A|_]). # member(A,[_|R]) :- member(A,R). # この述語をスラスラと書けないとさすがにPrologプログラマとはいえない。さて、 # foo(L,A) :- member(A,L),評価(A). # 評価が通るかどうか? こんな場合に、 # # 評価(A) :- の中で member(A,L) でAを取り出した後の要素、つまりまだ取り出していない要素のリストを知りたいとする。これは # member(A,[A|R],R). # member(A,[_|R1],R) :- member(A,R1,R). # で解決 。 # # # このように定義を変えた上で、 # foo(L,A) :- meber(A,L,R),評価(A,R). # として、評価/2の中でRを参照すればよい。 # # # さて、次は、まだ参照していない要素だけでなく、既に参照して評価してしまった要素も参照したいならどうするか。 # member([],A,[A|R],R). # member([B|R1],A,[B|R2],R) :- member(R1,A,R2,R). # これでどうか? # # 先ほどの member/4 の定義は一般に使われているものと引数順序が違うかも知れない。実は # ?- member(L1,A,L2,[a,b,c]). # は # ?- append(L1,[A|L2],[a,b,c]). # と同じことである。 # これを書きたくて書いてきた。 # # # これが同じ? # # member([],A,[A|E],E). # member([B|C],A,[B|D],E) :- member(C,A,D,E). # # append([],A,A). # append([A|B],C,[A|D]) :- append(B,C,D). # 1) 午前中に書いたPrologのmember/2でまだ参照していない残りリストを 得るmember/3を定義。残りのリスト R の位置を中に入れた。 member(A,R,[A|R]). member(A,R,[_|R3]) :- member(A,R,L3). 2) さらに 既に参照済みのリストも得られる member/4 を定義。 member([],A,R,[A|R]). member([B|L1],A,R,[B|L3]) :- member(L1,A,R,L3). これはPrologの代表述語append/3とよく似ている。 3) 第二引数 A と第三引数 R を [A|R] と纏める。 member([],[A|R],[A|R]). member([B|L1],[A|R],[B|L3]) :- member(L1,[A|R],L3). 4) 第一節の[A|R] を L に 第二節の[A|R] を L2 に置換すると member([],L,L). member([B|L1],L2,[B|L3]) :- member(L1,L2,L3). 5) 述語名をappendに置き換えてみる。 append([],L,L). append([B|L1],L2,[B|L3]) :- append(L1,L2,L3). という例の定義になる。member/2 に後方参照、前方参照を付加したものを変形すれば、である。 % 以下のサイトは # # append/4からappend/nまでを一気に定義してしまう、 'append/4から/nの定義'/1 。 # append/nの定義、 'append/nの定義'/1 。 # 'append/4からappend/nの定義'(_n) :- between(4,_n,M), 'abolish_append/n'(M), 'append/nの定義'(M), _n = M. 'append/nの定義'(_n) :- 'L2からLnまで'(_n,_L2_Ln), 'L2からLn_1まで'(_n,_L2_Ln_1), 'L1からLnまで'(_n,_L1_Ln), 'append/nの定義'(_n,_L2_Ln,_L2_Ln_1,_L1_Ln). 'append/nの定義'(_n,_L2_Ln,_L2_Ln_1,_L1_Ln) :- 'append/nの第一節の定義'(_n,_L2_Ln), 'append/nの第二節の定義'(_n,_L2_Ln_1,_L1_Ln). 'append/nの第一節の定義'(_n,_L2_Ln) :- format(atom(S1),'append([],~w) :-~n append(~p).~n',[_L2_Ln,_L2_Ln]), read_term_from_atom(S1,Clause_1,[variables(_変数ならび),variable_names(_変数名ならび)]), assertz(Clause_1). 'append/nの第二節の定義'(_n,_L2_Ln_1,_L1_Ln) :- format(atom(S2),'append([U|L1],~w,[U|L~p]) :-~n append(~w).\n',[_L2_Ln_1,_n,_L1_Ln]), read_term_from_atom(S2,Clause_2,[variables(_変数ならび),variable_names(_変数名ならび)]), assertz(Clause_2). 'L2からLnまで'(_n,_L2_Ln) :- findall(A,( between(2,_n,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L2_Ln). 'L2からLn_1まで'(_n,_L2_Ln_1) :- _m is _n - 1, findall(A,( between(2,_m,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L2_Ln_1). 'L1からLnまで'(_n,_L1_Ln) :- findall(A,( between(1,_n,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L1_Ln). 'abolish_append/n'(_n) :- abolish(append,_n). % 以下のサイトは # # ならびの最初のn要素を切り取る # ならびの最初のn要素を切り取る(_n,_ならび,_最初のn要素を切り取ったならび) :- length(_最初のn要素を切り取ったならび,_n), append(_最初のn要素を切り取ったならび,_,_ならび). ならびの最初のn要素を切り取る(_n,_ならび,_最初のn要素を切り取ったならび,_残りならび) :- length(_最初のn要素を切り取ったならび,_n), append(_最初のn要素を切り取ったならび,_残りならび,_ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの最初のn要素を切り取る(0,_,[]). ならびの最初のn要素を切り取る(_n,[A|R1],[A|R2]) :- succ(_n_1,_n), ならびの最初のn要素を切り取る(_n_1,R1,R2). ならびの最初のn要素を切り取る(0,_残りのならび,[],_残りのならび). ならびの最初のn要素を切り取る(_n,[A|R1],[A|R2],_残りのならび) :- succ(_n_1,_n), ならびの最初のn要素を切り取る(_n_1,R1,R2,_残りのならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの先頭からn要素を切り取る(_n,_ならび,_最初のn要素を切り取ったならび) :- length(_最初のn要素を切り取ったならび,_n), append(_最初のn要素を切り取ったならび,_,_ならび). ならびの先頭からn要素を切り取る(_n,_ならび,_最初のn要素を切り取ったならび,_残りならび) :- length(_最初のn要素を切り取ったならび,_n), append(_最初のn要素を切り取ったならび,_残りならび,_ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの先頭からn要素を切り取る(0,_,[]). ならびの先頭からn要素を切り取る(_n,[A|R1],[A|R2]) :- succ(_n_1,_n), ならびの先頭からn要素を切り取る(_n_1,R1,R2). ならびの先頭からn要素を切り取る(0,_残りのならび,[],_残りのならび). ならびの先頭からn要素を切り取る(_n,[A|R1],[A|R2],_残りのならび) :- succ(_n_1,_n), ならびの先頭からn要素を切り取る(_n_1,R1,R2,_残りのならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの末尾からn要素を切り取る(_n,_ならび,_末尾からn要素を切り取ったならび) :- length(_最初のn要素を切り取ったならび,_n), append(_,_末尾からn要素を切り取ったならび,_ならび). % 以下のサイトは # プログラミングのお題スレ Part4 #197 # アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 # 例に沿って連続する文字をカウントするプログラムを作成せよ。 # # 出力の最後に改行を挿入すること。 # 標準入力から以下の形式で与えられる。 # S # # 例) # In: # aaaaaaaaaabbbbbbbbbbbbcccccccddddddddddeeeeeeefffffffffghiiiiiiiii # # Out: # a10b12c7d10e7f9ghi9 # # In: # # Out: # 0 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 例に沿って連続する文字をカウントするプログラムを作成せよ。 出力の最後に改行を挿入すること。 標準入力から以下の形式で与えられる。' :- 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字ならび), 連続する文字をカウントする(_文字ならび,_文字_連続数ならび), 出力する(_文字_連続数ならび). 連続する文字をカウントする(L4,_文字_連続数ならび) :- findall([_文字,_連続数],( append(L1,L2,L3,L4), 'L2は限界連続文字ならび'(L1,L2,L3,_文字,_連続数)), _文字_連続数ならび). 'L2は限界連続文字ならび'(L1,L2,L3,_文字,_連続数) :- all(L2,_文字), \+(nth1(1,L3,_文字)), \+(last(L1,_文字)), length(L2,_連続数). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). all([],_). all([A|R],A) :- all(R,A). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字ならび) :- length(S,100), write('In: '), '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字), 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(S,_文字,_文字ならび). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる,'([],_,[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_,end_of_file,[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_,'\n',[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる'([_|S],_文字,[_文字|R]) :- '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(S,_次の文字), 'アルファベットの小文字aからzで成り立つS(S,0≦S≦100)が標準入力から与えられる。'(S,_次の文字,R). '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(end_of_file) :- !. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'('\n') :- !. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字) :- get_char(_文字), 文字はアルファベットの小文字aからzで成り立つ(_文字),!. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字) :- '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字). 文字はアルファベットの小文字aからzで成り立つ(end_of_file) :- !. 文字はアルファベットの小文字aからzで成り立つ('\n') :- !. 文字はアルファベットの小文字aからzで成り立つ(_文字) :- _文字 @>= 'a', _文字 @=< 'z',!. 出力する(LL) :- flatten(LL,L), atomic_list_concat(L,_出力文字列). writef('Out:\n%t\n',[_出力文字列]). % 以下のサイトは # プログラミングのお題スレ Part4 #197 # アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 # 例に沿って連続する文字をカウントするプログラムを作成せよ。 # # 出力の最後に改行を挿入すること。 # 標準入力から以下の形式で与えられる。 # S # # 例) # In: # aaaaaaaaaabbbbbbbbbbbbcccccccddddddddddeeeeeeefffffffffghiiiiiiiii # # Out: # a10b12c7d10e7f9ghi9 # # In: # # Out: # 0 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 例に沿って連続する文字をカウントするプログラムを作成せよ。 出力の最後に改行を挿入すること。 標準入力から以下の形式で与えられる。'(LL) :- 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(Line), atom_chars(Line,Chars), '連続する文字をカウントするプログラムを作成せよ。'(Chars,LL), 出力する(LL). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(Line) :- write('In: '), get_line(Line). '連続する文字をカウントするプログラムを作成せよ。'([],[]) :- !. '連続する文字をカウントするプログラムを作成せよ。'(Chars,[[_連続文字,_文字数]|R]) :- 先頭からの連続文字(Chars,Chars1,Chars2,_連続文字), length(L1,_文字数), '連続する文字をカウントするプログラムを作成せよ。'(L2,R). 先頭からの連続文字(Chars,Chars1,Chars2,_連続文字) :- append(Chars1,Chars2,Chars), 連続文字(Chars1,_連続文字), \+((Chars2 = [A|R],_連続文字 = A)). 連続文字([],_). 連続文字([_連続文字|R],_連続文字) :- 連続文字(R,_連続文字). 出力する(LL) :- flatten(LL,L), atomic_list_concat(L,S), writef('Out:\n%t\n',[S]). % 以下のサイトは append([],L2,L3,L4,L5,L6,L7,L8,L9,L10) :- append(L2,L3,L4,L5,L6,L7,L8,L9,L10). append([U|L1],L2,L3,L4,L5,L6,L7,L8,L9,[U|L10]) :- append(L1,L2,L3,L4,L5,L6,L7,L8,L9,L10). append([],L2,L3,L4,L5,L6,L7,L8,L9) :- append(L2,L3,L4,L5,L6,L7,L8,L9). append([U|L1],L2,L3,L4,L5,L6,L7,L8,[U|L9]) :- append(L1,L2,L3,L4,L5,L6,L7,L8,L9). append([],L2,L3,L4,L5,L6,L7,L8) :- append(L2,L3,L4,L5,L6,L7,L8). append([U|L1],L2,L3,L4,L5,L6,L7,[U|L8]) :- append(L1,L2,L3,L4,L5,L6,L7,L8). append([],L2,L3,L4,L5,L6,L7) :- append(L2,L3,L4,L5,L6,L7). append([U|L1],L2,L3,L4,L5,L6,[U|L7]) :- append(L1,L2,L3,L4,L5,L6,L7). append([],L2,L3,L4,L5,L6) :- append(L2,L3,L4,L5,L6). append([U|L1],L2,L3,L3,L5,[U|L6]) :- append(L1,L2,L3,L4,L5,L6). append([],L2,L3,L4,L5) :- append(L2,L3,L4,L5). append([U|L1],L2,L3,L4,[U|L5]) :- append(L1,L2,L3,L4,L5). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|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), 描画する(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). % 以下のサイトは # 出典: スレ立てるまでもない質問はここで 134匹目 #717 # ある病院で4と13(例えば104とか113とか)を使わないで全ての病室に番号を振りたいと考えている # この場合1000室目は何番になるか答えなさい(´・ω・`) 'ある病院で4と13(例えば104とか113とか)を使わないで全ての病室に番号を振りたいと考えている。この場合1000室目は何番になるか答えなさい(´・ω・`) '(_何番) :- '4と13を使わないで全ての病室に番号を振りたいと考えている。この場合1000室目は何番になるか'(1,1,_何番). '4と13を使わないで全ての病室に番号を振りたいと考えている。この場合1000室目は何番になるか'(1000,_何番,_何番) :- !. '4と13を使わないで全ての病室に番号を振りたいと考えている。この場合1000室目は何番になるか'(_室数_1,_何番_1,_何番) :- '数の中に4という数字と1,3という数字の連続が共に含まれていない時は_室数_と_何番_かの両方を更新して、それで1000室目は何番になるか'(_室数_1,_何番_1,_何番). '4と13を使わないで全ての病室に番号を振りたいと考えている。この場合1000室目は何番になるか'(_室数_1,_何番_1,_何番) :- '数の中に4という数字か1,3という数字の連続が含まれていれば_室数_は更新せず_何番_のみを更新して、それで1000室目は何番になるか'(_室数_1,_何番_1,_何番). '数の中に4という数字と1,3という数字の連続が共に含まれていない時は_室数_と_何番_かの両方を更新して、それで1000室目は何番になるか'(_室数_1,_何番_1,_何番) :- '数の中に4という数字か1,3という数字の連続が含まれていない'(_何番_1), _室数_2 is _室数_1 + 1, _何番_2 is _何番_1 + 1, '4と13を使わないで全ての病室に番号を振りたいと考えている。この場合1000室目は何番になるか'(_室数_2,_何番_2,_何番). '数の中に4という数字か1,3という数字の連続が含まれていれば_室数_は更新せず_何番_のみを更新して、それで1000室目は何番になるか'(_室数_1,_何番_1,_何番) :- '数の中に4という数字か1,3という数字の連続が含まれる'(_何番_1), _何番_2 is _何番_1 + 1, '4と13を使わないで全ての病室に番号を振りたいと考えている。この場合1000室目は何番になるか'(_室数_1,_何番_2,_何番). '数の中に4という数字か1,3という数字の連続が含まれる'(_数) :- number_chars(_数,_数字ならび), '_数字ならびには4という数字か1,3という数字の連続が含まれる'(_数字ならび). '数の中に4という数字か1,3という数字の連続が含まれていない'(_数) :- \+('数の中に4という数字か1,3という数字の連続が含まれる'(_数)). '_数字ならびには4という数字か1,3という数字の連続が含まれる'(_数字ならび) :- member('4',_数字ならび),!. '_数字ならびには4という数字か1,3という数字の連続が含まれる'(_数字ならび) :- append(_,['1','3'|_],_数字ならび),!. % 以下のサイトは # 出題: プログラミングのお題スレ Part3 #902 # # お題:文字列sにあるn個の文字からなる集合を # 要素とする集合をつくる # # 例1:以下n=2 # "today"-> {to td ta ty od oa oy da dy ay} # "book" -> {bo bk ok} # "ababab" -> {ab} # "ab" -> {ab} # "aa" -> {} # "a" -> {} # "" -> {} # # 例2:以下n=3 # "today"-> {tod toa toy oda ody day dat ayt ayo} # "book" -> {boo bok okb} # "abc" -> {abc} # "ababab" ->{} # "ab" -> {} # "a" -> {} # "" -> {} 文字列にあるn個の文字からなる集合を要素とする集合をつくる(_文字列,_n,_文字列集合要素) :- atom_chars(_文字列,_文字ならび), 要素の重複を取り除いた文字ならび(_文字ならび,_要素に重複のない文字ならび), 組合せ(_要素に重複のない文字ならび,_n,_組合せ), atom_chars(_文字列集合要素,_組合せ). 要素の重複を取り除いた文字ならび(_文字ならび,_要素に重複のない文字ならび) :- findall(_文字,( append(L1,[_文字|_],_文字ならび), \+(member(_文字,L1))), _要素に重複のない文字ならび). 組合せ(L,1,[A]) :- !, member(A,L). 組合せ([A|R1],N,[A|R2]) :- N_1 is N - 1, 組合せ(R1,N_1,R2). 組合せ([_|R1],N,L) :- 組合せ(R1,N,L). % 以下のサイトは # 出題: プログラミングのお題スレ Part3 #902 # # お題:文字列sにあるn個の文字からなる集合を # 要素とする集合をつくる # # 例1:以下n=2 # "today"-> {to td ta ty od oa oy da dy ay} # "book" -> {bo bk ok} # "ababab" -> {ab} # "ab" -> {ab} # "aa" -> {} # "a" -> {} # "" -> {} # # 例2:以下n=3 # "today"-> {tod toa toy oda ody day dat ayt ayo} # "book" -> {boo bok okb} # "abc" -> {abc} # "ababab" ->{} # "ab" -> {} # "a" -> {} # "" -> {} 文字列にあるn個の文字からなる集合を要素とする集合をつくる(_文字列,_n,_文字列集合要素) :- atom_chars(_文字列,_文字ならび), 文字列の要素の重複を取り除いた文(_文字ならび,_要素に重複のない文字ならび), 組合せ(_要素に重複のない文字ならび,_n,_組合せ), atom_chars(_文字列集合要素,_組合せ). 文字列の要素の重複を取り除いた文(_文字ならび,_要素に重複のない文字ならび) :- findall(_文字,( append(L1,[_文字|_],_文字ならび), \+(member(_文字,L1))), _要素に重複のない文字ならび). 組合せ(L,1,[A]) :- member(A,L). 組合せ([_先頭要素|_残りならび],N,[_先頭要素|_組合せ]) :- 'Nが1より大きい時、_残りならびから、一個少ない選択の組合せの前に先頭要素を付加する'(_残りならび,N,L). 組合せ([_|_残りならび],N,_組合せ) :- 'Nが1より大きい時、ならびの先頭要素を取り去った_残りならびから同じくN個取り出す組合せ'(_残りならび,N,L). 'Nが1より大きい時、_残りならびから、一個少ない選択の組合せの前に先頭要素を付加する'(_残り要素,N,_組合せ) :- N > 1, _一個少ない選択 is N - 1, 組合せ(_残りならび,_一個少ない選択,_組合せ). 'Nが1より大きい時、ならびの先頭要素を取り去った_残りならびから同じくN個取り出す組合せ'(_残りならび,N,_組合せ) :- N > 1, 組合せ(_残りならび,N,_組合せ). % 以下のサイトは 覆面算(kadokawa+dwango+kada=kandouii,N1+N2+N3=N4,_文字と数字の対応) :- 覆面(kadokawa+dwango+kada=kandouii,L0_1,L0_2,L0_3,L1,L2,L3,L4), 覆面算(L0_3,L0_2), 覆面算計算(L1,L2,L3,L4,N1,N2,N3,N4), 文字と数字の対応(L0_1,L0_2,_文字と数字の対応). 覆面(A_1+A_2+A_3=A_4,L0_1,L0_2,L0_3,L1,L2,L3,L4) :- 文字出現順の決定([A_1,A_2,A_3,A_4],L0_1), findall(N,between(1,9,_),L0_2), L0_3 = ['1','2','3','4','5','6','7','8','9','0'], 覆面文字と変数の対応付け(L0_1,L0_2,A_1,A_2,A_3,A_4,L1,L2,L3,L4). 文字出現順の決定(L,L0_1) :- atomic_list_concat(L,A), atom_chars(A,Chars), 唯一の文字ならびを得る(Chars,L0_1). 要素に重複のない文字ならび(_文字ならび,_要素に重複のない文字ならび) :- findall(_文字,( append(L1,[_文字|_],_文字ならび), \+(member(_文字,L1))), _要素に重複のない文字ならび). 数式の対応付け(L0_1,L0_2,A_1,A_2,A_3,A_4,L1,L2,L3,L4) :- 数式の対応付け(L0_1,L0_2,A_1,L1), 数式の対応付け(L0_1,L0_2,A_2,L2), 数式の対応付け(L0_1,L0_2,A_3,L3), 数式の対応付け(L0_1,L0_2,A_4,L4). 覆面文字と変数の対応付け(L0_1,L0_2,_覆面文字列,_変数ならび) :- atom_chars(_覆面文字列,_覆面文字ならび), findall(V,( nth1(_nth1,_覆面文字ならび,_文字), nth1(_nth1,L0_1,_文字), nth1(_nth1,L0_2,V)), _変数ならび). 覆面算計算(L1,L2,L3,L4,N1,N2,N3,N4) :- number_chars(N1,L1), number_chars(N2,L2), number_chars(N3,L3), number_chars(N4,L4), N1 + N2 + N3 =:= N4. 覆面算(_,[]). 覆面算(L,[A|R2]) :- select(A,L,R), 覆面算(R,R2). 文字と数字の対応(L0_1,L0_2,_文字と数字の対応) :- findall(A=B,( nth1(_nth1,L0_1,A), nth1(_nth1,L0_2,B)), _文字と数字の対応). 唯一の文字ならびを得る([],[]). 唯一の文字ならびを得る([A|R1],[A|R2]) :- \+(member(A,R1)), 唯一の文字ならびを得る(R1,R2). 唯一の文字ならびを得る([A|R1],R2) :- member(A,R1), 唯一の文字ならびを得る(R1,R2). % 以下のサイトは # 出典 :: 「受験全解算数」日能研発行 p460 灘中入試問題より # # ある工場では3種類の機械A,B,Cを使って、品物Pを生産しています。 # 1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に # 8時間ずつ運転します。また、一日の生産高は、Cを使わないときは19544個、 # Bを使わないときは、13832個、Aを使わないときは14896個です。このとき、 # 次の問に答えなさい。 # (1) 3種類の機械はそれぞれ何台ありますか。 # (2) 全部の機械を使ったときの品物Pの総生産高を今の2倍にするために # は、Aを25台買い足して、さらにBとCをそれぞれ何台買いたせばよいで # すか。ただし、B,Cどちらも13台より多く買い入れるものとします。 'ある工場では3種類の機械A,B,Cを使って、品物Pを生産しています。 1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に 8時間ずつ運転します。また、一日の生産高は、Cを使わないときは19544個、 Bを使わないときは、13832個、Aを使わないときは14896個です。このとき、 次の問に答えなさい。 3種類の機械はそれぞれ何台ありますか。'(Aの台数,Bの台数,Cの台数) :- '一日の生産高は、Cを使わないときは19544個、 Bを使わないときは、13832個、Aを使わないときは14896個です。'(A,B,C), '1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に8時間ずつ運転します。 3種類の機械はそれぞれ何台ありますか。'(A,B,C,Aの台数,Bの台数,Cの台数). '一日の生産高は、Cを使わないときは19544個、 Bを使わないときは、13832個、Aを使わないときは14896個です。'(A,B,C) :- '一日の生産高は、Cを使わないときは19544個、'(A,B), '一日の生産高は、Bを使わないときは13832個、'(A,C), '一日の生産高は、Aを使わないときは14896個、'(B,C). '一日の生産高は、Cを使わないときは19544個、'(A,B) :- length(A_plus_B,19544), append(A,B,A_plus_B). '一日の生産高は、Bを使わないときは13832個、'(A,C) :- length(A_plus_C,13832), append(A,C,A_plus_C). '一日の生産高は、Aを使わないときは14896個、'(B,C) :- length(B_plus_C,14896), append(B,C,B_plus_C). '1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に8時間ずつ運転します。 3種類の機械はそれぞれ何台ありますか。'(A,B,C,Aの台数,Bの台数,Cの台数) :- '1時間あたりのAの生産高は77個で、1日に8時間ずつ運転します。台数は'(A,Aの台数), '1時間あたりのBの生産高は56個で、1日に8時間ずつ運転します。台数は'(B,Bの台数), '1時間あたりのCの生産高は14個で、1日に8時間ずつ運転します。台数は'(C,Cの台数). '1時間あたりのAの生産高は77個で、1日に8時間ずつ運転します。台数は'(A,Aの台数) :- _一台のAによる一日の生産高 is 77 * 8, length(A,Aによる一日の総生産高), Aの台数 is Aによる一日の総生産高 / _一台のAによる一日の生産高. '1時間あたりのBの生産高は56個で、1日に8時間ずつ運転します。台数は'(B,Bの台数) :- _一台のBによる一日の生産高 is 56 * 8, length(B,Bによる一日の総生産高), Bの台数 is Bによる一日の総生産高 / _一台のBによる一日の生産高. '1時間あたりのCの生産高は14個で、1日に8時間ずつ運転します。台数は'(C,Cの台数) :- _一台のCによる一日の生産高 is 14 * 8, length(C,Cによる一日の総生産高), Cの台数 is Cによる一日の総生産高 / _一台のCによる一日の生産高. % 以下のサイトは # 出典 :: 「受験全解算数」日能研発行 p460 灘中入試問題より # # ある工場では3種類の機械A,B,Cを使って、品物Pを生産しています。 # 1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に # 8時間ずつ運転します。また、一日の生産高は、Cを使わないときは19544個、 # Bを使わないときは、13832個、Aを使わないときは14896個です。このとき、 # 次の問に答えなさい。 # (1) 3種類の機械はそれぞれ何台ありますか。 # (2) 全部の機械を使ったときの品物Pの総生産高を今の2倍にするために # は、Aを25台買い足して、さらにBとCをそれぞれ何台買いたせばよいで # すか。ただし、B,Cどちらも13台より多く買い入れるものとします。 'ある工場では3種類の機械A,B,Cを使って、品物Pを生産しています。 1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に 8時間ずつ運転します。また、一日の生産高は、Cを使わないときは19544個、 Bを使わないときは、13832個、Aを使わないときは14896個です。このとき、 次の問に答えなさい。 (1) 3種類の機械はそれぞれ何台ありますか。'(Aの台数,Bの台数,Cの台数) :- length(A_plus_B,19544), length(A_plus_C,13832), length(B_plus_C,14896), append(A,B,A_plus_B), append(A,C,A_plus_C), append(B,C,B_plus_C), length(A,Aの一日の生産高), length(B,Bの一日の生産高), length(C,Cの一日の生産高), Aの台数 is Aの一日の生産高 / (77 * 8), Bの台数 is Bの一日の生産高 / (56 * 8), Cの台数 is Cの一日の生産高 / (14 * 8). % 以下のサイトは # 出典 :: C言語の宿題片付けます 167代目 #324 # [1] 授業単元:プログラミング基礎 # [2] 問題文 # text.txtというファイルに以下のような個人情報が保存されているとする。これを読み込み、 # 実行例のように画面に出力するプログラムを作成しなさい。 # ヒント: 氏名の読み込みでは"name: %s\n"のような変換仕様を用いると良い。 # ▼text.txtの内容 # name: Ichiro # age: 20 # weight: 65.5 # e-mail: ichiro@foo.bar # ▼実行例 # 氏名: Ichiro # 年齢: 20 # 体重: 65.5 # Eメール: ichiro@foo.bar # # ご教示願います 'text.txtというファイルに ▼text.txtの内容 name: Ichiro age: 20 weight: 65.5 e-mail: ichiro@foo.bar のような個人情報が保存されているとする。これを読み込み、 実行例のように表示する ▼実行例 氏名: Ichiro 年齢: 20 体重: 65.5 Eメール: ichiro@foo.bar' :- 'text.txtというファイルに ▼text.txtの内容 name: Ichiro age: 20 weight: 65.5 e-mail: ichiro@foo.bar のような個人情報が保存されているとする。これを読み込み、'(Lines), '実行例のように表示する ▼実行例 氏名: Ichiro 年齢: 20 体重: 65.5 Eメール: ichiro@foo.bar'(Lines). 'text.txtというファイルに ▼text.txtの内容 name: Ichiro age: 20 weight: 65.5 e-mail: ichiro@foo.bar のような個人情報が保存されているとする。これを読み込み、'(_行ならび) :- get_lines('text.txt',_行ならび). '実行例のように表示する ▼実行例 氏名: Ichiro 年齢: 20 体重: 65.5 Eメール: ichiro@foo.bar'(_行ならび) :- append(_,[_行|_残り行ならび],_行ならび), 実行例のように(_行,_変換された行), 表示する(_変換された行), _残り行ならび = []. 実行例のように(_行,_変換された行) :- 文字列変換候補(_変換対象文字列,_変換文字列), sub_atom(_行,_前文字列の長さ,_,_後文字列の長さ,_変換対象文字列), 変換された文字列を構成する(_行,_変換文字列,_前文字列の長さ,_後文字列の長さ,_変換された文字列),!. 実行例のように(_行,_行). 変換された文字列を構成する(_行,_変換文字列,_前文字列の長さ,_後文字列の長さ,_変換された文字列) :- sub_atom(_行,0,_前文字列の長さ,_,_前文字列), sub_atom(_行,_,_後文字列の長さ,0,_後文字列), atomic_list_concat([_前文字列,_変換文字列,_後文字列],_変換された行),!. 文字列変換候補(name,氏名). 文字列変換候補(age,年齢). 文字列変換候補(weight,体重). 文字列変換候補('e-mail','Eメール'). 表示する(_変換された行) :- writef('%t\n',[_変換された行]). % 以下のサイトは 規則性のある部分ならび(_ならび,_規則,_部分ならび) :- append(L1,_部分ならび,L3,_ならび), \+(_部分ならび = []), 部分ならびは規則に適合する(_部分ならび,_規則), その前後を含むと規則に適合しなくなる(L1,_部分ならび,L3,_規則). 部分ならびは規則に適合する(_部分ならび,_規則) :- P =.. [_規則,_部分ならび], call(P). その前後を含むと規則に適合しなくなる(L1,_部分ならび,L3,_規則) :- 'L1の最後の要素を含むと規則に適合しない'(L1,_部分ならび,_規則), 'L3の最初の要素を含むと規則に適合しない'(L3,_部分ならび,_規則). 'L1の最後の要素を含むと規則に適合しない'(L1,_部分ならび,_規則) :- \+((append(_,[A],L1),部分ならびは規則に適合する([A|_部分ならび],_規則))). 'L3の最初の要素を含むと規則に適合しない'(L3,_部分ならび,_規則) :- P =.. [_規則,A], \+((L3 = [A|_],append(_部分ならび,[A],_部分ならび_2),部分ならびは規則に適合する(_部分ならび_2,_規則))). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出典 :: SQL質疑応答スレ 14問目 #896 # 質問です。 # PostgreSQL9.3 # # テーブル # DATE, VALUE # 20140401,-13 # 20140402,-11 # 20140403, 12 # 20140404, 13 # 20140405, 12 # 20140406,-11 # # 欲しい結果 # DATE, VALUE ,COUNT # 20140401,-13, 1 # 20140402,-11, 2 # 20140403, 12, 1 # 20140404, 13, 2 # 20140405, 12, 3 # 20140406,-11, 1 # # このように、VALUEの値の正負の連続数をCOUNTし出力するようなSQLは書けるのですか? 'VALUEの値の正負の連続数をCOUNTし出力する' :- テーブルデータをならびに取得(LL), 'VALUEの値の正負の連続数をCOUNTし出力する'(LL). テーブルデータをならびに取得(LL) :- findall([_DATE,_VALUE],テーブル(_DATE,_VALUE),LL). 'VALUEの値の正負の連続数をCOUNTし出力する'(LL) :- 同一の符号の最大連続(LL,LL2), 'COUNTして出力する'(LL2). 同一の符号の最大連続(LL,LL2) :- append([LL1,LL2,LL3],LL), 'LL2が同一符号の最大連続である'(LL1,LL2,LL3). 'LL2が同一符号の最大連続である'(LL1,LL2,LL3) :- 全てが同一符号(LL2,_符号), 'LL1の最後の要素の符号は異なる'(LL1,_符号), 'LL3の最初の要素の符号は異なる'(LL3,_符号). 全てが同一符号([],_). 全てが同一符号([[_,_VALUE]|R],_符号) :- 符号(_VALUE,_符号), 全てが同一符号(R,_符号). 符号(_VALUE,+) :- _VALUE >= 0. 符号(_VALUE,-) :- _VALUE < 0. 'LL1の最後の要素の符号は異なる'(LL1,_符号) :- \+((last(LL1,[_,_VALUE]),符号(_VALUE,_符号))). 'LL3の最初の要素の符号は異なる'(LL3,_符号) :- \+((LL3 = [[_,_VALUE]|_],符号(_VALUE,_符号))). 'COUNTして出力する'(LL2) :- forall( nth1(_nth1,LL2,[_DATE,_VALUE]), writef('%t,%t,%t\n',[_DATE,_VALUE,_nth1])). % 以下のサイトは # 出典 :: SQL質疑応答スレ14問目 #890 # 質問させてください。MySQLです。 # 上位100件を抽出してその中から10件をランダムに抽出したい。 # SELECT文はどう書けばいいですか?1行でできますか? '上位100件を抽出してその中から10件をランダムに抽出したい。'(_10件をランダムに抽出) :- 上位100件を抽出して(_上位100件), length(_10件をランダムに抽出,10), '上位100件の中から10件をランダムに抽出したい。'(_上位100件,[],_10件をランダムに抽出). '上位100件を抽出して'(_上位100件) :- findall(_値,テーブル(_値),_値ならび), 降順整列(_値ならび,_降順整列した値ならび), length(_上位100件,100), append(_上位100件,_,_降順整列した値ならび). '上位100件の中から10件をランダムに抽出したい。'(_,_,[]). '上位100件の中から10件をランダムに抽出したい。'(_上位100件,_既に選択した位置,[_選択値|R]) :- 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値), '上位100件の中から10件をランダムに抽出したい。'(_上位100件,[_選択した位置|_既に選択した位置],R). 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値) :- ランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値),!. 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値) :- 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値). ランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値) :- _選択する位置 is random(100) + 1, \+(member(_選択する位置,_既に選択した位置)), nth1(_選択する位置,_上位100件,_選択値). 降順整列([],[]). 降順整列([A|R1],L) :- 降順分割(A,R1,L1,L2), 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[A|L2_2],L). 降順分割(_,[],[],[]). 降順分割(A,[B|R],[B|L1],L2) :- B @> A, 降順分割(A,R,L1,L2). 降順分割(A,[B|R],L1,[B|L2]) :- B @=< A, 降順分割(A,R,L1,L2). % 以下のサイトは # 出典 :: プログラミングのお題スレ3 #623 # お題:1のビットが3個ある二進表記文字列が与えられたとき、次に大きい # 1のビットが3個ある二進表記文字列を求める。 # 例 # 111 -> 1011 # 1110 -> 10011 # 101100 -> 110001 '1のビットが3個ある二進表記文字列が与えられたとき、次に大きい1のビットが3個ある二進表記文字列を求める。'(_1のビットが3個ある二進表記文字列,_次に大きい1のビットが3個ある二進表記文字列) :- 先頭に0を付加した二進表記文字列で探索する(_1のビットが3個ある二進表記文字列,_探索した数字ならび), '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(_探索した数字ならび,_次に大きい1のビットが3個ある二進表記文字列),!. 先頭に0を付加した二進表記文字列で探索する(_1のビットが3個ある二進表記文字列,_生成された数字ならび) :- atom_concat('0',_1のビットが3個ある二進表記文字列,_先頭に0を付加した1のビットが3個ある二進表記文字列), atom_chars(_先頭に0を付加した1のビットが3個ある二進表記文字列,_先頭に0を付加した1のビットが3個ある二進表記文字ならび), 順列で数字ならびを生成する(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_生成された数字ならび), _生成された数字ならび @> _先頭に0を付加した1のビットが3個ある二進表記文字ならび. 順列で数字ならびを生成する(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_生成された数字ならび) :- length(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_要素数), '最後の3要素だけが数字1、それより前は数字0のならび'(_要素数,_最後の3要素だけ数字1それより前は数字0のならび), 順列(_最後の3要素だけ数字1それより前は数字0のならび,_要素数,_生成された数字ならび). '最後の3要素だけが数字1、それより前は数字0のならび'(_要素数,_最後の3要素だけ数字1それより前は数字0のならび) :- length(_最後の3要素だけ数字1それより前は数字0のならび,_要素数), append(_全ての要素が数字0のならび,['1','1','1'],_最後の3要素だけ数字1それより前は数字0のならび), 全ての要素が数字0のならび(_全ての要素が数字0のならび). '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(['0'|L],_次に大きい1のビットが3個ある二進表記文字列) :- atomic_list_concat(L,_次に大きい1のビットが3個ある二進表記文字列). '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(['1'|L],_次に大きい1のビットが3個ある二進表記文字列) :- atomic_list_concat(['1'|L],_次に大きい1のビットが3個ある二進表記文字列). 全ての要素が数字0のならび([]). 全ての要素が数字0のならび(['0'|_全ての要素が数字0のならび]) :- 全ての要素が数字0のならび(_全ての要素が数字0のならび). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは :- dynamic(もらったよ/2). 'http://t.co/A1Tk1q6uuH'([_ぼく|R],L) :- はんぶんこ(_ぼく,L,L2), 'http://t.co/A1Tk1q6uuH'(R,L2). 'http://t.co/A1Tk1q6uuH'([],_). はんぶんこ(_ぼく,L,L2) :- length(L1,_要素数), length(L2_1,_要素数), はんぶんこ(L,L1,L2_1,L2), assertz(もらったよ(_ぼく,L1)). はんぶんこ(L,L1,L2_1,L2) :- append(L1,L2_1,[_ひとつ余り],L), append(L2_1,[_ひとつ余り],L2),!. はんぶんこ(L,L1,L2,L2) :- append(L1,L2,L),!. append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出題 :: プログラミングのお題スレ Part3 #482 # # お題:二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。 # 例 # aabaabbab -> a '二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_多数派の文字) :- 二種類の文字からなる長さが奇数の文字列があるとき(_二種類の文字からなる長さが奇数の文字列,_文字種_1,_文字種_2,Ln1,Ln2), 多数派の文字を求める(_文字種_1,_文字種_2,Ln1,Ln2,_多数派の文字). 二種類の文字からなる長さが奇数の文字列があるとき(_二種類の文字からなる長さが奇数の文字列,_文字種_1,_文字種_2,Ln1,Ln2) :- atom_chars(_二種類の文字からなる長さが奇数の文字列,Chars), 二種類の文字に分類して度数を示すならびを得る(Chars,_文字種_1,_文字種_2,Ln1,Ln2). 二種類の文字に分類して度数を示すならびを得る([],_,_,[],[]) :- !. 二種類の文字に分類して度数を示すならびを得る([A|R],A,B,[_|Ln1],Ln2) :- 二種類の文字に分類して度数を示すならびを得る(R,A,B,Ln1,Ln2). 二種類の文字に分類して度数を示すならびを得る([B|R],A,B,Ln1,[_|Ln2]) :- 二種類の文字に分類して度数を示すならびを得る(R,A,B,Ln1,Ln2). 多数派の文字を求める(_,B,Ln1,Ln2,B) :- append(Ln1,[_|_],Ln2),!. 多数派の文字を求める(A,_,_,_,A). % 以下のサイトは # 出題 :: プログラミングのお題スレ Part3 #482 # # お題:二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。 # 例 # aabaabbab -> a '二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_多数派の文字) :- 二種類の文字からなる(_二種類の文字からなる長さが奇数の文字列,_文字_1,_文字_2), '長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_文字_1,_文字_2,_多数派の文字). 二種類の文字からなる(_二種類の文字からなる長さが奇数の文字列,_文字_1,_文字_2) :- setof(_文字,[_文字,S,E] ^ sub_atom(_二種類の文字からなる長さが奇数の文字列,S,1,E,_文字),[_文字_1,_文字_2]). '長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_文字_1,_文字_2,_多数派の文字) :- 二種類の文字の数を数える(_二種類の文字からなる長さが奇数の文字列,_文字_1,_文字_2,L1,L2), 多数派の文字(L1,L2,_文字_1,_文字_2,_多数派の文字). 二種類の文字の数を数える(_二種類の文字からなる長さが奇数の文字列,_文字_1,_文字_2,L1,L2) :- 文字列中のある文字の文字数を形象化してならびとする(_二種類の文字からなる長さが奇数の文字列,_文字_1,L1), 文字列中のある文字の文字数を形象化してならびとする(_二種類の文字からなる長さが奇数の文字列,_文字_2,L2). 文字列中のある文字の文字数を形象化してならびとする(_文字列,_文字,_文字数を形象化したならび) :- findall(_,sub_atom(_文字列,_,1,_,_文字),_文字数を形象化したならび). 多数派の文字(L1,L2,_多数派の文字,_,_多数派の文字) :- append(L2,[_|_],L1). 多数派の文字(L1,L2,_,_多数派の文字,_多数派の文字) :- append(L1,[_|_],L2). % 以下のサイトは # # 出典 :: 竹渕瑛一氏のtwitter 20140417より # 各駅下り(_駅) :- 下り起点駅(_下り起点駅), 下り終点駅(_下り起点駅,_下り終点駅), 各駅下り(_下り起点駅,_下り終点駅,_駅). 下り起点駅(_下り起点駅) :- 駅が隣接する(_下り起点駅,_),!. 下り終点駅(_駅,_下り終点駅) :- 駅が隣接する(_駅,_次の駅), 下り終点駅(_次の駅,_下り終点駅). 下り終点駅(_下り終点駅,_下り終点駅). 各駅上り(_駅) :- 上り終点駅(_上り終点駅), 上り起点駅(_上り終点駅,_下り起点駅), 各駅上り(_上り起点駅,_上り終点駅,_駅). 上り終点駅(_上り終点駅) :- 駅が隣接する(_上り終点駅,_),!. 上り起点駅(_駅,_上り起点駅) :- 駅が隣接する(_駅,_次の駅), 上り起点駅(_次の駅,_上り起点駅). 上り起点駅(_上り起点駅,_上り起点駅). 各駅下り(_起点駅,_終点駅,_終点駅) :- 起点駅が終点駅に到達(_起点駅,_終点駅),!. 各駅下り(_起点駅,_終点駅,_駅) :- 駅が隣接する(_起点駅,_駅_2), この先に終点駅がある(_起点駅,_終点駅), 各駅下り(_起点駅,_終点駅,_駅_2,_駅). 各駅下り(_駅,_,_駅) :- \+(駅が隣接する(_駅,_)). 各駅下り(_駅,_,_,_駅). 各駅下り(_,_終点駅,_駅_2,_駅) :- 各駅下り(_駅_2,_終点駅,_駅). この先に終点駅がある(_,_終点駅) :- var(_終点駅),!. この先に終点駅がある(_起点駅,_) :- var(_起点駅),!. この先に終点駅がある(_終点駅,_終点駅) :- !. この先に終点駅がある(_駅,_終点駅) :- 駅が隣接する(_駅,_次の駅), この先に終点駅がある(_次の駅,_終点駅). 各駅上り(_起点駅,_終点駅,_終点駅) :- 起点駅が終点駅に到達(_起点駅,_終点駅),!. 各駅上り(_起点駅,_終点駅,_駅) :- 駅が隣接する(_駅_2,_起点駅), この前に終点駅がある(_起点駅,_終点駅), 各駅上り(_起点駅,_終点駅,_駅_2,_駅). 各駅上り(_駅,_,_駅) :- \+(駅が隣接する(_,_駅)). 各駅上り(_駅,_,_,_駅). 各駅上り(_,_終点駅,_駅_2,_駅) :- 各駅上り(_駅_2,_終点駅,_駅). この前に終点駅がある(_,_終点駅) :- var(_終点駅),!. この前に終点駅がある(_起点駅,_) :- var(_起点駅),!. この前に終点駅がある(_終点駅,_終点駅) :- !. この前に終点駅がある(_駅,_終点駅) :- 駅が隣接する(_次の駅,_駅), この前に終点駅がある(_次の駅,_終点駅). 起点駅が終点駅に到達(_起点駅,_終点駅) :- var(_起点駅), var(_終点駅),!,fail. 起点駅が終点駅に到達(_起点駅,_終点駅) :- var(_起点駅),!,fail. 起点駅が終点駅に到達(_起点駅,_終点駅) :- \+(var(_起点駅)), \+(var(_終点駅)), _起点駅 = _終点駅,!. 駅(相模大野). 駅(東林間). 駅(中央林間). 駅(南林間). 駅(鶴間). 駅(大和). 駅(桜ヶ丘). 駅(高座渋谷). 駅(長後). 駅(湘南台). 駅(六会日大前). 駅(善行). 駅(藤沢本町). 駅(藤沢). 駅(本鵠沼). 駅(鵠沼海岸). 駅(片瀬江ノ島). 駅が隣接する(相模大野, 東林間). 駅が隣接する(東林間, 中央林間). 駅が隣接する(中央林間, 南林間). 駅が隣接する(南林間, 鶴間). 駅が隣接する(鶴間, 大和). 駅が隣接する(大和, 桜ヶ丘). 駅が隣接する(桜ヶ丘, 高座渋谷). 駅が隣接する(高座渋谷, 長後). 駅が隣接する(長後, 湘南台). 駅が隣接する(湘南台, 六会日大前). 駅が隣接する(六会日大前, 善行). 駅が隣接する(善行, 藤沢本町). 駅が隣接する(藤沢本町, 藤沢). 駅が隣接する(藤沢, 本鵠沼). 駅が隣接する(本鵠沼, 鵠沼海岸). 駅が隣接する(鵠沼海岸, 片瀬江ノ島). /* 各駅下り(相模大野, 東林間). 各駅下り(東林間, 中央林間). 各駅下り(中央林間, 南林間). 各駅下り(南林間, 鶴間). 各駅下り(鶴間, 大和). 各駅下り(大和, 桜ヶ丘). 各駅下り(桜ヶ丘, 高座渋谷). 各駅下り(高座渋谷, 長後). 各駅下り(長後, 湘南台). 各駅下り(湘南台, 六会日大前). 各駅下り(六会日大前, 善行). 各駅下り(善行, 藤沢本町). 各駅下り(藤沢本町, 藤沢). 各駅下り(藤沢, 本鵠沼). 各駅下り(本鵠沼, 鵠沼海岸). 各駅下り(鵠沼海岸, 片瀬江ノ島). 各駅上り(片瀬江ノ島, 鵠沼海岸). 各駅上り(鵠沼海岸, 本鵠沼). 各駅上り(本鵠沼, 藤沢). 各駅上り(藤沢, 藤沢本町). 各駅上り(藤沢本町, 善行). 各駅上り(善行, 六会日大前). 各駅上り(六会日大前, 湘南台). 各駅上り(湘南台, 長後). 各駅上り(長後, 高座渋谷). 各駅上り(高座渋谷, 桜ヶ丘). 各駅上り(桜ヶ丘, 大和). 各駅上り(大和, 鶴間). 各駅上り(鶴間, 南林間). 各駅上り(南林間, 中央林間). 各駅上り(中央林間, 東林間). 各駅上り(東林間, 相模大野). */ 急行停車駅(相模大野). 急行停車駅(藤沢). 急行停車駅(片瀬江ノ島). 急行停車駅(長後). 急行停車駅(本鵠沼). 急行停車駅(鵠沼海岸). 急行停車駅(南林間). 急行停車駅(大和). 急行停車駅(南林間). 急行停車駅(湘南台). 駅間距離(相模大野, 東林間, 1.7). 駅間距離(東林間, 中央林間, 1.3). 駅間距離(中央林間, 南林間, 1.5). 駅間距離(南林間, 鶴間, 0.6). 駅間距離(鶴間, 大和, 2.5). 駅間距離(大和, 桜ヶ丘, 2.2). 駅間距離(桜ヶ丘, 高座渋谷, 2.0). 駅間距離(高座渋谷, 長後, 2.2). 駅間距離(長後, 湘南台, 1.8). 駅間距離(湘南台, 六会日大前, 1.5). 駅間距離(六会日大前, 善行, 2.4). 駅間距離(善行, 藤沢本町, 1.6). 駅間距離(藤沢本町, 藤沢, 1.8). 駅間距離(藤沢, 本鵠沼, 1.5). 駅間距離(本鵠沼, 鵠沼海岸, 1.3). 駅間距離(鵠沼海岸, 片瀬江ノ島, 1.7). 駅のならびを得る([_起点となる駅|L]) :- 駅が隣接する(_起点となる駅,_),!, findall(_駅,駅が隣接する(_,_駅),L). 全ての急行区間(_始点駅,_終点駅,_急行区間駅ならび,_急行停車駅ならび) :- 駅のならびを得る(_駅のならび), 全ての急行区間(_駅のならび,_始点駅,_終点駅,_急行区間駅ならび,_急行停車駅ならび). 全ての急行区間(_終点駅,_始点駅,_急行区間駅ならび,_急行停車駅ならび) :- 駅のならびを得る(_駅のならび), reverse(_駅のならび,_反転した駅のならび), 全ての急行区間(_反転した駅のならび,_終点駅,_始点駅,_急行区間駅ならび,_急行停車駅ならび). 全ての急行区間(_駅のならび,_始点駅,_終点駅,_急行区間駅ならび,_急行停車駅ならび) :- append(L1,[_始点駅|R],_駅のならび), last(R,_終点駅), _急行区間駅ならび = [_始点駅|R], findall(_駅,( member(_駅,[_始点駅|R]), 急行停車駅(_駅)), _急行停車駅ならび). last([A],A) :- !. last([_|R],A) :- last(R,A). 急行を使って停車駅を最小にする(_出発点駅,_到着点駅,_駅のならび,_出発駅から急行区間までの各駅停車駅ならび,_急行区間駅ならび,_終点急行停止駅から到着駅までの各駅停車駅ならび) :- append(L1,_急行区間駅ならび,L2,_駅のならび), 全ての急行区間(_,_,_急行区間駅ならび,_), 出発駅から急行区間までの駅ならび(_出発駅,L1,_出発駅から急行区間までの各駅停車駅ならび), 終点急行停止駅から到着駅までの各駅停車駅ならび(_到着点駅,L2,_終点急行停止駅から到着駅までの各駅停車駅ならび). 出発駅から急行区間までの駅ならび(_出発駅,L1,_出発駅から急行区間までの各駅停車駅ならび) :- append(_,[_出発駅|_出発駅から急行区間までの各駅停車駅ならび],L1), \+((member(_駅,_出発駅から急行区間までの各駅停車駅ならび),急行停車駅(_駅))). 終点急行停止駅から到着駅までの各駅停車駅ならび(_到着点駅,L2,_終点急行停止駅から到着駅までの各駅停車駅ならび) :- append(_終点急行停止駅から到着駅までの駅ならび,[_到着点駅|_],L2), \+((member(_駅,_終点急行停止駅から到着駅までの駅ならび),急行停車駅(_駅))). 区間距離(_起点駅,_終点駅,_区間距離) :- 区間距離(_起点駅,_終点駅,0.0,_区間距離),!. 区間距離(_起点駅,_終点駅,_区間距離) :- 区間距離(_終点駅,_起点駅,_区間距離). 区間距離(_終点駅,_終点駅,_区間距離,_区間距離) :- !. 区間距離(_駅,_終点駅,_区間距離_1,_区間距離) :- 駅間距離(_駅,_次の駅,_駅間距離), _区間距離_2 is _区間距離_1 + _駅間距離, 区間距離(_次の駅,_終点駅,_区間距離_2,_区間距離). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # お題:二次元配列を各行、各列ともに昇順になるように並べ替える。 # 例 # 1 5 3 4 # 0 4 1 0 # 7 2 3 1 #  ↓ # 0 0 1 4 # 1 2 3 5 # 1 3 4 7 '二次元配列を各行、各列ともに昇順になるように並べ替える。'(_二次元ならび,_各行各列ともに昇順ならび) :- flatten(_二次元ならび,L1), 要素に重複を許す昇順整列(L1,[L|R2]), length(L,Len), 二次元ならびと同型に構成する([L|R2],Len,_各行各列ともに昇順ならび). 二次元ならびと同型に構成する([],_,[]). 二次元ならびと同型に構成する(L1,Len,[L3|R3]) :- length(L3,Len), append(L3,R1,L1), 二次元ならびと同型に構成する(R1,Len,R3). 要素に重複を許す昇順整列([],[]). 要素に重複を許す昇順整列([_軸要素|R],L) :- '軸要素で分割する(要素の重複を許す)'(_軸要素,R,L1,L2), 整列(L1,L1_2), 整列(L2,L2_2), append(L1_2,[_軸要素|L2_2],L). '軸要素で分割する(要素の重複を許す)'(_,[],[],[]). '軸要素で分割する(要素の重複を許す)'(_軸要素,[A|R],[A|R1],L2) :- _軸要素 @>= A, '軸要素で分割する(要素の重複を許す)'(_軸要素,R,R1,L2). '軸要素で分割する(要素の重複を許す)'(_軸要素,[A|R],L1,[A|R2]) :- _軸要素 @< A, '軸要素で分割する(要素の重複を許す)'(_軸要素,R,L1,R2). % 以下のサイトは # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): # 10000以下の自然数のうち素因数分解を行ったときにその因子の数が最多となる数を求め,その数,因子の数,素因数分解の結果を表示するプログラムを作成して下さい. # # 出力形 # 8192 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 # 因子数:13 # # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限: 3月30日まで # [5] その他の制限: # ヒントを教授に聞きに行ったら自分で考えろと一蹴されました # よろしくお願いします '10000以下の自然数のうち素因数分解を行ったときにその因子の数が最多となる数を求め,その数,因子の数,素因数分解の結果を表示するプログラムを作成して下さい.' :- '10000以下の素数を求める'(_10000以下の素数ならび), '10000以下の自然数のうち素因数分解を行ったときに'(_10000以下の自然数,_10000以下の素数ならび,_素因子分解ならび), 'その因子の数が最多となる数を求め、'(_素因子分解ならび,_最多因子数), 'その数,因子の数,素因数分解の結果を表示する'(_素因子分解ならび,_最多因子数). '10000以下の自然数のうち素因数分解を行ったときに'(_10000以下の自然数,_10000以下の素数ならび,_素因子分解ならび) :- findall([_10000以下の自然数,_10000の素因子の数,_素因子ならび],( between(1,10000,_10000以下の自然数), '10000の素因子分解'(_10000以下の素数ならび,_素因子ならび), length(_素因子ならび,_10000の素因子の数)), _素因子分解ならび). '10000以下の素数を求める'(_10000以下の素数ならび) :- エラトステネスの篩によって10000以下の素数を求める(_10000以下の素数ならび). エラトステネスの篩によって10000以下の素数を求める(_10000以下の素数ならび) :- findall(N,between(1,10000,N),_10000以下の自然数ならび), エラトステネスの篩(_10000以下の自然数ならび,_10000以下の素数ならび). '10000以下の自然数のうち素因数分解を行ったときに'(_,[],[]) :- !. '10000以下の自然数のうち素因数分解を行ったときに'(M,[N|R1],[N|R2]) :- 0 is M mod N, M_1 is M // N, '10000以下の自然数のうち素因数分解を行ったときに'(M_1,[N|R1],R2). '10000以下の自然数のうち素因数分解を行ったときに'(M,[_|R1],R2) :- '10000以下の自然数のうち素因数分解を行ったときに'(M,R1,R2). 'その因子の数が最多となる数を求め、'(_素因子分解ならび,_最多因子数) :- findmax(_素因子の数,( member([_,_因子の数,_],_素因子分解ならび)), _最多因子数). 'その数,因子の数,素因子分解の結果を表示する'(_素因子分解ならび,_最多因子数) :- forall( member([_数,_最多因子数,_素因子分解の結果],_素因子分解ならび), writef('%t,%t,%t\n',[_数,_最多因子数,_素因子分解の結果])). findmax(_選択項,_評価項,_最大値) :- findall(_選択項,_評価項,_評価ならび), 最大値(_評価ならび,_最大値). 最大値(_ならび,_最大値) :- append(L1,[_最大値|L2],_ならび), ならび要素に最大値を超えるものはない(L1,_最大値), ならび要素に最大値を超えるものはない(L2,_最大値). ならびの要素に最大値を超えるものはない(_ならび,_最大値) :- \+((member(_要素,_ならび),_要素 @> _最大値)). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは 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). % 以下のサイトは # # 成績 [氏名,成績1,成績2, ... 成績n] の合計点順の # 順位を振る非決定性述語 # 成績の合計順に順位付けする(_成績ならび,_順位,_組) :- 成績の合計順に(_成績ならび,_成績の合計順に降順整列したならび), 順位付けする(_成績の合計順に降順整列したならび,_順位,_組). 成績の合計順に(_成績ならび,_成績の合計順に降順整列したならび) :- 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび), 降順整列(_合計点を先頭に付加された成績ならび,_成績の合計順に降順整列した合計点を先頭に付加された成績ならび), 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび). 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび) :- findall([_合計点,_氏名|L],( member([_氏名|L],_成績ならび), sum_list(L,_合計点)),_合計点を先頭に付加された成績ならび). 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび) :- findall(L,( member([_|L],_成績の合計順に降順整列した合計点を先頭に付加された成績ならび)),_成績の合計順に降順整列したならび). 降順整列([],[]). 降順整列([_軸要素|R],L) :- 軸要素との大小で二列を作りそれぞれ降順整列したものを結合する(_軸要素,R,L). 軸要素との大小で二列を作りそれぞれ降順整列したものを結合する(_軸要素,R,L) :- 降順整列の分割(_軸要素,R,L1,L2), それぞれ降順整列したものを結合する(_軸要素,L1,L2,L). 降順整列の分割(_,[],[],[]). 降順整列の分割(_軸要素,L,L1,L2) :- '軸要素との大小でL1,L2に割り振る'(_軸要素,L,L1,L2). '軸要素との大小でL1,L2に割り振る'(_軸要素,L,L1,L2) :- 'L1に要素を付加してさらに分割を続ける'(_軸要素,L,L1,L2). '軸要素との大小でL1,L2に割り振る'(_軸要素,L,L1,L2) :- 'L2に要素を付加してさらに分割を続ける'(_軸要素,L,L1,L2). 'L1に要素を付加してさらに分割を続ける'(_軸要素,[_要素|R],[_要素|L1],L2) :- _要素 @>= _軸要素, 降順整列の分割(_軸要素,R,L1,L2). 'L2に要素を付加してさらに分割を続ける'(_軸要素,[_要素|R],L1,[_要素|L2]) :- _要素 @< _軸要素, 降順整列の分割(_軸要素,R,L1,L2). それぞれ降順整列したものを結合する(_軸要素,L1,L2,L) :- 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[_軸要素|L2_2],L). 順位付けする(_整列した組みならび,_順位,_組) :- 順位付けする(_整列した組みならび,[],[],_順位,_組). 順位付けする([_組|_],Ln,_,_順位,_組) :- length([_|Ln],_順位). 順位付けする(L,Ln,Ln_2,_順位,_組) :- 同順位になる場合を考慮しながら順位付けをしていく(L,Ln,Ln_2,_順位,_組). 同順位になる場合を考慮しながら順位付けをしていく(L,Ln,Ln_2,_順位,_組) :- 順位調整(L,Ln,Ln_2,_新しいL,_新しいLn,_新しいLn_2), 順位付けする(_新しいL,_新しいLn,_新しいLn_2,_順位,_組). 順位調整(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位) :- '合計点が同点の場合は同順位。_位置順位のみ更新する'(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位),!. 順位調整(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位) :- '合計点が同点でない場合は、順位とはすなわち_位置順位である'(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位). '合計点が同点の場合は同順位。_位置順位のみ更新する'([_組_1,_組_2|R],_順位,_位置順位,[_組_2|R],_順位,[_|_位置順位]) :- 第二項以降の合計点が同じ(_組_1,_組_2). '合計点が同点でない場合は、順位とはすなわち_位置順位である'([_|R],_,_位置順位,R,[_|_位置順位],[_|_位置順位]). 第二項以降の合計点が同じ([_|R1],[_|R2]) :- sum_list(R1,S), sum_list(R2,S). % 以下のサイトは # # 成績 [氏名,成績1,成績2, ... 成績n]の成績の合計点順の # 順位を振る非決定性述語 # 順位付け(_整列した組みならび,_順位,_組) :- 順位付け(_整列した組みならび,[],[],_順位,_組). 順位付け([_組|_],Ln,_,_順位,_組) :- length([_|Ln],_順位). 順位付け([_組_1,_組_2|R],Ln,Ln_2,_順位,_組) :- 第二項以降の合計点が同じ(_組_1,_組_2),!, 順位付け([_組_2|R],Ln,[_|Ln_2],_順位,_組). 順位付け([_|R],_,Ln_2,_順位,_組) :- 順位付け(R,[_|Ln_2],[_|Ln_2],_順位,_組). 第二項以降の合計点が同じ([_|R1],[_|R2]) :- sum_list(R1,S), sum_list(R2,S). 成績の合計順に降順整列(_成績ならび,_成績の合計順に降順整列したならび) :- 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび), 降順整列(_合計点を先頭に付加された成績ならび,_成績の合計順に降順整列した合計点を先頭に付加された成績ならび), 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび). 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび) :- findall([_合計点,_氏名|成績ならび],( member([_氏名|_成績ならび],_成績ならび), sum_list(_成績ならび,_合計点)), _合計点を先頭に付加された成績ならび). 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび) :- findall(L,( member([_|L],_成績の合計順に降順整列した合計点を先頭に付加された成績ならび)), _成績の合計順に降順整列したならび). 降順整列([],[]). 降順整列([_軸要素|R],L) :- 降順整列の分割(_軸要素,R,L1,L2), 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[_軸要素|L2_2],L). 降順整列の分割(_,[],[],[]). 降順整列の分割(_軸要素,[_要素|R],[_要素|L1],L2) :- _要素 @>= _軸要素, 降順整列の分割(_軸要素,R,L1,L2). 降順整列の分割(_軸要素,[_要素|R],L1,[_要素|L2]) :- _要素 @< _軸要素, 降順整列の分割(_軸要素,R,L1,L2). % 以下のサイトは % % 非決定性の 降順に順位付け/3 % 降順に順位付け(_先頭に整列対象要素のある要素ならび,_順位,_要素) :- 降順整列(_先頭に整列対象要素のある要素ならび,_降順に整列したならび), append(L1,L2,L3,_降順に整列したならび), 'L2は同一の整列対象要素の最大集合'(L1,L2,L3), 順位と要素(L1,L2,_順位,_要素). 'L2は同一の整列対象要素の最大集合'(L1,L2,L3) :- 先頭の整列対象要素は全て同一(L2,_整列対象要素), 前後には整列対象要素はない(_整列対象要素,L1,L3),!. 前後には整列対象要素はない(_整列対象要素,L1,L3) :- \+(append(_,[[_整列対象要素|_]],L1)), \+(L3 = [[_整列対象要素|_]|_]). 順位と要素(L1,L2,_順位,_要素) :- length([_|L1],_順位), member(_要素,L2). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). 先頭の整列対象要素は全て同一([],_). 先頭の整列対象要素は全て同一([[_要素|_]|R],_要素) :- 先頭の整列対象要素は全て同一(R,_要素). 降順整列([],[]). 降順整列([_軸要素|R],L) :- 降順整列の分割(_軸要素,R,L1,L2), 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[_軸要素|L2_2],L). 降順整列の分割(_,[],[],[]). 降順整列の分割(_軸要素,[_要素|R],[_要素|L1],L2) :- A @>= _軸要素, 降順整列の分割(_軸要素,R,L1,L2). 降順整列の分割(_軸要素,[_要素|R],L1,[_要素|L2]) :- A @< _軸要素, 降順整列の分割(_軸要素,R,L1,L2). % 以下のサイトは # # 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のボックス). % 以下のサイトは # 【問題】 # ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。 # 【例】 # 1 3 4 7 11 6 8 9 7 10 13 14 # # これを昇順に並び替えると # 1 3 4 6 7 7 8 9 10 11 13 14 # # となります。つまり、最初の整数列の、4番目から10番目を並び替えれば良いことになります。このとき、 # 4..10 # # と出力してください。もし、ソートする必要がなければ、 # 0 # # と出力してください。 # # 【解答方法】 # まずはsort.zipをダウンロードしてください。 # 中には6つのファイルが含まれています。 # # answer.txt # 解答用テキストファイルです。 # # input_case_1.txt # input_case_2.txt # input_case_3.txt # input_case_4.txt # input_case_5.txt # 整数列が含まれたデータファイルです。これらを入力として得られた結果を解答していただきます。 # データファイルの整数列は、改行区切りになっています。 # # answer.txtに必要事項を記入し、テキストファイルのままアップロードしてください。 # ※answer.txt以外のファイルをzipに固めてアップロードした場合は評価対象外となります。 # :- op(600,xfx,'::'). 'ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。'(_整数列,_開始位置 :: _終了位置) :- 範囲の開始位置(_整数列,_開始位置), 範囲の終了位置(_整数列,_終了位置),!. 'ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。'(_,0). 範囲の開始位置(L,_開始位置) :- append(L1,[A|L2],L), 'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2),!, length([_|L1],_開始位置). 範囲の終了位置(L,_終了位置) :- reverse(L,LR), append(L1,[A|L2],LR), 'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2),!, length([A|L2],_終了位置). 'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2) :- member(B,L1), B > A. 'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2) :- member(B,L2), B < A. 'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2) :- member(B,L1), B < A. 'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2) :- member(B,L2), B > A. % 以下のサイトは # ●Regular Expressionの使用環境 # # # ●検索か置換か? # 置換 # # ●説明 # 複数行の空行を1つの空行にしたい # # ●対象データ # # # # # # ●希望する結果 # 複数行の空行を1つの空行にしたい(_ファイル) :- get_chars(_ファイル,_文字ならび), 複数行の空行を1つの空行にしたい(_行ならび,_複数の空行を1つの空行にした文字ならび), put_chars(_ファイル,_複数の空行を1つの空行にした文字ならび). 複数行の空行を1つの空行にしたい([],[]). 複数行の空行を1つの空行にしたい(['\n','\n'|_残り行ならび],_複数の空行を1つの空行にした行ならび) :- 複数行の空行を1つの空行にしたい(['\n'|_残り行ならび],_複数の空行を1つの空行にした行ならび),!. 複数行の空行を1つの空行にしたい([A|R1],[A|R2]) :- 複数行の空行を1つの空行にしたい(R1,R2),!. get_chars(_ファイル,_文字ならび) :- open(_ファイル,read,Instream), findall(_文字,( at_end_of_stream(Instream),!,fail; get_char(Instream,_文字))), _文字ならび), close(Instream). put_chars(_ファイル,_文字ならび) :- open(_ファイル,write,Outstream), append(_,[_文字|R],_文字ならび), putchar(Outstream,_文字), R = [], close(Outstream). % 以下のサイトは # http://toro.2ch.net/test/read.cgi/tech/1392388003/116 # [1] プログラミング言語 C # [2] # ・ 指定したファイルに文字列を行数を指定して挿入するプログラム(ファイル名と位置,挿入する文字列を入力できるようにする) # ・ また、上記のプログラムを直して文字列を挿入する場所を行だけでなく列も指定できるようにせよ。(まずは半角だけでよい) # # [3] 環境 #  [3.1] OS: Windows Vista #  [3.2] コンパイラ名とバージョン: Visual C++ #  [3.3] 言語: C # [4] 期限: 3月14日 '・ 指定したファイルに文字列を行数を指定して挿入するプログラム(ファイル名と位置,挿入する文字列を入力できるようにする ・ また、上記のプログラムを直して文字列を挿入する場所を行だけでなく列も指定できるようにせよ。'(_ファイル名,_行位置,_列位置,_列位置,_文字列) :- get_chars(_ファイル名,Chars), tell(_ファイル名), 指定したファイルに文字列を行数と列数を指定して挿入する(Chars,1,_行位置,_列位置,_文字列), told. 指定したファイルに文字列を行数と列数を指定して挿入する(Chars,_行位置,_行位置,_列位置,_文字列) :- 列位置に文字列を書き込む(Chars,_列位置,_文字列), 残りの文字ならびをファイルに書く(Chars),!. 指定したファイルに文字列を行数と列数を指定して挿入する(['\n'|R],_行位置_1,_行位置,_列位置_文字列) :- write('\n'), _行位置_2 is _行位置_1 + 1, 指定したファイルに文字列を行数と列数を指定して挿入する(R,_行位置_2,_行位置,_文字列),!. 指定したファイルに文字列を行数と列数を指定して挿入する([A|R],_行位置_1,_行位置,_文字列) :- write(A), 指定したファイルに文字列を行数と列数を指定して挿入する(R,_行位置_1,_行位置,_列位置,_文字列). 列位置に文字列を書き込む(Chars,_列位置,_文字列) :- length([_|L0],_列位置), append(L0,Chars2,Chars), writef('%t\n',[_文字列]),!. 残りの文字ならびをファイルに書く([]). 残りの文字ならびをファイルに書く([Char|R]) :- write(Char), 残りの文字ならびをファイルに書く(R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/300 # お題:次のような規則の配列でインデックス番号iの配列の値を求める。 # ・インデックス番号1の配列の値A(1)は1である。 # ・配列の値は昇順である。 # ・インデックス番号iの配列の値A(i)は配列内のiの個数である。 # 例 # A(10) -> 4 # A(100) -> 14 # A(1000) -> 45 # '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_i,X) :- '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'([],2,_i,2,_a), nth1(_i,_a,X). '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_a,_インデッスク,_i,_繰り返し数_1,_a) :- _インデックス > _i,!. '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_a_1,_インデッスク,_i,_繰り返し数_1,_a) :- 繰り返し数_1から繰り返し個数を求めてインデックス列を登録する(_a_1,_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2,_a_2), '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_a_2,_次のインデックス,_i,_繰り返し数_2,_a). 繰り返し数_1から繰り返し数を求めてインデックス列を登録する(_a_1,_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2,_a) :- 繰り返し個数を得る(_a_1,_繰り返し数_1,_繰り返し数), _次のインデックス is _インデックス + _繰り返し数, インデッスク列の生成(_インデックス,_繰り返し数,L), _繰り返し数_2 is _繰り返し数_1 + 1, append(_a_1,L,_a),!. 繰り返し数を得る(_a,N,M) :- nth1(N,_a,M),!. 繰り返し数を得る(_,N,N). インデッスク列の生成(_インデックス,_繰り返し数,L) :- _インデックス_2 is _インデックス + _繰り返し数 - 1, findall(N,( between(_インデックス,_インデックス_2,N)), L). % 以下のサイトは # # 上部の基壇に幅をもたせたピラミッドの矩形 # # # _向き = 上向き, _頂点の高さ = 2, _上部の基壇の幅 = 3 の場合 # # *** # ***** # # _向き = 右向き, _頂点の高さ = 3, _上部の基壇の幅 = 2 の場合 # # * # ** # *** # *** # ** # * # ピラミッドの矩形(右向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- 下向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形),!. ピラミッドの矩形(左向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- 上向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形),!. ピラミッドの矩形(_向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形). 下向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- ピラミッドの矩形(下向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). 上向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- ピラミッドの矩形(上向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- _底辺の幅 is _頂点の高さ * 2 + _上部基壇の幅, length(L,_底辺の幅), findall(L4,( append(L1,L2,L), 行にピラミッドの文様を描く(_向き,_上部基壇の幅,L1,L2,L4)), _ピラミッドの矩形). 行にピラミッドの文様を描く(上向き,_上部基壇の幅,[A|L1],L2,L4) :- length(L0,_上部基壇の幅), append(L0,L1,L), 行にピラミッドの文様を描く(L,L2,L4). 行にピラミッドの文様を描く(下向き,_上部基壇の幅,L1,[A|L2],L4) :- length(L0,_上部基壇の幅), append(L0,L2,L), 行にピラミッドの文様を描く(L,L1,L4). 行にピラミッドの文様を描く(L1,L2,L4) :- all(L1,'*'), all(L2,' '), append(L3,L3,L2), append(L3,L1,L3,L4). ピラミッドの矩形を表示する([]). ピラミッドの矩形を表示する([L|R]) :- atomic_list_concat(L,A), writef('%t\n',[A]), ピラミッドの矩形を表示する(R). all([],_). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは ピラミッドの矩形(右向き,_頂点の高さ,_ピラミッドの矩形) :- 下向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形),!. ピラミッドの矩形(左向き,_頂点の高さ,_ピラミッドの矩形) :- 上向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形),!. ピラミッドの矩形(_向き,_頂点の高さ,_ピラミッドの矩形) :- '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_ピラミッドの矩形). 下向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形) :- ピラミッドの矩形(下向き,_頂点の高さ,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). 上向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形) :- ピラミッドの矩形(上向き,_頂点の高さ,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_ピラミッドの矩形) :- _底辺の幅 is _頂点の高さ * 2 - 1, length(L,_底辺の幅), findall(L4,( append(L1,L2,L), 行にピラミッドの文様を描く(_向き,L1,L2,L4)), _ピラミッドの矩形). 行にピラミッドの文様を描く(上向き,[A|L1],L2,L4) :- all([A|L1],'*'), all(L2,' '), append(L3,L3,L2). append(L3,[A|L1],L3,L4). 行にピラミッドの文様を描く(下向き,L1,[A|L2],L4) :- all([A|L2],'*'), all(L1,' '), append(L3,L3,L1), append(L3,[A|L2],L3,L4). ピラミッドの矩形を表示する([]). ピラミッドの矩形を表示する([L|R]) :- atomic_list_concat(L,A), writef('%t\n',[A]), ピラミッドの矩形を表示する(R). all([],_). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/577 # こんなSQLがあります。 # # select id, name, utime # from something # order by utime desc; # # このとき、idが、ある指定された値までは読み飛ばし、それ以降のレコードを取得するにはどうしたらいいですか。 # ポイントは、 # * id順とutime順とで順番が異なること # * ソートキーは utime だが、読み飛ばす条件は id を使っていること # # whileループなら簡単な処理ですが、SQLだとどうするのでしょうか。 # # (使用DB: PostgreSQL 9.3) # 'こんなSQLがあります。 select id, name, utime from something order by utime desc; idが、ある指定された値までは読み飛ばし、それ以降のレコードを取得する'(_指定された値,_id,_name,_utime) :- 'idが、ある指定された値までは読み飛ばし、'(_指定された値,_それ以降), それ以降のレコードを取得する(_それ以降,_id,_name,_utime). 'idが、ある指定された値までは読み飛ばし、'(_指定された値,_それ以降) :- findall([_utime,_id,_name],something(_id,_name,_utime),LL1), 降順整列(LL1,LL2), append(_,[[_,_指定された値,_]|_それ以降],LL2),!. それ以降のレコードを取得する(_それ以降,_id,_name,_utime) :- member([_utime,_id,_name],_それ以降). 降順整列([],[]). 降順整列([_軸要素|_残りならび],_降順に整列したならび) :- 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,_残りならび,_軸要素より大きい要素ならび,_軸要素に等しいか小さい要素ならび), それぞれのならびを降順に整列する(_軸要素より大きい要素ならび,_軸要素に等しいか小さい要素ならび,_降順整列ならび_1,_降順整列ならび_2), append(_降順整列ならび_1,[_軸要素|_降順整列ならび_2],_降順に整列したならび). 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,[],[],[]) :- !. 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,[A|R1],[A|R2],R3) :- A @> _軸要素, 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,R1,R2,R3). 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,[A|R1],R2,[A|R3]) :- A @=< _軸要素, 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,R1,R2,R3). それぞれのならびを降順に整列する(_軸要素より大きい要素ならび,_軸要素に等しいか小さい要素ならび,_降順整列ならび_1,_降順整列ならび_2) :- 降順整列(_軸要素より大きい要素ならび,_降順整列ならび_1), 降順整列(_軸要素に等しいか小さい要素ならび,_降順整列ならび_2),!. % 以下のサイトは ?- 'a##'. # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/212 # お題:与えられた数列を以下のルールで縮小せよ # (a) 4つ以上連続した数を消す (複数ある場合は一番左を優先する) # (b) (a)を繰り返す # 例: # ------- # in : 11233344433331111143322211 # out: # 11233344433331111143322211 # 1123334441111143322211 # 11233344443322211 # 1123333322211 # 11222211 # 1111 # # ------- # in : 1122224411112222 # out: # 1122224411112222 # 114411112222 # 11442222 # 1144 # ------- # in : 211222211333312 # out: # 211222211333312 # 21111333312 # 2333312 # 212 # # '4つ以上連続した数を消す (複数ある場合は一番左を優先する)'(_数_1,_数_2) :- number_chars(_数_1,Chars_1), '4要素以上の連続した文字ならびを切り取る'(Chars_1,Chars_2), number_chars(_数_2,Chars_2),!. '4要素以上の連続した文字ならびを切り取る'(Chars_1,Chars_2) :- '4要素以上の連続する最初の文字ならびを切り取る'(Chars_1,Chars_3), '4要素以上の連続した文字ならびを切り取る'(Chars_3,Chars_2). '4要素以上の連続した文字ならびを切り取る'(Chars,Chars). '4要素以上の連続する最初の文字ならびを切り取る'(Chars_1,Chars_3) :- '4要素以上の連続する最初の文字ならびを'(Chars_1,L1,L3), 切り取る(L1,L3,Chars_3). '4要素以上の連続する最初の文字ならびを'(Chars_1,L1,L3) :- append(L1,L2,L3,Chars_1), all(L2,_文字), \+(L3 = [_文字|_]), L2 = [_,_,_,_|_],!. 切り取る(L1,L3,Chars_3) :- append(L1,L3,Chars_3). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1392388003/4 # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # struct node {int elem;struct node *next;}; # struct node *list; # 問1、中央のセルのポインタを返す関数list midcell(list L)を定義してください。 # 条件は単方向リストで。また中央のセルとは末尾のセルを除いて考えセルの個数が # 2N個の場合N番目のセルのことをいいます。 # 問2、連結リストLとその途中のセルのポインタMが与えられたとき # 先頭LからMの直前のセルまでを切り離し順序を逆転させリストを返す関数 # list revfR(list L,list M)を再帰関数で定義してください。 # リストLは空でないと仮定します。また本問も単方向リストでお願いします。 # 問3、問2の機能を持つ関数list revf(list L,list M)を再帰関数を用いず定義してください # よろしくお願いします。 # '問1、中央のセルのポインタを返す関数list midcell(list L)を定義してください。'(L,_中央位置) :- append(L1,L2,L), length(L1,_中央位置), length(L2,_中央位置). % 以下のサイトは # teitter by @SaitoAtsushi 2014-02-16 # 問題 三人の年齢(_1,_2,_3) :- 'Bの年齢'(Bの年齢), '36の約数の重複組合せから年齢候補を得る'(_1,_2,_3), Bの年齢 is _1 + _2 + _3, 最も高い年齢の子供は一人(_1,_2,_3). 'Bの年齢'(Bの年齢) :- '36の約数の重複組合せから年齢候補を得る'(_1,_2,_3), 最も高い年齢の子供が複数いる(_1,_2,_3), Bの年齢 is _1 + _2 + _3. '36の約数の重複組合せから年齢候補を得る'(_1,_2,_3) :- '36の約数を得る'(1,_36の約数ならび), 重複組合せ(_36の約数ならび,3,[_1,_2,_3]), 36 is _1 * _2 * _3. '36の約数を得る'(36,[36]) :- !. '36の約数を得る'(N,[N|R]) :- 0 is 36 mod N,!, N_2 is N + 1, '36の約数を得る'(N_2,R). '36の約数を得る'(N,[N|R]) :- N_2 is N + 1, '36の約数を得る'(N_2,R). 重複組合せ(X,1,[A]) :- member(A,X). 重複組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 重複組合せ([A|Y],M,X). 重複組合せ([_|Y],N,A) :- N > 1, 重複組合せ(Y,N,A). 最も高い年齢の子供は一人(_1,_2,_3) :- append(L1,[_最大年齢|L2],[_1,_2,_3]), \+((member(A1,L1),A1 >= _最大年齢)), \+((member(A2,L2),A2 >= _最大年齢)),!. 最も高い年齢の子供が複数いる(_1,_2,_3) :- append(L1,[_最大年齢|L2],[_1,_2,_3]), \+((member(A1,L1),A1 > _最大年齢)), \+((member(A2,L2),A2 > _最大年齢)), (member(_最大年齢,L1);member(_最大年齢,L2)). % 以下のサイトは 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). % 以下のサイトは % % カレンダー矩形/3 % '年カレンダー'(_年) :- 横並びカレンダーを表示する(_年,[1,2,3]), 横並びカレンダーを表示する(_年,[4,5,6]), 横並びカレンダーを表示する(_年,[7,8,9]), 横並びカレンダーを表示する(_年,[10,11,12]). 横並びカレンダーを表示する(_年,_月ならび) :- 月カレンダーを直列する(_年,_月ならび,LL1), 見出し表示(_年,_月ならび), カレンダー行の表示(LL2). 月カレンダーを直列する(_,[],[]). 月カレンダーを直列する(_年,[_月|R],LL) :- カレンダー矩形(_年,_月,LL1), 月カレンダーを直列する(_年,R,LL2), append(LL1,LL2,LL). 見出し表示(_年,_月ならび) :- write('\n'), forall(member(_月,_月ならび),writef('%6c%4r年 %2r月%8c')), write('\n\n'). カレンダー行の表示(_月カレンダー矩形ならび) :- between(1,7,_行), forall(member(_月カレンダー矩形,_月カレンダー矩形ならび), 週表示(_行,_月カレンダー矩形)), write('\n'), _行 = 7,!. 週表示(_行,_月カレンダー矩形) :- nth1(_行,_月カレンダー矩形,[_1,_2,_3,_4,_5,_6,_7]), writef('%3r%3r%3r%3r%3r%3r%3r ',[_1,_2,_3,_4,_5,_6,_7]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/69 # お題: # n=1のとき # 01 # 10 # # n=2のとき # 0011 # 0011 # 1100 # 1100 # # n=3のとき # 000111 # 000111 # 000111 # 111000 # 111000 # 111000 # # を表示する。 # # ブロックを表示する(_n,LL) :- '_n * _n のブロックを生成する'(_n,0,1,LL1), '_n * _n のブロックを生成する'(_n,1,0,LL2), 表示する(LL1,LL2). '_n * _n のブロックを生成する'(_n,A,B,LL) :- findall(L,( all(_n,L1,A), all(_n,L2,B), between(1,_n,_), append(L1,L2,L)), LL). all(0,[],_) :- !. all(N,[A|R],A) :- N_1 is N - 1, all(N_1,R,A). 表示する(LL1,LL2) :- forall(member(L1,LL1),(atomic_list_concat(L1,A),writef('%t\n',[A]))), forall(member(L2,LL2),(atomic_list_concat(L2,B),writef('%t\n',[B]))), % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/263 # ●Regular Expressionの使用環境 # Javascript # # ●検索か置換か? # 置換 # # ●説明 # '1'を含まないABCからDEFまでを削除したいです # # ●対象データ # ABC # 1 # DEF # # ABC # 2 # DEF # # ABC # 3 # DEF # # ●希望する結果 # ABC # 1 # DEF # # '''1''を含まないABCからDEFまでを削除したいです'(_文字列,_希望する結果) :- atom_char(_文字列,_文字ならび), '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(_文字ならび,L), atomic_list_concat(L,_希望する結果). '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'([],[]). '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(_文字ならび,L) :- '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までを'(_文字列,L3), '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(L3,L),!. '''1''を含まないABCからDEFまでを削除したいです'([A|R1],[A|R2]) :- '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(R1,R2). '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までを'(_文字列,L3) :- append(['A','B','C'|L2],['D','E','F'|L3],_文字ならび), \+(append(_,['A','B','C'|_],L2)), \+(append(_,['D','E','F'|_],L2)), \+(append(_,['1'|_],L2)),!. % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #24 # お題: # リストを与え、昇順でソートされている部分列のリスト出力する # [8,3,4,9,9,10,6,1,4,3] => [[8],[3,4,9,9,10],[6],[1,4],[3]] # [1,3,3,4,4,6,8,9,9,10] => [[1,3,3,4,4,6,8,9,9,10]] # [10,9,9,8,6,4,4,3,3,1] => [[10],[9,9],[8],[6],[4,4],[3,3],[1]] # [1,1,1,1,1,1,1,1,1,1] => [[1,1,1,1,1,1,1,1,1,1]] # [] => [] # [1] => [[1]] 'リストを与え、昇順でソートされている部分列のリスト出力する'(L) :- 'リストを与え、昇順でソートされている部分列のリストを'(L,LL), 出力する(LL) :- 'リストを与え、昇順でソートされている部分列のリストを'(L,LL) :- findall(L2,( append(L1,L2,L3,L), 昇順(L2), 'L1,L3とL2は昇順の接続になっていない'(L1,L2,L3)), LL). 昇順([A]) :- !. 昇順([A,B|R]) :- A =< B, 昇順([B|R]). 'L1,L3とL2は昇順の接続になっていない'(L1,L2,L3) :- 'L1とL2は昇順の接続になっていない'(L1,L2), 'L1とL3は昇順の接続になっていない'(L1,L3). 'L1とL2は昇順の接続になっていない'(L1,L2) :- \+((L2=[A|_],最後の要素(L1,B),A >= B)). 'L1とL3は昇順の接続になっていない'(L1,L3) :- \+((最後の要素(L2,A),L3=[B|_],A =< B))). 最後の要素(_ならび,_最後の要素) :- append(_,[_最後の要素],_ならび). 出力する(L,LL) :- writef('%t => %t\n',[L,LL]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/23 # お題: # リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する # ソートされていなければ先頭からソートされている個数を出力する # [6,6,3,2,6,4,7,4,7,4] => 4 # [2,3,4,4,4,6,6,6,7,7] => AS # [7,7,6,6,6,4,4,4,3,2] => DES # [1,1,1,1,1,1,1,1,1,1] => EQ # [] => EQ # [1] => EQ # # 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,全て同じ要素) :- 全て同じ要素である(_リスト),!. 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,昇順) :- 昇順にソートされている(_リスト),!. 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,降順) :- 降順にソートされている(_リスト),!. 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,_個数) :- ソートされていなければ先頭からソートされている個数を出力する(_リスト,_個数). 全て同じ要素である([],_). 全て同じ要素である([A|R],A) :- 全て同じ要素である(R,A). 昇順にソートされている(_リスト) :- forall(append(_,[A,B|_],_リスト),A @=< B). 降順にソートされている(_リスト) :- forall(append(_,[A,B|_],_リスト),A @>= B). ソートされていなければ先頭からソートされている個数を出力する(L,_先頭からソートされている個数) :- findall(Len,( append(L1,L2,L), length(L1,Len), (昇順にソートされている(L1);降順にソートされている(L1)), _長さならび), 最大値(_長さならび,_先頭からソートされている個数). 最大値([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値([A|R],_最大値_1,_最大値) :- A @> _最大値_1, 最大値(R,A,_最大値),!. 最大値([A|R],_最大値_1,_最大値) :- 最大値(R,_最大値_1,_最大値). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/842 # お題:スタックオーバーフローせよ。 # # 回答例および実行例: # public class StackOverflowErrorTest { # private void recurse(int i) { # try { # recurse(i + 1); # } catch (StackOverflowError e) { # System.out.println(i); # } # } # public static void main(String[] args) { # new StackOverflowErrorTest().recurse(0); # } # } # ↓ # 5776 # # グローバルスタックのオーバーフロー(A,B,C) :- append(A,B,C),fail. ローカルスタックのオーバーフロー(A) :- r(A). r(A) :- r(A). r(A). % 以下のサイトは 構文解析(L,LL) :- findall([_語ならび,_品詞],( append(L1,L2,L), 語句解析(L1,L2,_品詞,_語ならび)), LL). 語句解析(_前方,[私|_],名詞,[私]). 語句解析(_前方,[は|_],後置詞,[は]). 語句解析(_前方,[反対です|_],動詞,[反対です]). % ?- 構文解析([私,は,反対です],LL). % % LL = [[['私'],'名詞'],[['は'],'後置詞'],[['反対です'],'動詞']]. % yes. % ?- % 以下のサイトは # 出題場所 :: 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/1381909900/619 # 2014の2014乗の下4桁を標準出力に表示せよ # # 制限 # ・インクルードはstdio.hのみ # ・main実行開始から、出力間までの時間が1秒未満 # ・実行ファイルサイズ 50KB未満 # # '2014の2014乗の下4桁を標準出力に表示せよ' :- '2014の2014乗の下4桁を'(1,2014,_下4桁ならび), 標準出力に表示せよ(_下4桁ならび),!. '2014の2014乗の下4桁を'(2014,N,_下4桁ならび) :- 下4桁ならび(N,_下4桁ならび),!. '2014の2014乗の下4桁を'(_nth1_1,N_1,N) :- N_2 is N_1 * 2014 mod 10000, _nth1_2 is _nth1_1 + 1, '2014の2014乗の下4桁を'(_nth1_2,N_2,N). 下4桁ならび(N,[_1,_2,_3,_4]) :- number_chars(N,L2), append(L1,L2,[_1,_2,_3,_4]), all(L1,0). 標準出力に表示せよ(_下4桁ならび) :- writef('%t%t%t%t\n',_下4桁ならび). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/619 # 2014の2014乗の下4桁を標準出力に表示せよ # # 制限 # ・インクルードはstdio.hのみ # ・main実行開始から、出力間までの時間が1秒未満 # ・実行ファイルサイズ 50KB未満 # # '2014の2014乗の下4桁を標準出力に表示せよ' :- X is 2014 ^ 2014, number_chars(X,L), append(_,[_1,_2,_3,_4],L), writef('%t%t%t%t\n',[_1,_2,_3,_4]). % 以下のサイトは % % SWI-Prolog の readln/1 では % ?- readln(X). % :| abc,def % X = [abc,',',def] が期待される。 % ところが漢字を用いると % ?- readln(X). % :| 尾崎,隆大 % X = [尾,崎,',',隆,大] となって漢字の部分を語と認識しない。 % この問題を回避する為の一時凌ぎが以下の述語である。 % 予め、アトムを構成する文字コードのリストを utf16_code/1 で定義して置く。 % :- findall(X,between(12288,40959,X),L1), findall(Y,between(65280,65299,Y),L2), append(L1,L2,L), assertz(utf16_code(L)). readln(X) :- utf16_code(U), readln(X,_,_,U,_). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/726 # お題:連続した自然数の和が2014になるものをすべて求める。 # # '連続した自然数の和が2014になるものをすべて求める。'(_和が2014になる連続した自然数) :- N_1 is 2014 // 2, findall(N,between(1,N_1,N),L), append(L1,L2,L), 和が2014になる連続した自然数(L2,_和が2014になる連続した自然数). 和が2014になる連続した自然数(L2,_和が2014になる連続した自然数) :- 和が2014以上になる連続した自然数(L2,_和が2014になる連続した自然数,2014). 和が2014以上になる連続した自然数(L2,_和が2014以上になる連続した自然数,_和) :- append(_和が2014を以上の連続した自然数,_,L2), sumlist(_和が2014を以上の連続した自然数,_和), _和 >= 2014,!. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/726 # お題:連続した自然数の和が2014になるものをすべて求める。 # # '連続した自然数の和が2014になるものをすべて求める。'(_和が2014になる連続した自然数) :- N_1 is 2014 // 2, findall(N,between(1,N_1,N),L), append(L1,L2,L), 和が2014になる連続した自然数(L2,_和が2014になる連続した自然数). 和が2014になる連続した自然数(L2,_和が2014になる連続した自然数) :- 和が2014以上になる連続した自然数(L2,_和が2014以上になる連続した自然数,_和), _和 = 2014, _和が2014以上になる連続した自然数 = _和が2014になる連続した自然数. 和が2014以上になる連続した自然数(L2,_和が2014以上になる連続した自然数,_和) :- append(_和が2014を以上の連続した自然数,_,L2), sumlist(_和が2014を以上の連続した自然数,_和), _和 >= 2014,!. % 以下のサイトは # 出題場所 http://toro.2ch.net/test/read.cgi/tech/1387257592/131 # すいません。VBScriptで # 抽出した文字列にダブりがあります。 # 例: # AAA # BBB # AAA # CCC # BBB # CCC # これを # AAA # BBB # CCC # のように抽出し直すにはどうすればいいでしょうか? '抽出した文字列にダブりがあります。\\n例:\\nAAA\\nBBB\\nAAA\\nCCC\\nBBB\\nCCC\\nこれを\\nAAA\\nBBB\\nCCC\\nのように抽出し直すにはどうすればいいでしょうか?'(_文字列ならび,_抽出し直した文字列ならび) :- findall(_文字列,( append(L1,[_文字列|R],_文字列ならび), \+(member(_文字列,L1))), _抽出し直した文字列ならび). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/684 # お題: ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ # # 出力: http://ime.nu/codepad.org/9Qm1zRxy # # 一番上の「☆」と土台の「||」は固定でよい # 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する # # 解答例: http://ime.nu/codepad.org/aR7eI9F2 # # ☆ # || # ☆ # ** # || # ☆ # b* # *i*o # || # ☆ # ** # **** # ****** # || # ☆ # *b # **** # i**%*J # *Ni***** # || # ☆ # ** # *%** # *****i # **JX**** # ********** # || # ☆ # %* # **%* # *i***o # ******** # ****%***** # **o%****oi*b # || 葉と飾り(20,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b]). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ 出力: http://ime.nu/codepad.org/9Qm1zRxy 一番上の「☆」と土台の「||」は固定でよい 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する' :- forall((between(2,8,_何段), 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_何段,_クリスマスツリー)), クリスマスツリーの表示(_クリスマスツリー)). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_何段,_クリスマスツリー) :- length(_クリスマスツリー,_何段), append([☆|L1],['||'],_クリスマスツリー), findall(_段,( nth1(_段目,_クリスマスツリー,_段), 一段生成(_段目,_段)), _クリスマスツリー). 一段生成(_段目,_飾りを含む葉) :- var(_飾りを含む葉), length(_段,_段目), 飾りを含む葉の生成(_段,_飾りを含む葉),!. 一段生成(_,_既に存在するもの) :- \+(var(_既に存在するもの)). 飾りを含む葉の生成(_段,_一段の葉飾り) :- 葉と飾り(_基数,_葉と飾りならび), findall(_葉または飾り,( 葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り)), _葉または飾りならび), atomic_list_concat(_葉または飾りならび,_一段の葉飾り),!. 葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り) :- member(_葉または飾り,_段), _乱数 is random(_基数), nth0(_乱数,_葉と飾りならび,_葉または飾り). クリスマスツリーの表示(_クリスマスツリー) :- forall(member(_段,_クリスマスツリー), writef('%t\n',[_段])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/684 # お題: ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ # # 出力: http://ime.nu/codepad.org/9Qm1zRxy # # 一番上の「☆」と土台の「||」は固定でよい # 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する # # 解答例: http://ime.nu/codepad.org/aR7eI9F2 # # ☆ # || # ☆ # ** # || # ☆ # b* # *i*o # || # ☆ # ** # **** # ****** # || # ☆ # *b # **** # i**%*J # *Ni***** # || # ☆ # ** # *%** # *****i # **JX**** # ********** # || # ☆ # %* # **%* # *i***o # ******** # ****%***** # **o%****oi*b # || 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ 出力: http://ime.nu/codepad.org/9Qm1zRxy 一番上の「☆」と土台の「||」は固定でよい 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する' :- forall((between(2,8,_段), 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー)), クリスマスツリーの表示(_クリスマスツリー)). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー) :- length(L,_段), append([☆|L1],['||'],L), findall(A,( nth1(_nth1,L,A), '一段生成'(_nth1,A)), L). '一段生成'(_nth1,A) :- var(A), length(L,_nth1), 飾りを含む葉の生成(L,A),!. '一段生成'(_,A) :- \+(var(A)). 飾りを含む葉の生成(L,A) :- findall(B,( member(B,L), _乱数 is random(20), nth0(_乱数,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b],B)), L), atomic_list_concat(L,A),!. クリスマスツリーの表示(_クリスマスツリー) :- forall(member(A,_クリスマスツリー), writef('%t\n',[A])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/642 # お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 # "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を # 返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 # 例 # 1 # 11 # 21 # 1211 # 111221 # 312211 # 13112221 # 1113213211 # 31131211131221 # 13211311123113112211 # 11131221133112132113212221 # # '"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。"11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を返す。"1"から始めてこの操作(以下、"この操作"とする)を10回繰り返し、途中経過を表示する。' :- length(Ln,10), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],'1'). '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([],_文字列) :- !. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],_文字列) :- writef('%t\n',[_文字列]), この操作を(_文字列,_次の文字列), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,_次の文字列). この操作を(_文字列,_次の文字列) :- findall(_個数と連続した記号の結合文字列,( '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数), atomic_list_concat([_個数,_連続した記号],_個数と連続した記号の結合文字列)), _個数と連続した記号の結合文字列ならび), 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列). '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数) :- atom_chars(_文字列,_文字ならび), 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数). 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数) :- append([L1,L2,L3],_文字ならび), 'L2は_記号が_個数連続している'(L2,_連続した記号,_個数), '両隣は_連続した記号と異なる'(_連続した記号,L1,L3). '両隣は_連続した記号と異なる'(_連続した記号,L1,L3) :- \+((last(L1,A0),A0=_連続した記号)), \+((nth1(1,L3,A3),A3=_連続した記号)). 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列) :- atomic_list_concat(_個数と連続した記号の結合文字列ならび,_次の文字列). 'L2は_記号が_個数連続している'(L2,_記号,_個数) :- L2 = [_記号|R], all(R,_記号), length([_記号|R],_個数). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/642 # お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 # "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を # 返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 # 例 # 1 # 11 # 21 # 1211 # 111221 # 312211 # 13112221 # 1113213211 # 31131211131221 # 13211311123113112211 # 11131221133112132113212221 # # '"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。"11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を返す。"1"から始めてこの操作(以下、"この操作"とする)を10回繰り返し、途中経過を表示する。' :- length(Ln,10), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,'1'). '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([],_文字列) :- !. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],_文字列) :- writef('%t\n',[_文字列]), この操作を(_文字列,_次の文字列), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,_次の文字列). この操作を(_文字列,_次の文字列) :- findall(_個数と連続した記号の結合文字列,( '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数), atomic_list_concat([_個数,_連続した記号],_個数と連続した記号の結合文字列)), _個数と連続した記号の結合文字列ならび), 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列). '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数) :- atom_chars(_文字列,_文字ならび), 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数). 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数) :- append(L1,L2,L3,_文字ならび), 'L2は_記号が_個数連続している'(L2,_連続した記号,_個数), '両隣は_連続した記号と異なる'(_連続した記号,L1,L3). '両隣は_連続した記号と異なる'(_連続した記号,L1,L3) :- \+((last(L1,A0),A0=_連続した記号)), \+((nth1(1,L3,A3),A3=_連続した記号)). 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列) :- atomic_list_concat(_個数と連続した記号の結合文字列ならび,_次の文字列). 'L2は_記号が_個数連続している'(L2,_記号,_個数) :- L2 = [_記号|R], all(R,_記号), length([_記号|R],_個数). all([],_). all([V|R],V) :- all(R,V). append([],L2,L3,L) :- append(L2,L3,L). append([U|R1],L2,L3,[U|R4]) :- append(R1,L2,L3,R4). % 以下のサイトは '文字列で()の対応を取る'(_文字列,_前文字列,_括弧対応文字列,_後文字列) :- atom_chars(_文字列,_文字ならび), '文字ならびで()の対応を取る'(_文字ならび,_前文字ならび,_括弧対応文字ならび,_後文字ならび), atom_chars(_前文字列,_前文字ならび), atom_chars(_括弧対応文字列,_括弧対応文字ならび), atom_chars(_後文字列,_後文字ならび). '文字ならびで()の対応を取る'(_文字ならび,_前文字ならび,_括弧対応文字ならび,_後文字ならび) :- '文字ならびで()の対応を取る'(0,0,_文字ならび,_前文字ならび_1,_括弧対応文字ならび_1,_後文字ならび_1), '文字ならびで()の対応を非決定性に得る'(_前文字ならび_1,_括弧対応文字ならび_1,_後文字ならび_1,_前文字ならび,_括弧対応文字ならび,_後文字ならび). '文字ならびで()の対応を非決定性に得る'(_前文字ならび,_括弧対応文字ならび,_後文字ならび,_前文字ならび,_括弧対応文字ならび,_後文字ならび). '文字ならびで()の対応を非決定性に得る'(_前文字ならび_1,_括弧対応文字ならび_1,_後文字ならび_1,_前文字ならび,_括弧対応文字ならび,_後文字ならび) :- '文字ならびで()の対応を取る'(_後文字ならび_1,_前文字ならび_2,_括弧対応文字ならび,_後文字ならび), append(_前文字ならび_1,_括弧対応文字ならび_1,_前文字ならび_2,_前文字ならび),!. '文字ならびで()の対応を取る'(0,0,_文字ならび,_前文字ならび,['('|_括弧対応文字ならび],_後文字ならび) :- append(_前文字ならび,['('|R],_文字ならび),!, '文字ならびで()の対応を取る'(1,0,R,_括弧対応文字ならび,_後文字ならび),!. '文字ならびで()の対応を取る'(N,N,R,[],R) :- !. '文字ならびで()の対応を取る'(M,N,[')'|R1],[')'|R2],R) :- N_2 is N + 1, '文字ならびで()の対応を取る'(M,N_2,R1,R2,R). '文字ならびで()の対応を取る'(M,N,['('|R1],['('|R2],R) :- M_2 is M + 1, '文字ならびで()の対応を取る'(M_2,N,R1,R2,R). '文字ならびで()の対応を取る'(M,N,[A|R1],[A|R2],R) :- '文字ならびで()の対応を取る'(M,N,R1,R2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/505 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): #  キーボードから正負の整数をデタラメに入力し、整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ # 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数の和,_5つの正の整数の平均) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'([],_5つの正の整数ならび), 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均). 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび,_正の整数ならび) :- 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび),!. 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび). 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび) :- length(_正の整数ならび,5). 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数), '正の整数のみを配列に格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2), 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_2,_正の整数ならび). 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 行入力(_行), '診断 :: 整数'(_行,_整数),!. 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数). '診断 :: 整数'(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). '正の整数のみを配列に格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2) :- _整数 >= 0, append(_正の整数ならび_1,[_整数],_正の整数ならび_2). '正の整数のみを配列に格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_1) :- _整数 < 0. 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均) :- sum_list(_5つの正の整数ならび,_5つの正の整数の和), _5つの正の整数の平均 is floor((_5つの正の整数の和 / 5) * 10 + 0.5) / 10. 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/365 # お題:偶数の目が奇数の目より二倍でやすいイカサマさいころの実装と、 # それを実際に10万回ふって出た目の数を集計し出力するコード。 # # 出力例 # 1: 11103 # 2: 22287 # 3: 11114 # 4: 22170 # 5: 11089 # 6: 22237 # # 余力があれば、任意の目の数と出やすさに対応できるコードにしてください。 # # 偶数の目が奇数の目より二倍でやすいイカサマさいころ(_イカサマさいころの目) :- _乱数値 is random(9), nth0(_乱数値,[1,2,3,4,5,6,2,4,6],_イカサマさいころの目),!. 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際に10万回ふって出た目の数を集計し出力する :- 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し([],[],[],[],[],[],[],Ln,_1,_2,_3,_4,_5,_6), length(Ln,100000), 出力する(_1,_2,_3,_4,_5,_6). 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し(Ln,_1,_2,_3,_4,_5,_6,Ln,_1,_2,_3,_4,_5,_6). 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し(Ln_1,LL_1,Ln,LL) :- 偶数の目が奇数の目より二倍でやすいイカサマさいころ(_イカサマさいころの目), 出た目の数を集計し(_イカサマさいころの目,LL_1,LL_2), 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し([_|Ln_1],LL_2,Ln,LL). 出た目の数を集計し(_イカサマさいころの目,LL_1,LL_2) :- length([_|LL0],_イカサマさいころの目), append(LL0,[L|LL2],LL_1), append(LL0,[[_|L]|LL2],LL_2),!. 出力する(_1,_2,_3,_4,_5,_6) :- forall((nth1(_nth1,[_1,_2,_3,_4,_5,_6],L),length(L,_集計値)), writef('%t: %t\n',[_nth1,_集計値]). % 以下のサイトは # お題: 任意の数の自然数を与えた時、それらの自然数を四則演算した結果が、 # 期待した自然数になる式を全て列挙するコードを作成しなさい。 # ただし、式中の乗除算は加減算より先に計算するものとする。 # また数の並びは変更出来ず、括弧は使わないものとする。 # # 例: 1 5 3 6 : 10 # # 1 * 5 / 3 * 6 # 1 + 5 * 3 - 6 # # 1 5 3 6 7 : 10 # -> # 1 + 5 + 3 - 6 + 7 '任意の数の自然数を与えた時、それらの自然数を四則演算した結果が、 期待した自然数になる式を全て列挙するコードを作成しなさい。 ただし、式中の乗除算は加減算より先に計算するものとする。 また数の並びは変更出来ず、括弧は使わないものとする。'(_自然数ならび,_期待した自然数,_式) :- findall(X,( append(_,[_自然数|R],_自然数ならび), 自然数と変数を交互に(_自然数,R,X)), _自然数の間に変数が挿入されたならび), 変数に演算子を当て嵌める(_自然数の間に変数が挿入されたならび), 式を計算する(_自然数の間に変数が挿入されたならび,_期待した自然数,_式). 自然数と変数を交互に(_自然数,[],_自然数) :- !. 自然数と変数を交互に(_自然数,_,_自然数). 自然数と変数を交互に(_自然数,_,_). 変数に演算子を当て嵌める(_自然数の間に変数が挿入されたならび) :- 変数のみ取り出して(_自然数の間に変数が挿入されたならび,_変数ならび), 変数に演算子を当て嵌める(_変数ならび). 変数のみ取り出して(_自然数の間に変数が挿入されたならび,_変数ならび) :- findall(_変数,( member(_変数,_自然数の間に変数が挿入されたならび), var(_変数)), _変数ならび). 変数に演算子を当て嵌める([]). 変数に演算子を当て嵌める([_変数|R]) :- member(_演算子,[+,-,*,//]), 変数に演算子を当て嵌める(R). 式を計算する(_自然数の間に変数が挿入されたならび,_期待した自然数,_式) :- 一旦文字列に変換して(_自然数の間に変数が挿入されたならび,_式文字列), 文字列から式を生成する(_式文字列,_式), _期待した自然数 is _式,!. 一旦文字列に変換して(_自然数の間に変数が挿入されたならび,_式文字列) :- atomic_list_concat(_自然数の間に変数が挿入されたならび,_式文字列). 文字列から式を生成する(_式文字列,_式) :- read_term_from_atom(_式文字列,_式,[]). % 以下のサイトは 加算の覆面演算行列([S,E,N,D,M,O,R,E,M,O,N,E,Y],[[0,S,E,N,D],[0,M,O,R,E],[M,O,N,E,Y]]). 加算の覆面算(_覆面ならび) :- 覆面に数字を当てはめる(_覆面ならび,[1,2,3,4,5,6,7,8,9,0]), 転置した覆面演算を反転したもの(_覆面ならび,LL), 加算(0,LL). 加算(_,[]). 加算(O,[L|R]) :- append(L0,[S],L2), list_sum(L0,S0), S is S0 mod 10, S2 is S0 // 10, 加算(S2,R). 覆面に数字を当てはめる([],_). 覆面に数字を当てはめる([_変数|R1],_数字ならび) :- 変数の場合は数字ならびから一つ数字を選択する(_変数,R1,_数字ならび). 覆面に数字を当てはめる([A|R1],_数字ならび) :- 既に定数の場合は読み飛ばす(A,R1,_数字ならび). 変数の場合は数字ならびから一つ数字を選択する(_変数,R1,_数字ならび,_残り数字ならび) :- var(_変数), select(_変数,_数字ならび,_残り数字ならび), 覆面に数字を当てはめる(R1,_残り数字ならび). 既に定数の場合は読み飛ばす(A,R1,_数字ならび) :- \+(var(A)), 覆面に数字を当てはめる(R1,_数字ならび). 転置した覆面演算を反転したもの(_覆面ならび,LL) :- 加算の覆面演算行列(_覆面ならび,LL1), 転置(LL1,LL2), reverse(LL2,LL). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/159 # # お題:値が奇数のデータだけ昇順にソートする。 # 例 # 37,61,86,9,81,50 -> 9,37,86,61,81,50 'お題:値が奇数のデータだけ昇順にソートする。 例 37,61,86,9,81,50 -> 9,37,86,61,81,50'(_値ならび,_奇数のデータだけ昇順にソートされた値ならび) :- 奇数のデータだけソートする(_値ならび,_昇順にソートされた奇数データならび), 奇数のデータだけ昇順に入れ替える(_値ならび,_昇順にソートされた奇数データならび,_奇数のデータだけ昇順にソートされた値ならび). 奇数のデータだけソートする(_値ならび,_昇順にソートされた奇数データならび) :- 奇数のデータだけ(_値ならび,_奇数のデータならび), ソートする(_奇数のデータならび,_昇順にソートされた奇数データならび). 奇数のデータだけ(_値ならび,_奇数のデータならび) :- findall(_値,( member(_値,_値ならび), 奇数(_値)), _奇数のデータならび). 奇数のデータだけ昇順に入れ替える([],_,[]). 奇数のデータだけ昇順に入れ替える([N1|R1],[N2|R2],[N2|R3]) :- 奇数(N1), 奇数のデータだけ昇順に入れ替える(R1,R2,R3). 奇数のデータだけ昇順に入れ替える([N1|R1],R2,[N1|R3]) :- 偶数(N1), 奇数のデータだけ昇順に入れ替える(R1,R2,R3). 奇数(N) :- 1 is N mod 2. 偶数(N) :- 0 is N mod 2. ソートする([],[]). ソートする([_軸要素|R1],L2) :- 分割(_軸要素,R1,L1_1,L1_2), ソートする(L1_1,L2_1), ソートする(L1_2,L2_2), append(L2_1,[_軸要素|L2_2],L2). 分割(_軸要素,[],[],[]). 分割(_軸要素,[N|R1],[N|R2],R3) :- N @=< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[N|R1],R2,[N|R3]) :- N @> _軸要素, 分割(_軸要素,R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/309 # # C500問って本にあった # # * # ** # *** # **** # ***** # ****** # ******* # ******** # ********* # ********** # ってのもいい問題かと 'C500問って本にあった * ** *** **** ***** ****** ******* ******** ********* ********** ってのもいい問題かと' :- atom_chars('**********',L), forall(append([H|R],_,L),(atomic_list_concat([H|R],S),writef('%t\n',[S])). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/68 # # お題:文字列をランダムに並べ替える。 # ただし、どの文字も元と同じ位置ではないこと。 '文字列をランダムに並べ替える。 ただし、どの文字も元と同じ位置ではないこと。'(_文字列,_ランダムに並べ替えた文字列) :- 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび), 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列). 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび) :- atom_length(_文字列,_文字列の長さ), length(_位置決めならび,_文字列の長さ), findall(N,between(1,_文字列の長さ,N),_整数順ならび), 位置を置換する(_整数順ならび,_文字列の置換位置ならび). 位置を置換する([],_位置決めならび) :- !. 位置を置換する([_位置1,_位置2,_位置3],_位置決めならび) :- 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび). 位置決めならび(L,_位置決めならび) :- 位置の交換(L,R,_位置決めならび), 位置を置換する(R,_位置決めならび). 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび) :- nth1(_位置1,_位置決めならび,_位置2), nth1(_位置2,_位置決めならび,_位置3), nth1(_位置3,_位置決めならび,_位置1),!. 位置の交換(L,L2,_位置決めならび) :- 位置選択(L,N1,L1), 位置選択(N2,L1,L2), nth1(N1,_位置決めならび,N2), nth1(N2,_位置決めならび,N1),!. 位置選択(L,_位置,L2) :- length(L,Len), _乱数値 is random(Len), length(L0,Len), append(L0,[_位置|R],L), append(L0,R,L2),!. 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列) :- findall(_文字,( member(_位置,_文字列の置換位置ならび), _位置_1 is _位置 - 1, sub_atom(_文字列,_位置_1,1,_,_文字)), _ランダムに並べ替えた文字ならび), atomic_list_concat(_ランダムに並べ替えた文字ならび,_ランダムに並べ替えた文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 166代目 #290 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): 100000 # 110000 # 111000 # 111100 # 111110 # 111111 # とこのように表示させるプログラム。 # '100000 110000 111000 111100 111110 111111 とこのように表示させるプログラム。' :- length(L,6), forall(先頭文字だけは1固定で行を1と0のならびで分離する(L),表示させる(L)). 先頭文字だけは1固定で行を1と0のならびで分離する(L) :- append(['1'|L1],L2,L), all(L1,'1'), all(L2,'0'). 表示させる(L) :- atomic_list_concat(L,A), writef('%t\n',[A]). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/53 # # # お題:nの階乗の末尾の連続した0の個数を求める。 # :- dynamic(階乗保存計算/2). 'nの階乗の末尾の連続した0の個数を求める。'(_n,_末尾の連続した0の個数) :- 階乗保存計算(_n,_nの階乗), 末尾の連続した0の個数(_nの階乗,_末尾の連続した0の個数). 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). 末尾の連続した0の個数(_nの階乗,_末尾の連続した0の個数) :- atom_chars(_nの階乗,L), append(_,L1,L), all(L1,'0'), length(L1,_末尾の連続した0の個数). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/861 # # # お題:たとえば整数20010307なら21370000のように0を右側に寄せ集めた整数を返す # 'たとえば整数20010307なら21370000のように0を右側に寄せ集めた整数を返す'(_整数,_0を右側に寄せ集めた整数) :- number_chars(_整数,_整数文字ならび), '0を右側に寄せ集めた'(_整数文字ならび,_0以外の文字ならび,_0の文字ならび), 整数を返す(_0以外の文字ならび,_0の文字ならび,_0を右側に寄せ集めた整数). '0を右側に寄せ集めた'(_整数文字ならび,_0以外の文字ならび,_0の文字ならび) :- findall('0',member('0',_整数文字ならび),_0の文字ならび), findall(_整数文字,( member(_整数文字,_整数文字ならび), \+(_整数文字='0')), _0以外の文字ならび). 整数を返す(_0以外のならび,_0のならび,_0を右側に寄せ集めた整数) :- append(_0以外のならび,_0のならび,_0を右側に寄せ集めたならび), number_chars(_0を右側に寄せ集めた整数,_0を右側に寄せ集めたならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/861 # # # お題:たとえば整数20010307なら21370000のように0を右側に寄せ集めた整数を返す # 'たとえば整数20010307なら21370000のように0を右側に寄せ集めた整数を返す'(_整数,_0を右側に寄せ集めた整数) :- number_chars(_整数,_整数文字ならび), '0を右側に寄せ集めた整数を返す'(_整数文字ならび,_0を右側に寄せ集めた整数). '0を右側に寄せ集めた整数を返す'(_整数文字ならび,_0を右側に寄せ集めた整数) :- '0を右側に寄せ集めた'(_整数文字ならび,_0以外のならび,_0のならび), 整数を返す(_0以外のならび,_0のならび,_0を右側に寄せ集めた整数). '0を右側に寄せ集めた'([],[],[]) :- !. '0を右側に寄せ集めた'(['0'|R],L1,['0'|R3]) :- '0を右側に寄せ集めた'(R,L1,R3). '0を右側に寄せ集めた'([A|R],[A|R2],L3) :- '0を右側に寄せ集めた'(R,R2,L3). 整数を返す(_0以外のならび,_0のならび,_0を右側に寄せ集めた整数) :- append(_0以外のならび,_0のならび,_0を右側に寄せ集めたならび), number_chars(_0を右側に寄せ集めた整数,_0を右側に寄せ集めたならび). % 以下のサイトは # お題: # 入力 # AND # # 出力 # DDDDD # DNNND # DNAND # DNNND # DDDDD # 囲み(_入力) :- atom_chars(_入力,[_中心の文字|_囲み文字ならび]), 囲み(_囲み文字ならび,[[_中心の文字]],_囲み), 出力(_囲み). 囲み([],_囲み,_囲み) :- !. 囲み([_文字|R],_囲み_1,_囲み) :- 文字で囲む(_文字,_囲み_1,_囲み_2), 囲み(R,_囲み_2,_囲み). 文字で囲む(_文字,_囲み_1,_囲み_2) :- 囲みの先頭と末尾に_文字の行を付加する(_文字,_囲み_1,_先頭と末尾に_文字の行を付加された囲み_1), 囲みの各行の先頭と末尾に_文字を付加する(_文字,_先頭と末尾に_文字の行を付加された囲み_1,_囲み_2). 囲みの先頭と末尾に_文字の行を付加する(_文字,_囲み,_先頭と末尾に_文字の行を付加された囲み_1) :- 転置(_囲み_1,_転置された囲み_1), 行の先頭と末尾に文字を付加する(_文字,_転置された囲み_1,_行の先頭と末尾に_文字を付加された転置された囲み_1), 転置(_行の先頭と末尾に文字を付加された転置された囲み_1,_先頭と末尾に_文字の行を付加された囲み_1). 囲みの各行の先頭と末尾に_文字を付加する(_文字,_囲み,_行の先頭と末尾に_文字を付加された囲み) :- findall(_先頭と末尾に_文字を付加された行,( member(_行,_囲み), append([_文字|_行],[_文字],_先頭と末尾に_文字を付加された行)), _行の先頭と末尾に_文字を付加された囲み). 出力(_囲み) :- forall(member(_行,_囲み),(atomic_list_concat(_行,_行文字列),writef('%t\n',[_行文字列])). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは '「たけしさんの前に9人、後ろに4人います。みんなで何人?」'(_何人) :- 'たけしさんの前に9人、後ろに4人います。'(_たけしさんの前に9人,_後ろに4人), 'みんなで何人?'(_たけしさんの前に9人,_後ろに4人,_何人). 'たけしさんの前に9人、後ろに4人います。'(_たけしさんの前に9人,_後ろに4人) :- 'たけしさんの前に9人、'(_たけしさんの前に9人), '後ろに4人います。'(_後ろに4人). 'たけしさんの前に9人、'(_たけしさんの前に9人) :- append(_前に9人,[_たけしさん],_たけしさんの前に9人), 前に9人(_前に9人). 前に9人(_前に9人) :- length(_前に9人,9). '後ろに4人います。'(_後ろに4人) :- length(_後ろに4人,4). 'みんなで何人?'(_たけしさんの前に9人,_後ろに4人,_何人) :- みんなで(_たけしさんの前に9人,_後ろに4人,_みんなで), '何人?'(_みんなで,_何人). みんなで(_たけしさんの前に9人,_後ろに4人,_みんなで) :- append(_たけしさんの前に9人,_後ろに4人,_みんなで). '何人?'(_みんなで,_何人) :- length(_みんなで,_何人). % 以下のサイトは '「たけしさんの前に9人、後ろに4人います。みんなで何人?」'(_何人) :- 'たけしさんの前に9人、後ろに4人います。'(_前に9人,_たけしさんの後ろに4人), 'みんなで何人?'(_前に9人,_たけしさんの後ろに4人,_何人). 'たけしさんの前に9人、後ろに4人います。'(_前に9人,_たけしさんの後ろに4人) :- 'たけしさんの前に9人、'(_前に9人), '後ろに4人います。'(_たけしさん,_たけしさんの後ろに4人). 'たけしさんの前に9人、'(_前に9人) :- length(_前に9人,9). 'たけしさんの後ろに4人います。'(_たけしさん,_たけしさんの後ろに4人) :- length(_後ろに4人,4), _たけしさんの後ろに4人 = [_たけしさん|_後ろに4人]. 'みんなで何人?'(_前に9人,_たけしさんの後ろに4人,_何人) :- みんなで(_前に9人,_たけしさんの後ろに4人,_みんなで), '何人?'(_みんなで,_何人). みんなで(_前に9人,_たけしさんの後ろに4人,_みんなで) :- append(_前に9人,_たけしさんの後ろに4人,_みんなで). '何人?'(_みんなで,_何人) :- length(_みんなで,_何人). % 以下のサイトは # # 「たけしさんの前に9人、後ろに4人います。みんなで何人?」 # '「たけしさんの前に9人、後ろに4人います。みんなで何人?」'(_何人) :- 'たけしさんの前に9人、後ろに4人います。'(_前に,たけしさん,_後ろに), 'みんなで何人?'(_前に,たけしさん,_後ろに,_何人). 'たけしさんの前に9人、後ろに4人います。'(_前に,たけしさん,_後ろに) :- 'たけしさんの前に9人、'(_前に), '後ろに4人います。'(_後ろに). 'たけしさんの前に9人、'(_前に) :- length(_前に,9). '後ろに4人います。'(_後ろに) :- length(_後ろに,4). 'みんなで何人?'(_前に,たけしさん,_後ろに,_何人) :- みんなで(_前に,たけしさん,_後ろに,_みんなで), '何人?'(_みんなで,_何人). みんなで(_前に,_たけしさん,_後ろに,_みんなで) :- append(_前に,[_たけしさん|_後ろに],_みんなで). '何人?'(_みんなで,_何人) :- length(_みんなで,_何人). % 以下のサイトは '「たけしさんの前に9人、後ろに4人います。みんなで何人?」'(_何人) :- append(_前に,[_たけしさん|_後ろに],_みんなで), length(_前に,9), length(_後ろに,4), length(_みんなで,_何人). % 以下のサイトは # お題:値が整数のn個の数列がある。隣同士の項の和の数列をつくる。 # この操作を繰り返して項が1個になったらその値を返す。 # 例 # 31,41,59,2 -> 333 # 31,41,59,2 # →(31+41),(41+59),(59+2) # →(31+41+41+59),(41+59+59+2) # →(31+41+41+59+41+59+59+2) # 三角数と初めの数列の長さに関係してる。数学問題だな '値が整数のn個の数列がある。隣同士の項の和の数列をつくる。この操作を繰り返して項が1個になったらその値を返す。'([_1個になったらその値],_1個になったらその値) :- !. '値が整数のn個の数列がある。隣同士の項の和の数列をつくる。この操作を繰り返して項が1個になったらその値を返す。'(_値が整数の数列,_1個になったらその値) :- \+(_値が整数の数列 = []), findall(_隣同士の項の和,( append(_,[_項_1,_項_2|_],_値が整数の数列), _隣同士の項の和 is _項_1 + _項_2), _隣同士の項の和の数列), '値が整数のn個の数列がある。隣同士の項の和の数列をつくる。この操作を繰り返して項が1個になったらその値を返す。'(_隣同士の項の和の数列,_1個になったらその値). % 以下のサイトは # 出典:: 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). % % 以下のサイトは % % カレンダーの形式(何曜日から始まるか)と % 月日数と1日の曜日が分かっている時 % カレンダーをならびに得る。 % 第一週と最終週を変数で補正した曜日起点月カレンダー補正(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー_1), 第一週と最終週を変数で補正した(_カレンダー_1,_カレンダー). 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- findall(N,between(1,_月日数,N),_日ならび), 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号), 曜日番号からカレンダーを作成する(_起点曜日番号,_日ならび,_カレンダー). 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号) :- 曜日番号(_曜日番号_1,_起点曜日形式), 曜日番号(_曜日番号,_1日の曜日), _起点曜日番号 is (7 - (_曜日番号 - _曜日番号_1)) mod 7. 曜日番号からカレンダーを作成する(0,_日ならび,_カレンダー) :- 'N個組'(7,_日ならび,_カレンダー),!. 曜日番号からカレンダーを作成する(_曜日番号,_日ならび,[L0|LL]) :- length(L0,_曜日番号), append(L0,L1,_日ならび), 'N個組'(7,L1,LL). 曜日番号(0,日曜) :- !. 曜日番号(1,月曜) :- !. 曜日番号(2,火曜) :- !. 曜日番号(3,水曜) :- !. 曜日番号(4,木曜) :- !. 曜日番号(5,金曜) :- !. 曜日番号(6,土曜) :- !. 'N個組'(_,[],[]) :- !. 'N個組'(N,L,[U|R]) :- 先頭からN個(N,L,U,R1), 'N個組'(N,R1,R). 先頭からN個(_,[],[],[]) :- !. 先頭からN個(0,L,[],L) :- !. 先頭からN個(N,[A|R1],[A|R2],R) :- M is N - 1, 先頭からN個(M,R1,R2,R). 第一週と最終週を変数で補正した([L|LL1],[[_1,_2,_3,_4,_5,_6,_7]|LL2]) :- 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]), 最終週を変数で補正(LL1,LL2). 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]) :- append(_,L,[_1,_2,_3,_4,_5,_6,_7]). 最終週を変数で補正(LL1,LL2) :- append(LL1_1,[L_2],LL1), append(L_2,_,[_11,_12,_13,_14,_15,_16,_17]), append(LL1_1,[[_11,_12,_13,_14,_15,_16,_17]],LL2),!. 変数だけ値を詰める([],_). 変数だけ値を詰める([V|R],V) :- 変数だけ値を詰める(R,V),!. 変数だけ値を詰める([_|R],V) :- 変数だけ値を詰める(R,V). 変数だけ要素位置番号を詰める([],_). 変数だけ要素位置番号を詰める([N|R],N) :- N_2 is N + 1, 変数だけ要素位置番号を詰める(R,N_2),!. 変数だけ要素位置番号を詰める([_|R],N) :- N_2 is N + 1, 変数だけ要素位置番号を詰める(R,N_2). % 以下のサイトは # いろいろな環境の中には、先読みの否定である (?! ) が # 使えない環境があります。 このような環境では、 # 「ABC」 という文字列を含まない # というような、文字列の否定をする正規表現を作るのは # とても難しい作業になります # ※ (?! ) が使える環境での作り方は こちら 。 # # では、例として、 # 以下のようなテキストにマッチする正規表現を考えてみましょう★ # ・ テキストの先頭が AA から始まる # ・ テキストの末尾が AA で終わる # ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない # '・ テキストの先頭が AA から始まる ・ テキストの末尾が AA で終わる ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト) :- sub_atom(_テキスト,'AA',S2,'AA',_,_,_), \+(sub_atom(S2,_,_,_,'AA')). %%%%%%%% sub_atom/7 %%%%%%%% sub_atom(A,H,X,T,HL,XL,TL) :- atom(A), atom_chars(A,Chars), append(HL,XL,TL,Chars), 'HL_XL_TL_H_X_T'(HL,XL,TL,H,X,T). 'HL_XL_TL_H_X_T'(HL,XL,TL,H,X,T) :- \+(XL=[]), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). %%%%%%%% append/4 %%%%%%%% append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # いろいろな環境の中には、先読みの否定である (?! ) が # 使えない環境があります。 このような環境では、 # 「ABC」 という文字列を含まない # というような、文字列の否定をする正規表現を作るのは # とても難しい作業になります # ※ (?! ) が使える環境での作り方は こちら 。 # # では、例として、 # 以下のようなテキストにマッチする正規表現を考えてみましょう★ # ・ テキストの先頭が AA から始まる # ・ テキストの末尾が AA で終わる # ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない # '・ テキストの先頭が AA から始まる ・ テキストの末尾が AA で終わる ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト) :- sub_atom(_テキスト,_,_,_,'AA',S2,'AA',_,_,_), \+(sub_atom(S2,_,_,_,'AA')). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% sub_atom(A,S,Len,R,H,X,T,HL,XL,TL) :- atomic(X), atom_chars(A,L), atom_chars(X,XL), subatom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,Len,R,H,X,T,HL,XL,TL) :- var(X), atom_chars(A,L), subatom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), \+(XL = []), atom_chars(T,TL). sub_atom_2(L,S,Len,R,L1,XL,L2) :- append(L1,XL,L2,L), length_cut(L1,S), length_cut(L2,R), length_cut(XL,Len). length_cut(L,Len) :- length(L,Len),!. % 以下のサイトは # @tsukada816: # Prologの実験中。appendとmemberを教えて、 # リストから指定した要素を取り除くdeleteを作れと問題を出した。 # 'Prologの実験中。appendとmemberを教えて、リストから指定した要素を取り除くdeleteを作れと問題を出した。'(_リスト,_取り除く要素リスト,_指定した要素を取り除いたリスト) :- delete(_リスト,_取り除く要素リスト,_指定した要素を取り除いたリスト). delete([],_取り除く要素リスト,[]). delete([_取り除く要素|_残りリスト],_取り除く要素リスト,_指定した要素を取り除いたリスト) :- member(_取り除く要素,_取り除く要素リスト), delete(_残りリスト,_取り除く要素リスト,_指定した要素を取り除いたリスト),!. delete([_要素|_残りリスト],_取り除く要素リスト,[_要素|_指定した要素を取り除いたリスト]) :- delete(_残りリスト,_取り除く要素リスト,_指定した要素を取り除いたリスト). % 以下のサイトは # @tsukada816: # Prologの実験中。appendとmemberを教えて、 # リストから指定した要素を取り除くdeleteを作れと問題を出した。 # 'Prologの実験中。appendとmemberを教えて、リストから指定した要素を取り除くdeleteを作れと問題を出した。'(_リスト,_取り除く要素,_指定した要素を取り除いたリスト) :- delete(_リスト,_取り除く要素,_指定した要素を取り除いたリスト). delete(_リスト,_取り除く要素,_指定した要素を取り除いたリスト) :- append(_前方リスト,[_取り除く要素|_後方リスト],_リスト), append(_前方リスト,_後方リスト,_指定した要素を取り除いたリスト). % 以下のサイトは # @tsukada816: # Prologの実験中。appendとmemberを教えて、 # リストから指定した要素を取り除くdeleteを作れと問題を出した。 # 'Prologの実験中。appendとmemberを教えて、リストから指定した要素を取り除くdeleteを作れと問題を出した。'(_リスト,_取り除く要素,_指定した要素を取り除いたリスト) :- delete(_リスト,_取り除く要素,_指定した要素を取り除いたリスト). delete(_リスト,_取り除く要素,_指定した要素を取り除いたリスト) :- append(_前方リスト,[_取り除く要素|_後方リスト],_リスト), delete(_後方リスト,_取り除く要素,_指定した要素を取り除いた後方リスト), append(_前方リスト,_指定した要素を取り除いた後方リスト,_指定した要素を取り除いたリスト),!. delete(_リスト,_,_リスト). % 以下のサイトは 行列から行を取り出す(_行列,_行) :- 行列から行を取り出す(_行列,_,_行). 行列から行を取り出す(_行列,_行目,_行) :- nth1(_行目,_行列,_行). 行列から列を取り出す(_行列,_列) :- 行列から列を取り出す(_行列,_nth1,_列). 行列から列を取り出す(_行列,_列目,_列) :- 転置(_行列,_転置された行列), nth1(_列目,_転置された行列,_列). 行列の位置要素を取り出す(_行列,_行目,_列目,_要素) :- nth1(_行目,_行列,_行), nth1(_列目,_行,_要素). 行列の要素を置換する(_行列,_置換対象値,_置換値,_置換された行列) :- findall(_置換された行,( member(_行,_行列), 行を全置換する(_行,_置換対象値,_置換値,_置換された行)), _置換された行列). 行を全置換する([],_,_,[]). 行を全置換する([A|R1],A,B,[B|R4]) :- 行を全置換する(R1,A,B,R4),!. 行を全置換する([C|R1],A,B,[C|R4]) :- 行を全置換する(R1,A,B,R4). 行列の位置要素を置換する(_行列,_行目,_列目,_値,_置換された行列) :- 行を取り出す(_行列,_行目,_それまでの行ならび,_行,_それより後の行ならび), 行の列要素を置換する(_行,_列目,_値,_置換された行),!, append(_それまでの行ならび,[_置換された行|_それより後の行ならび],_置換された行列). 行を取り出す(_行列,_行目,_それまでの行ならび,_行,_それより後の行ならび) :- _行目_1 is _行目 - 1, length(_それまでの行ならび,_行目_1), append(_それまでの行ならび,[_行|_それより後の行ならび],_行列). 行の列要素を置換する(_行,_列目,_値,_置換された行) :- _列目_1 is _列目 - 1, length(L0,_列目_1), append(L0,[_|R],_行), append(L0,[_値|R],_置換された行). 行列の行を入れ替える(_行列,_行目_1,_行目_2,_入れ替えた行列) :- _行目_1 > _行目_2, 行列の行を入れ替える(_行列,_行目_2,_行目_1,_入れ替えた行列). 行列の行を入れ替える(_行列,_行目_1,_行目_2,_入れ替えた行列) :- _行目_1 < _行目_2, 行列の行を取り出す(_行列,_行目_2,_前ならび_2,_行_2,_後ろならび_2), 行列の行を取り出す(_前ならび_2,_行目_1,_前ならび_1,_行_1,_後ろならび_1), append(_前ならび_1,[_行_2|_後ろならび_1],_前ならび_2_2), append(_前ならび_2_2,[_行_1|_後ろならび_2],_入れ替えた行列). 行列の行を取り出す(_行列,_行目_2,_前ならび_2,_行_2,_後ろならび_2) :- _行目_2_1 is _行目_2 - 1, length(_前ならび_2,_行目_2_1), append(_前ならび_2,[_行_2|_後ろならび_2],_行列). 行列の行を取り出す(_前ならび_2,_行目_1,_前ならび_1,_行_1,_後ろならび_1) :- _行目_1_1 is _行目_1 - 1, length(_前ならび_1,_行目_1_1), append(_前ならび_1,[_行_1|_後ろならび_1],_前ならび_2). 行列の列を入れ替える(_行列,_列目_1,_列目_2,_入れ替えた行列) :- 転置(_行列,_転置された行列), 行列の行を入れ替える(_転置された行列,_列目_1,_列目_2,_入れ替えた転置された行列), 転置(_入れ替えた転置された行列,_入れ替えた行列). 行全体をn倍する(_行列,_行目,_n倍,_行がn倍された行列) :- _行目_1 is _行目 - 1, length(L0,_行目_1), append(L0,[_行|R],_行列), 行要素全てをn倍する(_行,_n倍,_全ての要素がn倍された行), append(L0,[_全ての要素がn倍された行|R],_行がn倍された行列). 行要素全てをn倍する([],_,[]) :- !. 行要素全てをn倍する([A|R1],_n倍,[B|R2]) :- B is A * _n倍, 行要素全てをn倍する(R1,_n倍,R2). 列全体をn倍する(_行列,_列目,_n倍,_列がn倍された行列) :- 転置(_行列,_転置された行列), 行全体をn倍する(_転置された行列,_列目,_n倍,_行がn倍された転置された行列), 転置(_行がn倍された転置された行列,_列がn倍された行列). 二つの行のある列要素がそれぞれの最小公倍数になるように二つの行を倍する(_行列,_行目_1,_行目_2,_列目,_変形した行列) :- 行列の位置要素を取り出す(_行列,_行目_1,_列目,_要素_1), 行列の位置要素を取り出す(_行列,_行目_2,_列目,_要素_2), 最小公倍数を取る(_要素_1,_要素_2,_最小公倍数), _行目_1の倍数 is _最小公倍数 // _要素_1, _行目_2の倍数 is _最小公倍数 // _要素_2, 行全体をn倍する(_行列,_行目_1,_行目_1の倍数,_行列_2), 行全体をn倍する(_行列,_行目_2,_行目_2の倍数,_変形した行列). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/528 # # ●Regular Expressionの使用環境 # サクラエディタ # # ●検索か置換か? # 置換 # # ●説明 # 1行の中に同じ単語が2連続しているのを1つだけにしたいです。 # # ●対象データ # appleapple # orangeorange # grapegrape # # ●希望する結果 # apple # orange # grape # # よろしくお願いします。 # # '1行の中に同じ単語が2連続しているのを1つだけにしたいです。'(_文字列,_短縮した文字列) :- findmax([Len,S],( sub_atom(_文字列,_,Len,_,S1,_,S3,_,L2,_), append(L,L,L2), atom_chars(S4,L), atomic_list_concat([S1,S4,S3],S)), [_,_短縮した文字列]). % 以下のサイトは nth1(_nth1,L,A) :- nth1([_],_nth1,L,A). nth1(Ln,_nth1,[A|_],A) :- length(Ln,_nth1). nth1(Ln,_nth1,[_|R],A) :- integer(_nth1), length(L2,_nth1), append(Ln,_,L2), nth1([_|Ln],_nth1,R,A). nth1(Ln,_nth1,[_|R],A) :- var(_nth1), nth1([_|Ln],_nth1,R,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). % 以下のサイトは # 関数のソースコード or バイトコードを取得して # 実行時に書き換えられるかどうか # % コードの実行時書き換えはどのような場合に可能か? % % 下の例は簡単に可能。 :- dynamic(ならびの要素を削除する/2). 実行時のコードの書き換え(P,Q) :- retract(P), assertz(Q). ならびの要素を削除する(_ならび,_削除されたならび) :- append(L0,[_|R],_ならび), length(L0,0), append(L0,R,_削除されたならび). テストコード(_ならび,_削除されたならび) :- テストコード(1,_ならび,_削除されたならび). テストコード(5,_ならび,_削除されたならび) :- !,fail. テストコード(_,_ならび,_削除されたならび) :- ならびの要素を削除する(_ならび,_削除されたならび). テストコード(N,_ならび,_削除されたならび) :- 実行時のコードの書き換え((ならびの要素を削除する(_ならび_2,_削除されたならび_2) :- append(L0,[_|R],_ならび_2), length(L0,_), append(L0,R,_削除されたならび_2)), (ならびの要素を削除する(_ならび_2,_削除されたならび_2) :- append(L0,[_|R],_ならび_2), length(L0,N), append(L0,R,_削除されたならび_2))), N_2 is N + 1, テストコード(N_2,_ならび,_削除されたならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1377511459/294 # # 縦横6マスのボックスがあります。 # 全てのマスを○×で埋めます。 # ○と×はそれぞれ連続2個まで繋がっててOK。 # 縦横の各列は○と×の数は同じにならなければいけない。 # ○と×の並び方が他の列と重複するのはNG。(縦と横を比較して同じなのはOK。縦と縦、横と横が同じ並びって言うのがNG) # これはどうやって解けばいいのか教えてください。 # # '縦横6マスのボックスがあります。 全てのマスを○×で埋めます。 ○と×はそれぞれ連続2個まで繋がっててOK。 縦横の各列は○と×の数は同じにならなければいけない。 ○と×の並び方が他の列と重複するのはNG。(縦と横を比較して同じなのはOK。縦と縦、横と横が同じ並びって言うのがNG) これはどうやって解けばいいのか教えてください。'(LL) :- 行候補ならびを得る(_行候補ならび), 面を規定する(LL), 転置(LL,_転置されたLL), 面候補を得る(_行候補ならび,LL), 転置診断(_転置されたLL,_行候補ならび). 行候補ならびを得る(_行候補ならび) :- findall(L,( 順列([○,○,○,×,×,×],6,L), \+(append(_,[A,A,A|_],L))), _重複があり得る行候補ならび), sort(_重複があり得る行候補ならび,_行候補ならび). 面を規定する(LL) :- length(LL,6), findall(L,( member(L,LL), length(L,6)), LL). 面候補を得る(_行候補ならび,[L1,L2,L3,L4,L5,L6]) :- member(L1,_行候補ならび), member(L2,_行候補ならび), member(L3,_行候補ならび), member(L4,_行候補ならび), member(L5,_行候補ならび), member(L6,_行候補ならび), sort([L1,L2,L3,L4,L5,L6],[_,_,_,_,_,_]). 転置診断(_転置されたLL,_行候補ならび) :- sort(_転置されたLL,[_,_,_,_,_,_]), findall(_,( member(L,_転置されたLL), member(L,_行候補ならび), \+(append(_,[A,A,A|_],L))), [_,_,_,_,_,_]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(A,Y,Z), M is N - 1, 順列(Z,M,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数ならび'(_81以下の自然数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'([_],[_],_81以下の自然数ならび,_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'([_,_,_,_,_,_,_,_,_],[_,_,_,_,_,_,_,_,_,_],_81以下の自然数で九九に現れない数ならび,_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_,_,_,_,_,_,_,_,_,_],L1,L) :- '81以下の自然数で九九に現れない数を昇順にすべて'([_|Ln1],[_],L1,L). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,Ln2,L1,L) :- 九九に現れる数を削除(Ln1,Ln2,L1,L2), '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_|Ln2],L2,L). 九九に現れる数を削除(Ln1,Ln2,L1,L2) :- ならび掛け算(Ln1,Ln2,Ln3), length(Ln3,_九九に現れる数), 数をL1から削除してL2とする(_九九に現れる数,L1,L2),!. 九九に現れる数を削除(_,_,L,L). ならび掛け算(_,[],[]). ならび掛け算(L1,[B|R2],L) :- ならび掛け算(L1,R2,L2), append(L1,L2,L). 数をL1から削除してL2とする(_数,L1,L2) :- append(L0,[_数|R],L1), append(L0,R,L2). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数ならび'(_81以下の自然数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'([_],[_],_81以下の自然数ならび,_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'([_,_,_,_,_,_,_,_,_],[_,_,_,_,_,_,_,_,_,_],_81以下の自然数で九九に現れない数ならび,_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_,_,_,_,_,_,_,_,_,_],L1,L) :- '81以下の自然数で九九に現れない数を昇順にすべて'([_|Ln1],[_],L1,L). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,Ln2,L1,L) :- 九九に現れる数を削除(Ln1,Ln2,L1,L2), '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_|Ln2],L2,L). 九九に現れる数を削除(Ln1,Ln2,L1,L2) :- ならびの要素数表現を数表現に変換(Ln1,Ln2,_数_1,_数_2), _九九に現れる数 is _数_1 * _数_2, 数をL1から削除してL2とする(_九九に現れる数,L1,L2),!. 九九に現れる数を削除(_,_,L,L). ならびの要素数表現を数表現に変換(Ln1,Ln2,_数_1,_数_2) :- length(Ln1,_数_1), length(Ln2,_数_2). 数をL1から削除してL2とする(_数,L1,L2) :- append(L0,[_数|R],L1), append(L0,R,L2). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- findall(N,between(1,81,N),L_1), '81以下の自然数で九九に現れない数を昇順ですべて'(1,1,L_1,L_2), '表示せよ。'(L_2). '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1,_,L,L) :- _n_1 > 9,!. '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1,_n_2,L_1,L) :- _n_2 > 9, _n_1_2 is _n_1 + 1, '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1_2,1,L_1,L). '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1,_n_2,L_1,L_2) :- _n_3 is _n_1 * _n_2, 空白に置換(_n_3,L_1,L_2), _n_2_2 is _n_2 + 1, '81以下の自然数で九九に現れない数を'(_n_1,_n_2_2,L_3,L). 空白に置換(N,L_1,L_2) :- append(L0,[N|R],L_1), append(L0,[' '|R],L_2). 表示せよ(L) :- atomic_list_concat(L,_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは 重複要素を削る(_ならび,_重複要素を削ったならび) :- findall(_要素,( append(L0,[_要素|R],_ならび), \+(member(_要素,L0))), _重複要素を削ったならび). 重複要素を削って表示する(_ならび) :- forall(( append(L0,[要素|_],_ならび), \+(member(要素,L0))), writef('%t ',[_要素])). % 以下のサイトは 全順列(L,LL) :- length(L,Len), ダミー要素を付加する(Len,L,L_2), findall(L_4,( 順列(L_2,3,L_3), findall(A,(member(A,L_3),\+(var(A))),L_4)), LL_1), sort(LL_1,LL). 全組合せ(L,LL) :- length(L,Len), ダミー要素を付加する(Len,L,L_2), findall(L_4,( 組合せ(L_2,3,L_3), findall(A,(member(A,L_3),\+(var(A))),L_4)), LL_1), sort(LL_1,LL). ダミー要素を付加する(Len,L_1,L_2) :- length(L_v,Len), append(L_1,L_v,L_2),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/782 # # 読み込むiniファイルのセクション名を、string配列にpushし続けて、 # セクション名すべてpushしたらループから外れるって仕組みなんですけど、tmp = strtok_s()の代入がうまくいきません # どうしたらいいですか # # char SectionNames[1024]; # GetPrivateProfileSectionNames(SectionNames,1024,FilePath.c_str()); # # char *WTF;//謎の内部パラメータ,strtok_sの仕様 # vector<string> SquadNameList; # SquadNameList.push_back(strtok_s( SectionNames, "0" ,&WTF)); # # for(int i=0; i < SquadNameList.size();i++){ # char tmp[256]; # tmp = strtok_s( NULL, "0" ,&WTF); # if( tmp != NULL){ # SquadNameList.push_back(tmp); # } # } # # '読み込むiniファイルのセクション名を、string配列にpushし続けて、 セクション名すべてpushしたらループから外れるって仕組みなんですけど、 tmp = strtok_s()の代入がうまくいきませんどうしたらいいですか'(_iniファイル,_セクション名ならび) :- 読み込むiniファイルの(_iniファイル,_iniファイル文字ならび), 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_iniファイル文字ならび,[],_セクション名ならび). 読み込むiniファイルの(_iniファイル,_iniファイル文字ならび) :- get_chars(_iniファイル,_iniファイル文字ならび). 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_iniファイル文字ならび,L1,_セクション名ならび) :- セクション名を(_iniファイル文字ならび,_セクション名,_セクション名後の文字ならび), 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_セクション名後の文字ならび,[_セクション名|L1],_セクション名ならび). 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_iniファイル文字ならび,_セクション名ならび,_セクション名ならび). セクション名を(_iniファイル文字ならび,_セクション名,_セクション名後の文字ならび) :- append(L0,['['|_セクション名からの文字ならび],_iniファイル文字ならび), 'L0に[も]も存在しない'(L0), append(L0_1,[']'|_セクション名後の文字ならび],_セクション名からの文字ならび), 'L0_1に]が存在しない'(_セクション名後の文字ならび), atom_chars(_セクション名,_セクション名後の文字ならび). 'L0に[も]も存在しない'(L0) :- \+(member('[',L0)), \+(member(']',L0)),!. 'L0_1に]が存在しない'(L0_1) :- \+(member(']',L0_1)). % 以下のサイトは # 出典:: 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,_単純移動平均). % 以下のサイトは # # お題:整数同士の掛け算の筆算の計算過程を表示するプログラム # 整数同士の掛け算の筆算の計算過程を表示する(_整数_1,_整数_2) :- それぞれの整数を数値ならびに変換(_整数_1,_整数_2,_整数ならび_1,_整数ならび_2), 掛け算の筆算の計算過程を表示する(_整数ならび_1,_整数ならび_2). それぞれの整数を数値ならびに変換(_整数_1,_整数_2,_整数ならび_1,_整数ならび_2) :- number_chars(_整数_1,Chars_1), number_chars(_整数_2,Chars_2), 数字ならびを数値ならびに変換(Chars_1,_整数ならび_1), 数字ならびを数値ならびに変換(Chars_2,_整数ならび_2). 数字ならびを数値ならびに変換([],[]). 数字ならびを数値ならびに変換([A|R1],[N|R2]) :- atom_number(A,N), 数字ならびを数値ならびに変換(R1,R2). 掛け算の筆算の計算過程を表示する(_整数ならび_1,_整数ならび_2) :- reverse(_整数ならび_1,_反転した整数ならび_1), reverse(_整数ならび_2,_反転した整数ならび_2), '掛け算の筆算の計算過程(下の桁から掛ける)を表示する'(0,_反転した整数ならび_1,_反転した整数ならび_2,_前段の数ならび), 各桁の加算を表示する(_全段の数ならび). '掛け算の筆算の計算過程(下の桁から掛ける)を表示する'(_,_,[],[]). '掛け算の筆算の計算過程(下の桁から掛ける)を表示する'(_n,L1,[_m|R2],[L2|R4]) :- 乗数がn桁目の掛算(_n,_m,L1,L2), '掛け算の筆算の計算過程の表示'(_n,_m,L1,L2), _n_2 is _n + 1, '掛け算の筆算の計算過程(下の桁から掛ける)を表示する'(_n_2,L1,R2,R4). '掛け算の筆算の計算過程の表示'(_n,_m,L1,L2) :- reverse(L1,L1_2), atomic_list_concat(L1_2,S1), reverse(L2,L2_2), atomic_list_concat(L2_2,S2), writef('%t×%t=% t ... (%t)\n',[S1,_m,S,_n2]). 乗数がn桁目の掛算(_n,_m,L1,L2) :- length(L4,_n), all(L4,0), append(L4,L1,L1_2), 段の掛算(_m,L1_2,0,[],L2),!. 段の掛算(_,[],0,L,L) :- !. 段の掛算(_,[],C,L1,[C|L1]) :- !. 段の掛算(M,[N|R2],C,L3,L) :- 九九掛算(M,N,N1,N2), D is (N1 * 10 + C + N2) // 10, M2 is (C + N2) mod 10, 段の掛算(M,R2,D,[M2|L3],L). 各桁の加算を表示する(_全段の数ならび) :- 全段を逆順に並べ直す(_全段の数ならび,_逆順の全段の数ならび), length(_全段の数ならび,Len), 各桁の加算を表示する(_逆順の全段の数ならび,Len,0). 各桁の加算を表示する([],Len,S) :- findall(S,( between(1,Len,N), swritef(S,'(%w)',[N])), L), atomic_list_concat(L,'+',S1), writef('%w=%w\n',[S1,S]),!. 各桁の加算を表示する(_逆順の全段の数ならび,Len,S) :- 下の桁から加算する(_逆順の前段の数ならび,0,S1,R2), 各桁の加算を表示する(R2,Len,S1). 全段を逆順に並べ直す([],[]). 全段を逆順に並べ直す([L1|R1],[L2|R2]) :- reverse(L1,L2), 全段を逆順に並べ直す(R1,R2). 下の桁から加算する([],S,S,[]). 下の桁から加算する([[M|R1_1]|R1],S1,S,[R1_1|R2]) :- S2 is S1 + M, 下の桁から加算する(R,S2,S,R2),!. 下の桁から加算する([[]|R1],S1,S,R2) :- 下の桁から加算する(R,S1,S,R2). 九九掛算(M,N,X_1,X_2) :- length(L1,M), length(L2,N), append(L1,L2,L3), ならびの割り算(L3,[_,_,_,_,_,_,_,_,_,_],L4,L5), length(L4,X_1), length(L5,X_2). 九九掛算(0,0,0,0). 九九掛算(0,1,0,0). 九九掛算(0,2,0,0). 九九掛算(0,3,0,0). 九九掛算(0,4,0,0). 九九掛算(0,5,0,0). 九九掛算(0,6,0,0). 九九掛算(0,7,0,0). 九九掛算(0,8,0,0). 九九掛算(0,9,0,0). 九九掛算(1,0,0,0). 九九掛算(1,1,0,1). 九九掛算(1,2,0,2). 九九掛算(1,3,0,3). 九九掛算(1,4,0,4). 九九掛算(1,5,0,5). 九九掛算(1,6,0,6). 九九掛算(1,7,0,7). 九九掛算(1,8,0,8). 九九掛算(1,9,0,9). 九九掛算(2,0,0,0). 九九掛算(2,1,0,2). 九九掛算(2,2,0,4). 九九掛算(2,3,0,6). 九九掛算(2,4,0,8). 九九掛算(2,5,1,0). 九九掛算(2,6,1,2). 九九掛算(2,7,1,4). 九九掛算(2,8,1,6). 九九掛算(2,9,1,8). 九九掛算(3,0,0,0). 九九掛算(3,1,0,3). 九九掛算(3,2,0,6). 九九掛算(3,3,0,9). 九九掛算(3,4,1,2). 九九掛算(3,5,1,5). 九九掛算(3,6,1,8). 九九掛算(3,7,2,1). 九九掛算(3,8,2,4). 九九掛算(3,9,2,7). 九九掛算(4,0,0,0). 九九掛算(4,1,0,4). 九九掛算(4,2,0,8). 九九掛算(4,3,1,2). 九九掛算(4,4,1,6). 九九掛算(4,5,2,0). 九九掛算(4,6,2,4). 九九掛算(4,7,2,8). 九九掛算(4,8,3,2). 九九掛算(4,9,3,6). 九九掛算(5,0,0,0). 九九掛算(5,1,0,5). 九九掛算(5,2,1,0). 九九掛算(5,3,1,5). 九九掛算(5,4,2,0). 九九掛算(5,5,2,5). 九九掛算(5,6,3,0). 九九掛算(5,7,3,5). 九九掛算(5,8,4,0). 九九掛算(5,9,4,5). 九九掛算(6,0,0,0). 九九掛算(6,1,0,6). 九九掛算(6,2,1,2). 九九掛算(6,3,1,8). 九九掛算(6,4,2,4). 九九掛算(6,5,3,0). 九九掛算(6,6,3,6). 九九掛算(6,7,4,2). 九九掛算(6,8,4,8). 九九掛算(6,9,5,4). 九九掛算(7,0,0,0). 九九掛算(7,1,0,7). 九九掛算(7,2,1,4). 九九掛算(7,3,2,1). 九九掛算(7,4,2,8). 九九掛算(7,5,3,5). 九九掛算(7,6,4,2). 九九掛算(7,7,4,9). 九九掛算(7,8,5,6). 九九掛算(7,9,6,3). 九九掛算(8,0,0,0). 九九掛算(8,1,0,8). 九九掛算(8,2,1,6). 九九掛算(8,3,2,4). 九九掛算(8,4,3,2). 九九掛算(8,5,4,0). 九九掛算(8,6,4,8). 九九掛算(8,7,5,6). 九九掛算(8,8,6,4). 九九掛算(8,9,7,2). 九九掛算(9,0,0,0). 九九掛算(9,1,0,9). 九九掛算(9,2,1,8). 九九掛算(9,3,2,7). 九九掛算(9,4,3,6). 九九掛算(9,5,4,5). 九九掛算(9,6,5,4). 九九掛算(9,7,6,3). 九九掛算(9,8,7,2). 九九掛算(9,9,8,1). all([],0). all([A|R],A) :- all(R,A). ならびの割り算([],_,[],[]) :- !. ならびの割り算(_被除算項,_除算項,[_|_R3],_剰余項) :- length(_除算項,N), length(_除算項_2,N), append(_除算項_2,R,_被除算項), ならびの割り算(R,_除算項_2,_R3,_剰余項),!. ならびの割り算(L,_,[],_剰余項) :- length(L,N), length(_剰余項,N),!. % 以下のサイトは # プログラム: 言語(a) を受理するNDFA # # a # ------------------------- # 状態_0 | # <------------------------ # # # 図 簡単なオートマトン # '次の文字列を非決定性有限オートマトンが言語(a)を受理するまで検索する'(_文字列,_前文字列,_受理された文字列,_後文字列) :- '文字列を、前・受理された・後文字ならび候補に分解する'(_文字列,_前文字ならび,_受理された文字ならび,_後文字ならび), '言語(a)を受理する非決定性有限オートマトン'(_受理された文字ならび), '各部文字ならびを文字列に変換する'(_前文字ならび,_受理された文字ならび,_後文字ならび,_前文字列,_受理された文字列,_後文字列). '文字列を、前・受理された・後文字ならび候補に分解する'(_文字列,_前文字ならび,_受理された文字ならび,_後文字ならび) :- atom_chars(_文字列,_文字ならび), append([_前文字ならび,_受理された文字ならび,_後文字ならび],_文字ならび), \+(_受理された文字ならび=[]). '各部文字ならびを文字列に変換する'(_前文字ならび,_受理された文字ならび,_後文字ならび,_前文字列,_受理された文字列,_後文字列) :- atom_chars(_前文字列,_前文字ならび), atom_chars(_受理された文字列,_受理された文字ならび), atom_chars(_後文字列,_後文字ならび). '言語(a)を受理する非決定性有限オートマトン'(_記号ならび) :- '言語(a)初期状態'(_状態), '言語(a)を受理する非決定性有限オートマトン'(_状態,_記号ならび). '言語(a)を受理する非決定性有限オートマトン'(_状態,[_記号|R]) :- '言語(a)'(_状態,_記号,_状態_1), '言語(a)を受理する非決定性有限オートマトン'(_状態_1,R). '言語(a)を受理する非決定性有限オートマトン'(_状態,[]) :- '言語(a)終了状態'(_状態). '言語(a)初期状態'(状態_0). '言語(a)終了状態'(状態_0). '言語(a)'(状態_0,a,状態_0). % 以下のサイトは # # (p) http://cp1.nintendo.co.jp/2012 任天堂サイトの問題ですが # # $ python SimpleBarsTest.py # test_loop (__main__.testSimpleBars) ... ok # test_simple_rule (__main__.testSimpleBars) ... ok # # ---------------------------------------------------------------------- # Ran 2 tests in 0.000s # # OK # # テストコードまでOKなんですが、 # answerを出したのですが違っているようなんです。 # この問題を解いた方がいましたら少し教えてもらえませんでしょうか。 'iTピラミッド' :- 'iTピラミッド'(1,12,[i,'T']), 'iTピラミッド'(12,1,['T',i]). 'iTピラミッド'(1,6,[i,'T']). 'iTピラミッド'(_開始段数,_段数,_記号並び順) :- for(_開始段数,N,_段数), ピラミッドの段を生成(N,_記号並び順,L), 最初の3文字分を末尾に移動して段文字列とする(L,_段文字列), writef('%t\n',[_段文字列]), N = _段数. ピラミッドの段を生成(N,_記号並び順,L) :- 段の記号部分を生成(_記号並び順,L2), length(L,25), append(L1,L2,L1,L), all(L1,' '). 段の記号部分を生成(_記号並び順,L2) :- _length is (N - 1) * 2 + 1, length(L2,_length), '記号並び順に変数を埋める'(_記号並び順,L2). '記号並び順に変数を埋める'(_,[]). '記号並び順に変数を埋める'([A|R1],[A|R2]) :- append(R1,[A],L1), '記号並び順に変数を埋める'(L1,R2). 最初の3文字分を末尾に移動して段文字列とする([_1,_2,_3|R],_段文字列) :- append(R,[_1,_2,_3],_求める記号ならび), atomic_list_concat(_求める記号ならび,_段文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all([],_). all([V|R],V) :- all(R,V). for(S,N,E) :- for_2(S,N,E). for(S,N,E) :- for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(S,N,E) :- N is S. for_1(S,N,E) :- S1 is S - 1, for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(S,N,E) :- N is S. for_2(S,N,E) :- S1 is S + 1, for_2(S1,N,E). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/419 # # ●Regular Expressionの使用環境 # sakura editor # # ●検索か置換か? # 置換 # # ●説明 # xmlのtaxiwaypath要素のなかに # type="TAXI"と centerLineLighted="FALSE"が存在するときに、 他の属性を書き換えずにcenterLineLighted="TRUE"に書き換えたいです # # ●対象データ # <TaxiwayPath # type="TAXI" # … # centerLineLighted="FALSE" # … # /> # # ●希望する結果 # <TaxiwayPath # type="TAXI" # … # centerLineLighted="TRUE" # … # /> # # …は省略していると言う意味です # # ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" に置換する'(_文字列,_置換された文字列) :- sPLIT(_文字列,['>',' ','\n','\t'],_区切りを含む要素ならび), ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" にする'(R2,R2_2), atomic_list_concat(_置換された区切りを含む要素ならび,_置換された文字列),!. ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" に置換する'(_文字列,_文字列). ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" に置換する'(R2,_置換された区切りを含む要素ならび) :- append(L1,[''|R3],_区切りを含む要素ならび), \+(member('>',R2)), member('type="TAXI"',R2), ならびの置換(R2,'centerLineLighted="FALSE"','centerLineLighted="TRUE"',R2_2), append(L1,[''|R3],_置換された区切りを含む要素ならび),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/329 # # [1] 授業単元:ソート # [2] 問題文(含コード&amp;リンク): # # 次の条件を満たす関数を作ってください。 # # 第1引数はint型の配列。 # 第2引数はint型で第1引数の配列の要素数。 # 第3引数はint型の値。 # # 配列内の要素を並び替えて、第3引数の値より小さなものが配列の最初の方に位置するようにし、 # その次に第3引数の値と同じものが位置するようにし、その次に第3引数の値より大きなものが位置するように # してください。 # # 戻り値は、第3引数の値より小さなもののうち最も後方のインデックスをstruct Pairのfirstにセットし、 # 第3引数の値と同じもののうち、最も後方のインデックスをstruct Pairのsecondにセットして # struct Pair型の値を返してください。 # # struct Pair { # int first; # int second; # }; # # できるだけ速く処理できるよう実装を工夫してください。 # # '次の条件を満たす関数を作ってください。 第1引数はint型の配列。 第2引数はint型で第1引数の配列の要素数。 第3引数はint型の値。 配列内の要素を並び替えて、第3引数の値より小さなものが配列の最初の方に位置するようにし、 その次に第3引数の値と同じものが位置するようにし、その次に第3引数の値より大きなものが位置するように してください。 戻り値は、第3引数の値より小さなもののうち最も後方のインデックスをstruct Pairのfirstにセットし、 第3引数の値と同じもののうち、最も後方のインデックスをstruct Pairのsecondにセットして struct Pair型の値を返してください。 '(_ならび,_要素数,_第3引数の値,_第3引数の値より小さなもののうち最も後方のインデックス,_第3引数の値と同じのもののうち最も後方のインデックス) :- findall(_nth1,( nth1(_nth,_ならび,A), A @< _第3引数の値), L1), findall(_第3引数の値,( nth1(_nth1,_ならび,_第3引数の値)), L2), findall(A,( nth1(_nth1,_ならび,A), A @> _第3引数の値), L3), append(L1,L2,L3,_並び替えたならび), last(L1,_第3引数の値より小さなもののうち最も後方のインデックス), last(L2,_第3引数の値と同じのもののうち最も後方のインデックス), % 以下のサイトは ある文字数以上の単語をすべて抽出する(_ある文字数以上の単語ならび) :- 形態素解析(_文字列,_形態素ならび), 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). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 165代目 #32 # 総当りをする関数を作成して下さい # # VC++2010 # Windows Vista Home SP2 # # 例 # 第1引数 総当りの初めの文字 # 第2引数 総当りの最後の文字 # 第3引数 総当りする桁数 # func('a', 'z', 3); # とした時の動作は # aaa〜zzz、aa〜zz、a〜z # の全てを出力するようにしたいです # # よろしくお願いします # # 総当り(_総当りの初めの文字,_総当りの最後の文字,_総当りする桁数,_総当り) :- 文字ならびを確定する(_総当りの初めの文字,_総当りの最後の文字,_文字ならび), 総当り(_総当りする桁数,_文字ならび,_総当り). 総当り(1,_文字ならび,_文字ならび). 総当り(_桁数,_文字ならび,_総当り) :- _桁数 > 1, _桁数_1 is _桁数 - 1, 総当り(_桁数_1,_文字ならび,_総当り_2), 総当り_2(_文字ならび,_総当り_2,_総当り). 総当り_2(_文字ならび,_総当り_2,_総当り) :- findall(_文字列,( member(_文字_1,_文字ならび), member(_文字列_2,_総当り_2), atom_concat(_文字_1,_文字列_2,_文字列)), _総当り_1), append(_総当り_1,_総当り_2,_総当り). 文字ならびを確定する(_総当りの初めの文字,_総当りの最後の文字,_文字ならび) :- char_code(_総当りの初めの文字,_総当りの初めの文字コード), char_code(_総当りの最後の文字,_総当りの最後の文字コード), findall(_文字,( between(_総当りの初めの文字コード,_総当りの最後の文字コード,_文字コード), char_code(_文字,_文字コード)), _文字ならび). % 以下のサイトは ダイクストラ法による最短距離探索(_出発点,_距離,_最短経路,_確定集合) :- _確定集合_1 = [[_出発点,0,[_出発点]]], 初期の未確定集合を得る(_出発点,_未確定集合), ダイクストラ法による最短距離探索(_確定集合_1,_未確定集合,_確定集合). 初期の未確定集合を得る(_出発点,_初期未確定集合) :- setof([_出発点,9999,[]],[_点,_隣接点,_距離,_出発点] ^ ( 経路(_点,_隣接点,_距離), \+(_点 = _出発点)), _初期未確定集合). ダイクストラ法による最短距離探索(_確定集合,[],_確定集合). ダイクストラ法による最短距離探索([[_直前に確定した点,_距離,_経路]|R],_未確定集合_1,_確定集合) :- 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_距離,_経路,_未確定集合_1,_未確定集合_2), 未確定集合から最小距離点を抜き取る(_未確定集合_2,_最小距離点,_最小距離,_最小距離点の経路,_未確定集合_3), 確定集合に追加(_最小距離点,_最小距離,_最小経路点の経路,[[_直前に確定した点,_距離,_経路]|R],_確定集合_2), ダイクストラ法による最短距離探索(_確定集合_2,_未確定集合_3,_確定集合). 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_距離,_経路,_未確定集合_1,_未確定集合_2) :- findall([_隣接点,_距離], 隣接点を得る(_直前に確定した点,_未確定集合,_隣接点,_距離), LL), 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_距離,_経路,LL,_未確定集合_1,_未確定集合_2). 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,[[_隣接点,_距離]|R],_未確定集合_1,_未確定集合_2) :- 未確定集合の更新(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,_隣接点,_距離,_未確定集合_1,_未確定集合_3), 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,R,_未確定集合_3,_未確定集合_2). 隣接点を得る(_直前に確定した点,_未確定集合,_隣接点,_距離) :- 経路(_直前に確定した点,_隣接点,_距離), member([_隣接点,_,_],_未確定集合). 未確定集合の更新(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,_隣接点,_距離,_未確定集合_1,_未確定集合_2) :- _距離_2 is _直前に確定した点までの距離 + _距離, append(L1,[[_隣接点,_距離_1,_経路_1]|L2],_未確定集合_1), _距離_1 > _距離_2, append(L1,[[_隣接点,_距離_1,[_隣接点|_直前に確定した点までの経路]]|L2],_未確定集合_2),!. 未確定集合の更新(_,_,_,_,_,_未確定集合,_未確定集合). 未確定集合から最小距離点を抜き取る(_未確定集合_1,_最小距離点,_最小距離,_最小距離点の経路,_未確定集合_2) :- append(L1,[[_最小距離点,_最小距離,_最小距離の経路]|L2],_未確定集合_1), forall(member([_,_距離_1,_],L1),_距離_1 >= _最小距離), forall(member([_,_距離_2,_],L1),_距離_2 >= _最小距離), append(L1,L2,_未確定集合_2),!. 確定集合に追加(_点,_距離,_経路,_確定集合_1,[[_点,_距離,_経路]|_確定集合_1]). % 以下のサイトは 奇数に一致させる(_文字列,_前文字列,_適合文字列,_後文字列) :- 数値候補の取り出し(L,L1,L2,L3,N), 1 is N mod 2, atom_chars(_前文字列,L1), atom_chars(_適合文字列,L2), atom_chars(_後文字列,L3). 数値候補の取り出し(L,L1,L2,L3,N) :- atom_chars(_文字列,L), append(L1,L2,L3,L), すべてが数字(L2), 'L1の最後の文字とL2の最初の文字は数字ではない'(L1,L2), number_chars(N,L2). すべてが数字([]). すべてが数字([A|R]) :- 数字(A), すべてが数字(R). 'L1の最後の文字とL2の最初の文字は数字ではない'(L1,L2) :- \+((last(L1,A),数字(A))), \+((L=[B|_],数字(B))). 数字(A) :- A @>= '0', A @=< '9'. % 以下のサイトは 偶数に一致させる(_文字列,_前文字列,_適合文字列,_後文字列) :- 数値候補の取り出し(L,L1,L2,L3,N), 0 is N mod 2, atom_chars(_前文字列,L1), atom_chars(_適合文字列,L2), atom_chars(_後文字列,L3). 数値候補の取り出し(L,L1,L2,L3,N) :- atom_chars(_文字列,L), append(L1,L2,L3,L), すべてが数字(L2), 'L1の最後の文字とL2の最初の文字は数字ではない'(L1,L2), number_chars(N,L2). すべてが数字([]). すべてが数字([A|R]) :- 数字(A), すべてが数字(R). 'L1の最後の文字とL2の最初の文字は数字ではない'(L1,L2) :- \+((last(L1,A),数字(A))), \+((L=[B|_],数字(B))). 数字(A) :- A @>= '0', A @=< '9'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/159 # # [1] 授業単元:タンシバへの挑戦状 # [2] 問題文:入力された正の整数をローマ数字に変換するプログラムを作れ。 # 正の整数をローマ数字に変換(_正の整数,_ローマ数字) :- 正の整数をローマ数字に変換([1,4,5,9,10,40,50,90,100,400,500,900,1000],['I','IV','V','IX','X','XL','L','XC','C','CD','D','CM','M'],_正の整数,_ローマ数字). 正の整数をローマ数字に変換(L1,L2,_正の整数,_ローマ数字) :- '正の整数がL1に存在した時はL2から対応するローマ数字を得る'(L1,L2,_正の整数,_ローマ数字). 正の整数をローマ数字に変換(L1,L2,_正の整数,_ローマ数字) :- '正の整数がL1に存在しない場合はL2から正の整数より小さくかつ最大のローマ数字単位とローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字_1), '正の整数からローマ数字単位を引いた整数のローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字_2), concat_atom(_ローマ数字_1,_ローマ数字_2,_ローマ数字). '正の整数がL1に存在した時はL2から対応するローマ数字を得る'(L1,L2,_正の整数,_ローマ数字) :- nth1(_nth1,L1,_正の整数), nth1(_nth1,L2,_ローマ数字),!. '正の整数がL1に存在しない場合は正の整数より小さくかつ最大のローマ数字単位とローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字) :- 正の整数より小さくかつ最大のローマ数字単位(L1,L0,_ローマ数字単位), 正の整数より小さくかつ最大のローマ数字(L2,L0,_ローマ数字). 正の整数より小さくかつ最大のローマ数字単位(L1,L0,_ローマ数字単位) :- append(L0,[_ローマ字数字単位|R],L1), _ローマ字数字単位 < _正の整数, \+((member(_ローマ字数字単位_1,R),_ローマ字数字単位_1 < _正の整数)). 正の整数より小さくかつ最大のローマ数字(L2,L0,_ローマ数字) :- length(L0,_nth0), nth0(_nth0,L2,_ローマ数字). '正の整数からローマ数字単位を引いた整数のローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字_2) :- _差分整数 is _正の整数 - _ローマ数字単位, 正の整数をローマ数字に変換(L1,L2,_差分整数,_ローマ数字_2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/370 # # ●Regular Expressionの使用環境 # ActivePerl5.8 # # ●検索か置換か? # 検索 # # ●説明 # 連続する数を検索したい(1965から2011までの数) # # ●対象データ(配列内に格納) # 1952 # 1965 # 1986 # 2012 # 1972 # 2011 #  ・ #  ・ # ●希望する結果(配列の各要素を正規表現で検索して、マッチする要素だけ抽出) # 1965 # 1986 # 1972 # 2011 #  ・ #  ・ # # 配列の各要素が1955から2011までの数の場合にマッチする正規表現を教えてください # # '●検索か置換か? 検索 ●説明 連続する数を検索したい(1965から2011までの数) ●対象データ(配列内に格納) 1952 1965 1986 2012 1972 2011  ・  ・ ●希望する結果(配列の各要素を正規表現で検索して、マッチする要素だけ抽出) 1965 1986 1972 2011  ・  ・'(_文字列,_前文字列,_適合文字列,_後文字列) :- '連続する数を検索したい(1965から2011までの数)'(_文字列,_前文字列,_適合文字列,_後文字列). '連続する数を検索したい(1965から2011までの数)'(_文字列,_前文字列,_適合文字列,_後文字列) :- atom_chars(_文字列,_文字ならび), '文字ならびから連続する数を検索したい(1965から2011までの数)'(_文字ならび,_前文字列,_適合文字列,_後文字列). '文字ならびから連続する数を検索したい(1965から2011までの数)'(_文字ならび,_前文字列,_適合文字列,_後文字列) :- '数値を切り出す(1965から2011までの数)'(_文字ならび,L1,L2,L3,N), atom_chars(_前文字列,L1), atom_chars(_後文字列,L3), atom_chars(_適合文字列,L2). '数値を切り出す(1965から2011までの数)'(_文字ならび,L1,L2,L3,N) :- append(L1,L2,L3,_文字ならび), 全てが数字(L2), 'L1の最後の文字とL3の最初の文字は数字ではない'(L1,L3), number_chars(_数,L2), '1965から2011までの数'(_数). 全てが数字(_ならび) :- forall(member(_数字,_ならび),数字(_数字)). 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. 'L1の最後の文字とL3の最初の文字は数字ではない'(L1,L3) :- 'L1の最後の文字は数字ではない'(L1), 'L3の最初の文字は数字では無い'(L3). 'L1の最後の文字は数字ではない'(L1) :- \+((last(L1,A),数字(A))). 'L3の最初の文字は数字では無い'(L3) :- \+(([B|_]=L3,数字(B))). '1965から2011までの数'(_数) :- between(1965,2011,_数). % 以下のサイトは ならびをn個切り出す(_ならび,_m要素目から,_n個,_切り出されたならび) :- length([_|L1],_m要素目から), append(L1,_切り出されたならび,_,_ならび), length(_切り出されたならび,_n個). ならびをm要素目からn要素目まで切り出す(_ならび,_m要素目から,_n要素目まで,_切り出されたならび) :- length([_|L1],_m要素目から), length(L2,_n要素目まで), append(L1,_切り出されたならび,L2), append(L1,_切り出されたならび,_,_ならび). % 以下のサイトは # # @ft4613_ac # if(n段上れる)step_1(N-n,S) みたいな再帰がかけない # 階段を上がる(_,[_現在の段|_残りの階段],[],_現在の段,_残りの階段). 階段を上がる(_n段上がる,[_現在の段_1|_残りの階段_1],_既に登った階段,_現在の段,_残りの階段) :- length(_駆け上がり階段ならび,_n段上がる), append(_駆け上がり階段ならび,_残りの階段_2,[_現在の段_1|_残りの階段_1]), 階段を上がる(_n段上がる,_残りの階段_2,_既に登った階段_2,_現在の段,_残りの階段), append(_駆け上がり階段ならび,_既に登った階段_2,_既に登った階段). % % ?- 階段を上がる(3,[0,1,2,3,4,5,6,7],_既に登った階段,_現在の段,_残りの階段). % % _既に登った階段 = [], % _現在の段 = 0, % _残りの階段 = [1,2,3,4,5,6,7]; % _既に登った階段 = [0,1,2], % _現在の段 = 3, % _残りの階段 = [4,5,6,7]; % _既に登った階段 = [0,1,2,3,4,5], % _現在の段 = 6, % _残りの階段 = [7]; % no. % ?- % % 以下のサイトは # # @ft4613_ac # if(n段上れる)step_1(N-n,S) みたいな再帰がかけない # 階段を上がる(_n段上がる,_階段,_既に登った階段,_現在の段,_残りの階段) :- length(_駆け上がり段数ならび,_n段上がる), length(_階段,_階段の段数), length([_最初の段|_残り段数の変数ならび],_階段の段数), 階段を上がる(_駆け上がり段数ならび,_残り段数の変数ならび,_階段,_既に登った階段,_現在の段,_残りの階段). 階段を上がる(_,_残りの階段,_階段,_既に登った段,_現在の段,_残りの階段) :- append(_既に登った階段,[_現在の段|_残りの階段],_階段). 階段を上がる(_駆け上がり段数ならび,_残り段数の変数ならび,_階段,_既に登った階段,_現在の段,_残りの階段) :- append(_駆け上がり段数ならび,_駆け上がった後の残り段数の変数ならび,_残り段数の変数ならび), 階段を上がる(_駆け上がり段数ならび,_駆け上がった後の残り段数の変数ならび,_階段,_既に登った階段,_現在の段,_残りの階段). % % ?- 階段を上がる(3,[0,1,2,3,4,5,6,7],_既に登った階段,_現在の段,_残りの階段). % % _既に登った階段 = [], % _現在の段 = 0, % _残りの階段 = [1,2,3,4,5,6,7]; % _既に登った階段 = [0,1,2], % _現在の段 = 3, % _残りの階段 = [4,5,6,7]; % _既に登った階段 = [0,1,2,3,4,5], % _現在の段 = 6, % _残りの階段 = [7]; % no. % ?- % % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 色(赤). 色(青). 色(緑). 塗り分けならび(_塗り分けならび) :- findall(_塗り分けならび,塗り分け(_塗り分けならび),_塗り分けならび). 全色塗り分けならび(_塗り分けならび) :- findall(_塗り分けならび,全色塗り分け(_塗り分けならび),_塗り分けならび). 塗り分け(_塗り分けならび) :- 領域名と色の対ならび(_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), 色検査(_塗り分けならび). 全色塗り分け(_塗り分けならび) :- 領域名と色の対ならび(_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), forall(member(_色,_色ならび),member([_,_色],_塗り分けならび)), 色検査(_塗り分けならび). 領域名と色の対ならび(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), 色ならび(_色ならび), 対ならびの形成(_領域名ならび,_色ならび,_塗り分けならび). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 色ならび(_色ならび) :- findall(_色,色(_色),_色ならび). 対ならびの形成(_領域名ならび,_色ならび,_塗り分けならび) :- length(_領域名ならび,Len), length(_塗り分けならび,Len), findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,_塗り分けならび,_色)), _塗り分けならび). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(_塗り分けならび) :- forall((member([A,C],_塗り分けならび),領域が隣接している(A,B)),\+(member([B,C],_塗り分けならび))). 領域が隣接している(A,A) :- 領域が孤立している,!,fail. 領域が隣接している(A,B) :- 隣接(A,B). 領域が孤立している. % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 全色塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(_塗り分けならび,Len), findall(_塗り分けならび,塗り分け(_領域名ならび,_色ならび,_塗り分けならび),_塗り分けならび). 塗り分け(_領域名ならび,_色ならび,_塗り分けならび) :- 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), 色検査(_塗り分けならび). 全色塗り分け(_領域名ならび,_色ならび,_塗り分けならび) :- 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), forall(member(_色,_色ならび),member([_,_色],_塗り分けならび)), 色検査(_塗り分けならび). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび) :- findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,_塗り分けならび,_色)), _塗り分けならび). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(_塗り分けならび) :- forall((member([A,C],_塗り分けならび),隣接(A,B)),\+(member([B,C],_塗り分けならび))). % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 全色塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 塗り分け(_領域名ならび,_色ならび,LL) :- 領域名と色の対ならび(_領域名ならび,_色ならび,LL), 色を割り振る(_色ならび,LL), 色検査(LL). 全色塗り分け(_領域名ならび,_色ならび,LL) :- 領域名と色の対ならび(_領域名ならび,_色ならび,LL), 色を割り振る(_色ならび,LL), forall(member(_色,_色ならび),member([_,_色],LL)), 色検査(LL). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 領域名と色の対ならび(_領域名ならび,_色ならび,LL) :- findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,LL,_色)), LL). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(L) :- forall((member([A,C],L),隣接(A,B)),\+(member([B,C],L))). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- '表示する数字は読み込まれた整数値の個数とする。'(_個数), length(Ln2,_個数), '1234567890を繰り返し表示する'([],_個数). '1234567890を繰り返し表示する'(Ln,Ln2) :- append(Ln,_,Ln2), 表示する([_,_,_,_,_,_,_,_,_,_],'1234567890'), '1234567890を繰り返し表示する'([_,_,_,_,_,_,_,_,_,_|Ln],Ln2). '1234567890を繰り返し表示する'(Ln,_) :- 表示する(Ln,'1234567890'). '表示する数字は読み込まれた整数値の個数とする。'(_個数) :- 整数を得る(整数値,true,_個数). 表示する(Ln,_文字列) :- length(Ln,Len), sub_atom(_文字列,0,Len,_,_副文字列), write(_副文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数,true,_個数), length(L,_個数), '1234567890を繰り返し'(L), 表示する(L). '1234567890を繰り返し'([1,2,3,4,5,6,7,8,9,0|R]) :- '1234567890を繰り返し'(R). '1234567890を繰り返し'(L) :- append(L,_,[1,2,3,4,5,6,7,8,9,0]). 表示する(L) :- atomic_list_concat(L,A), writef('%t',[A]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数,true,_個数), length(Ln,_個数), '1234567890を繰り返し表示する'(Ln,[1,2,3,4,5,6,7,8,9,0]). '1234567890を繰り返し表示する'([],_). '1234567890を繰り返し表示する'([_|Ln],[N|R]) :- write(N), append(R,[N],L1), '1234567890を繰り返し表示する'(Ln,L1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/855 # # [1]C言語初級課題 # [2]次のコードは、キーボードから0から9までの4つの数を # 受け取って小さい順から書き出すプログラムの未完成版である。 # コードを完成させなさい。fgetsでキーボードから文字列を受け取り、 # それをatoi関数で整数に変換し、0から9までの範囲にあるか確認し、 # 範囲にない場合は再入力を促し再入力させること。 # # #include <stdio.h> # #inckude <stdlib.h> # int main(void){ # char s[1024];//fgets関数に与える文字列バッファ # char *t;//fgets戻り値格納用 # int n;//atoi関数の戻り値格納用 # { # //この部分にコードを追加してコードを完成させてください。 # return(0); # } # [3] Windows 7/Microsoft SDK/C言語 # [4]5/31まで # [5]簡単な課題だそうですが、手こずってます。どうかよろしくお願いします。 # # 'キーボードから0から9までの4つの数を受け取って小さい順から書き出す。キーボードから文字列を受け取り、それをatoi関数で整数に変換し、0から9までの範囲にあるか確認し、範囲にない場合は再入力を促し再入力させること' :- キーボードから0から9までの4つの数を受け取って(_4つの数ならび), 小さい順から書き出す(_4つの数ならび),!. キーボードから0から9までの4つの数を受け取って([]) :- !. キーボードから0から9までの4つの数を受け取って([_整数|R]) :- キーボードから文字列を受け取り(_文字列), 整数に変換し(_文字列,_整数), キーボードから0から9までの4つの数を受け取って(R). キーボードから0から9までの4つの数を受け取って(L) :- キーボードから0から9までの4つの数を受け取って(L). キーボードから文字列を受け取り(_文字列) :- write('0から9の範囲の整数を入力して下さい : '), get_line(_文字列). 整数に変換し(_文字列,_整数) :- atom_to_term(_文字列,_整数,_), integer(_整数), 0から9までの範囲にあるか確認し(_整数),!. 0から9までの範囲にあるか確認し(_整数) :- _整数 >= 0, _整数 =< 9,!. 0から9までの範囲にあるか確認し(_整数) :- write('受け取った%tは0から9の範囲にありません。再入力をお願いします。\n'), fail. 小さい順から書き出す([]) :- write('\n'). 小さい順から書き出す(L) :- 最小値(L,A,L1), writef('%t ',[_最小値]), 小さい順から書き出す(L1). 最小値(L,A,L1) :- append(L0,[A|R],L), \+((member(B,L0),B @< A)), \+((member(C,R),C @< A)), append(L0,R,L1),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/855 # # [1]C言語初級課題 # [2]次のコードは、キーボードから0から9までの4つの数を # 受け取って小さい順から書き出すプログラムの未完成版である。 # コードを完成させなさい。fgetsでキーボードから文字列を受け取り、 # それをatoi関数で整数に変換し、0から9までの範囲にあるか確認し、 # 範囲にない場合は再入力を促し再入力させること。 # # #include <stdio.h> # #inckude <stdlib.h> # int main(void){ # char s[1024];//fgets関数に与える文字列バッファ # char *t;//fgets戻り値格納用 # int n;//atoi関数の戻り値格納用 # { # //この部分にコードを追加してコードを完成させてください。 # return(0); # } # [3] Windows 7/Microsoft SDK/C言語 # [4]5/31まで # [5]簡単な課題だそうですが、手こずってます。どうかよろしくお願いします。 # # 'キーボードから0から9までの4つの数を受け取って小さい順から書き出す。キーボードから文字列を受け取り、それをatoi関数で整数に変換し、0から9までの範囲にあるか確認し、範囲にない場合は再入力を促し再入力させること' :- キーボードから0から9までの4つの数を受け取って(_4つの数ならび), 小さい順から書き出す(_4つの数ならび),!. キーボードから0から9までの4つの数を受け取って([]) :- !. キーボードから0から9までの4つの数を受け取って([_整数|R]) :- キーボードから文字列を受け取り(_文字列), 整数に変換し(_文字列,_整数), キーボードから0から9までの4つの数を受け取って(R). キーボードから0から9までの4つの数を受け取って(L) :- キーボードから0から9までの4つの数を受け取って(L). キーボードから文字列を受け取り(_文字列) :- write('0から9の範囲の整数を入力して下さい : '), get_line(_文字列). 整数に変換し(_文字列,_整数) :- atom_to_term(_文字列,_整数,_), integer(_整数), 0から9までの範囲にあるか確認し(_整数),!. 0から9までの範囲にあるか確認し(_整数) :- _整数 >= 0, _整数 =< 9,!. 0から9までの範囲にあるか確認し(_整数) :- write('受け取った%tは0から9の範囲にありません。再入力をお願いします。\n'), fail. 小さい順から書き出す([]) :- write('\n'). 小さい順から書き出す(L) :- 最小値(L,A,L1), writef('%t ',[_最小値]), 小さい順から書き出す(L1). 最小値(L,A,L1) :- append(L0,[A|R],L), \+((member(B,L0),B @< A)), \+((member(C,R),C @< A)), append(L0,R,L1),!. % 以下のサイトは # 宿題じゃないんだけど、 # input.txtの中身が # 北アイルランド # あいうえお # aaa # だったとして # → # aaa # あいうえお # 北アイルランド # とエクセルの昇順と同じように並べ替えて # output.txtとして保存するプログラムを作成する # # C言語でお願いします。 'input.txtの中身が 北アイルランド あいうえお aaa だったとして → aaa あいうえお 北アイルランド とエクセルの昇順と同じように並べ替えて output.txtとして保存するプログラム' :- 'input.txtの中身が'(_行ならび), エクセルの昇順と同じように並べ替えて(_行ならび,_整列済み行ならび), 'output.txtとして保存する'(_整列済み行ならび). 'input.txtの中身が'(_行ならび) :- get_lines('input.txt',_行ならび). エクセルの昇順と同じように並べ替えて(_行ならび,_整列済み行ならび) :- 整列(_行ならび,_整列済み行ならび). 'output.txtとして保存する'(_整列済み行ならび) :- open('output.txt',write,Outstream), 'output.txtとして保存する'(Outstream,_整列済み行ならび), close(Outstream). 'output.txtとして保存する'(_,[]). 'output.txtとして保存する'(Outstream,[_行|_残り行ならび]) :- writef(Outstream,'%t\n',[_行]), 'output.txtとして保存する'(Outstream,_残り行ならび). get_lines( 整列([],[]). 整列([_軸要素|_残りならび],_整列したならび) :- 分類(_軸要素,_残りならび,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび), 整列(_軸要素に等しいか小さい要素ならび,_整列した軸要素に等しいか小さい要素ならび), 整列(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), append(_整列した軸要素に等しいか小さい要素ならび,[_軸要素|_整列した軸要素に等しいか小さい要素ならび],_整列したならび). 分類(_,[],[],[]). 分類(_軸要素,[_要素|_残り要素ならび],[_要素|_軸要素に等しいか小さい要素ならび],_軸要素より大きい要素ならび) :- _要素 @=< _軸要素, 分類(_軸要素,_残り要素ならび,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび). 分類(_軸要素,[_要素|_残り要素ならび],_軸要素に等しいか小さい要素ならび,[_要素|_軸要素より大きい要素ならび]) :- _要素 @> _軸要素, 分類(_軸要素,_残り要素ならび,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび). % 以下のサイトは # # 子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。 # このとき、考え得る階段の上がり方が何通りあるか求めるメソッドを実装してください。 '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方が何通りあるか求める。'(_n,_何通り) :- length(Ln,_n), 度数('子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'([],Ln,L),_何通り). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(L,L,[]). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_前回までに登った段,Ln,[_一歩で何段|_残りの段]) :- append(_前回までに登った段,[_|_],Ln), '一歩で1段、2段、もしくは3段を登ることができます'(_前回までに登った段,_一歩で何段,_登った段), '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_登った段,Ln,_残りの段). '一歩で1段、2段、もしくは3段を登ることができます'(_前回までに登った段,_一歩で何段,_登った段) :- member(_一歩で何段,[[_],[_,_],[_,_,_]]), append(_前回までに登った段,_一歩で何段,_登った段). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/561 # # Pythonにパターンマッチは無いよ # こういうことは出来るけど # # x, *y, z = [0, 1, 2, 3, 4] # print(x, y, z) #=> 0, [1, 2, 3], 4 # 'x, *y, z = [0, 1, 2, 3, 4]'(_x,_y,_z,L) :- append([_x],_y,[_z],L). append([],L1,L2,L3) :- append(L1,L2,L3). append([U|X],L1,L2,[U|Z]) :- append(X,L1,L2,Z). % 以下のサイトは 'append([],L,L).\nappend([U|X],Y,[U|Z]) :- append(X,Y,Z).\n'([],L,L). 'append([],L,L).\nappend([U|X],Y,[U|Z]) :- append(X,Y,Z).\n'([U|X],Y,[U|Z]) :- 'append([],L,L).\nappend([U|X],Y,[U|Z]) :- append(X,Y,Z).\n'(X,Y,Z). % 以下のサイトは # @deep_verdure氏のツイートから # # @deep_verdure # linearsearch(_,[]) :- fail. # linearsearch(X,[Y|Z]) :- (Y=X)->format('find!!');linearsearch(X,Z). # # 線形探索にすら再帰が必要な時点で自分はPrologを敵とみなした 線形探索(X,[Y|Z]) :- X = Y, format('find!!'),!. 線形探索(X,[_|Z]) :- 線形探索(X,Z). 線形探索(L,_前,X,_後) :- append(_前,[X|_後],L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/425 # # 要素に重複のないリスト(リストがない場合は配列)がある。 # このリストの部分リストを先頭要素と末尾要素を指定することによって、 # 切り出し、この部分リストだけを昇順に整列する。 # 元のリストを破壊することなしに、切り出されたリストの前部のリストを前に、 # 同じくならびの残り部分を後に結合した新たなならびを作るプログラムを示せ。 '要素に重複のないならび(ならびがない場合は配列)がある。 このならびの部分ならびを先頭要素と末尾要素を指定することによって、 切り出し、この部分ならびだけを昇順に整列する。 元のならびを破壊することなしに、切り出されたならびの前部のならびを前に、 同じくならびの残り部分を後に結合した新たなならびを作る'(_ならび,_切り出し先頭要素,_切り出し末尾要素,_新たなならび) :- 'このならびの部分ならびを先頭要素と末尾要素を指定することによって、切り出し、この部分ならびだけを昇順に整列する。'(_ならび,_切り出し先頭要素,_切り出し末尾要素,_前ならび,_切り出され整列したならび,_後ならび), 元のならびを破壊することなしに、切り出されたならびの前部のならびを前に、同じくならびの残り部分を後に結合した新たなならびを作る'(_前ならび,_切り出され整列したならび,_後ならび,_新たなならび). 'このならびの部分ならびを先頭要素と末尾要素を指定することによって、切り出し、この部分ならびだけを昇順に整列する。'(_ならび,_切り出し先頭要素,_切り出し末尾要素,_前ならび,_切り出され整列したならび,_後ならび) :- append(_前ならび,[_切り出し先頭要素|_残りならびの一],_ならび), append(L0,[_切り出し末尾要素|_後ならび],_残りならびの一), sort([_部分ならびの先頭要素,_部分ならびの末尾要素|L0],_切り出され整列したならび). '元のならびを破壊することなしに、切り出されたならびの前部のならびを前に、同じくならびの残り部分を後に結合した新たなならびを作る'(_前ならび,_切り出され整列したならび,_後ならび,_新たなならび) :- append(_前ならび,_切り出され整列したならび,L), append(L,_後ならび,_新たなならび). % 以下のサイトは # http://toro.2ch.net/test/read.cgi/tech/1364009659/344 # # uniq :: Eq a => [a] -> [a] # uniq [] = [] # uniq [x] = [x] # uniq (x1:xs@(x2:_)) # | x1 == x2 = uniq xs # | otherwise = x1 : uniq xs # 'uniq :: Eq a => [a] -> [a] uniq [] = [] uniq [x] = [x] uniq (x1:xs@(x2:_)) | x1 == x2 = uniq xs | otherwise = x1 : uniq xs'(L1,L2) :- uniq(L1,L2). uniq(L1,L2) :- findall(E,( append(_,[E|R],L1), \+(member(E,R))), L2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1232627790/958 # # 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】7/14 am6:00 # 【 Ver  】Eclipse Version: 3.4.2 # 【 補足 】 # あいう # かきく # さしす # 上記のようなテキストファイルを読み込み、 # さかあ # しきい # すくう # のように別のテキストファイルに書き出す感じです。 'テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す'(InFile,OutFile) :- テキストファイルから文字列5行を読み込み(Infile,_文字列5行), 別のテキストへ右縦書きで(_文字列5行,_右書き用に置換された文字列ならび), 書き出す(OutFile,_右書きように置換された文字列ならび), テキストファイルから文字列5行を読み込み(Infile,_文字列5行) :- open(InFile,read,Instream), findall(_行,( between(1,5,N), get_line(Instream,_行)), _文字列5行), close(InFile). 別のテキストへ右縦書きで(_文字列5行,_右書き用に置換された文字列ならび) :- findmax(_行の長さ,( member(_行,_文字列5行), atom_length(_行,_行の長さ), _最長文字数), 空白文字を付加して文字数一致させる(_最長文字数,_文字列5行,_空白文字を付加して矩形にした文字列5行), 右書き用に置換する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび). 右書き用に置換する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび) :- 行を反転しながら転置する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび). 行を反転しながら転置する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび) :- '一旦文字ならびに変換して、行を反転して転置する'(_空白文字を付加して矩形にした文字列5行,LL2), 文字列に戻す(LL2,_右書き用に置換された文字列ならび). '一旦文字ならびに変換して、行を反転して転置する'(_空白文字を付加して矩形にした文字列5行,LL2) :- findall(L,( member(_行,_空白文字を付加して矩形にした文字列5行), atom_chars(_行,Chars), reverse(Chars,L)), LL1), 転置(LL1,LL2). 文字列に戻す(LL2,_右書き用に置換された文字列ならび) :- findall(_文字列,( member(Chars,LL2), atom_chars(_文字列,Chars)), _右書き用に置換された文字列ならび). 空白文字を付加して文字数を一致させる(_最大文字数,_文字列5行,_空白を付加した文字列5行) :- findall(_空白を付加された文字列,( member(_文字列,_文字列5行), atom_length(_文字列,_文字列長さ), 空白文字を付加する(_最大文字数,_文字列の長さ,_文字列,_空白を付加された文字列)), _空白を付加された文字列5行). 空白文字を付加する(_最大文字数,_文字列の長さ,_文字列,_空白を付加された文字列) :- _空白文字数 is _最大文字数 - _文字列の長さ, findall(' ',between(1,_空白文字数,_),_空白文字ならび), atomic_list_concat([_文字列|_空白文字ならび],_空白を付加された文字列). 書き出す(OutFile,_右書き用に置換された文字列ならび) :- open(OutFile,write,Outstream), append(_,[_行|R],_右書き用に置換された文字列ならび), writef(Outstream,'%t\n',[_行]), R = [], close(Outstream). % % この符にはfindall/3だけで表現するという主題がある。 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/295 # # # お題 頂点座標から多角形の面積を求める # 頂点座標から多角形の面積を求める(_閉路をなす多角形の頂点座標ならび,_多角形の面積) :- '多角形の面積は iが1からnまで変化する範囲で Xi * (Yi+1 - Yi-1) の総計となる。(ただし Yn+1 = Y1 Y0 = Yn)'(_閉路をなす多角形の頂点座標ならび,_多角形の面積). '多角形の面積は iが1からnまで変化する範囲で Xi * (Yi+1 - Yi-1) の総計の半分となる。(ただし Yn+1 = Y1 Y0 = Yn)'(_閉路をなす多角形の頂点座標ならび,_多角形の面積) :- 'ただし Yn+1 = Y1 Y0 = Yn'(_閉路をなす多角形の頂点座標ならび,_拡張した座標ならび), '多角形の面積は iが1からnまで変化する範囲で Xi * (Yi+1 - Yi-1) の総計の半分となる。'(_拡張した座標ならび,_多角形の面積). '多角形の面積は iが1からnまで変化する範囲で Xi * (Yi+1 - Yi-1) の総計の半分となる。'(_拡張した座標ならび,_多角形の面積) :- findsum(U,( append(_,[(_x1,_y1),(_x2,_y2),(_x3,_y3)|_],_拡張した座標ならび), U is _x2 * (_y3 - _y1)), S), _多角形の面積 is S / 2. 'ただし Yn+1 = Y1 Y0 = Yn'([_0,_1|_残り座標ならび],_拡張した座標ならび) :- append([_0,_1|_残り座標ならび],[_0,_1],_拡張した座標ならび). findsum(U,P,Sum) :- findall(U,P,L), sum(L,Sum). sum([],0). sum([A|R],Sum) :- sum(R,Sum1), Sum is Sum1 + A. % 以下のサイトは # # 働き蟻の8割はまともだが2割は馬鹿、しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという # 結論:駆除しても無駄 # # '働き蟻の8割はまともだが2割は馬鹿、しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという'(_働き蟻,_駆除対象の馬鹿,_まともな働き蟻) :- '働き蟻の8割はまともだが2割は馬鹿'(_働き蟻,_駆除対象の馬鹿_1,_まともな働き蟻_1), 'しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという'(_駆除対象の馬鹿_1,_まともな働き蟻_1,_駆除対象の馬鹿,_まともな働き蟻). 'しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという'(_駆除対象の馬鹿,_まともな働き蟻,_駆除対象の馬鹿,_まともな働き蟻). 'しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという'(_,_まともな働き蟻,_駆除対象の馬鹿,_まともな働き蟻) :- '2割が新しく馬鹿になる'(_まともな働き蟻,_2割が新しく馬鹿になった働き蟻), '働き蟻の8割はまともだが2割は馬鹿、しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという'(_2割が新しく馬鹿になった働き蟻,_駆除対象の馬鹿,_まともな働き蟻). '働き蟻の8割はまともだが2割は馬鹿'(_働き蟻,_駆除対象の馬鹿,_まともな働き蟻) :- 働き蜂の個体数(_働き蜂,_働き蜂の個体数), 馬鹿順に整列する(_働き蟻,_馬鹿順に整列した働き蟻), 働き蟻の8割はまともだが(_馬鹿順に整列した働き蟻,_働き蟻の個体数,_まともな働き蟻), '2割は馬鹿'(_馬鹿順に整列した働き蟻,_働き蟻の個体数,_駆除対象の馬鹿). 働き蟻の8割はまともだが(_馬鹿順に整列した働き蟻,_働き蟻の個体数,_まともな働き蟻) :- _働き蟻の8割の個体数 is truncate(_働き蟻の個体数 * 0.8 + 0.49), length(_まともな働き蟻,_働き蟻の8割の個体数), append(_,_まともな働き蟻,_馬鹿順に整列した働き蟻). '2割は馬鹿'(_馬鹿順に整列した働き蟻,_働き蟻の個体数,_駆除対象の馬鹿) :- _働き蟻の2割の個体数 is truncate(_働き蟻の個体数 * 0.2 + 0.51), length(_駆除対象の馬鹿,_働き蟻の2割の個体数), append(_駆除対象の馬鹿,_,_馬鹿順に整列した働き蟻). 働き蟻の個体数(_働き蟻,_働き蟻の個体数) :- length(_働き蟻,_働き蟻の個体数). 馬鹿順に整列する(_働き蟻,_働き蟻) :- 馬鹿とまともな働き蟻とは実は差がない. 馬鹿とまともな働き蟻とは実は差がない. '2割が新しく馬鹿になる'(_まともな働き蟻,_2割が新しく馬鹿になった働き蟻) :- _まともな働き蟻 = _2割が新しく馬鹿になった働き蟻. % 以下のサイトは # # 要素数がn個以上のならび # n個以上のならび(_n,_n個以上のならび,_n個のならび,_残りならび) :- length(_n個のならび,_n), append(_n個のならび,_残りならび,_n個以上のならび). n個以上のならび(_n,_n個以上のならび,_残りならび) :- length(_n個のならび,_n), append(_n個のならび,_残りならび,_n個以上のならび). n個以上のならび(_n,_n個以上のならび) :- length(_n個のならび,_n), append(_n個のならび,_,_n個以上のならび). % 以下のサイトは # # 要素が高々n個のならびの定義 # 高々n個のならび(_n,_ならび) :- length(L,_n), append(_ならび,_,L). % 以下のサイトは # 無題 投稿者:774 投稿日:2013/04/16(Tue) 17:04 No.6 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 一次配列を指定した数参照(例だと3つ),配列の終わりに到達したら,最初に戻る. # これを数回繰り返すプログラム(例1) # また,例1で特定の条件を満たす場合,次回はその条件を満たした配列の次からスタート. # ※例2:条件を満たす数が複数含まれている場合,後ろを優先 # 例1 # a[4]={1,2,3,4,5} # 回数3 # 1回目 a[0]=1,a[1]=2,a[2]=3 # 2回目 a[3]=4,a[4]=5,a[0]=1 # 3回目 a[1]=2,a[2]=3,a[3]=4 # # 例2 # 条件:2の倍数→2と4 # a[5]={1,2,3,4,5,6} # 回数5 # 1回目 a[0]=1,a[1]=2,a[2]=3 # ※a[1]が条件を満たすので,次回はa[2]から # 2回目 a[2]=3,a[3]=4,a[4]=5 # ※a[3]が条件を満たすので,次回はa[4]から # 3回目 a[4]=5,a[5]=6,a[0]=1 # 4回目 a[1]=2,a[2]=3,a[3]=4 # ※a[1],a[3]が条件を満たすので,次回はa[4]から # 5回目 a[4]=5,a[5]=6,a[0]=1 # # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン:gcc v3.3 #  [3.3] 言語:C # [4] 期限: 4/18 # [5] その他の制限:stdio.h stdlib.hのみ # わかりにくい問題でごめんなさい。ヒントだけでもよろしくお願いします。 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(_参照) :- 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,_参照), Ln = [],!. 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,_参照) :- ならびを入力する(_ならび), 繰り返し回数を入力する(_回数,_限界回数L), 参照限界数を入力する(_参照限界数,_参照限界数L), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([],_参照限界数L,[],_回数L,_ならび,_ならび,[],_参照), _回数L = _限界回数L. ならびを入力する(_ならび) :- write('ならびを項として入力してください(ピリオドで終わる) : '), read(_ならび). 繰り返し回数を入力する(_回数,Ln) :- 整数を得る(繰り返し回数,_回数 > 0,_回数), length(Lmax,_回数). 参照限界数を入力する(_参照限界数,Lmax) :- 整数を得る(参照限界数,_参照限界数 > 0,_参照限界数), length(Ln,_参照限界数). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Lmax,Lmax,_回数L,_回数L,_,_,L1,L) :- reverse(L1,L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Lmax,Lmax,_回数L_1,_回数L,_ならび_1,_ならび,L1,L) :- 次の開始ならびを決める(L1,_ならび,_ならび_2), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([],Lmax,[_|_回数L_1],_回数L,_ならび_2,_ならび,[],L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,[],_ならび,L1,L) :- 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,_ならび,_ならび,L1,L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,[_値|R1],_ならび,L1,L) :- 参照位置を得る([_値|R1],_ならび,_参照位置), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([_|Ln],Lmax,_回数L_1,_回数L,R1,_ならび,[[_参照位置,_値]|R2],L). 参照位置を得る(L1,_ならび,N) :- append(L0,L1,_ならび), length(L0,N),!. 次の開始ならびを決める(L1,_ならび,_ならび_2) :- 値が偶数でそれより後にリセットされていない(L1,_nth0,_値,L0), length(L0_1,_nth0), append([_|L0_1],_ならび_2,_ならび),!. 次の開始ならびを決める(L1,_,L1). 値が偶数でそれより後にリセットされていない(L1,_nth0,_値,L0) :- append(L0,[[_nth0,_値]|R],L1), 偶数(_値), \+(member([0,_],L0)),!. 偶数(_値) :- 0 is _値 mod 2. % 以下のサイトは # 無題 投稿者:774 投稿日:2013/04/16(Tue) 17:04 No.6 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 一次配列を指定した数参照(例だと3つ),配列の終わりに到達したら,最初に戻る. # これを数回繰り返すプログラム(例1) # また,例1で特定の条件を満たす場合,次回はその条件を満たした配列の次からスタート. # ※例2:条件を満たす数が複数含まれている場合,後ろを優先 # 例1 # a[4]={1,2,3,4,5} # 回数3 # 1回目 a[0]=1,a[1]=2,a[2]=3 # 2回目 a[3]=4,a[4]=5,a[0]=1 # 3回目 a[1]=2,a[2]=3,a[3]=4 # # 例2 # 条件:2の倍数→2と4 # a[5]={1,2,3,4,5,6} # 回数5 # 1回目 a[0]=1,a[1]=2,a[2]=3 # ※a[1]が条件を満たすので,次回はa[2]から # 2回目 a[2]=3,a[3]=4,a[4]=5 # ※a[3]が条件を満たすので,次回はa[4]から # 3回目 a[4]=5,a[5]=6,a[0]=1 # 4回目 a[1]=2,a[2]=3,a[3]=4 # ※a[1],a[3]が条件を満たすので,次回はa[4]から # 5回目 a[4]=5,a[5]=6,a[0]=1 # # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン:gcc v3.3 #  [3.3] 言語:C # [4] 期限: 4/18 # [5] その他の制限:stdio.h stdlib.hのみ # わかりにくい問題でごめんなさい。ヒントだけでもよろしくお願いします。 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(_参照) :- 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,_参照), Ln = [],!. 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,_参照) :- ならびを入力する(_ならび), 繰り返し回数を入力する(_回数,_限界回数L), 参照限界数を入力する(_参照限界数,_参照限界数L), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([],_参照限界数L,[],_回数L,_ならび,_ならび,[],_参照), _回数L = _限界回数L. ならびを入力する(_ならび) :- write('ならびを項として入力してください(ピリオドで終わる) : '), read(_ならび). 繰り返し回数を入力する(_回数,Ln) :- 整数を得る(繰り返し回数,_回数 > 0,_回数), length(Lmax,_回数). 参照限界数を入力する(_参照限界数,Lmax) :- 整数を得る(参照限界数,_参照限界数 > 0,_参照限界数), length(Ln,_参照限界数). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Lmax,Lmax,_回数L,_回数L,_,_,L1,L) :- reverse(L1,L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Lmax,Lmax,_回数L_1,_回数L,_ならび_1,_ならび,L1,L) :- 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([],Lmax,[_|_回数L_1],_回数L,_ならび_1,_ならび,[],L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,[],_ならび,L1,L) :- 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,_ならび,_ならび,L1,L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,[A|R1],_ならび,L1,L) :- 参照位置を得る([A|R1],_ならび,_参照位置), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([_|Ln],Lmax,_回数L_1,_回数L,R1,_ならび,[[_参照位置,A]|R2],L). 参照位置を得る(L1,_ならび,_参照位置) :- append(L0,L1,_ならび), length(L0,_参照位置),!. % 以下のサイトは # 出典:: 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). '第二・第一レベルドメイン'('м'). '第二・第一レベルドメイン'('мо'). '第二・第一レベルドメイン'('мос'). '第二・第一レベルドメイン'('моск'). '第二・第一レベルドメイン'('москв'). '第二・第一レベルドメイン'('москва'). '第二・第一レベルドメイン'('р'). '第二・第一レベルドメイン'('рф'). '第二・第一レベルドメイン'('с'). '第二・第一レベルドメイン'('ср'). '第二・第一レベルドメイン'('срб'). '第二・第一レベルドメイン'('香'). '第二・第一レベルドメイン'('香港'). '第二・第一レベルドメイン'('中'). '第二・第一レベルドメイン'('中国'). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/233 # # ●Regular Expressionの使用環境 # 秀丸 8.2.1 # ●検索か置換か? # 置換 # # ●説明 # 二つ目のTab以降を削除したいです。 # # ●対象データ # 100 こくご えいご 100 20 固定 # 共通 シャカイ スウガク 100 10 ランダム # # (データの間の空白は全部Tabです) # # ●希望する結果 # 100 こくご # 共通 すうがく # # # 下の正規表現で試してみました。 # ^(.*)?\t(.*)?\t[あ-ん ア-ン].* # \1\t\2 # (.*)?\t(.*)?\tでTabまでの最短マッチ(のつもり)二つで、えいご、スウガクまでを指定しています。 # # 3つめのカラムの1文字目がひらがなとカタカナなので、[あ-ん ア-ン]で指定しているのですが、 # 後ろの"ランダム"がマッチしてしまい、2行目が下のような結果になってしまいます。 # # 100 こくご # 共通 シャカイ スウガク 100 10 # # やり方教えて貰えればうれしいです。 # よろしくお願いします。 # '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- atom_chars(_文字列,Chars), '二つ目のTab以降を削除したいです。'(Chars,['\t','\t'],_二つ目のTab以降を削除後の文字ならび), atom_chars(_二つ目のTab以降を削除後の文字列,_二つ目のTab以降を削除後の文字ならび). '二つ目のTab以降を削除したいです。'([A|_二つめのTab以降],[A],[A]) :- !. '二つ目のTab以降を削除したいです。'([A|R1],[A|R2],[A|R3]) :- '二つ目のTab以降を削除したいです。'(R1,R2,R3). '二つ目のTab以降を削除したいです。'([B|R1],L2,[B|R3]) :- '二つ目のTab以降を削除したいです。'(R1,L2,R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- atom_chars(_文字列,Chars), '一文字ずつ最初のTabが来るまで'(Chars,_Tabまでの文字ならび,_残り文字ならび_1), '二個目のTabが来るまで'(_残り文字ならび_1,_二個目のTabまでの文字ならび), append(_Tabまでの文字ならび,_二個目のTabまでの文字ならび,_二つ目のTabまでの文字ならび), atom_chars(_二つ目のTab以降を削除後の文字列,_二つ目のTabまでの文字ならび). '一文字ずつ最初のTabが来るまで'(['\t'|_残り文字ならび],['\t'],_残り文字ならび) :- !. '一文字ずつ最初のTabが来るまで'([A|_残り文字ならび],[],_残り文字ならび) :- '一文字ずつ最初のTabが来るまで'([A|_残り文字ならび],[],_残り文字ならび),!. '二個目のTabが来るまで'(['\t'|_],['\t']) :- !. '二個目のTabが来るまで'([A|R1],[A|R2]) :- '二個目のTabが来るまで'(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- 文字ならびに変換する(_文字列,_文字ならび), 二つのTabが来るまで(_文字ならび,_最初のTabまで,_その後二つ目のTabまで), 文字列を復元(_最初のTabまで,_その後二つ目のTabまで,_二つ目のTab以降を削除後の文字列). 文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 二つのTabが来るまで(_文字ならび,_最初のTabまで,_その後二つ目のTabまで) :- append(L1,['\t'|R2],['\t'|_],_文字ならび). 文字列を復元(_最初のTabまで,_その後二つ目のTabまで,_二つ目のTab以降を削除後の文字列) :- append(_最初のTabまで,['\t'|_その後二つめのTabまで],['\t'],_二つ目のTab以降を削除後の文字ならび), atom_chars(_二つ目のTab以降を削除後の文字列,_二つ目のTab以降を削除後の文字ならび),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- 最初のTabから後の副文字列を得る(_文字列,_最初のTabを含めた文字列の長さ,_それ以後の文字列), それ以後の文字列の最初に現れたTabを含めた長さ(_それ以後の文字列,_それ以後の文字列の最初に現れたTabを含めた長さ), _長さ is _最初のTabを含めたそこまでの文字列の長さ + _それ以後の文字列の最初に現れたTabを含めた長さ, sub_atom(_文字列,0,_長さ,_,_二つ目のTab以降を削除後の文字列),!. 最初のTabから後の副文字列を得る(_文字列,_最初のTabを含めた文字列の長さ,_それ以後の文字列) :- sub_atom(_文字列,St1,1,R,'\t'), _最初のTabを含めたそこまでの文字列の長さ is St1 + 1, sub_atom(_文字列,_最初のTabを含めた文字列の長さ,R,0,_それ以後の文字列). それ以後の文字列の最初に現れたTabを含めた最初からの長さ(_それ以後の文字列,_それ以後の文字列の最初に現れたTabを含めた長さ) :- sub_atom(_それ以後の文字列,St,1,_,'\t'), _それ以後の文字列の最初に現れたTabを含めた長さ is St + 1,!. % 以下のサイトは # # mysql 5.5.9 # master # code # last_tradingdate # # data_tbl # code # data1 # tradingdate # # で、data_tblにはcode毎に取引日が入っています # それでmasterのlast_tradingdateにcode毎の入力最新日をセット # したいのですが、どう書けばいいんでしょうか。 :- dynamic(master/2,data_tbl/3). 'master code last_tradingdate data_tbl code data1 tradingdate で、data_tblにはcode毎に取引日が入っています それでmasterのlast_tradingdateにcode毎の入力最新日をセット したいのですが、どう書けばいいんでしょうか。' :- findall([_code,_最終取引日],( master(_code,_), findmax(_trandingdate,( data_tble(_code,_,_tradingdate)), _最終取引日)), LL), masterの_last_tradingdateを書き換える(LL). masterの_last_tradingdateを書き換える(LL) :- append(_,[[_code,_最終取引日]|R],LL), retract(master(_code,_)), assertz(master(_code,_最終取引日)), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/172 # # ●Regular Expressionの使用環境 # PHP5 # # ●検索か置換か? # 置換 # # ●説明 # Javaのコメント・文字列を抽出してタグで囲みたいです。 # /**/, "", '' が入れ子になってる場合に外側だけ適応するのができません # 失敗例 <ダブル>"これは<シングル>'ペン'</シングル>です"</ダブル> # 成功例 <ダブル>"これは'ペン'です"</ダブル> # # ●対象データ() # /* "hello" 'world' */ # String var="これは'ペン'です"; # String apos='apopo "/* moge'; # # ●希望する結果 # <コメント>/* "hello" 'world' */</コメント> # String var=<ダブル>"これは'ペン'です"</ダブル>; # String apos=<シングル>'apopo "/* moge'</シングル>; # # 'Javaのコメント・文字列を抽出してタグで囲みたいです。'(_文字列,_置換された文字列) :- atom_chars(_文字列,Chars), '文字ならびからコメント・文字列を抽出してタグで囲む'(Chars,_置換された文字ならび), atom_chars(_置換された文字列,_置換された文字ならび). '文字ならびからコメント・文字列を抽出してタグで囲む'([],[]). '文字ならびからコメント・文字列を抽出してタグで囲む'([''''|R1],[<,シ,ン,グ,ル,>,''''|L1]) :- 'シングルクォートの外側入れ子を変換'(R1,L1,R2),!, '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). '文字ならびからコメント・文字列を抽出してタグで囲む'(['"'|R1],[<,ダ,ブ,ル,>,'"'|L1]) :- 'ダブルクォートの外側入れ子を変換'(R1,L1,R2),!, '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). '文字ならびからコメント・文字列を抽出してタグで囲む'([/,*|R1],[<,コ,メ,ン,ト,>,/,*|L1]) :- 'コメントの外側入れ子を変換'(R1,L1,R2),!, '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). '文字ならびからコメント・文字列を抽出してタグで囲む'([A|R1],[A|R2]) :- '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). シングルクォートの外側入れ子を変換(L,L1,R) :- append(L0,[''''|R],L), \+(member('''',R)), append(L0,['''',<,/,シ,ン,グ,ル,>|R],L1),!. ダブルクォートの外側入れ子を変換(L,L1,R) :- append(L0,['"'|R],L), \+(member('"',R)), append(L0,['"',<,/,ダ,ブ,ル,>|R],L1),!. コメントの外側入れ子を変換(L,L1,R) :- append(L0,[*,/|R],L), \+(append(_,[*,/|_],R)), append(L0,[*,/,<,/,コ,メ,ン,ト,>|R],L1),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/91 # # Youtubeみたいなランダムでユニークなn文字数の文字列を作る方法を教えてください 選択可能文字リスト( ['0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). 'Youtubeみたいなランダムでユニークなn文字数の文字列を作る'(_n,_ランダムでユニークなn文字数の文字列) :- findall(_ランダムでユニークな文字,~( ランダムでユニークな文字(_n,_ランダムでユニークな文字)), _ランダムでユニークなn文字数の文字リスト). atom_chars(_ランダムでユニークなn文字数の文字列,_ランダムでユニークなn文字数の文字リスト). ランダムでユニークな文字(_n,_ランダムでユニークな文字) :- length(Ln,_n), 選択可能文字リスト(_選択可能文字リスト), ランダムでユニークな文字_1(Ln,_選択可能文字リスト,_ランダムでユニークな文字). ランダムでユニークな文字_1([_|Ln],_選択可能文字リスト,_ランダムでユニークな文字) :- リストからランダムに値を抜き取る(_選択可能文字リスト,_文字_1,_選択文字を抜き取った選択可能文字リスト), ランダムでユニークな文字_2([_|Ln],_文字_1,_選択文字を抜き取った選択可能文字リスト,_ランダムでユニークな文字). ランダムでユニークな文字_2([_|Ln],_文字,_,_文字). ランダムでユニークな文字_2([_|Ln],_,_選択文字を抜き取った選択可能文字リスト,_文字) :- ランダムでユニークな文字(Ln,_選択文字を抜き取った選択可能文字リスト,_文字). リストからランダムに値を抜き取る(_リスト,_値,_値を抜き取ったリスト) :- 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト), リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト). 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト) :- length(_リスト,_要素数), _乱数値 is random(_要素数), length(_乱数値を要素数とした変数リスト,_乱数値). リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト) :- append(_乱数値を要素数とした変数リスト,[_値|_残りリスト],_リスト), append(_乱数値を要素数とした変数リスト,_残りリスト,_値を抜き取ったリスト). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/91 # # Youtubeみたいなランダムでユニークなn文字数の文字列を作る方法を教えてください 選択可能文字リスト( ['0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). 'Youtubeみたいなランダムでユニークなn文字数の文字列を作る'(_n,_ランダムでユニークなn文字数の文字列) :- length(Ln,_n), 選択可能文字リスト(_選択可能文字リスト), ランダムでユニークなn要素の文字リストを作る(Ln,_選択可能文字リスト,_ランダムでユニークなn文字数の文字リスト), atom_chars(_ランダムでユニークなn文字数の文字列,_ランダムでユニークなn文字数の文字リスト). ランダムでユニークなn要素の文字リストを作る([],_,[]). ランダムでユニークなn要素の文字リストを作る([_|Ln],_選択可能文字リスト,[_選択値|R]) :- リストからランダムに値を抜き取る(_選択可能文字リスト,_選択値,_選択値を抜き取った選択可能文字リスト), ランダムでユニークなn要素の文字リストを作る(Ln,_選択値を抜き取った選択可能文字リスト,R). リストからランダムに値を抜き取る(_リスト,_値,_値を抜き取ったリスト) :- 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト), リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト). 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト) :- length(_リスト,_要素数), _乱数値 is random(_要素数), length(_乱数値を要素数とした変数リスト,_乱数値). リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト) :- append(_乱数値を要素数とした変数リスト,[_値|_残りリスト],_リスト), append(_乱数値を要素数とした変数リスト,_残りリスト,_値を抜き取ったリスト). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/727 # # [1] 授業単元: 暇つぶし # [2] 問題文:迷路を解くプログラム。 #  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 # ----- ここからテキスト ----- # 5 5 # sxrrr # rxrrr # rrrxr # rrxgr # ----- ここまでテキスト ----- #  テキストの1行目は順番に迷路の横幅と縦幅を表します。 #  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。 #  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。 #  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 # 1 step # sxrrr # +xrrr # rrrxr # rrxgr # <中略> # 9 step # sxrrr # +x+++ # +++x+ # rrxg+ # '問題文:迷路を解くプログラム。  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 ----- ここからテキスト ----- 5 5 sxrrr rxrrr rrrxr rrxgr ----- ここまでテキスト -----  テキストの1行目は順番に迷路の横幅と縦幅を表します。  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 1 step sxrrr +xrrr rrrxr rrxgr <中略> 9 step sxrrr +x+++ +++x+ rrxg+ '(_テキスト) :- 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト). 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト) :- テキストを入力とし(_テキスト,LL1,LL2), スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順), '道を表示してください。'(_スタートからゴールまでの道順,LL1). スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順) :- スタートを探す(LL1,LL2,_スタートの行,_スタートの列), ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列), 隣に移動する(_スタートの行,_スタートの列,_ゴールの行,_ゴールの列,LL1,LL2,[],_スタートからゴールまでの道順). テキストを入力とし(_テキスト,LL1,LL2) :- get_lines(_テキスト,[_不要要素|_行ならび]), findall(_文字ならび,( member(_一行,_行ならび), atom_chars(_一行,_文字ならび)), LL1), 転置(LL1,LL2). スタートを探す(LL1,LL2,_スタートの行,_スタートの列) :- nth1(_スタートの行,LL1,L), nth1(_スタートの列,L,s). ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列) :- nth1(_ゴールの行,LL1,L), nth1(_ゴールの列,L,g). 隣に移動する(_ゴールの行,_ゴールの列,_ゴールの行,_ゴールの列,LL1,LL2,_,[[_ゴールの行,_ゴールの列]]). 隣に移動する(_行,_列,_ゴールの行,_ゴールの列,LL1,LL2,_履歴1,[[_行,_列]|R]) :- 移動可能な隣接点を得る(_行,_列,LL1,LL2,_隣の行,_隣の列), \+(member([_隣の行,_隣の列],_履歴1)), 隣に移動する(_隣の行,_隣の列,_ゴールの行,_ゴールの列,LL1,LL2,[[_行,_列]|_履歴1],R). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 列の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列) :- nth1(_行,LL1,L), length([_|L0],_列), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の列). 列の移動可能な隣接点(_行,_列,LL1,LL2,_隣の行,_隣の列) :- nth1(_列,LL2,L), length([_|L0],_行), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の行). 移動可能な隣接点(L0,R,_隣) :- last(L0,r), length(L0,_隣). 移動可能な隣接点(L0,R,_隣) :- R = [r|_], length([_,_|L0],_隣). '道を表示してください。'(_スタートからゴールまでの道順,LL) :- append(LL0,[[_行,_列]|RR],_スタートからゴールまでの道順), length([_|LL0],_ステップ), write('%t\n',[_ステップ]), '通過点を+に置換してLLを表示する'(_行,_列,LL), R = []. '通過点を+に置換してLLを表示する'(_行,_列,LL) :- append(L0,[L1|R],LL), length([_|L0],_行_1), 列の置換(_行_1,_行,_列,L1,L2), ならびを文字列に変換して表示(L2), R = []. 列の置換(_行,_行,_列,L1,L2) :- length([_|L0],_列), append(L0,[_|R],L1), append(L0,[+|R],L2),!. 列の置換(_,_,_,L,L). ならびを文字列に変換して表示(L) :- atomic_list_concat(L,S), writef('%t\n',[S]). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/705 # # SQL SERVER 2010ですが # TOP 2を求めて残りをその他として合計表示したいです。 # よろしくお願いします。 # # 元のデータ # 列1 # A # A # A # B # B # C # D # # 求めたい結果 # A 3 # B 2 # その他 2 # # 'TOP 2を求めて残りをその他として合計表示したい'(_A,_B,_その他) :- setof(_列1,[_列1] ^ テーブル(_列1),_一意の列1ならび), 'TOP 2を求めて'(_一意の列1ならび,_A,_B,R), '残りをその他として合計表示したい'(R,_その他). 'TOP 2を求めて'(_一意の列1ならび,_A,_B,R) :- findall([_度数,_列1],( member(_列1,_一意の列1ならび), count(テーブル(_列1),_度数)), LL), sort(LL1,LL2), append(R,[_B,_A],LL2). '残りをその他として合計表示したい'(R,_その他) :- findsum(_度数,member([_度数,_],R),_その他). % 以下のサイトは # # 1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。 # '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(_1,_2,_3,_4,_5,_6,_7,_8) :- '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'([],[_1,_2,_3,_4,_5,_6,_7,_8]). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'([_1,_2,_3,_4,_5,_6,_7,_8|_],[_8,_7,_6,_5,_4,_3,_2,_1]) :- 整列([_1,_2,_3,_4,_5,_6,_7,_8],[_,_,_,M,N,_,_,_]), 44 is M + N. '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L1,L) :- N is random(99) + 1, '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'([N|L1],L). 整列([],[]). 整列([_軸要素|R1],L) :- 分割(_軸要素,R1,L1,L2), 整列(L1,L3), 整列(L2,L4), append(L3,[_軸要素|L4],L). 分割(_,[],[],[]). 分割(_軸要素,[A|R1],[A|R2],R3) :- A @=< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[A|R1],R2,[A|R3]) :- A @> _軸要素, 分割(_軸要素,R1,R2,R3). % 以下のサイトは # # 1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。 # '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。'(L) :- '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'([],L). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L1,L) :- 乱数を発生させる(_乱数), 乱数を挿入して整列させる(_乱数,L1,L2), '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるの二'(L2,LL). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるの二'(L1,L) :- 中央値が存在する(L1,L). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるの二'(L1,L) :- '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L1,L). 中央値が存在する(L1,L) :- append(L0,[[_1,_2,_3,_4,_5,_6,_7,_8]|R],L1), 44 is _4 + _5, 中央値が存在する(L1,L0,[_1,_2,_3,_4,_5,_6,_7,_8],R,L). 中央値が存在する(L1,_,L,_,L). 中央値が存在する(L1,L0,_,R,L) :- append(L0,R,L2), '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L2,L). 乱数を発生させる(_乱数) :- _乱数 is random(99) + 1. 乱数を挿入して整列させる(_乱数,[],[_乱数]) :- !. 乱数を挿入して整列させる(_乱数,[N|R],[_乱数,N|R]) :- _乱数 =< N,!. 乱数を挿入して整列させる(_乱数,[N|R1],[N|R2]) :- _乱数 > N, 乱数を挿入して整列させる(_乱数,R1,R2). % 以下のサイトは # このディレクトリの索引 # JavaScriptでこのような二次元配列があります # [ # ["d", true], # ["a", false], # ["e", true], # ["c", false], # ["b", true], # ]; # # この配列を以下のようにソートする方法を教えてください # b # d # e # a # c 'このような二次元配列があります [ ["d", true], ["a", false], ["e", true], ["c", false], ["b", true], ]; この配列を以下のようにソートする方法を教えてください b d e a c'(LL1,A) :- '第二引数true,false,第一引数辞書順で整列する'(LL1,LL2), member([A,_],LL2). '第二引数true,false,第一引数辞書順の順で整列する'([],[]). '第二引数true,false,第一引数辞書順の順で整列する'([[A,B]|R1],LL) :- 分割([A,B],R1,LL1,LL2), '第二引数true,false,第一引数辞書順の順で整列する'(LL1,LL3), '第二引数true,false,第一引数辞書順の順で整列する'(LL2,LL4), append(LL1,[[A,B]|LL4],LL). 分割(_,[],[],[]). 分割([A,B],[[C,D]|R2],L1,L2) :- '第二引数はtrue,false順に分割する'([A,B],[C,D],L1,L2,L12,L22), 分割([A,B],R2,L12,L22). '第二引数はtrue,false順に分割する'([A,true],[C,true],[C|R1],R2,R1,R2) :- A >=@ C,!. '第二引数はtrue,false順に分割する'([A,true],[C,true],R1,[C|R2],R1,R2) :- A @=< C,!. '第二引数はtrue,false順に分割する'([A,false],[C,false],[C|R1],R2,R1,R2) :- A >=@ C,!. '第二引数はtrue,false順に分割する'([A,false],[C,false],R1,[C|R2],R1,R2) :- A @=< C,!. '第二引数はtrue,false順に分割する'([A,false],[C,true],[C|R1],R2,R1,R2) :- !. '第二引数はtrue,false順に分割する'([A,true],[C,false],R1,[C|R2],R1,R2) :- !. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362715265/22 # '可変長のリストの入力に対して固定長のリストを出力したいのですが 足りない部分を先頭の要素から0で埋めようと思います'(_可変長リスト,_固定長リストの長さ) :- length(_固定長リスト,_固定長リストの長さ), append(_足りない部分のリスト,_可変長リスト,_固定長リスト), '0で埋める'(_足りない部分のリスト), write(_固定長リスト). '0で埋める'([]). '0で埋める'([0|_残りリスト]) :- '0で埋める'(_残りリスト). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362715265/18 # :- dynamic(todo/1). 'お題 こんな感じにコマンドラインで動くTODO管理アプリを作りなさい $ ./todo add "本屋でPythonの本を買ってくる" $ ./todo add "たいやきを買ってくる" $ ./todo list 1: 本屋でPythonの本を買ってくる 2: たいやきを買ってくる $ ./todo done 2 $ ./todo list 1: たいやきを買ってくる アドリブも可' :- todoを準備する, user_parameters(_パラメーター), 解析実行(_パラメーター), todoデータを保存する. 解析実行([add,_文字列]) :- assertz(todo(_文字列)),!. 解析実行([done,N]) :- 'N行目のtodoデータを削除する'(N). 解析実行([list]) :- 行番号を振ってtodoデータを表示する. 'N行目のtodoデータを削除する'(N) :- 一旦todoデータを削除しながらリストに取得し(L1), 'N番目の要素を削除して'(N,L1,L2), todoデータを定義し直す(L2). 一旦todoデータを削除しながらリストに取得し(L) :- findall(_データ,( retract(todo(_データ)), L). 'N番目の要素を削除して'(N,L1,L2) :- length([_|L0],N), append(L0,[_|R],L1), append(L0,R,L2). todoデータを定義し直す(L2) :- forall( member(_データ,L2), assertz(todo(_データ))). 行番号を振ってtodoデータを表示する :- findall(_データ,todo(_データ),L), forall(( nth1(No,L,_データ), writef('%t %t\n',[No,_データ]). todoデータを準備する :- reconsult('todo.pro'). todoデータを保存する :- tell('todo.pro'), listing(todo/1), told. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/140 # # [1] 授業単元: Cプロ # [2] 問題文(含コード&リンク): # 3行3列の行列aを入力後、余因子行列で行列値|a|を求める # '3行3列の行列aを入力後、余因子行列で行列値|a|を求める' :- '3行3列の行列aを入力'(_a), '余因子行列で行列値|a|を求める'(_a,_行列式_aの値), writef('行列値|a|は%tです。\n',[_行列式_aの値]). '3行3列の行列aを入力'(_a) :- length(_a,3), findall(L,( nth1(_nth1,_a,L), length(L,3), '3列入力する'(_nth1,1,L)), _a). '3列入力する'(_,_,[]). '3列入力する'(_行位置,_列位置,[V|R]) :- writef('列入力[%t][%t] : ',[_行位置,_列位置]), get_line(Line), atom_to_term(Line,V,_), _列位置_2 is _列位置 + 1, '3列入力する'(_行位置,_列位置_2,R). '余因子行列を使って逆行列を得る'(_n,_正方行列,_逆行列) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値), 余因子行列(_n,_正方行列,_余因子行列), 転置(_余因子行列,_転置された余因子行列), 行列のすべての要素に値を掛ける(1,_n,_転置された余因子行列,1 / _行列式の値,_逆行列). 行列のすべての要素に値を掛ける(_行目,_n,LL,_,LL) :- _行目 > _n,!. 行列のすべての要素に値を掛ける(_行目,_n,LL1,_乗数 / _除数,LL2) :- '行基本変形'(_乗数 / _除数 # _行目,LL1,LL3), _行目_2 is _行目 + 1, 行列のすべての要素に値を掛ける(_行目_2,_n,LL3,_乗数 / _除数,LL2). '余因子行列で行列値|a|を求める'(_a,_行列式_aの値) :- 余因子行列(_a,_余因子行列), _a = [_aの第一行|_], _余因子行列 = [_余因子行列の第一行|_], '二つのならびの積の和'(_aの第一行,_余因子行列の第一行,_行列式_aの値). '二つのならびの積の和'([],[],0). '二つのならびの積の和'([A|R1],[B|R2],S) :- '二つのならびの積の和'(R1,R2,S_1), S is S_1 + A * B. 余因子行列(_正方行列,_余因子行列) :- length(_正方行列,_n), 余因子行列(_n,_正方行列,_余因子行列). 余因子行列(_n,_正方行列,_余因子行列) :- length(_余因子行列,_n), findall(L,( nth1(_i,_余因子行列,L), 余因子行列の要素が余因子である(_n,_正方行列,_i,L)), _余因子行列). 余因子行列の要素が余因子である(_n,_正方行列,_i,L) :- length(L,_n), findall(_余因子,( nth1(_j,L,_余因子), 余因子(_n,_正方行列,_i,_j,_余因子)), L). 行列式の値(1,[[_]],1) :- !. 行列式の値(2,_正方行列,_行列式の値) :- 二つの対角要素の積の差を得る(_n,_正方行列,_行列式の値),!. 行列式の値(_n,_正方行列,_行列式の値) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値). 余因子(_n,_正方行列,_i,_j,_余因子) :- 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子). 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) :- '正方行列からi行j列を取り除いた行列式の値'(_n,_正方行列,_i,_j,_n_1次正方行列の行列式の値), 'i,jから乗数を得る'(_i,_j,_乗数), _余因子 is _乗数 * _n_1次正方行列の行列式の値. '正方行列からi行j列を取り除いた行列式の値'(_n,_正方行列,_i,_j,_n_1次正方行列の行列式の値) :- '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列), _n_1 is _n - 1, 行列式の値(_n_1,_n_1次正方行列,_n_1次正方行列の行列式の値). '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列) :- '第何行を取り除く'(_正方行列,_i,_第i行が取り除かれた行列), 転置(_第i行が取り除かれた行列,_転置された第i行が取り除かれた行列), '第何行を取り除く'(_転置された第i行が取り除かれた行列,_j,_転置された第i行第j列が取り除かれた行列), 転置(_転置された第i行第j列が取り除かれた行列,_n_1次正方行列). '第何行を取り除く'(_正方行列,_第何行,_第i行が取り除かれた行列) :- append(L0,[L|R],_正方行列), length([_|L0],_第何行), append(L0,R,_第i行が取り除かれた行列). 二つの対角要素の積の差を得る(0,[],1) :- !. 二つの対角要素の積の差を得る(1,[[N]],N) :- !. 二つの対角要素の積の差を得る(_n,_正方行列,_二つの対角要素の積の差) :- 二つの対角要素の積を得る(_正方行列,_右下がり対角要素の積,_右上がり対角要素の積), _二つの対角要素の積の差 is _右下がり対角要素の積 - _右上がり対角要素の積. 二つの対角要素の積を得る(_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :- 二つの対角要素を得る(_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび), 対角要素の掛算(_右下がり対角要素ならび,_右下がり対角要素の積), 対角要素の掛算(_右上がり対角要素ならび,_右上がり対角要素の積). 二つの対角要素を得る(_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :- 右下がり対角要素ならび(_正方行列,_右下がり対角要素ならび), 右上がり対角要素ならび(_正方行列,_右上がり対角要素ならび). 右下がり対角要素ならび(_正方行列,_右下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), nth1(_nth1,L,V)), _右下がり対角要素ならび). 右上がり対角要素ならび(_正方行列,_右上がり対角要素ならび) :- reverse(_正方行列,_行を逆転した正方行列), 右下がり対角要素ならび(_行を逆転した正方行列,_右上がり対角要素ならび). 左下がり対角要素ならび(_正方行列,_左下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), length([_|R],_nth1), append(_,[V|R],L)), _左下がり対角要素ならび),!. 左上がり対角要素ならび(_正方行列,_左上がり対角要素ならび) :- reverse(_正方行列,_行を逆転した正方行列), 左下がり対角要素ならび(_行を逆転した正方行列,_左上がり対角要素ならび). 'i,jから乗数を得る'(_i,_j,(-1)) :- 1 is (_i + _j) mod 2,!. 'i,jから乗数を得る'(_i,_j,1) :- 0 is (_i + _j) mod 2,!. 対角要素の掛算([],1). 対角要素の掛算([A|R],X) :- 対角要素の掛算(R,Y), X is A * Y. 'n次正方行列の要素を行・列順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_i行), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). 'n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_j列), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/567 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # 1から16777215までの整数を入力すると、それを小数点以下の桁数としたチャンパーノウン定数を表示するプログラムを作成せよ。 # 指定した桁数を超えて、あるいは満たずに表示させた場合は不正解とする。 # # 【入力例】 # 16 # 【出力例】 # 0.1234567891011121 # # '1から16777215までの整数を入力すると、それを小数点以下の桁数としたチャンパーノウン定数を表示するプログラムを作成せよ。 指定した桁数を超えて、あるいは満たずに表示させた場合は不正解とする。' :- '1から16777215までの整数を入力すると'(_整数), 'それを小数点以下の桁数としたチャンパーノウン定数を'(1,0,_整数,_チャンパーノウン定数), 表示する(_チャンパーノウン定数文字). '1から16777215までの整数を入力すると'(_整数) :- 整数を得る('1から16777215までの整数',(整数 > 0,_整数 =< 16777215),_整数). 'それを小数点以下の桁数としたチャンパーノウン定数を表示するプログラムを作成せよ。'(_整数,_チャンパーノウン定数) :- 'チャンパーノウン定数をならびとして作成'(1,0,_整数,_チャンパーノウン定数文字ならび), atomic_list_concat(['0','.'|_チャンパーノウン定数文字ならび],_チャンパーノウン定数). 'チャンパーノウン定数をならびとして作成'(_,_桁1,_限界桁,[]) :- _桁1 >= _限界桁,!. 'チャンパーノウン定数をならびとして作成'(N1,_桁1,_限界桁,R1) :- 'チャンパーノウン定数をならびとして作成'(N1,_桁数,_桁1,_限界桁,R1,R2). _桁2 is _桁1 + _桁数, N2 is N1 + 1, 'チャンパーノウン定数をならびとして作成'(N2,_桁2,_限界桁,R2). 'チャンパーノウン定数をならびとして作成'(N1,_桁数,_桁1,_限界桁,R1,R2) :- 追加文字ならび(N1,_桁数,_桁1,_限界桁,Chars), 'チャンパーノウン定数をならびとして作成'(Chars,R1,R2). 'チャンパーノウン定数をならびとして作成'([],R,R) :- !. 'チャンパーノウン定数をならびとして作成'([A|R1],[A|R2],R) :- 'チャンパーノウン定数をならびとして作成'(R1,R2,R). 追加文字ならび(N1,_桁数,_桁1,_限界桁,Chars) :- number_chars(N1,Chars1), length(Chars,_桁数), 追加文字ならび(_桁数,_桁1,_限界桁,Chars1,Chars),!. 追加文字ならび(_桁数,_桁1,_限界桁,Chars,Chars) :- _桁1 + _桁数 =< _限界桁,!. 追加文字ならび(_桁数,_桁1,_限界桁,Chars1,Chars) :- _桁2 is _限界桁 - _桁1, length(Chars,_桁2), append(Chars,R2,Chars1),!. 表示する(_チャンパーノウン定数文字) :- writef('%t',[_チャンパーノウン定数文字]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/669 # # oracleなんですが、次の表に # # 日付 数 # 1/1 5 # 1/2 2 # 1/3 -8 # 1/4 6 # 1/5 8 # # 残と繰越を計算して↓のようにしたいのですが # どのようなSQLにすればいいでしょうか?>< # # 日付 残 数 繰越 # 1/1 0 5 5 ←初日の残はゼロ、繰越=残+数 # 1/2 5 2 7 ←残=前日の繰越 # 1/3 7 -8 -1 # 1/4 0 6 6 ←前日の繰越がマイナスなら残はゼロに # 1/5 6 8 14 # # テーブル('1/1',5). テーブル('1/2',2). テーブル('1/3',-8). テーブル('1/4',6). テーブル('1/5',8). '1/1の期首残'(0). 'oracleなんですが、次の表に 日付 数 1/1 5 1/2 2 1/3 -8 1/4 6 1/5 8 残と繰越を計算して↓のようにしたいのです どのようなSQLにすればいいでしょうか?>< 日付 残 数 繰越 1/1 0 5 5 ←初日の残はゼロ、繰越=残+数 1/2 5 2 7 ←残=前日の繰越 1/3 7 -8 -1 1/4 0 6 6 ←前日の繰越がマイナスなら残はゼロに 1/5 6 8 14'(_日付,_残,_数,_繰越) :- '1/1の期首残'(_期首残), findall([_日付,_数],( テーブル(_日付,_数)), _日付_数ならび), 残と繰越を計算する(_期首残,_日付_数ならび,_日付,_残,_数,_繰越). 残と繰越を計算する(_期首残,_日付_数ならび,_日付,_残,_数,_繰越) :- append(L0,[[_日付,_数]|_],_日付_数ならび), 調整前の残を求める([[_,_期首残]|L0],_調整前の残), 残と繰越の調整(_調整前の残,_数,_残,_繰越). 調整前の残を求める(LL,_調整前の残) :- findall(_数,member([_,_数],LL),_数ならび), sum_list(_数ならび,_調整前の残). 残と繰越の調整(_残,_数,_残,_繰越) :- _残 >= 0, _繰越 is _残 + _数,!. 残と繰越の調整(_残_1,_数,0,_数) :- _残_1 < 0. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/651 # # 2010年度の月毎の件数をまとめたデータですが # 累計を求めたいです。 # # 月 2010年度 # 01 1 # 02 2 # 03 1 # 04 3 # 05 2 # 06 2 # 07 2 # 08 1 # 09 2 # 10 2 # 11 2 # 12 1 # # 求めたい結果 # 月 2010年度累計 # 04 3 # 05 5 # 06 7 # 07 9 # 08 10 # 09 12 # 10 14 # 11 16 # 12 17 # 01 18 # 02 20 # 03 21 # # これだけのデータから # スタートを4月にして累計を求める方法は # ありますでしょうか? # よろしくお願いします。 # '2010年度データ'('01',1). '2010年度データ'('02',2). '2010年度データ'('03',1). '2010年度データ'('04',3). '2010年度データ'('05',2). '2010年度データ'('06',2). '2010年度データ'('07',2). '2010年度データ'('08',1). '2010年度データ'('09',2). '2010年度データ'('10',2). '2010年度データ'('11',2). '2010年度データ'('12',1). '2010年度の月毎の件数をまとめたデータですが累計を求めたいです。'(_月,_累計件数) :- _月順序 = ['04','05','06','07','08','09','10','11','12','01','02','03'], findall(_件数,( member(_月,_月順序), '2010年度データ'(_月,_件数)), _月別件数), 累計表示(_月順序,_月別件数,_月,_累計件数). 累計表示(_月順序,_月別件数,_月,_累計件数) :- append(L1,[_件数|R],_月別件数), length(L1,_nth0), nth0(_nth0,_月順序,_月), sum([_件数|L1],_累計件数). sum([],0). sum([N|R],S) :- sum(R,S_1), S is S_1 + N. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/651 # # 2010年度の月毎の件数をまとめたデータですが # 累計を求めたいです。 # # 月 2010年度 # 01 1 # 02 2 # 03 1 # 04 3 # 05 2 # 06 2 # 07 2 # 08 1 # 09 2 # 10 2 # 11 2 # 12 1 # # 求めたい結果 # 月 2010年度累計 # 04 3 # 05 5 # 06 7 # 07 9 # 08 10 # 09 12 # 10 14 # 11 16 # 12 17 # 01 18 # 02 20 # 03 21 # # これだけのデータから # スタートを4月にして累計を求める方法は # ありますでしょうか? # よろしくお願いします。 # '2010年度データ'('01',1). '2010年度データ'('02',2). '2010年度データ'('03',1). '2010年度データ'('04',3). '2010年度データ'('05',2). '2010年度データ'('06',2). '2010年度データ'('07',2). '2010年度データ'('08',1). '2010年度データ'('09',2). '2010年度データ'('10',2). '2010年度データ'('11',2). '2010年度データ'('12',1). '2010年度の月毎の件数をまとめたデータですが累計を求めたいです。'(_月,_累計件数) :- _月順序 = ['04','05','06','07','08','09','10','11','12','01','02','03'], 月別件数を得る(_月順序,_月別件数), 累計表示(_月順序,_月別件数,_月,_累計件数). 月別件数を得る([],[]). 月別件数を得る([_月|R1],[_件数|R2]) :- '2010年度データ'(_月,_件数), 月別件数を得る(R1,R2). 累計表示(_月順序,_月別件数,_月,_累計件数) :- append(L1,[_件数|R],_月別件数), length(L1,_nth0), nth0(_nth0,_月順序,_月), sum([_件数|L1],_累計件数). sum([],0). sum([N|R],S) :- sum(R,S_1), S is S_1 + N. % 以下のサイトは # # 集約鍵の詳細化 (坂内広蔵氏による集約キーのグラフ化の研究の一部をなぞったもの) # 集約鍵の詳細化(_集約鍵ならび,_詳細化された集約鍵) :- append(_詳細化された集約鍵,_,_集約鍵ならび). % % ?- 集約鍵の詳細化([部,課,係],_詳細化された集約鍵). % % _詳細化された集約鍵 = []; % _詳細化された集約鍵 = [部]; % _詳細化された集約鍵 = [部,課]; % _詳細化された集約鍵 = [部,課,係]; % % false. % % ?- findall(L,集約鍵の詳細化([部,課,係],L),_詳細化された集約鍵ならび). % % _詳細化された集約鍵ならび = [[],[部],[部,課],[部,課,係]] % % ?- % % それでは、 % 集約鍵の詳細化とはどういう意味か。SQLを使って説明する。 ここでは社員数を把握している。 % % 集約鍵 = [] の場合、 % % select count(*) from 社員; % 336 % % % 集約鍵 = [部] の場合、 % % select 部,count(*) from 社員 group by 部; % 営業,200 % 開発,136 % % % 集約鍵 = [部,課] の場合、 % % select 部,課,count(*) from 社員 group by 部,課; % 営業,食品,112 % 営業,薬品,88 % 開発,食品,70 % 開発,薬品,60 % 開発,検査,6 % % % 集約鍵 = [部,課,係] の場合、 % % select 部,課,係,count(*) from 社員 group by 部,課,係; % 営業,食品,東東京,18 % 営業,食品,西東京,20 % 営業,食品,神奈川,20 % 営業,食品,埼玉,16 % 営業,食品,千葉,16 % 営業,食品,群馬,8 % 営業,食品,栃木,7 % 営業,食品,茨城,7 % 営業,薬品,東京,19 % 営業,薬品,神奈川,12 % <以下省略> % % 以下のサイトは # 出典:: http://pc8.2ch.net/test/read.cgi/tech/1136768567/ # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): #   2つのグラフが同型であるかどうかを判定するプログラムを作成しなさい。ただし、入力データは講義で配布した形式(mat4,mat5,...)のものとする。また、次の条件を守ること。 # # * プログラムはC言語で作成して下さい。 # * 同型の場合はその対応(全単射)も出力すること。 # * 可能な限り速いプログラムを作成しなさい。例えば、各頂点の次数に着目したり、木を探索する際途中で探索しても無意味だと判明した時点でそれ以下の探索を中止するなど枝刈りを行うことで高速化できます。 # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン: gcc #  [3.3] 言語:どちらでも可 # [4] 期限: 2006年01月11日16:00 # # 入力データ # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1426.zip '2つのグラフが同型であるかどうかを判定する'(_第一グラフ,_第二グラフ,[[_第一関数,_第二関数]|_単射ならび_1]) :- _第一グラフ =.. [_第一関数|_第一グラフの引数ならび], _第二グラフ =.. [_第二関数|_第二グラフの引数ならび], 引数が同型であるかどうかを判定する(_第一グラフの引数ならび,_第二グラフの引数ならび,_単射ならび_1). 引数が同型であるかどうかを判定する([],[],[]) :- !. 引数が同型であるかどうかを判定する([_引数_1|R1],[_引数_2|R2],_単射ならび) :- '2つのグラフが同型であるかどうかを判定する'(_引数_1,_引数_2,_単射ならび_1), append(_単射ならび_1,_単射ならび_2,_単射ならび), 引数が同型であるかどうかを判定する(R1,R2,_単射ならび_2). % 以下のサイトは % % 履歴付き最終組余り有効N個組 % 最終組余り有効N個組(N,_対象ならび,_N個組) :- 履歴付き最終組余り有効N個組(N,_対象ならび,_履歴ならび,_N個組,_後ならび). 履歴付き最終組余り有効N個組(N,_対象ならび,_履歴ならび,_N個組,_後ならび) :- length(_N個組の一,N), append(_N個組の一,R,_対象ならび),!, 履歴付き最終組余り有効N個組(N,_N個組の一,R,_履歴ならび,_N個組,_後ならび). 履歴付き最終組余り有効N個組(N,_N個組,[],_N個組,[]). 履歴付き最終組余り有効N個組(N,_N個組,_後ならび,[],_N個組,_後ならび). 履歴付き最終組余り有効N個組(N,_N個組の一,R,[_N個組の一|R1],_N個組,_後ならび) :- 履歴付き最終組余り有効N個組(N,R,R1,_N個組,_後ならび). % ?- 履歴付き最終組余り有効N個組(3,[1,2,3,4,5,6,7,8],_履歴,_N個組,_後). % _履歴 = [], % _N個組 = [1, 2, 3], % _後 = [4, 5, 6, 7, 8] ; % _履歴 = [[1, 2, 3]], % _N個組 = [4, 5, 6], % _後 = [7, 8] ; % _履歴 = [[1, 2, 3], [4, 5, 6]], % _N個組 = [7, 8], % _後 = []. % 以下のサイトは # # 剰余算を使った最終組余り有効N個組 # 最終組余り有効N個組(N,_対象ならび,_N個組) :- 最終組余り有効N個組(N,_対象ならび,_前ならび,_N個組,_後ならび). 最終組余り有効N個組(N,_対象ならび,_前ならび,_N個組,_後ならび) :- length(X1,N), append(L0,X1,R1,_対象ならび), length(L0,Len1), 0 is Len1 mod N, 最終組余り有効N個組終了条件(N,L0,X1,R1,_前ならび,_N個組,_後ならび). 最終組余り有効N個組終了条件(N,L0,X,R,L0,X,R). 最終組余り有効N個組終了条件(N,L0,X,R,L1,R,[]) :- length(R,LenR), LenR < N, append(L0,X,L1). append([],L1,L2,L) :- append(L1,L2,L). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % ?- 最終組余り有効N個組(3,[1,2,3,4,5,6,7,8],_前ならび,_N個組,_後ならび). % _前ならび = [], % _N個組 = [1, 2, 3], % _後ならび = [4, 5, 6, 7, 8] ; % _前ならび = [1, 2, 3], % _N個組 = [4, 5, 6], % _後ならび = [7, 8] ; % _前ならび = [1, 2, 3, 4, 5, 6], % _N個組 = [7, 8], % _後ならび = [] ; % false. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/311 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # 以下のような入力が与えられたときに # 3 # 11010 # 01111 # 10101 # 01110 # 01100 # # 01011 # 01010 # 00100 # 00110 # 10100 # # 11110 # 01110 # 01101 # 01110 # 00001 # # 以下のように出力されるプログラムを作成してください。よろしくお願いします。 # 4 # 3 # 8 # '以下のような入力が与えられたときに 3 11010 01111 10101 01110 01100 01011 01010 00100 00110 10100 11110 01110 01101 01110 00001 以下のように出力されるプログラムを作成してください。よろしくお願いします。 4 3 8'(LL) :- プログラム(LL,_解), writef('%t\n',[_解]). プログラム(LL,_解) :- 転置(LL,LL1), '1の最大連続数を得る'(LL1,_最大連続数), '最大連続数の連続は何か所にあるか'(LL1,_最大連続数,_何か所), _解 is _最大連続数 * _何か所. '1の最大連続数を得る'(LL1,_最大連続数) :- '1の最大連続数を得る'(LL1,0,_最大連続数). '1の最大連続数を得る'([],_最大連続数,_最大連続数) :- !. '1の最大連続数を得る'([L|R],_最大連続数_1,_最大連続数) :- 'Lの最大連続数'(L,_連続数), _連続数 > _最大連続数_1, '1の最大連続数を得る'(R,_連続数,_最大連続数),!. '1の最大連続数を得る'([_|R],_最大連続数_1,_最大連続数) :- '1の最大連続数を得る'(R,_最大連続数_1,_最大連続数). 'Lの最大連続数'(L,_Lの最大連続数) :- findmax(_連続数,( append(L1,L2,L3,L), '1の連続数'(L1,L2,L3,_連続数)), _Lの最大連続数). '1の連続数'(L1,L2,L3,_連続数) :- all(L2,1), \+(last(L1,1)), \+(L3 = [1|_]), length(L2,_連続数). '最大連続数の連続は何か所にあるか'([],_最大連続数,0) :- !. '最大連続数の連続は何か所にあるか'([L|R],_最大連続数,_何か所) :- length(L2,_最大連続数), count(( append(L1,L2,L3,L), '1の連続数'(L1,L2,L3,_最大連続数)), Count), '最大連続数の連続は何か所にあるか'(R,_最大連続数,_何か所_1), _何か所 is _何か所_1 + Count. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/59 # # ../test/read.cgi/tech/1361082416/48 # http://kohada.2ch.net/test/read.cgi/prog/1209467166/401 # FizzBuzzクイズ # # 1.fizz.buzz #=> 1 # 3.fizz.buzz #=> "Fizz" # 5.fizz.buzz #=> "Buzz" # 15.fizz.buzz #=> "FizzBuzz" # 997.fizz.buzz #=> 997 # # となるようなメソッドfizz、buzzは定義可能か? # 可能である場合、同様にgizzを追加定義し、 # 7.fizz.buzz.gizz #=> "Gizz" # 21.fizz.buzz.gizz #=> "FizzGizz" # 35.fizz.buzz.gizz #=> "BuzzGizz" # 105.fizz.buzz.gizz #=> "FizzBuzzGizz" # と拡張・応用ができるか? # # メソッドのコールに()が必須の言語では 3.fizz().buzz() 形式でも構わない。 # オープンクラス機構やメソッドのない言語では関数(buzz(fizz(3)) #=> "Fizz" など)で。 # # 'FizzBuzzGizz' :- 'FizzBuzzGizz'([],['','','Fizz'],['','','','','Buzz'],['','','','','','','Gizz']). 'FizzBuzzGizz'(Ln,_,_,_) :- length(Ln,100),!. 'FizzBuzzGizz'(Ln,L1,L2,L3) :- 'FizzBuzzGizz'([_|Ln],L1,L2,L3,_表示情報), writef('%t\n',[_表示情報]), 三つのリストの左シフト(L1,L2,L3,L1_2,L2_2,L3_2), 'FizzBuzzGizz'([_|Ln],L1_2,L2_2,L3_2). 'FizzBuzzGizz'(Ln,[''|_],[''|_],[''|_],_数値) :- length(Ln,_数値),!. 'FizzBuzzGizz'(Ln,[A|_],[B|_],[C|_],_FizzBuzzGizz文字列) :- atomic_list_concat([A,B,C],_FizzBuzzGizz文字列). 三つのリストの左シフト([A|R1],[B|R2],[C|R3],L1,L2,L3) :- append(R1,[A],L1), append(R2,[B],L2), append(R3,[C],L3). % 以下のサイトは % % 文字列検索/8 % 文字列検索(_文字列,_切り取り開始文字列ならび,_切り取り終了文字列ならび,_切り取り開始以前文字列,_切り取り開始文字列,_切り取り文字列,_切り取り終了文字列,_残り文字列) :- atom_chars(_文字列,_文字ならび), 切り取り文字列ならびを文字ならびのならびに変換(_切り取り開始文字列ならび,_切り取り終了文字列ならび,_切り取り開始文字ならび候補,_切り取り終了文字ならび候補), 切り取り文字列まで読み飛ばし(_文字ならび,_切り取り開始文字ならび候補,_切り取り開始以前文字ならび,_切り取り開始文字ならび,_残り文字ならびの一), 文字ならび切り取り(_残り文字ならびの一,_切り取り終了文字ならび候補,_切り取り文字ならび,_切り取り終了文字ならび,_残り文字ならび), 切り取り文字列文字ならび変換(_切り取り開始以前文字ならび,_切り取り文字ならび,_切り取り終了文字ならび,_残り文字ならび,_切り取り開始文字ならび,_切り取り開始以前文字列,_切り取り文字列,_切り取り終了文字列,_残り文字列,_切り取り開始文字列). 切り取り文字列ならびを文字ならびのならびに変換(_切り取り開始文字列ならび,_切り取り終了文字列ならび,_切り取り開始文字ならび候補,_切り取り終了文字ならび候補) :- findall(_切り取り開始文字ならびの一,( member(_切り取り開始文字列の一,_切り取り開始文字列ならび) , atom_chars(_切り取り開始文字列の一,_切り取り開始文字ならびの一)), _切り取り開始文字ならび候補), findall(_切り取り終了文字ならびの一,( member(_切り取り終了文字列の一,_切り取り終了文字列ならび), atom_chars(_切り取り終了文字列の一,_切り取り終了文字ならびの一)), _切り取り終了文字ならび候補). 切り取り文字列文字ならび変換(_切り取り開始以前文字ならび,_切り取り文字ならび,_切り取り終了文字ならび,_残り文字ならび,_切り取り開始文字ならび,_切り取り開始以前文字列,_切り取り文字列,_切り取り終了文字列,_残り文字列,_切り取り開始文字列) :- atom_chars(_切り取り開始以前文字列,_切り取り開始以前文字ならび), atom_chars(_切り取り文字列,_切り取り文字ならび), atom_chars(_切り取り終了文字列,_切り取り終了文字ならび), atom_chars(_残り文字列,_残り文字ならび), atom_chars(_切り取り開始文字列,_切り取り開始文字ならび). 切り取り文字列まで読み飛ばし(_文字ならび,[],[],[],_文字ならび) :- !. 切り取り文字列まで読み飛ばし(_文字ならび,_切り取り開始文字ならび候補,[],_切り取り開始文字ならび,_残り文字ならび) :- member(_切り取り開始文字ならび,_切り取り開始文字ならび候補), append(_切り取り開始文字ならび,_残り文字ならび,_文字ならび). 切り取り文字列まで読み飛ばし([A|R1],_切り取り開始文字ならび候補,[A|R2],_切り取り開始文字ならび,R3) :- 切り取り文字列まで読み飛ばし(R1,_切り取り開始文字ならび候補,R2,_切り取り開始文字ならび,R3). 文字ならび切り取り([],_,[],[],[]) :- !. 文字ならび切り取り(_文字ならび,[],_文字ならび,[],[]) :- !. 文字ならび切り取り(_残り文字ならびの一,_終了文字ならび候補,_切り取り文字ならび,_終了文字ならび,_残り文字ならび) :- member(_終了文字ならび,_終了文字ならび候補), append(_終了文字ならび,_残り文字ならび,_終了文字ならびの二), append(_切り取り文字ならび,_終了文字ならびの二,_残り文字ならびの一). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/600 # # お願いします。 # # ●正規表現の使用環境 # Javascript # # ●検索か置換か? # 検索 # # ●説明 # HMVの商品IDらしき番号を取得したい # # ●対象データ # http://ime.nu/www.hmv.co.jp/artist_松平健_000000000039225/item_マツケンサンバ-2-リミックス-トラックス-dvd_1789889 # # http://ime.nu/www.hmv.co.jp/artist_松平健_000000000039225/item_マツケンサンバ-2-リミックス-トラックス-dvd_1789889/ref/1448035_8 # # ●希望する結果 # 1789889 # # 説明 # アンダーバー以降の末尾の自然数が商品IDなのですが(これなら簡単) # リファラー付きの場合は末尾じゃなくなるので初心者の自分には難しいです。 # なお、商品IDは0(ゼロ)で桁合わせはしていません # # 'HMVの商品IDらしき番号を取得したい'(_文字列,_商品ID) :- sub_atom(_文字列,S,5,_,'/ref/'), sub_atom(_文字列,0,S,_,_文字列_1), '商品IDは最後の_から末尾までの副文字列'(_文字列_1,_商品ID),!. 'HMVの商品IDらしき番号を取得したい'(_文字列,_商品ID) :- '商品IDは最後の_から末尾までの副文字列'(_文字列,_商品ID),!. '商品IDは最後の_から末尾までの副文字列'(_文字列,_商品ID) :- atom_chars(_文字列,Chars), append(_,['_'|R1],Chars), \+(member('_',R1)), atom_chars(_商品ID,R1). % 以下のサイトは % % PrologというのはFizzBuzz問題向きなのだろうか。 % fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz([_],[_],L). fizzbuzz([_,_,_],[_,_,_,_,_],[_|R]) :- fizzbuzz([],[],['FizzBuzz'|R]). fizzbuzz([_,_,_],L2,[_|R]) :- fizzbuzz([],L2,['Fizz'|R]). fizzbuzz(L1,[_,_,_,_,_],[_|R]) :- fizzbuzz(L1,[],['Buzz'|R]). fizzbuzz(L1,L2,[A|R]) :- writef('%w ',[A]), fizzbuzz([_|L1],[_|L2],R). fizzbuzz(_,_,[]). fizzbuzz(N) :- fizbuzz(1,N,['','','Fizz'],['','','','','Buzz']). fizzbuzz(M,N,_,_) :- M > N,!. fizzbuzz(M,N,[_31,_32,_33],[_51,_52,_53,_54,_55]) :- 出力情報(_31,_51,M,_N), writef('%w%w%w ',[_31,_51,_N]), fizzbuzz(M,N,[_32,_33,_31],[_52,_53,_54,_55,_51]). 出力情報('','',_N,_N) :- !. 出力情報(_,_,_,''). fizzbuzz(N) :- findall(M,between(1,N,M),L), forall(fizzbuzz(['','','Fizz'],['','','','','Buzz'],L),true). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%w%w%w ',[A,B,C]). fizzbuzz([A|R1],[B|R2],[_|R3]) :- append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,''). % PrologによるFizzBuzz問題プログラムの比較 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/48 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 # 3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、 # 数値の代わりに出力することとする # '1から100までの整数をかいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする' :- 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'([],['','','Fizz'],['','','','','','','Buzz'],['','','','','','','','','','','','','hoge']). 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(Ln,_,_,_) :- length(Ln,100),!. 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(Ln,L1,L2,L3) :- '3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに'([_|Ln],L1,L2,L3,_表示情報), writef('%t\n',[_表示情報]), 三つのならびの左方向へ回転(L1,L2,L3,L1_2,L2_2,L3_2), 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'([_|Ln],L1_2,L2_2,L3_2). '3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに'(Ln,[''|_],[''|_],[''|_],_数値) :- length(Ln,_数値),!. '3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに'(Ln,[A|_],[B|_],[C|_],_FizzBuzzhoge文字列) :- atomic_list_concat([A,B,C],_FizzBuzzhoge文字列). 三つのならびの左方向へ回転([A|R1],[B|R2],[C|R3],L1,L2,L3) :- append(R1,[A],L1), append(R2,[B],L2), append(R3,[C],L3). % 以下のサイトは '10進数n進数変換表示'(_10進数,_n,_n進数数値ならび,_n進数文字ならび,_n進数表示) :- _n >= 0, _n =< 35, '10進数からn進数ならび'(_10進数,_n,[],_n進数数値ならび,[],_n進数文字ならび), atomic_list_concat(_n進数文字ならび,_n進数表示). '10進数からn進数ならび'(0,_n,L1,L1,L2,L2) :- !. '10進数からn進数ならび'(D,_n,L1_1,L1,L2_1,L2) :- M is D mod _n, D_1 is D // _n, n進数文字変換(M,M_1), '10進数からn進数ならび'(D_1,_n,[M|L1_1],L1,[M_1|L2_1],L2). n進数文字変換(N,_文字) :- N >= 10, N =< 35, N_2 is N + 55, char_code(_文字,N_2). n進数文字変換(N,_文字) :- atom_number(_文字,N). 頭部零10進数n進数変換表示(_10進数,_n,_指定桁数,_n進数数値ならび,_n進数文字ならび,_n進数表示) :- '10進数n進数変換表示'(_10進数,_n,_n進数数値ならび,_n進数文字ならび_1,_), length(_n進数文字ならび,_指定桁数), append(L0,_n進数文字ならび_1,_n進数文字ならび), all(L0,'0'), atomic_list_concat(_n進数文字ならび,_n進数表示). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/874 # # ../test/read.cgi/tech/1357748713/775 # http://pc11.2ch.net/test/read.cgi/tech/1202135539/607 # [1] 授業単元:プログラミング # [2] 問題文 :キーボードから西暦と月を入力するとカレンダーを #       表示するプログラムを作成せよ # キーボードから西暦と月を入力するとカレンダーを表示する :- キーボードから西暦と月を入力すると(_西暦,_月), カレンダーを表示する(_西暦,_月). キーボードから西暦と月を入力すると(_西暦,_月) :- 整数を得る(西暦,true,_西暦), 整数を得る(月,between(1,12,_月),_月). カレンダーを表示する(_西暦,_月) :- カレンダーを(_西暦,_月,_カレンダー), 表示する(_西暦,_月,_カレンダー). カレンダーを(_西暦,_月,_カレンダー) :- 月末日(_西暦,_月,_月末日), 'Zellerの公式を用いて曜日を得る'(_年,_月,1,_曜日を表す値,_曜日), findall(D,between(1,_月末日,D),L1), カレンダーの先頭に0を詰める(L1,L2), '7個組に分解'(L2,_カレンダー). 月末日(_西暦,2,29) :- うるう年(_西暦),!. 月末日(_,2,28) :- !. 月末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]),!. 月末日(_,_月,30) :- member(_月,[4,6,9,11]),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 'Zellerの公式で使う曜日を表す値'(_曜日を表す値,_曜日),!. 'Zellerの公式で使う曜日を表す値'(0,日曜). 'Zellerの公式で使う曜日を表す値'(1,月曜). 'Zellerの公式で使う曜日を表す値'(2,火曜). 'Zellerの公式で使う曜日を表す値'(3,水曜). 'Zellerの公式で使う曜日を表す値'(4,木曜). 'Zellerの公式で使う曜日を表す値'(5,金曜). 'Zellerの公式で使う曜日を表す値'(6,土曜). all([],_). all([V|R],V) :- all(R,V). カレンダーの先頭に0を詰める(L1,L2) :- length(L0,_曜日を表す値), append(L0,L1,L2), all(L0,0),!. '7個組に分解'([],[]) :- !. '7個組に分解'([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- '7個組に分解'(R1,R2),!. '7個組に分解'(L,[L]). 表示する(_西暦,_月,_カレンダー) :- writef('\n%8r年 %t月\n\n',[_西暦,_月]), member(L,_カレンダー), 一行表示する(L), fail. 表示する(_西暦,_月,_カレンダー) :- write('\n'). 一行表示する([]) :- write('\n'). 一行表示する([0|R]) :- writef('%3r',[' ']), 一行表示する(R),!. 一行表示する([N|R]) :- writef('%3r',[N]), 一行表示する(R). % 以下のサイトは # http://d.hatena.ne.jp/E_Mattsan/20130211/1360590408 # 「E.Mattsan氏のブログ 20130211より」 # # 設問 # # まず、パタンマッチングの部分だけが見やすくなるように、「どう書く」の問題からいろいろ取り去ってより簡単な問題を作りました。 # # # 要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 # コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 # 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 # 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 # 要素がコンテナ中に見つからない場合、-1を返す。 # 検索(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- 形式(_指定された要素,L1), append(L0,L1,_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. 検索(_,_,-1). 形式(_指定された要素,[_指定された要素,_指定された要素,_指定された要素|_]). 形式(_指定された要素,[_指定された要素,_指定された要素|_]). 形式(_指定された要素,[_指定された要素|_]). % 以下のサイトは # http://d.hatena.ne.jp/E_Mattsan/20130211/1360590408 # 「E.Mattsan氏のブログ 20130211より」 # # 設問 # # まず、パタンマッチングの部分だけが見やすくなるように、「どう書く」の問題からいろいろ取り去ってより簡単な問題を作りました。 # # # 要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 # コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 # 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 # 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 # 要素がコンテナ中に見つからない場合、-1を返す。 # search(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- member(L1,[[_指定された要素,_指定された要素,_指定された要素|_],[_指定された要素,_指定された要素|_],[_指定された要素|_]]), append(L0,L1,_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. search(_,_,-1). % 以下のサイトは # http://d.hatena.ne.jp/E_Mattsan/20130211/1360590408 # 「E.Mattsan氏のブログ 20130211より」 # # 設問 # # まず、パタンマッチングの部分だけが見やすくなるように、「どう書く」の問題からいろいろ取り去ってより簡単な問題を作りました。 # # # 要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 # コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 # 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 # 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 # 要素がコンテナ中に見つからない場合、-1を返す。 # '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- member(L1,[[_指定された要素,_指定された要素,_指定された要素|_],[_指定された要素,_指定された要素|_],[_指定された要素|_]]), append(L0,L1,_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,-1) :- 要素がコンテナ中に見つからない場合(_指定された要素,_コンテナ). 要素がコンテナ中に見つからない場合(_指定された要素,_コンテナ) :- \+(member(_指定された要素,_コンテナ)). % 以下のサイトは # http://d.hatena.ne.jp/E_Mattsan/20130211/1360590408 # 「E.Mattsan氏のブログ 20130211より」 # # 設問 # # まず、パタンマッチングの部分だけが見やすくなるように、「どう書く」の問題からいろいろ取り去ってより簡単な問題を作りました。 # # # 要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 # コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 # 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 # 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 # 要素がコンテナ中に見つからない場合、-1を返す。 # '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- search(_指定された要素,_コンテナ,_最初の場所の最初の要素の位置). search(A,L,_nth0) :- append(L0,[A,A,A|_],L), length(L0,_nth0),!. search(A,L,_nth0) :- append(L0,[A,A|_],L), length(L0,_nth0),!. search(A,L,_nth0) :- append(L0,[A|_],L), length(L0,_nth0),!. search(A,L,-1). % 以下のサイトは # http://d.hatena.ne.jp/E_Mattsan/20130211/1360590408 # 「E.Mattsan氏のブログ 20130211より」 # # 設問 # # まず、パタンマッチングの部分だけが見やすくなるように、「どう書く」の問題からいろいろ取り去ってより簡単な問題を作りました。 # # # 要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 # コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 # 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 # 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 # 要素がコンテナ中に見つからない場合、-1を返す。 # '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。要素が2つ連続した場所がない場合、最初の要素の位置を返す。要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- '先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置),!. '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。要素が2つ連続した場所がない場合、最初の要素の位置を返す。要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- '先頭の位置は0とする。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置),!. '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。要素が2つ連続した場所がない場合、最初の要素の位置を返す。要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- '先頭の位置は0とする。要素が2つ連続した場所がない場合、最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置),!. '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。要素が2つ連続した場所がない場合、最初の要素の位置を返す。要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- '要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,-1). '先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- append(L0,[_指定された要素,_指定された要素,_指定された要素|_],_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. '先頭の位置は0とする。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- 要素が3つ連続した場所がない場合(_コンテナ,_指定された要素), append(L0,[_指定された要素,_指定された要素|_],_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. '先頭の位置は0とする。要素が2つ連続した場所がない場合、最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- 要素が2つ連続した場所がない場合(_コンテナ,_指定された要素), append(L0,[_指定された要素|_],_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. '要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,-1) :- \+(member(_指定された要素,_コンテナ)). 要素が3つ連続した場所がない場合(_コンテナ,_指定された要素) :- \+(append(_,[_指定された要素,_指定された要素,_指定された要素|_],_コンテナ)). 要素が2つ連続した場所がない場合(_コンテナ,_指定された要素) :- \+(append(_,[_指定された要素,_指定された要素|_],_コンテナ)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/705 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # [3] 環境 # 問題1メイン関数でキーボードから二つの整数n1とn2を読み込み,それらをexponent関数を呼び出して, # n1のn2乗を計算し,結果をメイン関数で表示するプログラムを書きなさい. # <実行例> # 二つの整数を入力してください. # n1 = 5 # n2 = 2 # 5の2乗は25です. # 問題2 5人の点数を読み込んでいき、その最高点を表示するプログラムを作成しなさい。 # 問題3 円の面積の一覧表を計算するプログラムを作成しなさい。 # <実行結果> # 半径 --- 面積 # 1.0 --- 3.14 # 1.1 --- 3.80 # 1.2 --- 4.52 # 1.3 --- 5.31 # 問題4 球の体積を計算するプログラムを作成しなさい。 # 実行例 # 体積 = 1766.25 # [3.1] OS: unix #  [3.2] コンパイラ名とバージョン: gcc #  [3.3] 言語: C # [4] 期限:2月19日 # [5] その他の制限: なし # よろしくお願いします。 '5人の点数を読み込んでいき、その最高点を表示する' :- findall(_点数,( between(1,5,_), 数を得る(点数,true,_点数)), _5人の点数ならび), 最高点(_5人の点数ならび,_最高点), writef('最高点は%tです\n',[_最高点). 最高点(_5人の点数ならび,_最高点) :- append(_,[_最高点|R],_5人の点数ならび), \+((member(A,R),A > _最高点)),!. % 以下のサイトは # [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://mimizun.com/log/2ch/tech/972032579/115 # 115 :初心者 :2000/10/23(月) 16:45 # Cでのプログラミングをはじめて1ヶ月なんですが、 # 逆行列を計算するプログラムを作るという宿題が出ました。 # 手始めに4×4行列の逆行列を作ることが宿題です。 # おねいさんお願いします '4×4行列の逆行列を作る'(_対象行列,_4×4行列の逆行列) :- 単位行列(4,_単位行列), 対象行列の各行に対応する単位行列行を追加(_対象行列,_単位行列,_対象行列_2), 既約ガウス行列に変形(_対象行列_2,_既約ガウス行列), '5-8列を切り取る'(_既約ガウス行列,_4×4行列の逆行列),!. 対象行列の各行に対応する単位行列行を追加(_対象行列,_単位行列,_対象行列_2) :- findall(_行,( nth1(_nth1,_対象行列,_行_1), nth1(_nth1,_単位行列,_行_2), append(_行_1,_行_2,_行)), _対象行列_2). '5-8列を'(_既約ガウス行列,_4×4行列の逆行列) :- findall(R,( member([_,_,_,_|R],_既約ガウス行列)), _4×4行列の逆行列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/595 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 5列5行の多次元配列(0または1が適当に並べられているもの)を用意し # 1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更し # そうでない場合は1のままにする この操作を10回行った配列を求めるプログラムを作成する # またこの配列は上下左右繋がっていて1,1の配列の場合上は1,5、左は5.1である # '5列5行の多次元配列(0または1が適当に並べられているもの)を用意し 1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更し そうでない場合は1のままにする この操作を10回行った配列を求めるプログラムを作成する またこの配列は上下左右繋がっていて1,1の配列の場合上は1,5、左は5.1である'(_5列5行の多次元配列,_変換された5列5行の多次元配列) :- '5列5行の多次元配列(0または1が適当に並べられているもの)を用意し1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更しそうでない場合は1のままにするこの操作を10回行った配列を求める'(_5列5行の多次元配列,_変換された5列5行の多次元配列). '5列5行の多次元配列(0または1が適当に並べられているもの)を用意し1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更しそうでない場合は1のままにするこの操作を10回行った配列を求める'(_5列5行の多次元配列,_変換された5列5行の多次元配列) :- 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換する(0,_5列5行の多次元配列,_変換された5列5行の多次元配列). 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換することを10回繰り返す(10,_5列5行の多次元配列,_5列5行の多次元配列) :- !. 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換することを10回繰り返す(N,_5列5行の多次元配列_1,_変換された5列5行の多次元配列) :- 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換する(_5列5行の多次元配列_1,_5列5行の多次元配列_2), N_2 is N + 1, 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換することを10回繰り返す(N2,_5列5行の多次元配列_2,_変換された5列5行の多次元配列). 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換する(_5列5行の多次元配列_1,_5列5行の多次元配列_2) :- 列の置換(_5列5行の多次元配列_1,_置換された5列5行の多次元配列_1), 行の置換(_5列5行の多次元配列_1,_置換された5列5行の多次元配列_2), 二つの配列の論理積を取る(_置換された5列5行の多次元配列_1,_置換された5列5行の多次元配列_2,_5列5行の多次元配列_2). 行の置換(_5列5行の多次元配列,_置換された5列5行の多次元配列) :- '最終行を前、第一行を後ろに付加した5列6行の多次元配列'(_5列5行の多次元配列,_5列7行の多次元配列), findall(L,( append(L0,[_前の行,_行,_後の行|R],_5列7行の多次元配列), '1が2または3個存在するならこの配列の列全体を0に置換する'(_前の行,_行,_後の行,L)), _置換された5列5行の多次元配列). 列の置換(_5列5行の多次元配列,_置換された5列5行の多次元配列) :- 転置(_5列5行の多次元配列,_転置された5列5行の多次元配列), 行の置換(_転置された5列5行の多次元配列,_置換された転置された5列5行の多次元配列_1), 転置(_置換された転置された5列5行の多次元配列_1,_置換された5列5行の多次元配列). '最終行を前、第一行を後ろに付加した5列7行の多次元配列'(_5列5行の多次元配列,_5列7行の多次元配列) :- last(_5列5行の多次元配列,_最終行), _5列5行の多次元配列 = [_第一行|_], append([_最終行|_5列5行の多次元配列],[_第一行],_5列7行の多次元配列),!. '1が2または3個存在するならこの配列の列全体を0に置換する'(_前の行,_行,_後の行,[0,0,0,0,0]) :- count(member(1,_前の行),_前の行の1の個数), between(2,3,_前の行の1の個数),!. '1が2または3個存在するならこの配列の列全体を0に置換する'(_前の行,_行,_後の行,[0,0,0,0,0]) :- count(member(1,_後の行),_後の行の1の個数), between(2,3,_後の行の1の個数),!. '1が2または3個存在するならこの配列の列全体を0に置換する'(_,_行,_,_行). 二つの配列の論理積を取る([],[],[]) :- !. 二つの配列の論理積を取る([L1|R1],[L2|R2],[L3|R3]) :- '2つのならび要素の論理積'(L1,L2,L3), 二つの配列の論理積を取る(R1,R2,R3). '2つのならび要素の論理積'([],[],[]) :- !. '2つのならび要素の論理積'([N1|R1],[N2|R2],[N3|R3]) :- N3 is N1 /\ N2, '2つのならび要素の論理積'(R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/610 # # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # program :- '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA配列,0,0,0,0). '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする' :- 入力したDNA塩基配列(_DNA配列), atom_chars(_DNA配列,_DNA塩基ならび), '入力したDNA塩基ならび中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA塩基ならび,0,0,0,0). 入力したDNA塩基配列(_DNA配列) :- write('DNA塩基配列を入力してください : '), get_line(_DNA配列). '入力したDNA塩基ならび中にある塩基 t, c, a, g それぞれの個数をカウントする'([],_t,_c,_a,_g) :- 塩基カウント出力([[t,_t],[c,_c],[a,_a],[g,_g]]),!. '入力したDNA塩基ならび中にある塩基 t, c, a, g それぞれの個数をカウントする'([_塩基|R],_t_1,_c_1,_a_1,_g_1) :- カウントする(_塩基,_t_1,_c_1,_a_1,_g_1,_t_2,_c_2,_a_2,_g_2), '入力したDNA塩基ならび中にある塩基 t, c, a, g それぞれの個数をカウントする'(R,_t_2,_c_2,_a_2,_g_2). カウントする(t,_t,_c,_a,_g,_t_2,_c,_a,_g) :- _t_2 is _t + 1,!. カウントする(c,_t,_c,_a,_g,_t,_c_2,_a,_g) :- _c_2 is _c + 1,!. カウントする(a,_t,_c,_a,_g,_t,_c,_a_2,_g) :- _a_2 is _a + 1,!. カウントする(g,_t,_c,_a,_g,_t,_c,_a,_g_2) :- _g_2 is _g + 1,!. 塩基カウント出力(LL) :- append(_,[[_塩基記号,_個数]|R],LL), 塩基(_塩基名,_塩基記号), writef('%t (%t) : %t\n',[_塩基名,_塩基記号,_個数]), R = []. 塩基('Thymine',t). 塩基('Cytosine',c). 塩基('Adenine',a). 塩基('Guanine',g). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/610 # # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # program :- '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA配列,0,0,0,0). '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする' :- 入力したDNA塩基配列(_DNA配列), '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA配列,0,0,0,0). 入力したDNA塩基配列(_DNA配列) :- write('DNA塩基配列を入力してください : '), get_line(_DNA配列). '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'('',_t,_c,_a,_g) :- 塩基カウント出力([[t,_t],[c,_c],[a,_a],[g,_g]]),!. '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA配列,_t_1,_c_1,_a_1,_g_1) :- sub_atom(_DNA配列,0,1,R,_塩基), カウントする(_塩基,_t_1,_c_1,_a_1,_g_1,_t_2,_c_2,_a_2,_g_2), sub_atom(_DNA配列,1,R,0,_DNA半列_2), '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA配列_2,_t_2,_c_2,_a_2,_g_2). カウントする(t,_t,_c,_a,_g,_t_2,_c,_a,_g) :- _t_2 is _t + 1,!. カウントする(c,_t,_c,_a,_g,_t,_c_2,_a,_g) :- _c_2 is _c + 1,!. カウントする(a,_t,_c,_a,_g,_t,_c,_a_2,_g) :- _a_2 is _a + 1,!. カウントする(g,_t,_c,_a,_g,_t,_c,_a,_g_2) :- _g_2 is _g + 1,!. 塩基カウント出力(LL) :- append(_,[[_塩基記号,_個数]|R],LL), 塩基(_塩基名,_塩基記号), writef('%t (%t) : %t\n',[_塩基名,_塩基記号,_個数]), R = []. 塩基('Thymine',t). 塩基('Cytosine',c). 塩基('Adenine',a). 塩基('Guanine',g). % 以下のサイトは うるう年は何回来るか(_年起点,_年終点,_うるう年の回数) :- count(( between(_年起点,_年終点,_年), うるう年(_年)), _うるう年の回数). 'ある日から後の年のある日は何日目か(起点日と終点日はそれぞれ日数に含める)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はそれぞれ日数に含める, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2. 'ある日から後の年のある日は何日目か(起点日と終点日はともに日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 2. 'ある日から後の年のある日は何日目か(起点日と終点日のどちらかは日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 1. ある年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- うるう年は何回来るか(_年起点,_年終点,_うるう年の回数), '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目). '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目) :- _何日目 is _うるう年の回数 + 365 * (_年終点 - _年起点 + 1). 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- _翌年 is _年起点 + 1, ある年の元旦から後の年の大晦日は何日目か(_翌年,_年終点,_何日目). ある年の元旦から後の年のある日は何日目か(_年起点,_年終点,_月終点,_日終点,_何日目) :- _前年 is _年終点 - 1, ある年の元旦から後の年の大晦日は何日目か(_年起点,_前年,_何日目_1), ある年月日はその年の元旦から何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _何日目_1 + _何日目_2. ある年月日はその年の元旦から何日目か(_年,_月,_日,_元旦から何日) :- 月日数ならび(_年,_月日数ならび), _前月 is _月 - 1, length(L0,_月), append(L0,_,_月日数ならび), sum(L0,_前月末日までの日数), _元旦から何日 is _前月末日までの日数 + _日. 大晦日は何日目か(_年,_月,_日,_大晦日は何日目) :- 月日数ならび(_年,_月日数ならび), 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_翌月の一日から大晦日は何日目), 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数), _大晦日は何日目 is _今日を含めて今月の末日までの日数 + _翌月の一日から大晦日は何日目. 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_何日目) :- length(L0,_月), append(L0,_翌月からの月日数ならび,_月日数ならび), sum(_翌月からの月日数ならび,_何日目). 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _今日を含めて今月の末日までの日数 is _今月の日数 - _日 + 1. 明日から今月末日までの日数(_年,_月,_日,_月日数ならび,_明日から今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _明日から今月の末日までの日数 is _今月の日数 - _日. 月日数ならび(_年,[31,29,31,30,31,30,31,31,30,31,30,31]) :- うるう年(_年),!. 月日数ならび(_年,[31,28,31,30,31,30,31,31,30,31,30,31]). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 起点日と終点日はそれぞれ日数に含める. 起点日と終点日はともに日数に含めない. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/561 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 問題A # 0と1だけで構成されたテキストファイルAがある。このファイルを読み込み、文字数をカウントし、 # 同じ文字数の0と1で構成された乱数列を生成し、テキストファイルBとして出力するプログラムを作成せよ。 # シード値はシステム時刻など適当なものを使用せよ。 # 問題B # 問題Aで使用したテキストファイルA、Bを一文字ずつXORしテキストファイルCとして出力するプログラムを作成せよ。 # '問題A 0と1だけで構成されたテキストファイルAがある。このファイルを読み込み、文字数をカウントし、 同じ文字数の0と1で構成された乱数列を生成し、テキストファイルBとして出力するプログラムを作成せよ。'(_テキストファイルA,_テキストファイルB) :- 'このファイルを読み込み、文字数をカウントし、同じ文字数の0と1で構成された乱数列を生成し'(_テキストファイルA,_要素数,_乱数数字ならび), テキストファイルBとして出力する(_テキストファイルB,_乱数数字ならび). 'このファイルを読み込み、文字数をカウントし、同じ文字数の0と1で構成された乱数列を生成し'(_テキストファイルA,_要素数,_乱数数字ならび) :- このファイルを読み込み(_テキストファイルA,Chars), 文字数をカウントし(Chars,_文字数), 同じ文字数の0と1で構成された乱数列を生成し(_文字数,Chars,_乱数数字ならび). このファイルを読み込み(_テキストファイルA,Chars) :- get_chars(_テキストファイルA,Chars). 文字数をカウントし(Chars,_文字数) :- length(Chars,_文字数). 同じ文字数の0と1で構成された乱数列を生成し(0,[],[]) :- !. 同じ文字数の0と1で構成された乱数列を生成し(N,L1,[A|R]) :- M is random(N), 一文字取り出す(M,L1,A,L2), N_1 is N - 1, 同じ文字数の0と1で構成された乱数列を生成し(N_1,L2,R). 一文字取り出す(M,L1,A,L2) :- length(L0,M), append(L0,[A|R],L1), append(L0,R,L2). テキストファイルBとして出力する(_テキストファイルB,L) :- atom_chars(_乱数文字列,L), open(_テキストファイルB,write,Outstream), write(Outstream,A), close(Outstream). % 以下のサイトは # 出典:: http://viva2ch.net/tech/976462999.html # # プロローグについて質問です。 # SWI-Prologのplwin Version5.2.13でプログラムを組んでいます。 # atomに重複があれば最初のatomは残して後ろの重複したatomは消す、という # プログラムを作りたいのですが…できません。 # # 動作は # remdup([a, b, c, a, d, c], X). # は # X=[a, b, c, d] # となるはずです。 # # 本に載っていたのを試したのですが # 順番が逆になってしまいます。↓ # # remdup(L, M) :- dupacc(L, [], M). # dupacc([], A, A). # dupacc([H|T], A, L) :- member(H, A), dupacc(T, A, L). # dupacc([H|T], A, L) :- dupacc(T, [H|A], L). # # 結果: # 1 ?- remdup([a, b, c, a, d, c], X). # X = [d, c, b, a] # # reverse()を「使わずに」どうにか完成させたいのですが # できますでしょうか? # ちなみにmember()やappend()、atomp()、listp()、last()など基本的な関数は既に作りました、 # ですからそれらは使えます。 # どうかお助けください。m(__)m remdup(L1,L2) :- atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L1,L2). atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L1,L2) :- atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L1,[],L2). atomに重複があれば最初のatomは残して後ろの重複したatomは消す([],_,[]). atomに重複があれば最初のatomは残して後ろの重複したatomは消す([H|R1],L2,R3) :- member(H,L2), atomに重複があれば最初のatomは残して後ろの重複したatomは消す(R1,L2,R3). atomに重複があれば最初のatomは残して後ろの重複したatomは消す([H|R1],L2,[H|R3]) :- \+(member(H,L2)), atomに重複があれば最初のatomは残して後ろの重複したatomは消す(R1,[H|L2],R3). % 以下のサイトは # 出典:: http://viva2ch.net/tech/976462999.html # # プロローグについて質問です。 # SWI-Prologのplwin Version5.2.13でプログラムを組んでいます。 # atomに重複があれば最初のatomは残して後ろの重複したatomは消す、という # プログラムを作りたいのですが…できません。 # # 動作は # remdup([a, b, c, a, d, c], X). # は # X=[a, b, c, d] # となるはずです。 # # 本に載っていたのを試したのですが # 順番が逆になってしまいます。↓ # # remdup(L, M) :- dupacc(L, [], M). # dupacc([], A, A). # dupacc([H|T], A, L) :- member(H, A), dupacc(T, A, L). # dupacc([H|T], A, L) :- dupacc(T, [H|A], L). # # 結果: # 1 ?- remdup([a, b, c, a, d, c], X). # X = [d, c, b, a] # # reverse()を「使わずに」どうにか完成させたいのですが # できますでしょうか? # ちなみにmember()やappend()、atomp()、listp()、last()など基本的な関数は既に作りました、 # ですからそれらは使えます。 # どうかお助けください。m(__)m atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L1,L2) :- remdup(L1,L2). remdup(L1,L2) :- dupacc(L1,[],L2). dupacc([],_,[]). dupacc([H|R1],L2,R3) :- member(H,L2), dupacc(R1,L2,R3). dupacc([H|R1],L2,[H|R3]) :- \+(member(H,L2)), dupacc(R1,[H|L2],R3). % 以下のサイトは # 出典:: http://viva2ch.net/tech/976462999.html # # プロローグについて質問です。 # SWI-Prologのplwin Version5.2.13でプログラムを組んでいます。 # atomに重複があれば最初のatomは残して後ろの重複したatomは消す、という # プログラムを作りたいのですが…できません。 # # 動作は # remdup([a, b, c, a, d, c], X). # は # X=[a, b, c, d] # となるはずです。 # # 本に載っていたのを試したのですが # 順番が逆になってしまいます。↓ # # remdup(L, M) :- dupacc(L, [], M). # dupacc([], A, A). # dupacc([H|T], A, L) :- member(H, A), dupacc(T, A, L). # dupacc([H|T], A, L) :- dupacc(T, [H|A], L). # # 結果: # 1 ?- remdup([a, b, c, a, d, c], X). # X = [d, c, b, a] # # reverse()を「使わずに」どうにか完成させたいのですが # できますでしょうか? # ちなみにmember()やappend()、atomp()、listp()、last()など基本的な関数は既に作りました、 # ですからそれらは使えます。 # どうかお助けください。m(__)m remdup(L,X) :- atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L,X). atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L,X) :- findall(A,( append(L0,[A|_],L), \+(member(A,L0))), X). % 以下のサイトは # 出典:: http://viva2ch.net/tech/976462999.html # # プロローグについて質問です。 # SWI-Prologのplwin Version5.2.13でプログラムを組んでいます。 # atomに重複があれば最初のatomは残して後ろの重複したatomは消す、という # プログラムを作りたいのですが…できません。 # # 動作は # remdup([a, b, c, a, d, c], X). # は # X=[a, b, c, d] # となるはずです。 # # 本に載っていたのを試したのですが # 順番が逆になってしまいます。↓ # # remdup(L, M) :- dupacc(L, [], M). # dupacc([], A, A). # dupacc([H|T], A, L) :- member(H, A), dupacc(T, A, L). # dupacc([H|T], A, L) :- dupacc(T, [H|A], L). # # 結果: # 1 ?- remdup([a, b, c, a, d, c], X). # X = [d, c, b, a] # # reverse()を「使わずに」どうにか完成させたいのですが # できますでしょうか? # ちなみにmember()やappend()、atomp()、listp()、last()など基本的な関数は既に作りました、 # ですからそれらは使えます。 # どうかお助けください。m(__)m atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L,X) :- remdup(L,X). remdup(L,X) :- findall(A,( append(L0,[A|_],L), \+(member(A,L0))), X). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/425 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # クイックソート、バブルソート、選択ソートの三種のソート関数 # それぞれ、void qusort(int[]), busort(int[]) sesort(int[]),を作れ。 #   並び順は、降順。ソートした結果は引数配列と同じ配列に返してやる。 # 選択ソート([A],[A]) :- !. 選択ソート(L1,[_最小値|R2]) :- 最小値の抜き取り(L1,_最小値,R1), 選択ソート(R1,R2). 最小値の抜き取り(L1,_最小値,R1) :- append(L0,[_最小値|R2],L1), \+((member(D,R2),D < _最小値)), append(L0,R2,R1),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/287 # # [1] 授業単元: プログラミング # # [2] 問題文(含コード&リンク):1方向線上リストを使って、スタックを実現せよ。ただし、各記憶要素xは整数値をとるもの # とする。 要素xをプッシュするpush(int x)、ポップしてその値を返すpop()、スタックが # 空かどうかを判断し真偽値を返すempty()、ならびに現在のスタック内容全体を表示するshow()を用意する。 # push(_x,_スタック,[_x|_スタック]). pop([_x|_スタック],_x,_スタック). empty([]). show(_スタック) :- append(_,[_要素|R],_スタック) writef('%t\n',[_要素]), R = []. % 以下のサイトは # 出典:: 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/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, _B,_その結果) :- '次のA・Bの行列をA×Bの計算をして、'(_A, _B,_その結果), その結果を表示する(_その結果). '次のA・Bの行列をA×Bの計算をして、'(_A, _B,_その結果) :- _A = [[5,3],[3,8],[1,6],[9,1]], _B = [[7,1,5,4],[1,9,2,8]], 転置(_B,_B_2), 行列の掛け算_1(_A,_B_2,_その結果). その結果を表示する(_その結果) :- 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/149 # # [1] 授業単元:データ構造アルゴリズム # [2] 問題文(含コード&リンク) : qsort関数を用いてソートするプログラムを作成しなさい。身長の昇順、視力の降順など、複数の条件でソートすること。 # ※qsort関数 # 書式 void qsort(void*base,size_t nmemb,size_t size,int(*compar)(const void*,const void)) # 'qsort関数を用いてソートするプログラムを作成しなさい。身長の昇順、視力の降順など、複数の条件でソートすること。'(_テーブル名,_昇順降順,_鍵ならび,L) :- 単位節からリストに変換(_テーブル名,_属性名ならび,L1), 鍵位置ならびを得る(_鍵ならび,_属性名ならび,_鍵位置ならび), 鍵付きqsort(L1,_昇順降順,_鍵位置ならび,L2). 単位節からリストに変換(_テーブル名,_属性名ならび,L1) :- findall(_属性名,( テーブル定義(_テーブル名,_,_属性名)), _属性名ならび), length(_属性名ならび,Len), length(_引数ならび,Len), P =.. [_身体検査|_引数ならび], findall(_引数ならび,( call(P)), L1). 鍵位置ならびを得る([],_,[]). 鍵位置ならびを得る([_鍵|R1],_属性名ならび,[_鍵位置|R3]) :- nth1(_鍵位置,_属性名ならび,_鍵), 鍵位置ならびを得る(R1,_属性名ならび,R3). 鍵付きqsort([],_,_,[]) :- !. 鍵付きqsort([_軸要素|R1],_昇順降順,_鍵位置ならび,LL2) :- 鍵取得(_鍵位置ならび,_軸要素,_軸要素の鍵ならび), 分割(_軸要素の鍵ならび,R1,_昇順降順,_鍵位置ならび,LL1,LL2), 鍵付きqsort(LL1,_鍵位置ならび,LL1_s), 鍵付きqsort(LL2,_鍵位置ならび,LL2_2), append(LL1_s,[_軸要素|LL2_s],LL2). 鍵取得([],_,[]). 鍵取得([_鍵位置|R1],L,[_鍵|R3]) :- nth1(_鍵位置,L,_鍵), 鍵取得(R1,L,R3). 分割(_軸要素の鍵ならび,[],_,_鍵位置ならび,[],[]). 分割(_軸要素の鍵ならび,[L1|R2],_昇順降順,_鍵位置ならび,L2,L3) :- 鍵取得(_鍵位置ならび,L1,_鍵ならび_2), 分割_2(_昇順降順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,L2,L3), 分割(_軸要素の鍵ならび,R2,_昇順降順,_鍵位置ならび,R2,R3). 分割_2(昇順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,[_鍵ならび|R2],R3) :- _軸要素の鍵ならび @=< _鍵ならび. 分割_2(昇順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,R2,[_鍵ならび|R3]) :- _軸要素の鍵ならび @> _鍵ならび. 分割_2(降順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,[_鍵ならび|R2],R3) :- _軸要素の鍵ならび @>= _鍵ならび. 分割_2(降順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,R2,[_鍵ならび|R3]) :- _軸要素の鍵ならび @< _鍵ならび. % 以下のサイトは yes. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/158 # # [1] 授業単元: プログラミング 〜構造体〜 # [2] 問題文(含コード&リンク): 3名の名前と性別、10桁の会員番号を入力し表示せよ # *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ # 入力(1234567890)→出力(12-3456-7890) # *入力された会員番号が10桁に満たない場合、 # または大きい場合は再度入力する指示を入れること # '3名の名前と性別、10桁の会員番号を入力し表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890) *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること' :- '3名の名前と性別、10桁の会員番号を入力し *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_3名の名前と性別と会員番号), '表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890)'(_3名の名前と性別と会員番号). '3名の名前と性別、10桁の会員番号を入力し *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_3名の名前と性別と会員番号) :- findall([_名前,_性別,_会員番号],( between(1,3,_), 名前を得る(_名前), 性別を得る(_性別), '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号)), _3名の名前と性別と会員番号). 名前を得る(_名前) :- write('名前を入力してください : '), get_line(_名前). 性別を得る(_性別) :- 整数を得る('性別を番号で入力してください 1..男 2..女\n',between(1,2,_性別番号),_性別番号), 性別番号から性別を得る(_性別番号,_性別). 性別番号から性別を得る(1,男). 性別番号から性別を得る(2,女). '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号) :- write('会員番号(数字10桁)を入力してください : '), get_line(Line), '診断:: 会員番号を得る'(Line,_会員番号),!. '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号) :- '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号). '診断:: 会員番号を得る'(Line,_会員番号) :- atom_chars(Line,Chars), 会員番号は数字のみで入力し(Chars), '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars),!. '診断:: 会員番号を得る'(Line,_会員番号) :- write('再入力をお願いします\n'), fail. 会員番号は数字のみで入力し(Chars) :- forall((member(A,Chars), member(A,['0','1','2','3','4','5','6','7','8','9'])),true),!. 会員番号は数字のみで入力し(Chars) :- writef('入力された文字列 %t には数字以外の文字が混入しています\n',[Chars]), fail. '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars) :- length(Chars,10),!. '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars) :- writef('入力された文字列 %t は10桁でありません\n',[Chars]), fail. '表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890)'(_3名の名前と性別と会員番号) :- append(_,[[_名前,_性別,_会員番号]|R],_3名の名前と性別と会員番号), number_chars(_会員番号,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), atomic_list_concat([[_1,_2,-,_3,_4,_5,_6,-,_7,_8,_9,_10],_会員表示文字列), writef('名前: %t\n性別: %t\n会員番号: %t\n\n',[_会員番号表示文字列]), R = []. % 以下のサイトは # [1] 授業単元:C言語 # [2] 問題 http://ime.nu/codepad.org/yV0KrZox # # 問題4 # 9行9列の九九の表のそれぞれの値を計算によって算出し、表示するプログラムを、二次元配列を用いて作成しなさい。 # ------------------------------------------------------------------- # 1 2 3 4 5 6 7 8 9 # 2 4 6 8 10 12 14 16 18 # 3 6 9 12 15 18 21 24 27 # 4 8 12 16 20 24 28 32 26 # 5 10 15 20 25 30 35 40 45 # 6 12 18 24 30 36 42 48 54 # 7 14 21 28 35 42 49 56 63 # 8 16 24 32 40 48 56 64 72 # 9 18 27 36 45 54 63 72 81 # -------------------------------------------------------------------- # '9行9列の九九の表のそれぞれの値を計算によって算出し、表示するプログラムを、二次元配列を用いて作成しなさい。' :- length(LL,9), findall(L,行の計算(LL,L),LL), 表示する(LL). 行の計算(LL,L) :- nth1(M,LL,L), length(L,9), findall(X,列の計算(M,L,X),L). 列の計算(M,L,X) :- nth1(N,L,_), X is M * N. 表示する(LL) :- write('-------------------------------------------------------------------\n'), 行を表示する(LL,R), R = [], write('-------------------------------------------------------------------\n'). 行を表示する(LL,R) :- append(_,[L|R],LL), writef('%3r%3r%3r%3r%3r%3r%3r%3r%3r\n',L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/78 # # [1] 授業単元:C言語 # [2] 問題 http://ime.nu/codepad.org/yV0KrZox # # 問題2 # 以下2つの3行3列の行列の和を求め、表示するプログラムを、配列を用いて作成しなさい。 # ---------------------------------------------------------------------- # A = # 8 6 9 # 1 5 2 # 2 5 5 # B = # 3 2 3 # 8 6 7 # 2 5 1 # A + B = # 11 8 12 # 9 11 9 # 4 10 6 # --------------------------------------------------------------------- '2つの3行3列の行列の和を求め、表示する'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :- '2つの3行3列の行列の和を求め、'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]), 表示する([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]). '2つの3行3列の行列の和を求め、'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :- _C_1_1 is _A_1_1 + _B_1_1, _C_1_2 is _A_1_2 + _B_1_2, _C_1_3 is _A_1_3 + _B_1_3, _C_2_1 is _A_2_1 + _B_2_1, _C_2_2 is _A_2_2 + _B_2_2, _C_2_3 is _A_2_3 + _B_2_3, _C_3_1 is _A_3_1 + _B_3_1, _C_3_2 is _A_3_2 + _B_3_2, _C_3_3 is _A_3_3 + _B_3_3. 表示する([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :- 'A行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]), 'B行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]), 'A+B行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]). 'A行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]) :- write('A =\n'), append(_,[[_A_1,_A_2,_A_3]|R],[[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]), atomic_list_concat([_A_1,_A_2,_A_3],' ',S), writef('%t\n',[S]), R = []. 'B行列の表示'([[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]]) :- write('B =\n'), append(_,[[_B_1,_B_2,_B_3]|R],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]]), atomic_list_concat([_B_1,_B_2,_B_3],' ',S), writef('%t\n',[S]), R = []. 'A+B行列の表示'([[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :- write('A + B =\n'), append(_,[[_C_1,_C_2,_C_3]|R],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]), atomic_list_concat([_C_1,_C_2,_C_3],' ',S), writef('%t\n',[S]), R = []. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの3行3列の行列の和を求め、表示する'(_A,_B,_行列の和) :- すべての同一位置の要素の和を求める(_A,_B,_行列の和), 表示する([['A',_A],['B',_B],['A + B',_行列の和]]). すべての同一位置の要素の和を求める(_A,_B,_行列の和) :- findall(_同一列の和ならび,( nth1(_nth1,_A,_行_A), nth1(_nth1,_B,_行_B), 同一列の和を求める(_行_A,_行_B,_同一列の和ならび)), _行列の和). 同一列の和を求める(_行_A,_行_B,_同一列の和ならび) :- findall(_列の和,( nth1(_nth1,_行_A,_列の値_1), nth1(_nth1,_行_B,_列の値_2), _列の和 is _列の値_1 + _列の値_2), _同一列の和ならび). 表示する(LL) :- append(_,[_行列のシンボル,_行列]|R],LL), writef('%t =\n',[_行列のシンボル]), 行列の表示(_行列), R = []. 行列の表示(_行列) :- append(_,[[_行_1,_行_2,_行_3]|R_1],_行列), atomic_list_concat([_行_1,_行_2,_行_3],' ',_行表示), writef('%t\n,[_行表示]), R = [],!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元: リスト処理 # [2] 問題文(含コード&) http://codepad.org/3DdhcBUM # # /* # # seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 # また、整列する際に要素どうしを比較した回数も表示しなさい。 # # 【実行例】 # # 番号 氏名      得点 # 1021 Machida Masato 100 # 1017 Nonaka Fujio 98 # 1011 Suzuki kenichi 93 # 1019 Fujimoto Kaoru 92 # 1006 kato Ichiro 91 # ・ ・     ・ # ・ ・     ・ # ・ ・     ・ # 1020 Hoshi Izumi 32 # 整列の為の比較回数=132回 # # ※長いので実行結果は途中省略しています。 # ※比較回数はコードによって異なる場合があります。 # # */ 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 また、整列する際に要素どうしを比較した回数も表示しなさい。' :- 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび), リスト処理による挿入法で得点の降順に整列して(_生徒ならび,[],_整列済み生徒ならび,0,_比較回数), 表示しなさい(_整列済み生徒ならび,_比較回数). 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび) :- get_split_lines('seito.dat',[' '],_生徒ならび). リスト処理による挿入法で得点の降順に整列して([[_学籍番号,_姓,_名,_得点]|R1],L1,_整列済み生徒ならび,_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,L1,L2,_比較回数_1,_比較回数_2), リスト処理による挿入法で得点の降順に整列して(R1,L2,_整列済み生徒ならび,_比較回数_2,_比較回数),!. リスト処理による挿入法で得点の降順に整列して([],_整列済み生徒ならび,_整列済み生徒ならび,_比較回数,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],[[_学籍番号,_名,_名,_得点],[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],_比較回数_1,_比較回数) :- 比較回数 is _比較回数_1 + 1, _得点 >= _得点_1,!. 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R1],[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R2],_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,R1,R2,_比較回数_1,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[],[[_学籍番号,_名,_名,_得点]],_比較回数,_比較回数) :- !. 表示しなさい(_整列済み生徒ならび,_比較回数) :- 見出しの表示, append(_,[[_学籍番号,_姓,_名,_得点]|R],_整列済み生徒ならび), 整形して表示する(_学籍番号,_姓,_名,_得点), R = [], writef('整列の為の比較回数=%t回\n',[_比較回数]). 見出しの表示 :- write('番号 氏名      得点\n'). 整形して表示する(_学籍番号,_姓,_名,_得点) :- 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列), 得点を頭部空白3桁に(_得点,_得点文字列), atomic_list_concat([_学籍番号,_姓文字列,_名文字列,_得点文字列],' ',_表示文字列), writef('%t\n',[_表示文字列]). 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列) :- '8桁に'(_姓,_姓文字列), '8桁に'(_名,_名文字列). '8桁に'(_項,_8桁文字列) :- atom_chars(_項,Chars_1), length(L,8), append(L1,L2,L), all(L2,' '), atom_chars(_8桁文字列,L). 得点を頭部空白3桁に(_得点,_得点文字列) :- number_chars(_得点,Chars), length(L,3), append(L0,Chars,L), all(L0,' '), atom_chars(_得点文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,( member(A,Lines1), split(A,Sep,Line)), Lines). get_lines(Instream,end_of_file,_,_,[]) :-!. get_lines(Instream,S,[],_終了検索対象ならび,[S]) :- member(A,_終了検索対象ならび), 検索(S,A),!. get_lines(Instream,S,[],[],[S|R]) :- get_line(Instream,S2), get_lines(Instream,S2,[],[],R),!. get_lines(Instream,S,[],_終了検索対象ならび,[S|R]) :- member(A,_終了検索対象ならび), \+(検索(S,A)), get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), member(B,_終了検索対象ならび), 検索(S,B),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S|R]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), !, get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,_,_開始検索対象ならび,_終了検索対象ならび,X) :- get_line(Instream,S2), get_lines(Instream,S2,_開始検索対象ならび,_終了検索対象ならび,X),!. get_lines(_ファイル,_スタート行,_最終行,X) :- integer(_スタート行), integer(_最終行), 行位置指定選択(_ファイル,_スタート行,_最終行,X). get_lines(_ファイル,_開始検索対象ならび,_終了検索対象ならび,X) :- \+(integer(_開始検索対象ならび)), \+(integer(_終了検索対象ならび)), open(_ファイル,read,Instream), get_line(Instream,S), get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,X), close(Instream),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat, get_line(user_input,Line), (Line = end_of_file , (!) , fail ; true)), Lines). get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_chars(Instream,end_of_file,[]) :- !. get_chars(Instream,_,[]) :- at_end_of_stream(Instream),!. get_chars(Instream,X,[X|R]) :- get_char(Instream,Y), get_chars(Instream,Y,R) . get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists_file(File_1), open(File_1,read,Instream), get_char(Instream,X), get_chars(Instream,X,L), close(Instream),!. get_chars(Instream,L) :- is_stream(_,Instream,_), get_char(Instream,X), get_chars(Instream,X,L),!. get_chars(L) :- findall(U,( repeat, get_char(U), (U = end_of_file , (!) , fail ; true)), L). get_line(X) :- get_line(user_input,X). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,_,[]) :- at_end_of_stream(Instream),!. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), atomic_list_concat(U,A), chars_lines(R,R2). split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y) , \+(member(U,_区切り符号ならび))), Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), C number Nl,!. split_5(B,C) :- atomic_list_concat(B,C),!. all([],_). all([V|R],V) :- all(R,V). 検索(_文字列,_副文字列) :- atom_length(_文字列,_文字列の文字数), atom_length(_副文字列,_副文字列の文字数), Max is _文字列の文字数 - _副文字列の文字数, between(0,Max,N), sub_atom(_文字列,N,_副文字列の文字数,_副文字列),!. 行位置指定選択(_ファイル,_選択先頭行,_選択最終行,X) :- wc(_ファイル,[[_行,_,_,_]]), _行数_1 is _行 - _選択先頭行 + 1, _行数_2 is _選択最終行 - _選択先頭行, atomic_list_concat(['tail -',_行数_1,' ',_ファイル,' | head -',_行数_2],S), shs(S,X). wc(F,X) :- exists_file(F1), atomic_list_concat(['wc ',F1],S), sh(S,X),!. wc(F,X) :- atomic_list_concat([F,' | wc'],S), sh(S,X),!. sh(Command,X) :- shs(Command,Y), findall(U,(member(V,Y) , make_list(V,[' ',','],U)),X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,_,[]) :- at_end_of_stream(Instream),!. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元:リスト構造 # [2] 問題文(含コード&amp;リンク): # http://ime.nu/iup.2ch-library.com/i/i0825590-1357830189.gif # # 以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作 成せよ. # リストは1つとし,初期値は「15 4 32 1」である. # ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. # ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. # ・データのソート(降順)を行う関数を作成する. # ・リストの平均値を計算し出力する関数を作成する。 # # ------表示例------ # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : # ------------------ # # ------実行例------- # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 1 # 追加するデータを入力してください : 10 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 4 # リストの平均値 : 12.4 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 3 # リスト : 32 15 10 4 1 # :- dynamic(リスト/1). '以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作成せよ. リストは1つとし,初期値は「15 4 32 1」である. ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. ・データのソート(降順)を行う関数を作成する. ・リストの平均値を計算し出力する関数を作成する。 ------表示例------ 1. データの追加 2. データの削除 3. データのソート(降順) 4. リストの平均値 5. 終了 何を実行しますか : ' :- 'リストは1つとし,初期値は「15 4 32 1」である', メニューを表示, 各項目の機能を実現して結果を表示する. 'リストは1つとし,初期値は「15 4 32 1」である' :- assertz(リスト([15,4,32,1])). メニューを表示 :- write('1. データの追加\n2. データの削除\n3. データのソート(降順)\n4. リストの平均値\n5. 終了\n何を実行しますか : '). メニューを表示 :- メニューを表示. 各項目の機能を実現して結果を表示する :- 機能番号を選択する(_機能番号), 機能を実現して結果を表示する(_機能番号), _機能番号 = 5,!. 機能番号を選択する(_機能番号) :- get_line(Line), '診断:: メニューの選択'(Line,_機能番号),!. 機能番号を選択する(_機能番号) :- 機能番号を選択する(_機能番号). '診断:: メニューの選択'(Line,_機能番号) :- atom_number(Line,_機能番号), integer(_機能番号), between(1,5,_機能番号),!. '診断:: メニューの選択'(Line,_機能番号) :- writef('選択された %t からは適切な機能番号が得られません。再入力をお願いします。\n',[Line]), fail. 機能を実現して結果を表示する(5) :- !. 機能を実現して結果を表示する(1) :- データの追加. 機能を実現して結果を表示する(2) :- データの削除. 機能を実現して結果を表示する(3) :- 'データのソート(降順)'. 機能を実現して結果を表示する(4) :- リストの平均値. データの追加 :- write('追加するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), append(L1,[_データ],L2), assertz(リスト(L2)). データの削除 :- write('削除するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), ならびから削除(_データ,L1,L2), assertz(リスト(L2)). 'データのソート(降順)' :- リスト(L1), 降順整列(L1,L2), atomic_list_concat(L2,' ',S), writef('リスト : %t\n',[S]). リストの平均値 :- リスト(L1), findavg(_データ,( member(_データ,L1)), _平均値), atomic_list_concat(L1,_リスト表示), writef('平均値 : %t\nリスト : %t\n',[_平均値,_リスト表示]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,_,[e,n,d,'_',o,f,'_',f,i,l,e]) :- at_end_of_stream(Stream),!. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. 降順整列([],[]). 降順整列([_軸要素|R1],_降順に整列されたならび) :- 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび), 降順整列(_軸要素に等しいか大きいならび,_整列した軸要素に等しいか大きいならび), 降順整列(_軸要素より小さいならび,_整列した軸要素より小さいならび), append(_整列した軸要素に等しいか大きいならび,[_軸要素|_整列した軸要素より小さいならび],_降順に整列したならび). 降順分割(_,[],[],[]). 降順分割(_軸要素,[_要素|R],[_要素|_軸要素に等しいか大きいならび],_軸要素より小さいならび) :- _要素 @>= _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). 降順分割(_軸要素,[_要素|R],_軸要素に等しいか大きいならび,[_要素|_軸要素より小さいならび]) :- _要素 @< _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). findavg(_集約項,_項,_相加平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _相加平均 is _合計値 / _ならびの長さ,!. sum([],0). sum([N|R],S) :- sum(R,S_1), S is N + S_1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/998 # # [1] 授業単元:C++ # [2] 問題文(含コード&リンク): # 入力:二つの整数n,m # 出力:1からnまでの番号札を持った人が、番号順に円陣を組んでいる。 #      最初に、1番札の人からm番目の人が退席する(円陣は1減) #      続いて、その次からm番目の人が退席する。これを繰り返したときの、 #      退席者の順番を求め、出力せよ。 #     -例:n = 9,m = 5のとき、退席者の順番は5,1,7,4,3,6,9,2,8 # '入力:二つの整数n,m 出力:1からnまでの番号札を持った人が、番号順に円陣を組んでいる。      最初に、1番札の人からm番目の人が退席する(円陣は1減)      続いて、その次からm番目の人が退席する。これを繰り返したときの、      退席者の順番を求め、出力せよ。'(_n,_m) :- findall(N,( between(1,_n,N)), L1), '最初に、1番札の人からm番目の人が退席する(円陣は1減)      続いて、その次からm番目の人が退席する。これを繰り返したときの、      退席者の順番を求め、'(L1,_m,L2), '出力せよ。'(L2). '最初に、1番札の人からm番目の人が退席する(円陣は1減)      続いて、その次からm番目の人が退席する。これを繰り返したときの、      退席者の順番を求め、'([],_,[]) :- !. '最初に、1番札の人からm番目の人が退席する(円陣は1減)      続いて、その次からm番目の人が退席する。これを繰り返したときの、      退席者の順番を求め、'(L1,_m,[N|R]) :- _m_1 is _m - 1, ならびの回転(左方向,_m_1,L1,[N|L3]), '最初に、1番札の人からm番目の人が退席する(円陣は1減)      続いて、その次からm番目の人が退席する。これを繰り返したときの、      退席者の順番を求め、'(L2,_m,R). ならびの回転(_方向,N,L1,L2) :- length(Ln,N), ならびの回転_2(_方向,Ln,L1,L2). ならびの回転_2(_方向,[],L,L). ならびの回転_2(_方向,[_|Ln],L1,L2) :- ならびの回転(_方向,L1,L1_1), ならびの回転_2(_方向,L2,L1_1,L2). ならびの回転(左方向,[A|R],L) :- append(R,[A],L). ならびの回転(右方向,L1,L) :- append(R,[A],L1), append([A],R,L). '出力せよ。'(L2) :- writef('%t\n',[L2]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 161代目 #984 # [1] 授業単元:プログラミング応用 # [2] 問題文(含コード&リンク):西暦を年号に変換するプログラムを作成する。 # ただし、入力できるのは、1868年以降からであり、2008年以降も平成とする。 # 明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。 # 下記を参考にプログラムを作成しなさい。 # int gannen[]={1989, 1926, 1912, 1868}; # char nengou[][8]={"heisei", "syouwa", "taisyou", "meiji"}; # '西暦を年号に変換するプログラムを作成する。 ただし、入力できるのは、1868年以降からであり、2008年以降も平成とする。 明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。'(_西暦,_年号) :- 'ただし、入力できるのは、1868年以降からであり、'(_西暦), '明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。'(_元号ならび,_元年の西暦ならび), 西暦を年号に変換する(_西暦,_元号ならび,_元年の西暦ならび,_年号). 'ただし、入力できるのは、1868年以降からであり、'(_西暦) :- _西暦 >= 1868. '明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。'([明治,大正,昭和,平成],[1868,1912,1926,1989]). 西暦を年号に変換する(_西暦,_元号ならび,_元年の西暦ならび,_年号) :- 西暦から元号と元年の西暦を得る(_西暦,_元号ならび,_元年の西暦ならび,_元号,_元年の西暦), 年号を得る(_西暦,_元号,_元年の西暦,_年号). 西暦から元号と元年の西暦を得る(_西暦,_元号ならび,_元年の西暦ならび,_元号,_元年の西暦) :- 元号候補とその元年の西暦を得る(_元号ならび,_元年の西暦ならび,_元号,_元年の西暦), 西暦が存在する元号の元年の西暦(_西暦,_元年の西暦ならび,_元年の西暦). 元号候補とその元年の西暦を得る(_元号ならび,_元年の西暦ならび,_元号,_元年の西暦) :- nth1(_nth1,_元号ならび,_元号), nth1(_nth1,_元年の西暦ならび,_元年の西暦). 西暦が存在する元号の元年の西暦(_西暦,_元年の西暦ならび,_元年の西暦) :- append(L1,[_元年の西暦|L2],_元年の西暦ならび), forall(member(N,L1),N < _西暦), forall(member(N,L2),N > _西暦). 年号を得る(_西暦,_元号,_元年の西暦,_年号) :- N is _西暦 - _元年の西暦 + 1, 和年表現(N,_和年), atomic_list_concat([_元号,_和年],_年号). 和年表現(N,_和年) :- '二十未満の和年表現'(N,_和年). 和年表現(N,_和年) :- '二十以上の和年表現'(N,_和年). '二十未満の和年表現'(N,_和年) :- between(1,19,N), nth0(N,['',元年,二年,三年,四年,五年,六年,七年,八年,九年,十年,十一年,十二年,十三年,十四年,十五年,十六年,十七年,十八年,十九年],_和年). '二十以上の和年表現'(N,_和年) :- N >= 20, '二十以上の十の位、一の位'(N,_十の位,_一の位), atomic_list_concat([_十の位,十,_一の位,年],_和年). '二十以上の十の位、一の位'(N,_十の位,_一の位) :- N_1 is N // 10, N_2 is N mod 10, nth0(N_1,['',一,二,三,四,五,六,七,八,九],_十の位), nth0(N_2,['',一,二,三,四,五,六,七,八,九],_一の位). % 以下のサイトは # 出典:: 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/1354070278/859 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/kie.nu/Hag # ファイルの内容を行番号付きで出力するプログラムを作成せよ # ファイルの内容を行番号付きで出力するプログラムを作成せよ(_ファイル名) :- get_lines(_ファイル名,Lines), append(L0,[_行|R],Lines), length([_|L0],_行番号), writef('%t %t\n',[_行番号,_行]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/717 # # [1] 授業単元: C演習 # [2] 問題文(含コード&リンク): # (問題文)http://imgur.com/bAeG1 # (途中まで書いたコード)://codepad.org/nwwt2hgU # (使用するテキストファイル、結果含む) # http://s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/joyful.cgi? のNo.396 # :- dynamic(転置索引/2). テキストのダウンロード(_サイトファイル名,_出力ファイル名) :- atomic_list_concat(['w3m -dump ',_サイトのファイル名],S), popen(S,Chars), open(_出力ファイル名,write,Outstream), ファイルに書き込む(Outstream,Chars), close(Outstream). ファイルに書き込む(Outstream,[]). ファイルに書き込む(Outstream,[C|R]) :- put_char(Outstream,C), ファイルに書き込む(Outstream,R). 転置索引を作る(_ファイル名) :- open(_ファイル名,read,Instream), ストリームから転置索引を作る(Instream,0), close(Instream). ストリームから転置索引を作る(Instream,_) :- at_end_of_stream(Instream),!. ストリームから転置索引を作る(Instream,N) :- get_line(Instream,Line), N_2 is N + 1, 語彙を転置索引に登録する(Line,N), ストリームから転置索引を作る(Instream,N_2). 語彙を転置索引に登録する(Line,N) :- split(Line,[' ',',','.',':','(',')'],L), member(_語彙,L), \+(転置索引(_語彙,N)), assertz(転置索引(_語彙,N)), fail. 語彙を転置索引に登録する(_,_). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/682 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 以下の手順に従ってプログラムを作成せよ。 # 適宜printfを利用して、入力支援(「文字列を入力してください」等の画面表示)を行うこと。 # 1.文字配列name[5][64]を作成 # 2.キーボードから5人分の名前を入力し、name配列に格納 # 3.キーボードから名前を入力し、name配列の何番目に格納されているかを検索して表示 # (見つからなかった場合は「見つかりません」と表示) # 4.「quit」が入力されるまで3の処理を繰り返す # '以下の手順に従ってプログラムを作成せよ。 適宜printfを利用して、入力支援(「文字列を入力してください」等の画面表示)を行うこと。 1.文字配列名前[5][64]を作成 2.キーボードから5人分の名前を入力し、名前配列に格納 3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す' :- '1.文字配列名前[5][64]を作成'(_名前配列), '2.キーボードから5人分の名前を入力し、名前配列に格納'(_名前配列), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前). '1.文字配列名前[5][64]を作成'(LL) :- length(_名前配列,5), findall(L,( member(L,_名前配列), length(L,64)), _名前配列). '2.キーボードから5人分の名前を入力し、名前配列に格納'(_名前配列) :- findall(L,( member(L,_名前配列), 名前を入力し(_名前), 名前配列に格納(_名前,L)), _名前配列). 名前を入力し(_名前) :- write('名前を入力してください : '), get_line(_名前). 名前配列に格納(_名前,L) :- atom_chars(_名前,Chars), append(Chars,R,L), all(R,' '). '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前) :- 'キーボードから名前を入力し'(_名前), '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前). 'キーボードから名前を入力し'(_名前) :- write('検索する名前を入力してください : '), get_line(_名前). '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '4.「quit」が入力されるまで3の処理を繰り返す'(_名前),!. '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '名前配列の何番目に格納されているかを検索して'(_名前,_名前配列,_nth1), writef('%t番目 %t\n',[_nth,_名前]),!, fail. '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '見つからなかった場合は「見つかりません」と表示', fail. '見つからなかった場合は「見つかりません」と表示' :- write('見つかりません\n'). '名前配列の何番目に格納されているかを検索して'(_名前,_名前配列,_nth1) :- atom_chars(_名前,Chars), nth1(_nth1,_名前配列,L), append(Chars,R,L), all(R,' '). '4.「quit」が入力されるまで3の処理を繰り返す'(quit). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/431 # # UPDATE list SET target=1 WHERE id=1 # というので更新をかけたいのですが、id=1が複数あります。 # どれでもいいのでid=1のものを1つ更新をかけたいのですがそういったことは可能でしょうか? # 最後に「LIMIT 1」とつけたら # SQLSTATE[HY000]: General error: 1 near "LIMIT": syntax errorとエラーが表示されましたので間違っているとは思うのですが # こういったことが可能であれば構文的にご指摘いただけないでしょうか。 # # 'UPDATE list SET target=1 WHERE id=1 というので更新をかけたいのですが、id=1が複数あります。 どれでもいいのでid=1のものを1つ更新をかけたい' :- テーブルの更新(list,[id],[1],true,[target],[1]). テーブルの更新(_テーブル名,_鍵属性ならび,_鍵値ならび,_条件,_置換属性ならび,_置換値ならび) :- テーブル定義から実行項と引数ならびを得る(_テーブル名,P,_引数ならび), 鍵を設定する(_テーブル名,_鍵属性ならび,_鍵値ならび,_引数ならび), 条件に適合した節を削除する(P,_条件), 引数ならびの値を置換する(_テーブル名,_置換属性ならび,_置換値ならび,_引数ならび,_置換された引数ならび), 置換された節を先頭に加える(_テーブル名,_置換された引数ならび). 条件に適合した節を削除する(P,_条件) :- retract(P), '診断: 条件に適合した節を削除する'(P,_条件). '診断: 条件に適合した節を削除する'(P,_条件) :- call(_条件),!. '診断: 条件に適合した節を削除する'(P,_条件) :- asserta(P). テーブル定義から実行項と引数ならびを得る(_テーブル名,P,_引数ならび) :- findall(_,テーブル定義(_テーブル名,_,_),_引数ならび), P =.. [_テーブル名|_引数ならび],!. 鍵を設定する(_,[],[],_引数ならび). 鍵を設定する(_テーブル名,[_鍵属性|R1],[_鍵値|R2],_引数ならび) :- テーブル定義(_テーブル名,_nth1,_鍵属性), nth1(_nth1,_引数ならび,_鍵値), 鍵を設定する(_テーブル名,R1,R2,_引数ならび). 引数ならびの値を置換する(_,[],[],_置換された引数ならび,_置換された引数ならび). 引数ならびの値を置換する(_テーブル名,[_置換属性|R1],[_置換値|R2],_引数ならび,_置換された引数ならび) :- テーブル定義(_テーブル名,_nth1,_置換属性), 要素番号によるならびの置換(_nth1,_置換値,_引数ならび,_引数ならび_2), 引数ならびの値を置換する(_テーブル名,R1,R2,_引数ならび_2,_置換された引数ならび). 要素番号によるならびの置換(_要素番号,_置換要素,_対象ならび,_置換ならび) :- length([_|L0],_要素番号), append(L0,[_|R],_対象ならび), append(L0,[_置換要素|R],_置換ならび),!. 置換された節を先頭に加える(_テーブル名,_置換された引数ならび) :- P =.. [_テーブル名|_置換された引数ならび], asserta(P). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/625 # # [1] 授業単元:自己参照構造体 # [2] 問題文(含コード&リンク): # 以下のクラス・氏名・順位が定義された自己参照構造体をクラス毎に順位の昇順にソートしなさい。 # 3-1 A君 3位 # 3-1 B君 2位 # 3-1 C君 4位 # 3-1 D君 1位 # 3-2 P君 2位 # 3-2 Q君 3位 # 3-2 R君 1位 # 3-3 X君 1位 # 3-3 Y君 2位 # **************** # 結果 # 3-1 D 1 # 3-1 B 2 # 3-1 A 3 # 3-1 C 4 # 3-2 R 1 # 3-2 P 2 # 3-2 Q 3 # :- dynamic('クラス・氏名・順位'/3). 'クラス・氏名・順位'(3-1,'A',3). 'クラス・氏名・順位'(3-1,'B',2). 'クラス・氏名・順位'(3-1,'C',4). 'クラス・氏名・順位'(3-1,'D',1). 'クラス・氏名・順位'(3-2,'P',2). 'クラス・氏名・順位'(3-2,'Q',3). 'クラス・氏名・順位'(3-2,'R',1). 'クラス・氏名・順位'(3-3,'X',1). 'クラス・氏名・順位'(3-3,'Y',2). 'クラス・氏名・順位が定義された述語をクラス毎に順位の昇順にソートして定義し直す' :- クラス毎に順位の昇順にソートして(_クラス毎に昇順にソートされたならび), 定義し直す(_クラス毎に昇順にソートされたならび). 'クラス・氏名・順位が定義された述語をクラス毎に順位の昇順にソートして'(_クラス毎に昇順にソートされたならび) :- findall([_クラス,_順位,_氏名],retract('クラス・氏名・順位'(_クラス,_氏名,_順位)),_クラス_氏名_順位ならび), 整列(_クラス_氏名_順位ならび,_クラス毎に昇順にソートされたならび). 定義し直す(_クラス毎に昇順にソートされたならび) :- append(_,[[_クラス,_順位,_氏名]|R],_クラス毎に昇順にソートされたならび), assertz('クラス・氏名・順位'(_クラス,_氏名,_順位)), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/625 # # [1] 授業単元:自己参照構造体 # [2] 問題文(含コード&リンク): # 以下のクラス・氏名・順位が定義された自己参照構造体をクラス毎に順位の昇順にソートしなさい。 # 3-1 A君 3位 # 3-1 B君 2位 # 3-1 C君 4位 # 3-1 D君 1位 # 3-2 P君 2位 # 3-2 Q君 3位 # 3-2 R君 1位 # 3-3 X君 1位 # 3-3 Y君 2位 # **************** # 結果 # 3-1 D 1 # 3-1 B 2 # 3-1 A 3 # 3-1 C 4 # 3-2 R 1 # 3-2 P 2 # 3-2 Q 3 # :- dynamic('クラス・氏名・順位'/3). 'クラス・氏名・順位'(3-1,'A',3). 'クラス・氏名・順位'(3-1,'B',2). 'クラス・氏名・順位'(3-1,'C',4). 'クラス・氏名・順位'(3-1,'D',1). 'クラス・氏名・順位'(3-2,'P',2). 'クラス・氏名・順位'(3-2,'Q',3). 'クラス・氏名・順位'(3-2,'R',1). 'クラス・氏名・順位'(3-3,'X',1). 'クラス・氏名・順位'(3-3,'Y',2). 'クラス・氏名・順位が定義された述語をクラス毎に順位の昇順にソートしなさい。 ' :- findall([_クラス,_順位,_氏名],( retract('クラス・氏名・順位'(_クラス,_氏名,_順位))), LL1), 整列(LL1,LL2), append(_,[[_クラス,_順位,_氏名]|R],LL2), assertz('クラス・氏名・順位'(_クラス,_氏名,_順位))), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349545643/864 # # # 0 ~ 64 の 65 個の数字を # 以下のような個数毎に改行して表示する場合 # 各言語ではどのように書きますか? # 便宜上それぞれの数字の型は int としてください # # 0 1 2 3 4 # 5 6 7 8 # 9 10 11 12 # 13 14 15 16 17 # 18 19 20 21 # 22 23 24 25 # 26 27 28 29 30 # 31 32 33 34 # 35 36 37 38 # 39 40 41 42 43 # 44 45 46 47 # 48 49 50 51 # 52 53 54 55 56 # 57 58 59 60 # 61 62 63 64 '0 ~ 64 の 65 個の数字を 以下のような個数毎に改行して表示する場合 各言語ではどのように書きますか? 便宜上それぞれの数字の型は int としてください 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64' :- '0 ~ 64 の 65 個の数字を'(_数ならび), 個数毎に改行して表示する(_数ならび,[5,4,4]). '0 ~ 64 の 65 個の数字を'(_数ならび) :- findall(N,between(0,64,N),_数ならび). 個数毎に改行して表示する(_数ならび,[_個数|_残り表示パターン]) :- 個数毎に(_数ならび,_個数,_個数分の数ならび,_残り数ならび), 改行して表示する(_個数分の数ならび), 個数毎に改行して表示する(_残り数ならび,_残り表示パターン). 個数毎に改行して表示する([_数|_残り数ならび],[]) :- 個数毎に改行して表示する([_数|_残り数ならび],[5,4,4]). 個数毎に改行して表示する(_,_). 個数毎に(_数ならび,_個数,_個数分の数ならび,_残り数ならび) :- length(_個数分の数ならび,_個数), append(_個数分の数ならび,_残り数ならび,_数ならび),!. 改行して表示する(_個数分の数ならび) :- atomic_list_concat(_個数分の数ならび,' ',_空白で区切られた数ならび文字列), writef('%t\n',[_空白で区切られた数ならび文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/150 # # [1] c言語 # [2] # (1) # キーボードから二つの文字列を配列x[256],y[256] に入力する.配列xに含まれる文字列の # 後ろに配列yに含まれる文字列をつなげたものを配列z[256] に代入し,画面表示するプログ # ラムを作成せよ.例えば二つの文字列が「sch」,「ool」の場合,配列z に「school」が代入され, # 画面表示される.なお,NULL文字「\0」の扱いに注意し,配列z の文字列の後ろにNULL文 # 字を入れておくこと # # (2)以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入 # 力して下さい」などの画面表示)を行うこと. # 文字配列name[5][64] を作成する. # キーボードから5 人分の名前を入力し,name 配列に格納する. # キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示 # する.ただし,見つからなかった場合には,「見つかりません」と表示する. # 「quit」が入力されるまでの処理を繰り返す. # # '以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入力して下さい」などの画面表示)を行うこと. 1) 文字配列name[5][64] を作成する. 2) キーボードから5 人分の名前を入力し,name 配列に格納する. 3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する. 4) 「quit」が入力されるまで3)の処理を繰り返す.' :- '1) 文字配列name[5][64] を作成する.'(_name), '2) キーボードから5 人分の名前を入力し,name 配列に格納する.'(_name), '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,_名前), '4) 「quit」が入力されるまで3)の処理を繰り返す.'(_名前). '1) 文字配列name[5][64] を作成する.'(_name) :- length(_name,5), findall(L,( member(L,LL), length(L,64)), _name). '2) キーボードから5 人分の名前を入力し,name 配列に格納する.'(_name) :- findall(L,( member(L,_name), '名前を入力し,name 配列に格納する'(L)), _name). '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,名前) :- キーボードから名前を入力し(_名前), 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(_名前,_name). '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,_名前) :- '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,_名前). 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(quit,_) :- !. 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(_名前,_name) :- 'name 配列の何番目に格納されているかを検索して'(_名前,_name), 表示する(_名前,_何番目),!. 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(_,_) :- writef('見つかりません\n'), fail. 'name 配列の何番目に格納されているかを検索して'(_名前,_name) :- atom_chars(_名前,Chars), nth1(_何番目,_name,L), append(Chars,_,L). 表示する(_名前,_何番目) :- writef('%tは%t番目にあります。\n',[_名前,_何番目]),!. '4) 「quit」が入力されるまで3)の処理を繰り返す.'(quit). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/144 # # [1] 授業単元:文字列処理・ポインタ # [2] 問題文(含コード&リンク): #  C言語でhtml文内のタグをとり、文字のみを端末内に出力するようなプログラムを完成させよ #  *サンプルのhtml文を以下のように表示できるすること # # TITLE # # text1 # text2 # text3 # text4 # text5 # # リンク1 # url # # リンク2 # url # # リンク3 # url # # # ※サンプルhtml文 # # TITLE # #

#

リンク1

#

url

#

リンク2

#

url

#

リンク3

#

url

# # 文字列から必ず閉じたタグの値だけ取得する(_文字列,_値ならび) :- atom_chars(_文字列,Chars), 文字ならびから必ず閉じたタグの値だけ取得する(_文字列,_値ならび). 文字ならびから必ず閉じたタグの値だけ取得する(Chars,_タグ値ならび) :- findall(_タグの値,( タグの値を切り取る(Chars,_タグの値)), _値ならび). タグの値を切り取る(_文字のならび,_タグの値) :- append(L1,[>|R2],[<|_],_文字のならび), '<,>を含まない文字ならび'(R2), atomic_list_concat(R2,_タグの値). '<,>を含まない文字ならび'(L) :- \+(L = []), \+(member(<,L)), \+(member(>,L)). append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354715494/11 # # 【お題】 # [1, 2, 3, 4, 5, 6, 7]のようなリストを # 次のような表に整形して出力せよ # # <table> # <tr><td>1</td><td>2</td><td>3</td></tr> # <tr><td>4</td><td>5</td><td>6</td></tr> # <tr><td>7</td><td>&nbsp;</td><td>&nbsp;</td></tr> # </table> # # '[1, 2, 3, 4, 5, 6, 7]のようなリストを 次のような表に整形して出力せよ <table> <tr><td>1</td><td>2</td><td>3</td></tr> <tr><td>4</td><td>5</td><td>6</td></tr> <tr><td>7</td><td>&nbsp;</td><td>&nbsp;</td></tr> </table>'(L) :- 'リストを整形して出力せよ'(L). 'リストを整形して出力せよ'([]) :- !. 'リストを整形して出力せよ'([A,B,C|R]) :- '3つ組の出力'(A,B,C), 'リストを整形して出力せよ'(R),!. 'リストを整形して出力せよ'(L) :- '最後の組が3つ組にならなかった場合の特別な出力'(L). '3つ組の出力'(A,B,C) :- writef('<tr><td>%t</td><td>%t</td><td>%t</td></tr>\n',[A,B,C]). '最後の組が3つ組にならなかった場合の特別な出力'(_最後の組) :- 値のない部分は空白で埋める(_最後の組,A,B,C), writef('<tr><td>%t</td><td>%t</td><td>%t</td></tr>\n',[A,B,C]). 値のない部分は空白で埋める(L,A,B,C) :- append(L,L2,[A,B,C]), all(L2,'&nbsp;'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/119 # # [1]C言語 # [2]http://ime.nu/www.dotup.org/uploda/www.dotup.org3700396.jpg # 探索木についての課題です # 問題1. データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。 # # 問題2. 前問をプログラムとして、表示しなさい。表示する関数は再帰的に書きなさい。 # 左の子(部分木) を print,node を print, 右の子 (部分木) を print のように表示することをDFS 中間順と言います。 # # 問題3. 標準入力から文字を入力させ、その文字によって2分探索木に対して以下の動作をするプログラムを作成せよ。 # s ---> 数を1つ標準入力から入力されてデータが存在するか表示 # i ---> 数を1つ標準入力から入力させて2分探索木に追加 # p ---> 今まで入力された数をすべて表示 (DFS中間順で) # q ---> quit # # 問題4. 0から9999の整数の乱数を10000個生成して、2分探索木を作り、データの # 総数、木の深さの最大値、データの最小値と最大値を求めるプログラムを作成し # て確認せよ。 # # [3]ubuntu # gcc # c言語 # [4]期限:木曜日6:00 # 宜しくお願いします。 # :- dynamic([木/3,根/1,二分探索木ラベル/2]). 二分探索木ラベルの生成(_値ならび,_ラベルならび) :- findall(_ラベル,( member(_値,_値ならび), 二分探索木ラベルの候補(_ラベル), assertz(二分探索木ラベル(_ラベル,_値))), _ラベルならび). 二分探索木ラベルの候補(_ラベル) :- N is random(900000) + 100000, atomic_list_concat(['L',N],_ラベル), \+(二分探索木ラベル(_ラベル,_)),!. 二分探索木ラベルの候補(_ラベル) :- 二分探索木ラベルの候補(_ラベル). 根を作る(_値,_ラベル) :- asserta((根(_ラベル) :- !)), 木を作る(_値,_ラベル). 木を作る(_値,_ラベル) :- 二分探索木ラベル(_ラベル,_値), asserta(木([],_ラベル,[])). 木に追加(_根のラベル,_値のラベル) :- 二分探索木ラベル(_根のラベル,_根の値), 二分探索木ラベル(_値のラベル,_値), 木に追加(_根のラベル,_値のラベル,_根の値,_値). 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, retract(木([],_根のラベル,_右枝)), 木を作る(_値のラベル), asserta(木(_値のラベル,_根のラベル,_右枝)),!. 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, 木(_左枝,_根,_右枝), 木に追加(_左枝,_値). 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, retract(木(_左枝,_根,[])), 木を作る(_値のラベル), asserta(木(_左枝,_根のラベル,_値のラベル)),!. 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, 木(_左枝,_根のラベル,_右枝), 木に追加(_右枝,_値のラベル). 'データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。' :- 二分探索木ラベルの生成([6,4,3,8,5,9,7],[_根のラベル|_ラベルならび]), 根を作る(_先頭のラベル), append(_,[N|R],_ラベルならび), 木に追加(_根のラベル,N), R = []. 二分探索木全体を表示する :- 根(_根のラベル), 木を表示する(_根のラベル). 木を表示する([]) :- !. 木を表示する(_木の根のラベル) :- 木(_左枝,_木の根のラベル,_右枝), 木を表示する(_左枝,_木の根のラベル,_右枝). 木を表示する(_左の枝,_木の根,_右の枝) :- 二分木探索ラベル(_木の根ラベル,_木の根の値), 木を表示する(_左枝), writef('%t ',[_木の根の値]), 木を表示する(_右枝). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/119 # # [1]C言語 # [2]http://ime.nu/www.dotup.org/uploda/www.dotup.org3700396.jpg # 探索木についての課題です # 問題1. データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。 # # 問題2. 前問をプログラムとして、表示しなさい。表示する関数は再帰的に書きなさい。 # 左の子(部分木) を print,node を print, 右の子 (部分木) を print のように表示することをDFS 中間順と言います。 # # 問題3. 標準入力から文字を入力させ、その文字によって2分探索木に対して以下の動作をするプログラムを作成せよ。 # s ---> 数を1つ標準入力から入力されてデータが存在するか表示 # i ---> 数を1つ標準入力から入力させて2分探索木に追加 # p ---> 今まで入力された数をすべて表示 (DFS中間順で) # q ---> quit # # 問題4. 0から9999の整数の乱数を10000個生成して、2分探索木を作り、データの # 総数、木の深さの最大値、データの最小値と最大値を求めるプログラムを作成し # て確認せよ。 # # [3]ubuntu # gcc # c言語 # [4]期限:木曜日6:00 # 宜しくお願いします。 # 二分探索木ラベルの生成(_値ならび) :- nth1(_nth1,_値ならび,_値), atomic_list_concat(['L','_',_nth1],_ラベル), assertz(二分探索木ラベル(_ラベル,_値)), fail. 二分探索木ラベルの生成(_). 根を作る(_値,_ラベル) :- 二分探索木ラベル(_ラベル,_値), asserta(根(_ラベル,[],[])). 枝を作る(_値,_ラベル) :- 二分探索木ラベル(_ラベル,_値), asserta(枝(_ラベル,[],[])). 枝に追加(_根のラベル,_値) :- 二分探索木ラベル(_根のラベル,_根の値), 二分探索木ラベル(_値のラベル,_値), 枝に追加(_根のラベル,_値のラベル,_根の値,_値). 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, retract(枝(_根のラベル,[],_右枝)), 枝を作る(_値), asserta(根(_根のラベル,_値のラベル,_右枝)),!. 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, 枝(_根,_左枝,_右枝), 枝に追加(_左枝,_値). 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, retract(枝(_根,_左枝,[])), 枝を作る(_値), asserta(根(_根のラベル,_左枝,_値のラベル)),!. 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, 枝(_根のラベル,_左枝,_右枝), 枝に追加(_右枝,_値). 'データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。' :- 二分探索木ラベルの生成([6,4,3,8,5,9,7]), 根を作る(6,_根のラベル), append(_,[N|R],[4,3,8,5,9,7]), 枝に追加(_根のラベル,N), R = []. % 以下のサイトは # 出典:: 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'). % 以下のサイトは # # ならびの中央値 # 中央値(L,_中央値) :- 整列(L,L1), length(L,_要素数), Div_2 is _要素数 // 2, Mod_2 is _要素数 mod 2, 中央値(L1,Div_2,Mod_2,_中央値). 中央値(L,Div_2,1,_中央値) :- nth0(Div_2,L,_中央値). 中央値(L,Div_2,0,_中央値) :- nth1(Div_2,L,_値_1), nth0(Div_2,L,_値_2), _中央値 is (_値_1 + _値_2) / 2. 整列([],[]). 整列([_軸要素|R],L2) :- 分割(_軸要素,R,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび), 整列(_軸要素に等しいか小さい要素ならび,_整列した軸要素に等しいか小さい要素ならび), 整列(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), append(_整列した軸要素に等しいか小さい要素ならび,[_軸要素|_整列した軸要素より大きい要素ならび],L2). 分割(_,[],[],[]). 分割(_軸要素,[_値|R1],[_値|R2],R3) :- _値 @=< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[_値|R1],R2,[_値|R3]) :- _値 @> _軸要素, 分割(_軸要素,R1,R2,R3). % 以下のサイトは # # ならびの中央値 # 中央値(_ならび,_中央値) :- 整列(_ならび,_整列済みならび), length(L0,_同じ要素数), length(R,_同じ要素数), 中央値(_整列済みならび,L0,R,_中央値),!. 中央値(_整列済みならび,L0,R,_中央値) :- append(L0,[_中央値_1,_中央値_2|R],_整列済みならび), _中央値 is (_中央値_1 + _中央値_2) / 2. 中央値(_整列済みならび,L0,R,_中央値) :- append(L0,[_中央値|R],_整列済みならび). 整列([],[]). 整列([_軸要素|R],L2) :- 分割(_軸要素,R,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび), 整列(_軸要素に等しいか小さい要素ならび,_整列した軸要素に等しいか小さい要素ならび), 整列(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), append(_整列した軸要素に等しいか小さい要素ならび,[_軸要素|_整列した軸要素より大きい要素ならび],L2). 分割(_,[],[],[]). 分割(_軸要素,[_値|R1],[_値|R2],R3) :- _値 @=< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[_値|R1],R2,[_値|R3]) :- _値 @> _軸要素, 分割(_軸要素,R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/70 # # [1] c言語 # [2] () キーボードから0 以上100以下の整数を入力し, # (1) 0以上10未満 # (2) 10 以上20未満 # (3) 20 以上30未満 # ..... # (10) 90 以上100 未満 # (11) 100 # の11 段階に分類して頻度を調べるプログラムを作成せよ.ただし,負の値が入力された場合 # にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面 # 表示して頻度には数えないこと. # # ()整数値を要素にもつk 行m 列行列A とm 行n 列行列B を宣言し,それらの要素をキーボー # ドから入力してA×B を算出するプログラムを作成せよ.ただし,k,m,n はk≠m,m≠n,k≧2, # m≧2,n≧2 を満たす任意の値をプログラム内で各自設定してよい.ただし,A×B の値を画面 # 表示する前に,k 行n列行列C に値を代入しておくこと. # # ' キーボードから0 以上100以下の整数を入力し, (1) 0以上10未満 (2) 10 以上20未満 (3) 20 以上30未満 ..... (10) 90 以上100 未満 (11) 100 の11 段階に分類して頻度を調べるプログラムを作成せよ.ただし,負の値が入力された場合 にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えないこと.' :- 頻度ならびの初期化(0,_頻度ならびの初期状態), 'キーボードから0 以上100以下の整数を入力し,11 段階に分類して頻度を調べる.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えないこと'(_頻度ならびの初期状態,_頻度ならび,継続), 現在の頻度の表示(_頻度ならび). 頻度ならびの初期化(100,[[100,101,0]]) :- '100の場合だけは範囲指定にならないが、ここでは101未満として形式的に一致させる',!. 頻度ならびの初期化(N,[[N,N_2,0]|R]) :- N_2 is N + 10, 頻度ならびの初期化(N_2,R). '100の場合だけは範囲指定にならないが、ここでは101未満として形式的に一致させる'. 'キーボードから0 以上100以下の整数を入力し,11 段階に分類して頻度を調べる.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えないこと'(_,_頻度ならび,_頻度ならび,終了) :- !. 'キーボードから0 以上100以下の整数を入力し,11 段階に分類して頻度を調べる.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えないこと'(_入力された整数,_頻度ならび_1,_頻度ならび,_) :- 現在の頻度の表示(_頻度ならび_1), ' キーボードから0 以上100以下の整数を入力する.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示する.'(_入力された整数), 頻度ならびの更新(_入力された整数,_頻度ならび_1,_頻度ならび_2,_状態_2), 'キーボードから0 以上100以下の整数を入力し,ただし,負の値が入力された場合にはプログラムを終了し,11 段階に分類して頻度を調べる.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えないこと'(_入力された整数,[],_頻度ならび,_状態_2). ' キーボードから0 以上100以下の整数を入力する.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示する.'(_整数) :- write('0 以上100以下の整数を入力してください : '), get_line(Line), '診断::整数入力'(Line,_整数),!. ' キーボードから0 以上100以下の整数を入力する.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示する.'(_整数) :- ' キーボードから0 以上100以下の整数を入力する.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示する.'(_整数). '診断::整数入力'(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), _整数 < 101,!. '診断::整数入力'(Line,_整数) :- writef('入力された%tからは0以上100以下の整数が得られません。再入力をお願いします。\n',[Line]), fail. 頻度ならびの更新(_入力された整数,_頻度ならび_1,_頻度ならび_2,継続) :- between(0,100,_入力された整数), 頻度ならびの更新(_入力された整数,_頻度ならび_1,_頻度ならび_2),!. 頻度ならびの更新(N,_頻度ならび,_頻度ならび,終了) :- N < 0,!. 頻度ならびの更新(_入力された整数,_頻度ならび_1,_頻度ならび_2) :- append(L0,[[_範囲以上,_範囲未満,_頻度_1]|R],_頻度ならび_1), _入力された整数 >= _範囲以上, _入力された整数 < _範囲未満, _頻度_2 is _頻度_1 + 1, append(L0,[[_範囲以上,_範囲未満,_頻度_2]|R],_頻度ならび_2). 頻度ならびの初期化(100,[[100,101,0]]) :- !. 頻度ならびの初期化(N,[[N,N_2,0]|R]) :- N_2 is N + 10, 頻度ならびの初期化(N_2,R). 現在の頻度の表示([[100,101,_頻度]]) :- writef('%t 頻度=%t\n',[_頻度]),!. 現在の頻度の表示([[_範囲以上,_範囲未満,_頻度]|R]) :- writef('%t 以上 %t 未満 頻度=%t\n',[_範囲以上,_範囲未満,_頻度]), 現在の頻度の表示(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/49 # # [1] 授業単元:計算機実習 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/eMHdX9DL # 上記のプログラムを変更して,キーボードから(x, y)の座標とマスの状態を入力し,反映するようにしなさい. # 入力の際には座標や状態が範囲を超えていないか確認し,越えているときにはもう一度入力するようにしなさい. # # #include # int plot[8][8]; # char state[3][5] = {" ","○ ","● "}; # # # void print_board(){ # int x,y; # printf("\033[2J"); # printf("\033[%d;%dH",0,0); # for(y = 0;y < 8;y++){ # for (x = 0;x < 8;x++){ # printf("%s|",state[plot[x][y]]); # } # printf("\n"); # printf("--+--+--+--+--+--+--+--+\n"); # } # } # # int main(){ # int x,y; # # for(y = 0;y < 8;y++)for(x = 0;x < 8;x++)plot[x][y] = 0; # plot[3][3] = plot[4][4] = 1; # plot[3][4] = plot[4][3] = 2; # # print_board(); # } # # 1 2 3 4 5 6 7 8 # +--+--+--+--+--+--+--+--+ # 1 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 2 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 3 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 4 | | | |○|●| | | | # +--+--+--+--+--+--+--+--+ # 5 | | | |●|○| | | | # +--+--+--+--+--+--+--+--+ # 6 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 7 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 8 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # :- dynamic(ボード保存/1). 'キーボードから(x, y)の座標とマスの状態を入力し,反映するようにしなさい.入力の際には座標や状態が範囲を超えていないか確認し,越えているときにはもう一度入力するようにしなさい.' :- ボードの初期状態(_ボート), ボードゲーム(_ボード). ボードの初期状態(_ボート) :- findall(L,( between(1,8,_), length(L,8), all(L,' ')), _ボード). ボードゲーム(_現在のボード) :- ボード(_現在のボード,_一手進んだボード), ボードゲーム(_一手進んだボード),!. ボードゲーム(_現在のボード) :- ボード表示(_現在のボード), write('ゲーム終了です。\n'), 終了時点のボードを保存する(_現在のボード). ボード(_現在のボード) :- 着手するべきマスが残っている(_現在のボード), 'キーボードから(x, y)の座標とマスの状態を入力し'(X,Y), ボードを更新する(X,Y,_現在のボード,_一手進んだボード), ボードを表示する(_一手進んだボード),!. 着手するべきマスが残っている([L|R]) :- member(' ',L), 着手するべきマスが残っている(R),!. 'キーボードから(x, y)の座標とマスの状態を入力し'(X,Y,_マスの状態) :- 整数を得る('x(0は終了)',between(0,8,X),X), \+(X = 0), 整数を得る('y',between(1,8,Y),Y), マスの状態を得る(_マスの状態). マスの状態を得る(_マスの状態) :- write(' ..0か●..1か○..2を着手してください : '), get_Line(Line), '診断: マスの状態を得る'(Line,_マスの状態),!. マスの状態を得る(_マスの状態) :- マスの状態を得る(_マスの状態). '診断: マスの状態を得る'('0',' ') :- !. '診断: マスの状態を得る'('1','○') :- !. '診断: マスの状態を得る'('2','●') :- !. ボードを更新する(X,Y,_着手,_現在のボード,_一手進んだボード) :- '前の行ならび、対象行、後の行ならび'(Y,_現在のボード,_前の行ならび,_対象行,_後の行ならび), 対象行を更新する(X,_着手,_対象行,_更新された対象行), append(_前の行ならび,[_更新された対象行|_後の行ならび],_一手進んだボード). '前の行ならび、対象行、後の行ならび'(Y,_現在のボード,_前の行ならび,_対象行,_後の行ならび) :- append(_前の行ならび,[_対象行|_後の行ならび],_現在のボード), length([_|_前の行ならび],Y). 対象行を更新する(X,_着手,_対象行,_更新された対象行) :- append(L0,[_|R],_対象行), length([_|L0],X), append(L0,[_着手|R],_更新された対象行). ボード表示(_ボード) :- append(L0,[L|R],_ボード), ボードの一行を表示する(L0,L), R = [], writef(' +--+--+--+--+--+--+--+--+\n'),!. ボードの一行を表示する(L0,L) :- length([_|L0],N), writef(' +--+--+--+--+--+--+--+--+\n'), atomic_list_concat(L,'|',S), writef('%t %t|\n',[N,S]). 終了時点のボードを保存する(_現在のボード) :- asserta(ボード保存(終了時点のボードを保存する(_現在のボード)). % 以下のサイトは % % 第二引数も順にコピーするリストの結合の途中経過を示す非決定性の述語 % % appendの途中経過を示す非決定性の述語 % % appendの定義は % % append([],L,L). % append([U|X],Y,[U|Z]) :- % append(X,Y,Z). % 第二引数も順にコピーするリストの結合の途中経過([],[V|Y],[V]). 第二引数も順にコピーするリストの結合の途中経過([],[V|Y],[V|Z]) :- 第二引数も順にコピーするリストの結合の途中経過([],Y,Z). 第二引数も順にコピーするリストの結合の途中経過([U|X],Y,[U]). 第二引数も順にコピーするリストの結合の途中経過([U|X],Y,[U|Z]) :- 第二引数も順にコピーするリストの結合の途中経過(X,Y,Z). appendの途中経過([],L,L). appendの途中経過([U|X],Y,[U]). appendの途中経過([U|X],Y,[U|Z]) :- appendの途中経過(X,Y,Z). % 以下のサイトは % % 第二引数も順にコピーするリストの結合の途中経過を示す非決定性の述語 % % appendの途中経過を示す非決定性の述語 % % appendの定義は % % append([],L,L). % append([U|X],Y,[U|Z]) :- % append(X,Y,Z). % 第二引数も順にコピーするリストの結合の途中経過([],[V|Y],[V]). 第二引数も順にコピーするリストの結合の途中経過([],[V|Y],[V|Z]) :- 第二引数も順にコピーするリストの結合の途中経過([],Y,Z). 第二引数も順にコピーするリストの結合の途中経過([U|X],Y,[U]). 第二引数も順にコピーするリストの結合の途中経過([U|X],Y,[U|Z]) :- 第二引数も順にコピーするリストの結合の途中経過(X,Y,Z). appendの途中経過([],L,L). appendの途中経過([U|X],Y,[U]). appendの途中経過([U|X],Y,[U|Z]) :- appendの途中経過(X,Y,Z). % 以下のサイトは ヒストグラムを出力する(_標本ならび) :- ヒストグラムの用意(_標本ならび,LL1), 転置して出力する(LL1). ヒストグラムの用意(_標本ならび,LL1) :- '標本の最大値要素数のリストを作る'(_標本ならび,L1), findall(L1,( 星のリストに変換(_標本ならび,L1)),LL1). '標本の最大値要素数のリストを作る'(_標本ならび,L1) :- 最大値(_標本ならび,_最大値), length(L1,_最大値). 星のリストに変換(_標本ならび,L1) :- member(_標本値,_標本ならび), length(_星のリスト,_標本値), 空白リストと星のリスト(_星のリスト,L1). 空白リストと星のリスト(_星のリスト,L1) :- append(_空白リスト,_星のリスト,L1), all(_空白リスト,' '), all(_星のリスト,*). 転置して出力する(LL1) :- 転置(LL1,LL2), 出力する(LL2). 出力する(LL) :- forall( ならび要素を文字列に変換して(LL,_出力行文字列), writef('%w\n',[_出力行文字列])). ならび要素を文字列に変換して(LL,_出力行文字列) :- member(L,LL), atomic_list_concat(L,_出力行文字列). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). all([],_). all([V|R],V) :- all(R,V). 最大値([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値(_ならび,_最大値_1,_最大値) :- '_ならびの先頭要素の値によって_最大値_1を置き換えて行く'(_ならび,_最大値_1,_最大値). '_ならびの先頭要素の値によって_最大値_1を置き換えて行く'(_ならび,_最大値_1,_最大値) :- '_ならびの先頭要素が_最大値_1より大きい場合、_最大値_1を置き換える'(_ならび,_最大値_1,_最大値). '_ならびの先頭要素の値によって_最大値_1を置き換えて行く'(_ならび,_最大値_1,_最大値) :- '_ならびの先頭要素が_最大値_1と等しいか小さい場合、_最大値_1を置き換えない'(_ならび,_最大値_1,_最大値). '_ならびの先頭要素が_最大値_1より大きい場合、_最大値_1を置き換える'([_先頭要素|R],_最大値_1,_最大値) :- _先頭要素 @> _最大値_1, 最大値(R,_先頭要素,_最大値). '_ならびの先頭要素が_最大値_1と等しいか小さい場合、_最大値_1を置き換えない'([_先頭要素|R],_最大値_1,_最大値) :- _先頭要素 @=< _最大値_1, 最大値(R,_最大値_1,_最大値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/7 # # [1] 授業単元:問題1:二次元配列 問題2:関数 # [2] 問題文(含コード&リンク): # 問題1:ファイルから入力した英小文字a-zの頻度のヒストグラムを # 出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。 # # 問題2:1文字を引数としてそれが小文字であれば大文字にして返し # そうでなければそのまま文字を返す関数を作成しキーボードから # 文字入力としてこの関数の動作を確認せよ。 # [3.1] OS: windows vista #  [3.2] コンパイラ名とバージョン:visual studio2010 #  [3.3] 言語: C言語 # [4] 期限: 11月30日 # [5]ポインタはやってません。宜しくお願いします 。 # # 'ファイルから入力した英小文字a-zの頻度のヒストグラムを出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。' :- get_chars('c161_7.html',Chars), '英小文字a-zの頻度の'(Chars,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]), ヒストグラムを出力する([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]). '英小文字a-zの頻度の'([],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]). '英小文字a-zの頻度の'([_文字|_残りならび],L1,L) :- 英小文字ならば頻度を更新(_文字,L1,L2), '英小文字a-zの頻度の'(_残りならび,L2,L),!. '英小文字a-zの頻度の'([_|_残りならび],L1,L) :- '英小文字a-zの頻度の'(_残りならび,L1,L). 英小文字ならば頻度を更新(_文字,L1,L2) :- nth0(Nth0,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_文字), length(L0,Nth0), append(L0,[S|R],L1), S2 is S + 1, append(L0,[S2|R],L2). ヒストグラムを出力する(L) :- ヒストグラムの用意(L,LL1), 転置(LL1,LL2), 出力する(LL2). ヒストグラムの用意(L,LL1) :- 最大値(L,_最大値), length(L1,_最大値), findall(L1,( 星のリストに変換(L,L1)), LL1). 星のリストに変換(L,L1) :- member(N,L), length(R,N), append(L0,R,L1), all(L0,' '), all(R,*). 出力する([]). 出力する([L|R]) :- atomic_list_concat(L,S), writef('%t\n',[S]), 出力する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349545643/864 # # ../test/read.cgi/tech/1349545643/845の問題の # # 「取り出した玉が黒であるとき、その玉を取り出した箱に # 残っている玉が黒玉である確率を求めよ」 # # という文章を # # 「取り出した玉が黒であるとき、その玉を取り出した箱から # もう一度玉を取り出したとき黒玉である確率を求めよ。」 # # に変更すると、二つの箱に任意個の白黒玉を入れた場合を考える事ができる。 # 片方の箱に{白, 白, 黒}、もう一方に{黒, 黒, 黒, 白}が入ってる場合の確率を求めよ。 # '取り出した玉が黒であるとき、その玉を取り出した箱からもう一度玉を取り出したとき黒玉である確率を求めよ。'(_一つ目の箱,_二つめの箱,_確率) :- '箱から黒を取り出した後に、次に黒を取り出す確率は'(_一つ目の箱,_確率_1), '箱から黒を取り出した後に、次に黒を取り出す確率は'(_二つ目の箱,_確率_2), _求める確率 is 0.5 * _確率_1 + 0.5 * _確率_2. '箱から黒を取り出した後に、次に黒を取り出す確率は'(_箱,_確率) :- 黒玉を一つ削除する(_箱,_黒玉を一つ削除した箱), length(_黒玉を一つ削除箱,_残りの玉の数), 黒玉の数(_黒玉を一つ削除した箱,_残りの黒玉の数), 一つの箱で次に黒玉を取り出す確率を求める(_残りの黒玉の数,_残りの玉の数,_確率). 黒玉を一つ削除する(L1,L1_2) :- append(L0,[黒|R],L1), append(L0,R,L1_2),!. 黒玉を一つ削除する(L,L). 黒玉の数(_箱,_黒玉の数) :- findall(_,member(黒,_箱),L), length(L,_黒玉の数). 一つの箱で次に黒玉を取り出す確率を求める(_,0,_) :- write('黒玉を取り出したら残りの玉はもうありませんでした。\n確率計算はできません。\n'),!, fail. 一つの箱で次に黒玉を取り出す確率を求める(_残りの黒玉の数,_残りの玉の数,_確率) :- _確率 is _残りの黒玉の数 / _残りの玉の数. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/889 # # [1] 授業単元:C言語 # [2] 問題 # 0から255までの整数を8bitの2進数で表わし、小さい方から順に左から右へ並べ、 # それらを上位のbitから6bitづつ区切って342個の整数に変換するとき、 # (最後に2bitあまるので下位4bitを0で埋める) # 変換後のそれぞれの整数の出現数をカウントし、整数とその出現数を表示する。 # 表示する際は、整数は6bitで表示し、整数の小さい順に出力すること。 # 例: # 00000000 00000001 00000010 ... # ↓ # 000000 000000 000100 000010 ... # ↓ # 000000 XX回 # 000001 XX回 # ... # 111111 XX回 # # '0から255までの整数を8bitの2進数で表わし、小さい方から順に左から右へ並べ、 それらを上位のbitから6bitづつ区切って342個の整数に変換するとき、 (最後に2bitあまるので下位4bitを0で埋める) 変換後のそれぞれの整数の出現数をカウントし、整数とその出現数を表示する。 表示する際は、整数は6bitで表示し、整数の小さい順に出力すること。 例: 00000000 00000001 00000010 ... ↓ 000000 000000 000100 000010 ... ↓ 000000 XX回 000001 XX回 ... 111111 XX回' :- '0から255までの整数を8bitの2進数で表わし'(_256個の2進数表示ならび), 'それらを上位のbitから6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'(_256個の2進数表示ならび,_342個の6ビット2進数表示ならび), '変換後のそれぞれの整数の出現数をカウントし、整数とその出現数を表示する'(_342個の6ビット2進数表示ならび). '0から255までの整数を8bitの2進数で表わし'(_256個の2進数表示ならび) :- findall(_二進数表示ならび,( between(0,255,N), 二進数表示ならび(N,[],_二進数表示ならび)), _256個の2進数表示ならび). 二進数表示ならび(0,L,L) :- !. 二進数表示ならび(N,L1,L) :- M is N mod 2, D is N // 2, 二進数表示ならび(D,[M|L1],L). 'それらを上位のbitから6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'(_256個の2進数表示ならび,_342個の6ビット2進数表示ならび) :- flatten(_256個の2進数表示ならび,_平坦化されたビットならび), '6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'(_平坦化されたビットならび,_342個の6ビット2進数表示ならび). '6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'([_1,_2,_3,_4,_5,_6|R1],[[_1,_2,_3,_4,_5,_6],R2]) :- '6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'(R1,R2). '6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'(_2bitあまり,[_下位4bit0で埋めた6個組]) :- append(_2bitあまり,[0,0,0,0],_下位4bit0で埋めた6個組). '変換後のそれぞれの整数の出現数をカウントし、整数とその出現数を表示する'(_342個の6ビット2進数表示ならび) :- _2の6乗の上限値 is truncate(2 ^ 6 - 1), between(0,_2の6乗の上限値,N), 'それぞれの整数の出現数をカウントし'(_342個の6ビット2進数表示ならび,N,_6ビット2進数表示ならび,_頻度), 整数とその出現数を表示する(_6ビット2進数表示ならび,_頻度), N = _2の6乗の上限値. 'それぞれの整数の出現数をカウントし'(_342個の6ビット2進数表示ならび,N,_6ビット2進数表示ならび,_頻度) :- '6ビット2進数表示ならび'(N,_6ビット2進数表示ならび), count(member(_6ビット2進数表示ならび,_342個の6ビット2進数表示ならび),_頻度). '6ビット2進数表示ならび'(N,L) :- length(L,6), 二進数表示ならび(N,[],L1), append(L0,L1,L), all(L0,0). all([],_). all([A|R],A) :- all(R,A). 整数とその出現数を表示する(_6ビット2進数表示ならび,_頻度) :- atomic_list_concat(_6ビット2進数表示ならび,_6ビット2進数表示文字列), 整数から頭部空白文字列(3,_頻度,_頻度表示文字列), writef('%t%t回\n',[_6ビット2進数表示文字列,_頻度表示文字列]). 整数から頭部空白文字列(N桁,_整数,_整数表示文字列) :- length(L,N桁), nuber_chars(_整数,L1), append(L0,L1,L), all(L0,' '), atomic_list_concat(L,_整数表示文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/837 # # 単元 C言語配列 # 問題1 Float型配列にマクロで指定した個数の乱数(randを使う)を格納して # その平均値と最大値を出力するプログラムを作成せよ。 # # 問題2 上記の問題で結果を小さい順で表記せよ。 # 環境 Linux gcc C言語 # 期限 今週日曜日まで # よろしくお願いします # # 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して、小さい順で表記せよ。'(_指定した個数) :- 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して'(_指定した個数,_ならび), 整列(_ならび,_整列したならび), writef('%t\n',[_整列したならび]). 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して'(_指定した個数,_ならび) :- findall(_浮動小数点数,( between(1,_指定した個数,_), _浮動小数点数 is (-1 ^ (random(2)+1)) * random(10000) / (random(10000) + 1)), _ならび). 整列([],[]). 整列([A|R],L) :- 分割(A,R,L1,L2), 整列(L1,L1_2), 整列(L2,L2_2), append(L1_2,[A|L2_2],L). 分割(_,[],[],[]). 分割(A,[B|R1],[B|R2],R3) :- B @=< A, 分割(A,R1,R2,R3). 分割(A,[B|R1],R2,[B|R3]) :- A @< B, 分割(A,R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/828 # # 単元:プログラミング1 # 問題:ある指定した個数の素数の表を出力するプログラムをかけ。 # 環境:gcc C言語 # 期限:11/20まで # # ある指定した個数の素数の表を出力する :- 整数を得る(ある指定した個数,_ある指定した個数 > 2,_ある指定した個数), ある指定した個数の素数の表を出力する(_ある指定した個数). ある指定した個数の素数の表を出力する(_ある指定した個数) :- ある指定した個数の素数ならび(_ある指定した個数,_ある指定した個数の素数ならび), 素数ならびを一行に10要素ずつの表として出力する(_ある指定した個数の素数ならび). ある指定した個数の素数ならび(_ある指定した個数,_ある指定した個数の素数ならび) :- ある指定した個数の逆順素数ならび(1,-1,_ある指定した個数,[3,2],_逆順素数ならび), reverse(_逆順素数ならび,__ある指定した個数の素数ならび),!. ある指定した個数の逆順素数ならび(N,P_M,_ある指定した個数,L,L) :- length(L,_ある指定した個数),!. ある指定した個数の逆順素数ならび(M_1,_Plus_Minus,_ある指定した個数,L1,L) :- 素数は6の倍数の前後にしか現れない(M_1,_Plus_Minus,L1,L2,M_2,_Plus_Minus_2), ある指定した個数の逆順素数ならび(M_2,_Plus_Minus_2,_ある指定した個数,L2,L). 素数は6の倍数の前後にしか現れない(M,-1,L1,[J|L1],N,1) :- N is 6 * M - 1, 'Nは素数か'(N),!. 素数は6の倍数の前後にしか現れない(M,-1,L1,L1,M,1). 素数は6の倍数の前後にしか現れない(M,1,L1,[J|L1],M_2,-1) :- N is 6 * M + 1, 'Nは素数か'(N), M_2 is M + 1,!. 素数は6の倍数の前後にしか現れない(M,1,L1,L1,M_2,-1) :- M_2 is M + 1. 'Nは素数か'(N) :- N_2 is N // 2, between(2,N_2,M), 0 is N mod M,!, fail. 'Nは素数か'(_). 素数ならびを一行に10要素ずつの表として出力する(_素数ならび) :- length(_10個の素数ならび,10), append(_10個の素数ならび,_残り素数ならび,_素数ならび), 一行出力する(_10個の素数ならび), 素数ならびを一行に10要素ずつの表として出力する(_残り素数ならび). 素数ならびを一行に10要素ずつの表として出力する(_残った素数ならび) :- 一行出力する(_残った素数ならび). 一行出力する([]). 一行出力する([A]) :- writef('%t\n',[A]),!. 一行出力する([A|R]) :- writef('%t,',[A]), 一行出力する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/827 # # 単元:プログラミング1 # 問題:ある指定した値までの素数の表を出力するプログラムをかけ。 # 環境:gcc C言語 # 期限:11/20まで # # ある指定した値までの素数の表を出力する :- ある指定した値(_ある指定した値), ある指定した値までの素数の表を出力する(_ある指定した値). ある指定した値(_ある指定した値) :- 整数を得る('素数の表の上限値',_ある指定した値 > 0,_ある指定した値),!. ある指定した値までの素数の表を出力する(_ある指定した値) :- findall(N,( between(2,_ある指定した値,N)), _2からの整数ならび), エラトステネスの篩(_2からの整数ならび,_素数ならび), 素数ならびを一行に10要素ずつの表として出力する(_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 素数ならびを一行に10要素ずつの表として出力する(_素数ならび) :- length(_10個の素数ならび,10), append(_10個の素数ならび,_残り素数ならび,_素数ならび), 一行出力する(_10個の素数ならび), 素数ならびを一行に10要素ずつの表として出力する(_残り素数ならび). 素数ならびを一行に10要素ずつの表として出力する(_残った素数ならび) :- 一行出力する(_残った素数ならび). 一行出力する([]). 一行出力する([A]) :- writef('%t\n',[A]),!. 一行出力する([A|R]) :- writef('%t,',[A]), 一行出力する(R). % 以下のサイトは # # 連番のエロ画像をダウンロードするスクリプトください # # # %%% バッチファイル anonymouget %%% # anonymousget2 $2 $3 | ftp -n $1 # # %%% バッチファイル anonymousget2 %%% # echo user anonymous ***** # echo binary # echo get $1 $2 | plustosp # echo close # echo quit # # %%% plustosp.c %%% # #include # main() { # unsigned int c0,n; # n=0; # while((c0=getchar()) != EOF) { # if(c0=='+') # putchar(32); # else # putchar(c0); # } # } 連番のエロ画像をダウンロードする(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点) :- 連番ファイルをダウンロードする(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点). 連番ファイルをダウンロードする(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点) :- anonymousgetの準備, ダウンロード対象ファイルを得る(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点,_連番,_ファイル名_2), anonymousget(_ftpサイト名,_ファイル名_2,_ファイル名_2), _連番終点 = _連番. ダウンロード対象ファイルを得る(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点,_連番,_ファイル名_2) :- between(_連番起点,_連番終点,_連番), 整数から文字列(_連番桁数,_連番,_連番文字列), atomic_list_concat([_ファイル名,_連番文字列,'.',_サフィックス],_ファイル名_2). anonymousgetの準備 :- バッチファイルanonymousgetの生成, コマンドデータanonymousget2の生成, 実行プログラムplustospの生成. バッチファイルanonymousgetの生成 :- open(anonymousget,write,Outstream), write(Outstream,'anonymousget2 $2 $3 | ftp -n $1\n'), close(Outstream), shell('chmod 777 anonymousget'),!. コマンドデータanonymousget2の生成 :- open(anonymousget2,write,Outstream), write(Outstream,'echo user anonymous *****\necho binary\necho get $1 $2 | plustosp\necho close\necho quit\n'), close(Outstream). 実行プログラムplustospの生成 :- open('plustosp.c',write,Outstream), write(Outstream,'#include \nmain() {\n unsigned int c0,n;\n n=0;\n while((c0=getchar()) != EOF) {\n if(c0==\'+\')\n putchar(32);\n else\n putchar(c0);\n }\n}\n'), close(Outstream), shell('cc -o plustosp plustosp.c';chmod 777 plustosp),!. anonymousget(_ftpサイト名,_入力ファイル名,_出力ファイル名) :- atomic_list_concat(['anonymousget ',_ftpサイト名,' "',_入力ファイル名,'" "',_出力ファイル名,'"'],S), shell(S),!. 整数から文字列(_文字桁,_整数,_数値文字列) :- length(L,_文字桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,'0'). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: 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://nojiriko.asia/prolog/fukakusa_no_shoushou_1.html の後半に現れる # 算みて見たれば/2 は append(_,[_|_算みて見たれば],_榻の数々) でも同じ結果が # 得られる。 # しかし、appendだと少将の喘ぐような気持ちが表現できない。ここはどうしても # 再帰の疎ましさが必要だ。 # # 上のツイートには誤りがあった。 # # # @bezokuGon 今日は。今朝私のPrologのツイートをお気に入りに登録されたよう # なのですが、私の記述に誤りがありました。 # append/3の方は解を返す順序が逆でした。 # これだと、少将がひとつ、ふたつ、みっつ、と数えることになりませんから、 # 使えません。すみませんでした。 # # それから append(_,_算みて見たれば,_榻の数々) としないと # 一要素(第一要素を)取り損ないます。順序は場合によっては罷り通るでしょうが、 # こちらは致命的でした。 # %%%% 定義その一 %%%%%%%%%%%%%%%%%%%%%%%%%%% 末尾からリストを切り出す([_|R],L) :- 末尾からリストを切り出す(R,L). 末尾からリストを切り出す(L,L). % ?- 末尾からリストを切り出す([1,2,3],L). % L = []; % L = [3]; % L = [2,3]; % L = [1,2,3]; % false. %%%% こちらは要素数が降順になる切り出し %%% 末尾からリストを切り出す(L1,L) :- append(_,L,L1). % ?- 末尾からリストを切り出す([1,2,3],L). % L = [1,2,3]; % L = [2,3]; % L = [3]; % L = []; % false. % 以下のサイトは # 昨日の http://nojiriko.asia/prolog/fukakusa_no_shoushou_1.html の後半に現れる # 算みて見たれば/2 は append(_,[_|_算みて見たれば],_榻の数々) でも同じ結果が # 得られる。 # しかし、appendだと少将の喘ぐような気持ちが表現できない。ここはどうしても # 再帰の疎ましさが必要だ。 # # 上のツイートには誤りがあった。 # # # @bezokuGon 今日は。今朝私のPrologのツイートをお気に入りに登録されたよう # なのですが、私の記述に誤りがありました。 # append/3の方は解を返す順序が逆でした。 # これだと、少将がひとつ、ふたつ、みっつ、と数えることになりませんから、 # 使えません。すみませんでした。 # # それから append(_,_算みて見たれば,_榻の数々) としないと # 一要素(第一要素を)取り損ないます。順序は場合によっては罷り通るでしょうが、 # こちらは致命的でした。 # %%%% 定義その一 %%%%%%%%%%%%%%%%%%%%%%%%%%% 末尾からリストを切り出す([_|R],L) :- 末尾からリストを切り出す(R,L). 末尾からリストを切り出す(L,L). % ?- 末尾からリストを切り出す([1,2,3],L). % L = []; % L = [3]; % L = [2,3]; % L = [1,2,3]; % false. %%%% こちらは要素数が降順になる切り出し %%% 末尾からリストを切り出す(L1,L) :- append(_,L,L1). % ?- 末尾からリストを切り出す([1,2,3],L). % L = [1,2,3]; % L = [2,3]; % L = [3]; % L = []; % false. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/228 # # ご教示お願いいたします。 # # ・DBMS名とバージョン # SQL Server2008 # # ・テーブルデータ # テーブル名:住所_MST # ID 住所 # ------------ # 001 住所A # 002 住所B # 003 住所C # 004 住所D # 005 住所E # 006 住所F # 008 住所G # 010 住所H # # ・欲しい結果 # IDに007を設定してINSERTしたいのですが上手くSQL文が浮かびませんでした # 仕様としましては一番若いIDから、設定されていないIDを取得してINSERTします # なお、IDはキー設定されています # # 結果は下記のようになります # ID 住所 # ------------ # 001 住所A # 002 住所B # 003 住所C # 004 住所D # 005 住所E # 006 住所F # 007 新住所 # 008 住所G # 010 住所H # # '・DBMS名とバージョン SQL Server2008 ・テーブルデータ テーブル名:住所_MST ID 住所 ------------ 001 住所A 002 住所B 003 住所C 004 住所D 005 住所E 006 住所F 008 住所G 010 住所H ・欲しい結果 IDに007を設定してINSERTしたいのですが上手くSQL文が浮かびませんでした 仕様としましては一番若いIDから、設定されていないIDを取得してINSERTします なお、IDはキー設定されています 結果は下記のようになります ID 住所 ------------ 001 住所A 002 住所B 003 住所C 004 住所D 005 住所E 006 住所F 007 新住所 008 住所G 010 住所H '(_住所) :- '一番若いIDから、設定されていないIDを取得してINSERTします'(_住所). '一番若いIDから、設定されていないIDを取得してINSERTします'(_住所) :- between(1,999,N), 頭部零文字列(3,N,_ID), \+(住所_MST(_ID,_)), assertz(住所_MST(_ID,_住所)),!. 頭部零文字列(_長さ,_整数,_頭部零文字列) :- length(_頭部零文字ならび,_長さ), number_chars(_整数,Chars), append(L0,Chars,_頭部零文字ならび), all(L0,'0'), atom_chars(_頭部零文字列,_頭部零文字ならび),!. all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/722 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文 行列ベクトル積 # http://ime.nu/ideone.com/21ECGq # 行列ベクトル積(_行列,_ベクトル,_行列ベクトル積) :- findall([S],( append(_,[L|_],_行列), findsum(U,( nth1(Nth1,L,A), nth1(Nth1,_ベクトル,[B]), U is A * B), S)), _行列ベクトル積). findsum(T,P,Sum) :- findall(T,P,L), sum_list(L,Sum). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/437 # # 【 形態 】Javaアプリケーション # 【 期限 】一週間後まで # 【 Ver  】java version "1.7.0_03" # 【 課題 】2次元配列、1次元配列を使って科目得点表を表示するプログラムを作成する。 #       平均点に関しては、プログラム内で求めて表示する。また、配列の要素は必要な個数分だけにする。 #        #           国語  数学  英語  社会  理科  平均 #       青木   50   90   76           72 #       木村   80   46   84   67       69 #       山田   30   69   72   89   56   63 # #       科目名、生徒はStringクラスの1次元配列、点数はint型の2次元配列で初期化。 # # 【 補足 】点数、平均点の表示は何とか出来たのですが、表にしようとすると、青木の社会、理科、木村の理科の部分が足りず、ArrayIndexOutOfBoundsExceptionが発生してしまいます。 # '2次元配列、1次元配列を使って科目得点表を表示するプログラムを作成する。 平均点に関しては、プログラム内で求めて表示する。また、配列の要素は必要な個数分だけにする。                  国語  数学  英語  社会  理科  平均       青木   50   90   76           72       木村   80   46   84   67       69       山田   30   69   72   89   56   63 科目名、生徒はStringクラスの1次元配列、点数はint型の2次元配列で初期化。' :- 科目名ならび(_科目名ならび), 生徒ならび(_生徒ならび), 得点ならび(_得点ならび), 科目得点表を表示する(_得点ならび,_生徒ならび,_得点ならぴ). 科目名ならび([国語,数学,英語,社会,理科]). 生徒ならび([青木,木村,山田]). 得点ならび([[50,90,76,[],[],72],[80,46,84,67,[],69],[30,69,72,89,56,63]]). 科目得点表を表示する(_科目ならび,_生徒ならび,_得点ならぴ) :- 科目見出し(_科目ならび), 行表示(_生徒ならび,_得点ならび). 科目見出し(_科目ならび) :- write(' '), append(_,[A|R],_科目ならび), 幅は8桁で表示(A), R = [], write('\n'). 行表示([],[]). 行表示([_生徒|R1],[_得点ならび|R2]) :- writef(' %t',[_生徒]), 得点列を表示する(_得点ならび), 行表示(R1,R2). 得点列を表示する(_得点ならび) :- append(_,[N|R],_得点ならび), 幅は8桁で表示(N), R = [], write('\n'). 幅は8桁で表示(A) :- atom(A), 文字列の末尾を空白で埋める(A,S), writef('%t',[S]). 幅は8桁で表示(N) :- integer(N), 整数の頭部を空白で埋める(N,S), writef('%t',[S]). 文字列の末尾を空白で埋める(A,S) :- length(L,8), atom_chars(A,L1), append(L1,L2,L), all(L2,' '), atom_chars(S,L2). 整数の頭部を空白で埋める(A,S) :- length(L,8), number_chars(A,L2), append(L1,L2,L), all(L1,' '), atom_chars(S,L2). % 以下のサイトは # 出典:: 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/628 # # [1] c言語 # [2] 問題文:C言語でのポインタを使った行列の操作です。 # 1 2 3 0 # 0 0 0 1 # 2 0 0 2 # 0 0 0 1 # をファイルから読み込み,以下の操作を実行せよ。 # 1,非零の要素を左から右へ、上から下へ書きならべた配列を作り、 # [1 2 3 1 2 2 1]とする。 # 2,各要素が何行目・何列目にあるかを別の配列に格納し、 # A = [1 2 3 1 2 2 1] 非零要素リスト # IA = [1 1 1 2 3 3 4] i行 # JA = [1 2 3 4 1 4 4] j列 # の配列が出力されるようにせよ。 # 3,何番目の要素からiが始まるかを書きならべる。 # IAの中で、1が初めに出現するのは1番目、2が初めに出現するのは4番目、3が初めに出現するのは5番目、4が初めに出現するのは7番目なので、 # IA' = [1 4 5 7] の配列が出力されるようにせよ # # '非零の要素を左から右へ、上から下へ書きならべた配列を作り'(_行列,_非零要素ならび) :- flatten(_行列,_要素ならび), findall(_非零要素,( member(_非零要素,_行列), \+(_非零要素 = 0)), _非零要素ならび). '各要素が何行目・何列目にあるかを別の配列に格納し'(_行列,_非零要素ならび,_非零要素の元々の行位置ならび,_非零要素の元々の列位置ならび) :- findall([_非零要素,_非零要素の元々の行位置,_非零要素の元々の列位置],( nth1(_非零要素の元々の行位置,_行列,_行), nth1(_非零要素の元々の列位置,_行,_非零要素), \+(_非零要素 = 0)), LL), 三つのならびに分解(LL,_非零要素ならび,_非零要素の元々の行位置ならび,_非零要素の元々の列位置ならび). 三つのならびに分解([],[],[],[]). 三つのならびに分解([[A,B,C]|R1],[A|R2],[B|R3],[C|R4]) :- 三つのならびに分解(R1,R2,R3,R4). '何番目の要素からiが始まるかを書きならべる。IAの中で、1が初めに出現するのは1番目、2が初めに出現するのは4番目、3が初めに出現するのは5番目、4が初めに出現するのは7番目なので、IA = [1 4 5 7] の配列が出力されるようにせよ'(_非零要素の元々の行位置ならび,_何番目の非零要素から元々の行列での行が変わったかを示すならび) :- findall(_何番目,( append(L0,[I|R],_非零要素の元々の行位置ならび), \+(member(I,L0), length([_|L0],_何番目)), _何番目の非零要素から元々の行列での行が変わったかを示すならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/617 # # 環境:Windows XP(32bit)、VC++ 2005 # # ある与えられた文字列をバイナリに変換して16バイトのバイト配列に入れる # 与えられる文字列は、バイナリ変換した時に128bitまでに収まる数値の文字列とする # という問題で困ってます # 例: # "1234" # →1234(4D2h) # →00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,04h,D2h # # で、QWORD以上は整数値にできずに困っています。 # "18446744073709551616" # →10000000000000000h # →00h,00h,00h,00h,00h,00h,00h,01h,00h,00h,00h,00h,00h,00h,00h,00h, # どのように処理すればいいのでしょうか? # # 'ある与えられた文字列をバイナリに変換して16バイトのバイト配列に入れる。与えられる文字列は、バイナリ変換した時に128bitまでに収まる数値の文字列とする'(_文字列,_バイナリー文字列) :- append(L,16), atom_number(_文字列,_整数), '16進数ならびに変換'(_整数,[],L1), '先頭から00hを埋めて16進数ならびをバイナリー文字列に変換'(L,L1,_バイナリー文字列). '16進数ならびに変換'(0,L,L) :- !. '16進数ならびに変換'(_整数,L1,L) :- M is _整数 mod 256, N is _整数 // 256, '16進数表示'(M,C), '16進数ならびに変換'(N,[C|L1],L). '16進数表示'(N,C) :- N_1 is N // 256, N_2 is N mod 256, 変換(N_1,A), 変換(N_2,B), atomic_list_concat([A,B,h],C). 変換(0,'0'). 変換(1,'1'), 変換(2,'2'). 変換(3,'3'), 変換(4,'4'). 変換(5,'5'), 変換(6,'6'). 変換(7,'7'), 変換(8,'8'), 変換(9,'9'), 変換(10,'A'). 変換(11,'B'). 変換(12,'C'). 変換(13,'D'). 変換(14,'E'). 変換(15,'F'). '先頭から00hを埋めて16進数ならびをバイナリー文字列に変換'(L,L1,_バイナリー文字列) :- append(L0,L1,L), all(L0,'00h'), atomic_list_concat(L,',',_バイナリ文字列). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/209 # # MySQLの初歩的な質問です # # テーブル名y2010 主キー 場所 # # 場所 人口 # ---------------- # 東京 1500 # 大阪 800 # 福岡  500 #  ・・・ # # テーブル名 y2011 主キー 場所 # # 場所 人口 # ---------------- # 東京 1600 # 大阪 900 # 福岡  600 # # のようなテーブルがあるときに、 # # テーブル名 y_sum 主キー 場所 # # 場所 人口 # ---------------- # 東京 3100 # 大阪 1700 # 福岡 1100 # # のように、複数のテーブルから主キーを含むフィールドを参照して # 参照した或るフィールドの値の和を代入したフィールドをもつテーブルを新たに作成するには # どのようなクエリにすればよいのでしょうか? # # おねがいしますm(._.)m おねがい # :- dynamic(y_sum/2). '複数のテーブルから主キーを含むフィールドを参照して参照した或るフィールドの値の和を代入したフィールドをもつテーブルを新たに作成する' :- setof(_場所,[_場所] ^ 場所(_場所),_場所ならび), append(_,[_場所|R],_場所ならび), 人口の合計(_場所,_人口の合計), assertz(y_sum(_場所,_人口の合計)), R = []. 場所(_場所) :- y2010(_場所,_). 場所(_場所) :- y2011(_場所,_). 人口(_場所,_人口) :- y2010(_場所,_人口). 人口(_場所,_人口) :- y2011(_場所,_人口). 人口の合計(_場所,_人口の合計) :- findsum(_人口,人口(_場所,_人口),_人口の合計). % 以下のサイトは # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):◎見にくくなりそうなので一番下に書きます。 # [3] 環境 #  [3.1] OS:Windows #  [3.2] コンパイラ名とバージョン:VC++ 2005 #  [3.3] 言語:C++ # [4] 期限:明日 11/3 # [5] その他の制限: 標準入出力ストリームで、 # # 整数除算による商の計算表(下記の例を参照)を表示する. # # # | 1 2 3 4 5 6 7 8 9 # --+------------------ # 1 | 1 0 0 0 0 0 0 0 0 # 2 | 2 1 0 0 0 0 0 0 0 # 3 | 3 1 1 0 0 0 0 0 0 # 4 | 4 2 1 1 0 0 0 0 0 # 5 | 5 2 1 1 1 0 0 0 0 # 6 | 6 3 2 1 1 1 0 0 0 # 7 | 7 3 2 1 1 1 1 0 0 # 8 | 8 4 2 2 1 1 1 1 0 # 9 | 9 4 3 2 1 1 1 1 1 # # これを出力するようなプログラムを教えてください。 '整数除算による商の計算表(下記の例を参照)を表示する' :- 商の計算表本体(_商の計算表本体), 商の計算表見出し表示, 商の計算表本体の表示(_商の計算表本体). 商の計算表本体(_商の計算表本体) :- findall(_表示行,( between(1,9,_被除数), 表示行(_被除数,_表示行)), _商の計算表本体). 表示行(_被除数,_表示行) :- findall(N,( between(1,9,_除数), N is _被除数 // _除数), _商表示ならび), atomic_list_concat([_被除数,'|'|_商表示ならび],' ',_表示行). 商の計算表見出し表示 :- write(' | 1 2 3 4 5 6 7 8 9\n--+------------------\n'). 商の計算表本体の表示(_商の計算表本体) :- append(_,[_表示行|R],_商の計算表本体), write('%t\n',[_表示行]), R = []. % 以下のサイトは # このディレクトリの索引 # [1] 授業単元:プログラミング # [2] 問題文( # キーボードから入力したメニュー番号に沿った図形を「*」で表示するプログラムを # 作成してください。なお、プログラム作成時は以下の仕様に従ってください。 # ファイル名: kadai3.c # 【 問題作成時の注意点 】 # ・メニュー番号と図形の種類は以下の通りとします。なお、キーボードから # 入力した値が以下の番号以外の場合、再びメニュー番号を入力するように # してください。 # 1 三角形 # 2 四角形 # ・図形の段数(高さ)は、キーボードから入力してください。なお、キーボード # から入力した数が1 以下の場合、エラーメッセージを表示し、exit 関数で # プログラムを終了してください。 # エラーメッセージの例) wrong number # ・図形の表示には関数を利用してください。関数のプロトタイプ宣言は以下の # 通りとします。 # void DrawTriangle(int); # void DrawRectangle(int); # [3] 環境 #  [3.1] OS: Windows #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C++ # [4] 期限: ([2006年11月2日17:30まで # [5] その他の制限:なし 'キーボードから入力したメニュー番号に沿った図形を「*」で表示するプログラムを 作成してください。なお、プログラム作成時は以下の仕様に従ってください。 l・メニュー番号と図形の種類は以下の通りとします。なお、キーボードから 入力した値が以下の番号以外の場合、再びメニュー番号を入力するように してください。 1 三角形 2 四角形 ・図形の段数(高さ)は、キーボードから入力してください。なお、キーボード から入力した数が1 以下の場合、エラーメッセージを表示し、exit 関数で プログラムを終了してください。' :- 'キーボードから入力した 1 三角形 2 四角形 のメニュー番号'(_メニュー番号), 'メニュー番号に沿った図形を「*」で表示する'(_メニュー番号). 'キーボードから入力した 1 三角形 2 四角形 のメニュー番号'(_メニュー番号) :- write('左側の数字で選択してください\n\n1 三角形\n2 四角形\n\n'), 整数を得る('メニュー番号[1/2]',member(_メニュー番号,[1,2]),_メニュー番号). 'メニュー番号に沿った図形を「*」で表示する'(1) :- 三角形の表示. 'メニュー番号に沿った図形を「*」で表示する'(2) :- 四角形の表示. 三角形の表示 :- '図形の段数(高さ)を入力してください'(_図形の高さ), 三角形の図形像(_図形の高さ,_図形像), 図形表示(_図形像). 三角形の図形像(_図形の高さ,_図形像,_図形像) :- findall(_表示星列,( between(1,_図形の段数,_現在の段), 三角形の表示星列(_現在の段,_表示星列)), _図形像). 三角形の表示星列(_現在の段,_表示星列) :- length(L,_現在の段), all(L,'*'), atomic_list_concat(L,_表示星列). 四角形の表示 :- 幅を入力してください(_図形の幅), '図形の段数(高さ)は、キーボードから入力してください'(_図形の高さ), 四角形の図形像(_図形の幅,_図形の高さ,_図形像), 図形の表示(_図形像). 四角形の図形像(_図形の幅,_図形の高さ,_図形像) :- 表示星列(_図形の幅,_表示星列), findall(_表示星列,( between(1,_図形の高さ,_), 四角形の表示星列(_図形の幅,_表示星列)), _図形像). 図形の表示(_図形像) :- append(_,[_表示星列|R],_図形像), writef('%t\n',[_表示星列]), R = []. 四角形の表示星列(_現在の段,_表示星列) :- length(L,_現在の段), all(L,'*'), atomic_list_concat(L,_表示星列). '図形の段数(高さ)を入力してください'(_図形の高さ) :- 整数を得る(図形の段数,_図形の高さ), 図形の高さ診断(_図形の高さ),!. '図形の段数(高さ)を入力してください'(_図形の高さ) :- '図形の段数(高さ)を入力してください'(_図形の高さ). 図形の高さ診断(_図形の高さ) :- _図形の高さ > 1,!. 図形の高さ診断(_図形の高さ) :- writef('入力された図形の高さ %t はこの図形の高さとして適切でありません。\n再入力をお願いします。\n',[_図形の高さ]), fail. '幅を入力してください'(_図形の幅) :- 整数を得る(図形の段数,_図形の幅), 図形の幅診断(_図形の幅),!. '幅を入力してください'(_図形の幅) :- '幅を入力してください'(_図形の幅). 図形の幅診断(_図形の幅) :- _図形の幅 > 1,!. 図形の幅診断(_図形の幅) :- writef('入力された図形の幅 %t はこの図形の幅として適切でありません。\n再入力をお願いします。\n',[_図形の幅]), fail. all([],_). all([A|R],A) :- all(R). % 以下のサイトは # [1] 授業単元:プログラミング # [2] 問題文( # 問題1 # キーボードから入力した5 件のデータのうち、最大値と最小値を調べ、最後に # 表示してください。なお、プログラム作成時は以下の仕様に従ってください。 # ファイル名: kadai2.c # 【 問題作成時の注意点 】 # ・キーボードから入力したデータはint 型配列で管理してください。 # ・データを入力する際にはscanf 関数を利用してください。 # ・画面にメッセージを表示する際にはprintf 関数を利用してください。 # なお、結果表示時は、最大値/最小値となる要素の添字もあわせて # 表示してください。また、最大値/最小値が複数ある場合は、 # すべての要素を表示してください。 # 【 実行時のイメージ 】 # ----------------------------- # data[0] ... 69 ←「...」の後ろはキーボード入力部 # data[1] ... 91 ←「...」の後ろはキーボード入力部 # data[2] ... 91 ←「...」の後ろはキーボード入力部 # data[3] ... 72 ←「...」の後ろはキーボード入力部 # data[4] ... 86 ←「...」の後ろはキーボード入力部 # Max : data[1] = 91 # Max : data[2] = 91 # Min : data[0] = 69 # ----------------------------- # # [3] 環境 #  [3.1] OS: Windows #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C++ # [4] 期限: ([2006年11月2日17:30まで # [5] その他の制限:なし # 'キーボードから入力した5 件のデータのうち、最大値と最小値を調べ、最後に 表示してください。なお、プログラム作成時は以下の仕様に従ってください。 ファイル名: kadai2.c 【 問題作成時の注意点 】 ・キーボードから入力したデータはint 型配列で管理してください。 ・データを入力する際にはscanf 関数を利用してください。 ・画面にメッセージを表示する際にはprintf 関数を利用してください。 なお、結果表示時は、最大値/最小値となる要素の添字もあわせて 表示してください。また、最大値/最小値が複数ある場合は、 すべての要素を表示してください。 【 実行時のイメージ 】 ----------------------------- data[0] ... 69 ←「...」の後ろはキーボード入力部 data[1] ... 91 ←「...」の後ろはキーボード入力部 data[2] ... 91 ←「...」の後ろはキーボード入力部 data[3] ... 72 ←「...」の後ろはキーボード入力部 data[4] ... 86 ←「...」の後ろはキーボード入力部 Max : data[1] = 91 Max : data[2] = 91 Min : data[0] = 69 ----------------------------- ' :- 'キーボードから入力した5 件のデータのうち、最大値と最小値を調べ、最後に表示してください。'. 'キーボードから入力した5 件のデータのうち、最大値と最小値を調べ、最後に表示してください。' :- キーボードから入力した5 件のデータのうち(_5件のデータ), 最大値と最小値を調べ(_5件のデータ,_最大値情報のならび,_最小値の情報ならび), 最大値の情報を表示する(_最大値の情報ならび), 最小値の情報を表示する(_最小値の情報ならび). キーボードから入力した5 件のデータのうち(_5件のデータ) :- length(_5件のデータ,5), findall(_データ,( append(L0,[_|_],_5件のデータ), データを得る(L0,_データ)), _5件のデータ). データを得る(L0,_データ) :- length(L0,_0基準位置), writef('data[%t] ... ',[_0基準位置]), 整数を得る(整数,_データ),!. 最大値と最小値を調べ(_5件のデータ,_最大値の情報ならび,_最小値の情報ならび) :- 位置情報を持った最大値(_5件のデータ,_最大値の情報ならび), 位置情報を持った最小値(_5件のデータ,_最小値の情報ならび). 位置情報を持った最大値(_5件のデータ,_最大値の情報ならび) :- findall([_位置情報,_最大値],( append(L0,[_最大値|R],_5件のデータ), すべてが等しいか小さい(L0,_最大値), すべてが等しいか小さい(R,_最大値), length(L0,_位置情報)), _最大値の情報ならび). 位置情報を持った最小値(_5件のデータ,_最小値の情報ならび) :- findall([_位置情報,_最大値],( append(L0,[_最大値|R],_5件のデータ), すべてが等しいか大きい(L0,_最小値), すべてが等しいか大きい(R,_最小値), length(L0,_位置情報)), _最小値の情報ならび). すべてが等しいか小さい([],_). すべてが等しいか小さい([A|R],_基準値) :- A @=< _基準値, すべてが等しいか小さい(R,_基準値). すべてが等しいか大きい([],_). すべてが等しいか大きい([A|R],_基準値) :- A @>= _基準値, すべてが等しいか大きい(R,_基準値). 最大値の情報を表示する(_最大値の情報ならび) :- append(_,[[_0基準位置,_最大値]|R],_最大値の情報ならび), writef('Max : data[%t] = %t\n',[_0基準位置,_最大値]), R = []. 最小値の情報を表示する(_最小値の情報ならび) :- append(_,[[_0基準位置,_最小値]|R],_最小値の情報ならび), writef('Min : data[%t] = %t\n',[_0基準位置,_最小値]), R = []. % 以下のサイトは # [1] プログラミング # [2] 50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求めるプログラムを作成せよ. # # 次のような出力が得られることを確認せよ (表示形式は各自工夫せよ). # o 310円 → 50円×3枚+80円×2枚+120円×0枚 # o 390円 → 50円×3枚+80円×0枚+120円×2枚, 50円×3枚+80円×3枚+120円×0枚 # [3] 環境 #  [3.1] winXP sp2 #  [3.2] cygwin #  [3.3] C # [4] 2006年10月23日23時59分 # [5] 途中までやったんで埋める形でお願いします # 途中までやったぶんは次書きます '50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求めて、これを表示する. ' :- 'キーボードから金額 t を入力し'(_金額t), '50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求める'(_金額t,_切手枚数の組合せならび), 組合せを表示する(_金額t,_切手枚数の組合せならび). '50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求める. '(_金額t,_切手枚数の組合せならび) :- setof([_50円切手の枚数,_80円切手の枚数,_120円切手の枚数], [_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数] ^ 組合せ合計が金額tと一致する(_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数)),_切手枚数の組合せならび). 'キーボードから金額 t を入力し'(_金額t) :- 整数を得る('金額t ',_金額t > 0,_金額t). 組合せ合計が金額tと一致する(_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数) :- 組合せ合計が金額tと一致する(_L,_金額t), 組合せ枚数を数える(L,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数). 組合せ合計が金額tと一致する(_L,_金額t) :- between(1,12,N), 組合せ([50,50,50,50,80,80,80,80,120,120,120],N,L), sum_list(L,_金額t), 組合せ枚数を数える(L,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数) :- 度数(member(50,L),_50円切手の枚数), 度数(member(80,L),_80円切手の枚数), 度数(member(120,L),_120円切手の枚数). 組合せを表示する(_,[]) :- write('切手の組合せは作れません\n'). 組合せを表示する(_金額t,_切手枚数の組合せならび) :- forall(append(_,[[_50円切手の枚数,_80円切手の枚数,_120円切手の枚数]|R],_切手枚数の組合せならび), writef('%w -> 50円切手×%w枚+80円切手×%w枚+120円切手×%w枚\n',[_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数])). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R2]) :- 'Nを1減らして残り要素の組合せ'(R1,N,R2). 組合せ([_|R1],N,R2) :- 'Nはそのままで残り要素の組合せ'(R1,N,R2). 'Nを1減らして残り要素の組合せ'(R1,N,R2) :- N > 1, succ(N_1,N), 組合せ(R1,N_1,R2). 'Nはそのままで残り要素の組合せ'(R1,N,R2) :- N > 1, 組合せ(R1,N,R2). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # [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/1349527750/412 # # [1] 授業単元:C言語 for文 # [2] 問題文(含コード&リンク): # +#+#+#+#+* # +#+#+#+*-* # +#+#+*-*-* # +#+*-*-*-* # +*-*-*-*-*  # この模様を二重ループを使って作成せよ # '+#+#+#+#+* +#+#+#+*-* +#+#+*-*-* +#+*-*-*-* +*-*-*-*-*  この模様を作成する'(_模様を表すならび) :- findall(S,( append(L1,L2,[_,_,_,_]), 中の模様を生成(L1,L2,S)), _模様を表すならび). 中の模様を生成(L1,L2,S) :- all(L1,'#+'), all(L2,'*-'), atomic_list_concat(L1,S1), atomic_list_concat(L2,S2), atomic_list_concat([+,S1,S2,*],S). % 以下のサイトは # 出典 :: C/C++言語の宿題片付けます 160代目 #412 # [1] 授業単元:C言語 for文 # [2] 問題文(含コード&リンク): # +#+#+#+#+* # +#+#+#+*-* # +#+#+*-*-* # +#+*-*-*-* # +*-*-*-*-*  # この模様を二重ループを使って作成せよ # '+#+#+#+#+* +#+#+#+*-* +#+#+*-*-* +#+*-*-*-* +*-*-*-*-*  この模様を作成する' :- forall(行模様を形成し(L), 行模様を表示する(L)). 行模様を形成し([D,C,B,A]) :- append(L1,L2,[A,B,C,D]), '*-と#+のパターンで埋める'(L1,L2). '*-と#+のパターンで埋める'(L1,L2) :- all(L1,'*-'), all(L2,'#+'). all([],_). all([A|R],A) :- all(R,A). 行模様を表示する(L) :- writef('+%w%w%w%w*\n',L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ # '2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。' :- findall(Count,( between(1,100,N), count((between(1,100,M), U is random(1000), U < 400), Count)), L), 分布を表示する(L). 分布を表示する(L) :- between(0,100,N), 表示文字列を生成(N,L,_表示文字列), writef('%t: %t\n',[_カウント表示文字列]), N = 100. 表示文字列を生成(N,L,_表示文字列) :- 整数から文字列(2,Count,_カウント表示文字列), findall((*),( member(N,L)), L), atomic_list_concat([_カウント表示文字列,': '|L],_表示文字列). 整数から文字列(_文字列桁,_整数,_文字列) :- 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列),!. 整数から文字列(_文字列桁,_整数,_文字列) :- atom_number(_文字列,_整数). 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列) :- length(L,_文字列桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,' '), atomic_list_concat(L,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ # 'コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn,そのmax、min を調べよ。'(_n) :- append(_,[_試行回数|R],[10,100,1000,10000,100000]), 試行回数の集計ならび(_試行回数,_最大値,_最小値), 整数から文字列(6,_試行回数,_試行回数文字列), writef('試行回数%t: 最大値=%t 最小値=%t\n',[_試行回数文字列,_最大値,_最小値]), R = []. 試行回数の集計ならび(_試行回数,_最大値,_最小値) :- findall(S,( between(1,_試行回数,_), count(( between(1,_n,_), 1 is random(1)), S)), L), min(L,_最小値), max(L,_最大値),!. 整数から文字列(_文字列桁,_整数,_文字列) :- 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列),!. 整数から文字列(_文字列桁,_整数,_文字列) :- atom_number(_文字列,_整数). 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列) :- length(L,_文字列桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,' '), atomic_list_concat(L,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ 'サイコロを10,100,1000,10000,100000 回投げて分布を調べよ'(N,0,0,0,0,0,0,_1,_2,_3,_4,_5,_6) :- append(_,[_何回|R],[10,100,1000,10000,100000]), サイコロの目の頻度(0,_何回,L1,L2), writef('投げた回数..%t, 1..%t,2..%t,3..%t,4..%t,5..%t,6..%t\n',[_何回|L2]), R = []. サイコロの目の頻度(_何回,_何回,L,L) :- !. サイコロの目の頻度(N,_何回,L1,L) :- _サイコロの目 is random(6) + 1, 頻度に加算(_サイコロの目,L1,L2), N_2 is N + 1, サイコロの目の頻度(N_2,_何回,L2,L). 頻度に加算(1,[_1,_2,_3,_4,_5,_6],[_1_2,_2,_3,_4,_5,_6]) :- _1_2 is _1 + 1. 頻度に加算(2,[_1,_2,_3,_4,_5,_6],[_1,_2_2,_3,_4,_5,_6]) :- _2_2 is _2 + 1. 頻度に加算(3,[_1,_2,_3,_4,_5,_6],[_1,_2,_3_2,_4,_5,_6]) :- _3_2 is _3 + 1. 頻度に加算(4,[_1,_2,_3,_4,_5,_6],[_1,_2,_3,_4_2,_5,_6]) :- _4_2 is _4 + 1. 頻度に加算(5,[_1,_2,_3,_4,_5,_6],[_1,_2,_3,_4,_5_2,_6]) :- _5_2 is _5 + 1. 頻度に加算(6,[_1,_2,_3,_4,_5,_6],[_1,_2,_3,_4,_5,_6_2]) :- _6_2 is _6 + 1. % 以下のサイトは # 出典 :: C言語の宿題片付けます 160代目 #400 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/QdOnaWYm # # /* # ビンゴゲームを作る # # 仕様 # ・5×5のビンゴカードをint型の2次元配列として宣言する # ・ビンゴカードの数字は重複しない1〜100の乱数を作り、それから先頭の25個をビンゴカードに適用 # ・最初にビンゴカード作成に使うための重複しない100個の乱数を見やすい形で表示 # ・値を交換する処理は関数化する # ・実際のビンゴゲームのようにガラガラで1つずつ数字が出てくる # ・ガラガラは1〜100までの重複しない乱数を作る機械であり、ビンゴカード作成に用いた乱数列とガラガラで使う乱数列は別物である # ・ビンゴカード作成用の乱数とガラガラ用の乱数はヒープ領域に確保した配列に格納 # ・カードの縦、横、斜めのいずれかがそろったらゲーム終了 # */ # :- dynamic(賞品/1). ビンゴ参加者(ケイスケ). ビンゴ参加者(ユウヤ). ビンゴ参加者(タダシ). ビンゴ参加者(マッチ). ビンゴ参加者(トオル). 賞品('フェラーリ(模型)'). 賞品('コルト45(模型)'). 賞品(西竹一の使っていた拍車). 賞品(ティーボールセット). 賞品(ビンゴセット). ビンゴゲーム :- findall(_ビンゴ参加者,ビンゴ参加者(_ビンゴ参加者),_ビンゴ参加者ならび), ビンゴゲーム(_ビンゴ参加者ならび). ビンゴゲーム(_ビンゴ参加者ならび) :- ゲーム参加者のビンゴカード(_ビンゴ参加者ならび,_ビンゴカードならび), 'ガラガラは1〜100までの重複しない乱数を作る機械であり、ビンゴカード作成に用いた乱数列とガラガラで使う乱数列は別物である'(_ガラガラで使う乱数列), 参加者全員がビンゴとなるまでガラガラを繰り返す(_ビンゴカードならび,_ガラガラで使う乱数列). 参加者全員がビンゴとなるまでガラガラを繰り返す([],_) :- write('ビンゴ終了\nご苦労さまでした\n'),!. 参加者全員がビンゴとなるまでガラガラを繰り返す(_参加者ビンゴカードならび,L1) :- ガラガラ(L1,_数,L2), ビンゴになったカードを探し賞品を渡してそのカードを削除(_数,_参加者ビンゴカードならび,_ビンゴになった人を削除した参加者ビンゴカードならび), 参加者全員がビンゴとなるまでガラガラを繰り返す(_ビンゴになった人を削除した参加者ビンゴカードならび,L2). '5×5のビンゴカードをint型の2次元配列として宣言する'(_ビンゴカード) :- length(_ビンゴカード,5), findall(L,( member(L,_ビンゴカード), length(L,5)),_ビンゴカード). ゲーム参加者のビンゴカード(_ビンゴ参加者ならび,_ビンゴカードならび) :- findall([_ビンゴ参加者,_ビンゴカード],( member(_ビンゴ参加者,_ビンゴ参加者ならび), 'ビンゴカードの数字は重複しない1〜100の乱数を作り、それから先頭の25個をビンゴカードに適用'(_ビンゴカード)),_ビンゴカードならび). 'ビンゴカードの数字は重複しない1〜100の乱数を作り、それから先頭の25個をビンゴカードに適用'(_ビンゴカード) :- 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(L), それから先頭の25個をビンゴカードに適用(L,_ビンゴカード). 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(L) :- findall(N,between(1,100,N),L1), 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(100,L1,L). 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(0,_,[]) :- !. 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(Nth,L1,[N|R2]) :- '重複しない1〜100の乱数'(Nth,L1,N,L2), Nth_1 is Nth - 1, 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(Nth_1,L2,R2). '重複しない1〜100の乱数'(Nth,L1,N,L2) :- Nth0 is random(Nth), length(L0,Nth0), append(L0,[N|R1],L1), append(L0,R1,L2),!. それから先頭の25個をビンゴカードに適用(_重複しない100個の乱数ならび,_ビンゴカード) :- ビンゴカード(_重複しない100個の乱数ならび,_ビンゴカード). ビンゴカード(_重複しない100個の乱数ならび,_ビンゴカード) :- _ビンゴカード=[[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_]], flatten(_ビンゴカード,L), append(L,_,_重複しない100個の乱数ならび). 'ガラガラは1〜100までの重複しない乱数を作る機械であり、ビンゴカード作成に用いた乱数列とガラガラで使う乱数列は別物である'(_ガラガラで使う乱数列) :- 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(_ガラガラで使う乱数列),!. ビンゴになったカードを探し賞品を渡してそのカードを削除(_,[],[]). ビンゴになったカードを探し賞品を渡してそのカードを削除(_数字,[[_ビンゴ参加者,_ビンゴカード_1]|R1],R) :- 一致した数字があったら穴をあける(_数字,_ビンゴカード_1,_ビンゴカード_2), ビンゴになったカードを探し賞品を渡してそのカードを削除_2(_数字,[[_ビンゴ参加者,_ビンゴカード_2]|R1],R). ビンゴになったカードを探し賞品を渡してそのカードを削除_2(_数字,[[_ビンゴ参加者,_ビンゴカード_1]|R1],R) :- ビンゴだったら賞品を渡してその人は上がり(_ビンゴカード_1,_ビンゴ参加者), ビンゴになったカードを探し賞品を渡してそのカードを削除(_数字,R1,R),!. ビンゴになったカードを探し賞品を渡してそのカードを削除_2(_数字,[[_ビンゴ参加者,_ビンゴカード_1]|R1],[[_ビンゴ参加者,_ビンゴカード_1]|R]) :- ビンゴになったカードを探し賞品を渡してそのカードを削除(_数字,R1,R). ビンゴだったら賞品を渡してその人は上がり(_ビンゴカード,_ビンゴ参加者) :- ビンゴ(_ビンゴカード), ビンゴ表示(_ビンゴカード), 賞品を渡す(_ビンゴ参加者),!. 一致した数字があったら穴をあける(_数字,_ビンゴカード_1,_ビンゴカード_2) :- findall(L2,( member(L,_ビンゴカード_1), 一致した場合だけ穴を開ける(_数字,L,L2)),_ビンゴカード_2). 一致した場合だけ穴を開ける(_数字,L,L2) :- append(L0,[_数字|R],L), append(L0,[穴|R],L2),!. 一致した場合だけ穴を開ける(_,L,L). ビンゴ([穴,_,_,_,_],[_,穴,_,_,_,_],[_,_,穴,_,_],[_,_,_,穴,_],[_,_,_,_,穴]) :- !. ビンゴ([_,_,_,_,穴],[_,_,_,穴,_],[_,_,穴,_,_],[_,穴,_,_,_,_],[穴,_,_,_,_]) :- !. ビンゴ(_ビンゴカード) :- member(L,_ビンゴカード), all(L,穴),!. ビンゴ(_ビンゴカード) :- 転置(_ビンゴカード,_ビンゴカード_2), member(L,_ビンゴカード_2), all(L,穴),!. ビンゴ表示(_ビンゴカード) :- forall(member(L,_ビンゴカード),ビンゴ行表示(L)). ビンゴ行表示([]) :- write('\n'). ビンゴ行表示([A|R]) :- 表示変換(A,B), writef('%w ',[B]), ビンゴ行表示(R). 表示変換(穴,穴) :- !. 表示変換(N,A) :- N < 10, atomic_list_concat([' ',N],A),!. 表示変換(N,A) :- atom_number(A,N). 賞品を渡す(_参加者) :- retract(賞品(_賞品)), writef('%t君はビンゴになりました。賞品は %t です!\n',[_参加者,_賞品]),!. all([],_). all([A|R],A) :- all(R,A). ガラガラ(L1,_数字,L2) :- length(L1,_nth_1), Nth is random(_nth_1) + 1, '重複しない1〜100の乱数'(Nth,L1,_数字,L2). % 以下のサイトは # # 文字列の先頭と末尾から順に対にして取り出す # # ならびの先頭と末尾から順に対にして取り出す # 文字列の先頭と末尾から順に対にして取り出す(_文字列,C1,C2) :- sub_atom(_文字列,S,1,R,C1), sub_atom(_文字列,R,1,_,C2). ならびの先頭と末尾から順に対にして取り出す(_ならび,C1,C2) :- append(L0,[C1|L1],_ならび), length(L0,Len), length(R,Len), append(_,[C2|R],_ならび). % 以下のサイトは a(' bottles of beer on the wall, '). b(' bottles of beer, Take one down and pass it around, '). c(' bottles of beer on the wall. '). d('1 bottle of beer on the wall, 1 bottle of beer, Take one down, and pass it around, Now they are all gone. '). '99 bottles of beer on the wall'(_99_bottles_of_beer_on_the_wall) :- a(A), b(B), c(C), d(D), findall_flatten_concat_2(A,B,C,D,_99_bottles_of_beer_on_the_wall). findall_flatten_concat_2(A,B,C,D,S) :- findall([N,C,N,A,N,B],( for(99,N,2)), L_1), flatten(L_1,[_,_|L_2]), append(L_2,[D],L_3), atomic_list_concat(L_3,S). % 以下のサイトは # 出典:: 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/1349527750/338 # # 7個のデータを入力し、中央地を表示するプログラムを作成して下さい # # 例 # 1番目の数字を入力してください: 13 # 2番目の数字を入力してください: 22 # ・・・ # 中央値は 22 です。 # # '7個のデータを入力し、中央地を表示する' :- '7個のデータを入力し'(_7個のデータ), 中央値を表示する(_7個のデータ). '7個のデータを入力し'(_7個のデータ) :- '7個のデータを'(_7個のデータ), 入力し(1,_7個のデータ),!. '7個のデータを'(_7個のデータ) :- length(_7個のデータ,7). 入力し(_何番目,[]) :- _何番目 > 7. 入力し(_何番目,[_データ|R]) :- writef('%t番目のデータを入力してください: ',[_何番目]), get_line(_データ), _何番目_2 is _何番目 + 1, 入力し(_何番目_2,R). 中央値を表示する(_7個のデータ) :- バブルソート(_7個のデータ,[_,_,_,_中央値,_,_,_]), 表示する(_中央値). バブルソート(L1,L2) :- 軽い泡はちょっと浮き上がる(L1,L3), 泡が浮き上がったら最初からやり直す(L3,L2),!. バブルソート(L,L) :- 浮き上がる泡がなくなったらバブルソート終了. 軽い泡はちょっと浮き上がる(L1,L3) :- append(L0,[_重い泡,_軽い泡|R],L1), _重い泡 @> _軽い泡, append(L0,[_軽い泡,_重い泡|R],L3). 泡が浮き上がったら最初からやり直す(L3,L2) :- バブルソート(L3,L2). 浮き上がる泡がなくなったらバブルソート終了. 表示する(_中央値) :- writef('中央値は %t です\n',[_中央値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/226 # # [1]C言語 繰り返し文 # [2]問題 長いのでリンクでお願いします。 # http://ime.nu/codepad.org/iaWNbokN # [3]Linux ubuntu gcc C言語 # [4]今週日曜日迄 # [5]配列 ポインタなどは習ってないですよろしくお願いします。 # # 課題1. # #include <stdio.h> # int main(void) # { # int n, i, count = 0; # printf("n: "); # scanf("%d", &n); # for (i = 2; i * i <= n; i++) { # count++; # if (n % i == 0) { # break; # } # } # if (i * i > n) { # printf("%d: %d\n", n, count); # } # return 0; # } # # # 課題2. キーボードから10 進整数を入力し,その数を2 進数に変換した値を表示するプログラムを作成 # せよ.ただし,変換後の2 進数は正しい順序で表示すること(入力が10 ならば,1010 と表示). # # 課題3.課題1,2 のプログラムを作成するにあたり,どのように考えてプログラムを実現したのかをレ # ポートにまとめよ(プログラムの説明ではなく,問題を解くための考え方を説明する). # ※プログラムが完成していなくても,自分の考えた解き方をレポートにまとめること # */ # 'キーボードから10進整数を入力し,その数を2進数に変換した値を表示する' :- キーボードから10進整数を入力し(_10進整数), その数を2進数に変換した値を表示する(_10進整数). キーボードから10進整数を入力し(_10進整数) :- 整数を得る('10進整数',integer(_10進整数),_10進整数). その数を2進数に変換した値を表示する(_10進整数) :- その数を2進数に変換した値を(_10進整数,[],_2進数に変換した値), 表示する(_2進数に変換した値). その数を2進数に変換した値を(_10進整数,_2進数に変換した値) :- _10進整数 >= 0, その数を2進数に変換した値を(_10進整数,[],L), atomic_list_concat(L,_2進数に変換した値),!. その数を2進数に変換した値を(_10進整数,_2進数に変換した値) :- 負数を2進数に変換(_10進整数,_2進数に変換した値). その数を2進数に変換した値を(N,L1,[N|L1]) :- N < 2,!. その数を2進数に変換した値を(_10進整数,L1,L) :- M_1 is _10進整数 // 2, M_2 is _10進整数 mod 2, その数を2進数に変換した値を(M_1,[M_2|L1],L). 負数を2進数に変換(_10進整数,_2進数に変換した値) :- _10進整数_2 is abs(_10進整数) + 1, その数を2進数に変換した値を(_10進整数_2,[],L_1), 'Lを32要素に拡張して否定する'(L_1,L_2), atomic_list_concat(L_2,_2進数に変換した値). 'Lを32要素に拡張して否定する'(L_1,L_2) :- length(L,32), append(L_0,L_1,L), all(L_0,0), 各要素を反転する(L,L_2),!. 各要素を反転する([],[]). 各要素を反転する([0|R1],[1|R2]) :- 各要素を反転する(R1,R2). 各要素を反転する([1|R1],[0|R2]) :- 各要素を反転する(R1,R2). 表示する(_2進数に変換した値) :- writef('%t\n',[_2進数に変換した値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/212 # # C言語で明日までです # # # n件の整数型データを配列に入力し、その平均値を出力するプログラムを作成せよ。ただし、実行部において添字演算子を用いないで、また、*(p+i)と*p++の形2つを用いた場合をそれぞれ求めよ。です。お願いします! # # 'n件の整数データを入力し、その平均値を出力する'(_n) :- 'n件の整数データを入力し'(_n,_n件の整数データ), その平均値を出力する(_n,_n件の整数データ,0). 'n件の整数データを入力し'(_n,_n件の整数データ) :- length(_n件の整数データ,_n), findall(_整数,( append(L0,[_|_],_n件の整数データ), length([_|L0],_何件目), atomic_list_concat(['[',_何件目,']',' : '],_催促), 整数を得る(_催促,_整数)), _n件の整数データ). その平均値を出力する(_n,[],_合計) :- _平均値 is _合計 / _n, writef('平均値 は %t です\n',[_平均値]). その平均値を出力する(_n,[_整数|R],_合計_1) :- _合計_2 is _整数 + _合計_1, その平均値を出力する(_n,R,_合計_2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/175 # # [1]C言語 # [2]問1. キーボードから正の整数を2 つ(x、y とする) 入力し、縦x 個、横y 個の文字'*' から # なる長方形を表示するプログラムを多重ループを用いて作成せよ。 # # 問2. キーボードから正の整数x を入力し、下記のように、一辺に'*' がx 個並んだ直角三角 # 形が画面に出力されるプログラムを作成せよ。(x = 5 のときの例) # ***** # **** # *** # ** # * # [3]Linux # gcc # C言語 # [4]本日中でお願いします。 # # 'キーボードから正の整数''x'' を入力し、一辺に''*'' がx 個並んだ直角三角形が画面に出力される' :- 'キーボードから正の整数''x'' を入力し'(_x), '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(_x). 'キーボードから正の整数''x'' を入力し'(_x) :- 整数を得る(正の整数x,_x > 0,_x). '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(_x) :- length(L,_x), all(L,'*'), '直角三角形が画面に出力される'(L). '直角三角形が画面に出力される'(L) :- append(_,L2,L), atomic_list_concat(L2,A), writef('%t\n',[A]), L2 = ['*']. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/165 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/YKwOhX0L # # /* # ・仕様 # ・配るカードは13枚 # ・スートはSuiteという列挙体で定義され、Spade(スペード)、Club(クラブ)、Heart(ハート) # Dia(ダイア)という定数を持つ # ・カードはCARDという構造体で定義され、Suite列挙体のsuiteと、カードのランクを表す # int型のrankという2つのメンバを持つ # ・カードは配列 # ・13枚のカードのスートとランクは乱数で決定。現実にはありえないカードの配り方 # になってもよい(例:13枚の中にスペードのエースが5枚ある等) # ・スートはスペード→ハート→クラブ→ダイヤの順にソートし、ランクは小さい順(1,2,3,…13) # にソート、またランクよりもスートを優先 # 例:4枚のカードの内訳がスペードの2と5、ハートの3、クラブの10なら # スペードの2→スペードの5→ハートの3→クラブの10とソートされる # ・ソートのアルゴリズムはバブルソートを使う # ソートの前とソートの後のカードを表示する # */ '乱数を使ってカードを13枚配りそれをバブルソートする'(_配られたカード,_ソートされたカード) :- '乱数を使ってカードを13枚配り'(_配られたカード), それをバブルソートする(_配られたカード,_ソートされたカード). '乱数を使ってカードを13枚配り'(_配られたカード) :- 'カードを13枚'(_配られたカード), スートとランクを当て嵌める(_配られたカード). 'カードを13枚'(_配られたカード) :- length(_配られたカード,13). スートとランクを当て嵌める(_配られたカード) :- findall([_スート,_ランク],( member(_カード,_配られたカード), スートを決める(_スート), ランクを決める(_ランク)), _配られたカード). スートを決める(_スート) :- _乱数 is random(4), スートを決める(_乱数,_スート). スートを決める(0,スペード). スートを決める(1,ハート). スートを決める(2,クラブ). スートを決める(3,ダイヤ). ランクを決める(_ランク) :- _ランク is random(13) + 1. それをバブルソートする(_配られたカード,_ソートされたカード) :- 'スート・ランク仕様のバブルソート'(_配られたカード,_ソートされたカード). 'スート・ランク仕様のバブルソート'(L1,L2) :- 軽い泡はちょっと浮き上がる(L1,L3), 泡が浮き上がったら最初からやり直す(L3,L2),!. 'スート・ランク仕様のバブルソート'(L,L) :- 浮き上がる泡がなくなったらバブルソート終了. 軽い泡はちょっと浮き上がる(L1,L3) :- append(L0,[_重い泡,_軽い泡|R],L1), 泡の重さを量る(_重い泡,_軽い泡), append(L0,[_軽い泡,_重い泡|R],L3). 泡の重さを量る([_スート_1,_],[_スート_2,_]) :- スート強度(_スート_1,_スート_2),!. 泡の重さを量る([_スート,_ランク_1],[_スート,_ランク_2]) :- _ランク_1 >= _ランク_2. スート強度(_スート_1,_スート_2) :- nth1(N1,[ダイヤ,クラブ,ハート,スペード],_スート_1), nth1(N2,[ダイヤ,クラブ,ハート,スペード],_スート_2), N1 > N2,!. 泡が浮き上がったら最初からやり直す(L3,L2) :- 'スート・ランク仕様のバブルソート'(L3,L2). 浮き上がる泡がなくなったらバブルソート終了. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/165 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/YKwOhX0L # # /* # ・仕様 # ・配るカードは13枚 # ・スートはSuiteという列挙体で定義され、Spade(スペード)、Club(クラブ)、Heart(ハート) # Dia(ダイア)という定数を持つ # ・カードはCARDという構造体で定義され、Suite列挙体のsuiteと、カードのランクを表す # int型のrankという2つのメンバを持つ # ・カードは配列 # ・13枚のカードのスートとランクは乱数で決定。現実にはありえないカードの配り方 # になってもよい(例:13枚の中にスペードのエースが5枚ある等) # ・スートはスペード→ハート→クラブ→ダイヤの順にソートし、ランクは小さい順(1,2,3,…13) # にソート、またランクよりもスートを優先 # 例:4枚のカードの内訳がスペードの2と5、ハートの3、クラブの10なら # スペードの2→スペードの5→ハートの3→クラブの10とソートされる # ・ソートのアルゴリズムはバブルソートを使う # ソートの前とソートの後のカードを表示する # */ '乱数を使ってカードを13枚配りそれをバブルソートする'(_配られたカード,_ソートされたカード) :- '乱数を使ってカードを13枚配り'(_配られたカード), それをバブルソートする(_配られたカード,_ソートされたカード). '乱数を使ってカードを13枚配り'(_配られたカード) :- 'カードを13枚'(_配られたカード), スートとランクを当て嵌める(_配られたカード). 'カードを13枚'(_配られたカード) :- length(_配られたカード,13). スートとランクを当て嵌める(_配られたカード) :- findall([_スート,_ランク],( member(_カード,_配られたカード), スートを決める(_スート), ランクを決める(_ランク)), _配られたカード). スートを決める(_スート) :- _乱数 is random(4), スートを決める(_乱数,_スート). スートを決める(0,スペード). スートを決める(1,ハート). スートを決める(2,クラブ). スートを決める(3,ダイヤ). ランクを決める(_ランク) :- _ランク is random(13) + 1. それをバブルソートする(_配られたカード,_ソートされたカード) :- 'スート・ランク仕様のバブルソート'(_配られたカード,_ソートされたカード). 'スート・ランク仕様のバブルソート'(L1,L2) :- 軽い泡はちょっと浮き上がる(L1,L3), 泡が浮き上がったら最初からやり直す(L3,L2),!. 'スート・ランク仕様のバブルソート'(L,L) :- 浮き上がる泡がなくなったらバブルソート終了. 軽い泡はちょっと浮き上がる(L1,L3) :- append(L0,[_重い泡,_軽い泡|R],L1), 泡の重さを量る(_重い泡,_軽い泡), append(L0,[_軽い泡,_重い泡|R],L3). 泡の重さを量る([_スート_1,_],[_スート_2,_]) :- スート強度(_スート_1,_スート_2),!. 泡の重さを量る([_スート,_ランク_1],[_スート,_ランク_2]) :- _ランク_1 >= _ランク_2. スート強度(_スート_1,_スート_2) :- nth1(N1,[ダイヤ,クラブ,ハート,スペード],_スート_1), nth1(N2,[ダイヤ,クラブ,ハート,スペード],_スート_2), N1 > N2,!. 泡が浮き上がったら最初からやり直す(L3,L2) :- 'スート・ランク仕様のバブルソート'(L3,L2). 浮き上がる泡がなくなったらバブルソート終了. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/127 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/YK6POzO6 # # 値を入力し、最小値と最大値を求める。 # ただしマイナスの値が入力されたら結果を表示する。 # # [実行例] # 値1:50 # 値2:32 # 値3:102 # 値4:2 # 値5:99 # 値6:-2 # # //最大値の右にmax、最小値の右にminと出力する。// # 1: 50 # 2: 32 # 3:102  max # 4: 2  min # 5: 99 # '値を入力し、最小値と最大値を求める。ただしマイナスの値が入力されたら結果を表示する。' :- findall(_値,( '値を入力し、'(_値), ( マイナスの値が入力されたら(_値),!, fail; true)), _値ならび), '入力した値をmin(最小値),max(最大値)を付加して表示する。'(_値ならび). '値を入力し、'(_値) :- append(L0,_,_), length([_|L0],_何番目), atomic_list_concat([値,_何番目],_催促表示), 数を得る(_催促表示,_値). '入力した値をmin(最小値),max(最大値)を付加して表示する。'(_値ならび) :- 最大値(_値ならび,_最大値), 最小値(_値ならび,_最小値), 全ての行を表示する(_値ならび,_最小値,_最大値). 全ての行を表示する(_値ならび,_最小値,_最大値) :- append(L0,[_値|R],_値ならび), length([_|L0],_何番目), 行表示文字列を生成(_何番目,_値,_最小値,_最大値,_行表示文字列), writef('%t\n',[_行表示文字列]), R = [],!. 行表示文字列を生成(_何番目,_値,_最小値,_最大値,_行表示文字列) :- atomic_list_concat([_何番目,':',_値],_行表示_1), 最小値ならminを付加(_値,_最小値,_行表示_1,_行表示_2), 最大値ならmaxを付加(_値,_最大値,_行表示_2,_行表示文字列). 最小値ならminを付加(_最小値,_最小値,_行表示_1,_行表示_2) :- atomic_list_concat([_行表示_1,' min'],_行表示_2),!. 最小値ならminを付加(_,_,_行表示,_行表示). 最大値ならminを付加(_最大値,_最大値,_行表示_1,_行表示_2) :- atomic_list_concat([_行表示_1,' max'],_行表示_2),!. 最大値ならminを付加(_,_,_行表示,_行表示). マイナスの値が入力されたら(V) :- integer(V), V < 0,!. マイナスの値が入力されたら(V) :- float(V), V < 0.0,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/95 # # [1] 授業単元:C言語 配列 # [2] 問題文(含コード&リンク):入力された10個の整数データをバブルソートで昇順に整列せよ # 入力された10個の整数データをバブルソートで昇順に整列する(_昇順に整列されたデータ) :- 入力された10個の整数データを(_10個の整数データ), バブルソートで昇順に整列する(_10個の整数データ,_昇順に整列されたデータ). '入力された10個の整数データを'(_10個の整数データ) :- length(_10個の整数データ,10), findall(_整数データ,( member(_整数データ,_10個の整数データ), 整数を得る(整数データ,_整数データ)), _10個の整数データ). バブルソートで昇順に整列する(_10個の整数データ,_昇順に整列されたデータ) :- バブルソート(_10個の整数データ,_昇順に整列されたデータ). バブルソート(L1,L2) :- 軽い泡はちょっと浮き上がる(L1,L3), 泡が浮き上がったら最初からやり直す(L3,L2). バブルソート(L,L) :- 浮き上がる泡がなくなったらバブルソート終了. 軽い泡はちょっと浮き上がる(L1,L3) :- append(L0,[_重い泡,_軽い泡|R],L1), _重い泡 @> _軽い泡, append(L0,[_軽い泡,_重い泡|R],L3). 泡が浮き上がったら最初からやり直す(L3,L2) :- バブルソート(L3,L2). 浮き上がる泡がなくなったらバブルソート終了. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/793 # # [1] 授業単元:プログラミング # [2] 問題文: # http://ime.nu/codepad.org/3HrmfsVo # http://ime.nu/codepad.org/InxgbSAZ # http://ime.nu/codepad.org/99RFoVNY # # /* # プログラムの引数に書籍データのファイルと列数(a) を与える。書籍データのファイルは # c2md.csv である。 # # 各行が1つの書籍データを表している。書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち、 # それらをカンマ(,)で区切って表している。ただし書名にカンマ(,)が含まれる場合には、書名は二重引用符 # (”)で囲まれている。発行年、本体価格は正の整数値で記述されており、情報がない不明の場合は記述がない。 # # a で指定された列だけを表示せよ。 # ただし1行を出版社出版社名を表す文字の配列、書名を表す文字の配列、発行年を表す整数、本体価格 # を表す整数に分解する関数bunkatu を実装することで実現せよ。 # # */ # /* # プログラムの引数に書籍データのファイル(c2md.csv) を与える。各出版社が2000 年から2012 年ま # でに出版した本の冊数を求め、その冊数の多い順に表示せよ。 # ただし出版社名(name)とその出版社が2000 年から2012 年までに出版した本の冊数(pub)を表す以 # 下の構造体bkcmpy を用意する。 # struct bkcmpy { # char name[100]; # int pub; # }; # 各出版社に対して、このbkcmpy を作成し、この構造体の情報を出力することでプログラムを作成せよ。 # # プログラムでは、出版社が全部で150 社以下であることは仮定し、bkcmpy のポインターの配列 # bkcmpydb[150] を用意する。関数touroku ではbkcmpydb と読み込んだ出版社名cname を与える。 # cname が既にbkcmpydb に登録されていたら、その構造体のpub を1 増やし、登録されていなかった # ら、bkcmpy を1つ作成してbkcmpydb に登録する。 # /* # プログラムの引数に書籍データのファイル(c2md.csv) を与える。各出版社が2000 年から2012 年ま # でに出版した本の中で最高価格の本の情報を表示せよ。 # ただし出版社名(name)、書名(book)、発行年(year)、最高価格(price)を表す以下の構造体bkcmpy # を用意する。 # # struct bkcmpy { # char name[100]; # char book[420]; # int year; # int price; # }; # # 各出版社に対して、このbkcmpy を作成し、この構造体の情報を出力することでプログラムを作成せよ。 # # */ 'プログラムの引数に書籍データのファイルと列数(a) を与える。書籍データのファイルはc2md.csv である。各行が1つの書籍データを表している。書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち、それらをカンマ(,)で区切って表している。ただし書名にカンマ(,)が含まれる場合には、書名は二重引用符(”)で囲まれている。発行年、本体価格は正の整数値で記述されており、情報がない不明の場合は記述がない。a で指定された列だけを表示せよ。'(_ファイル名,_列数a) :- get_lines(_ファイル名,_行ならび), 書籍データならびに変換する(_行ならび,_書籍データならび), 空文字でないデータの列数が列数aと一致する情報だけ表示する(_列数a,_書籍データならび). 書籍データならびに変換する([],[]). 書籍データならびに変換する([_行|R1],[[_出版社名,_書名,_発行年,_本体価格]|R2]) :- '書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち'(_行,_出版社名,_書名,_発行年,_本体価格), 書籍データならびに変換する(R1,R2). '書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち'(_書籍データ,_出版社名,_書名,_発行年,_本体価格) :- 二重引用符をエスケープに使ったsplit(_書籍データ,[_出版社名,_書名,_発行年,本体価格]). 二重引用符をエスケープに使ったsplit(_書籍データ,L) :- atom_chars(_書籍データ,_書籍データ文字ならび), 二重引用符をエスケープに使った文字ならびを区切る(_書籍データ文字ならび,L). 二重引用符をエスケープに使った文字ならびを区切る([],[]). 二重引用符をエスケープに使った文字ならびを区切る(L1,[A|R2]) :- 二重引用符にぶつかった(L1,A,R1_2), 二重引用符をエスケープに使った文字ならびを区切る(R1_2,R2),!. 二重引用符をエスケープに使った文字ならびを区切る(L1,[A|R2]) :- カンマ区切りを切り取る(L1,A,R1), 二重引用符をエスケープに使った文字ならびを区切る(R1,R2). 二重引用符にぶつかった(L1,A,R1_2) :- append(L0,['"'|R1],L1), \+(member('''',L0)), append(L1_1,['"'|R1_2],R1), atom_chars(A,L1_1),!. カンマ区切りを切り取る(L1,A,R1) :- append(L0,[','|R1],L1), atom_chars(A,L0),!. 空文字でないデータの列数が列数aと一致する情報だけ表示する(_列数a,_書籍データならび) :- member(L,_書籍データならび), count((member(A,L),\+(A='')),_列数a), writef('%t,%t,%t,%t\n',L), fail. 空文字でないデータの列数が列数aと一致する情報だけ表示する(_列数a,_書籍データならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/296 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 検索 # # ●説明 # タグの外にある文字列を順に取り出したい # # ●対象データ # <hoge><hoge></hoge>あああ<hoge><hoge></hoge>いいい<hoge></hoge>ううう<hoge><hoge>・・・ # # ●希望する結果 # while (m.Success) # の繰り返しの中であああ、いいい、ううう・・・と順に取り出していきたい # # よろしくお願いします。 # # タグの外にある文字列を順に取り出したい(_文字列,_タグの外にある文字列) :- atom_chars(_文字列,Chars), タグの外にある文字列を順に取り出したい(Chars,[],_タグの外にある文字列). タグの外にある文字列を順に取り出したい([],L,_タグの外にある文字列) :- \+(L=[]), atom_chars(_タグの外にある文字列,L). タグの外にある文字列を順に取り出したい(Chars,L,_タグの外にある文字列) :- タグを読み飛ばす(Chars,_残り文字ならび), atom_chars(_タグの外にある文字列,L). タグの外にある文字列を順に取り出したい([A|R],L,_タグの外にある文字列) :- append(L,[A],L2), タグの外にある文字列を順に取り出したい(R,L2,_タグの外にある文字列). タグを読み飛ばす(Chars,_残り文字ならび) :- タグで始まっている(Chars,_タグ,_終了タグ,_タグの後の文字ならび), append(_,_終了タグ,_残り文字ならび,_タグの後文字ならび),!. タグで始まっている(Chars,_タグ,_終了タグ,_タグの後の文字ならび) :- append(['<'|R1],['>'|_タグの後の文字ならび],Chars), \+(member('<',R1)), \+(member('>',R1)), append(['<','/'|R1],['>'],_終了タグ),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/844 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/DXRUGC3J # http://ime.nu/codepad.org/e9CIf3Iy # # /* # # 4. # 2次元平面上の3つの座標 p1、p2、 p3 を頂点とする # 3角形を考え、構造体 triangle を以下のように定義する。 # struct triangle { # double p1[2]; double p2[2]; double p3[2]; # }; # # 構造体 triangle に対して、以下の関数を作成せよ。 適当な構造体 triangle の変数を # いくつか作成して、この関数が正しく動作することを確認するプログラムを作成せよ。 # # int congruence (structure triangle *a, structure triangle *b) # # 三角形 a と三角形 b が合同かどうかを判定する、 # 合同なら 1 を合同でないなら 0 を返す # # */ # # /* # # 5.構造体Tri は三角形に対応するものであり、3 つの辺の長さ(a,b,c) とその三角形の面積(area) を # メンバーとしてして持つ。 # struct Tri { # int a; # int b; # int c; # double area # }; # # 構造体Tri の変数をランダムにn 個作成して、三角形の面積が大きい順に表示するプログラムを作成 # する。ただしn はプログラムの引数として与える。また構造体Tri の変数をランダムに作成する際 # に、a とb には3 以上30 以下の整数をランダムに入れ、c にはa とb の値から、3 辺a, b, c から三 # 角形ができるようにランダムに正の整数を入れる。 # # [実行結果] # > ./a.out 1000 # 1 番目に大きい三角形は3 辺が( 30, 29, 41 ) で面積は434.741302 # 2 番目に大きい三角形は3 辺が( 29, 29, 43 ) で面積は418.422260 # 3 番目に大きい三角形は3 辺が( 30, 27, 37 ) で面積は399.749922 # ... # 998 番目に大きい三角形は3 辺が( 4, 3, 3 ) で面積は4.472136 # 999 番目に大きい三角形は3 辺が( 3, 3, 3 ) で面積は3.897114 # 1000 番目に大きい三角形は3 辺が( 3, 3, 1 ) で面積は1.479020 # # */ '三角形の面積が大きい順に表示する'(_n) :- 三角形をn個生成する(_n,_n個の三角形ならび), 大きい順に表示する(_n個の三角形ならび). 三角形をn個生成する(_n,_n個の三角形ならび) :- findall([_a,_b,_c],( between(1,_n,_), 三辺の長さを生成する(_a,_b,_c)), _n個の三角形ならび). 三辺の長さを生成する(_a,_b,_c) :- _a is random(100) + 1, _b is random(100) + 1, _c is random(100) + 1. 大きい順に表示する(_n個の三角形ならび) :- 三角形の面積と相対位置のならびを作る(0,_n個の三角形ならび,_面積と相対位置のならび), 大きい順に(_面積と相対位置のならび,_大きい順に整列した面積と相対位置のならび), 表示する(0,_大きい順に整列した面積と相対位置のならび,_n個の三角形ならび). 三角形の面積と相対位置のならびを作る(_,[],[]). 三角形の面積と相対位置のならびを作る(N_1,[[_a,_b,_c]|R1],[[_三角形の面積,N_2]|R2]) :- N_2 is N + 1, ヘロンの公式(_a,_b,_c,_三角形の面積), 三角形の面積と相対位置のならびを作る(0,R1,R2). ヘロンの公式(_a,_b,_c,_三角形の面積) :- _周囲の半分 is (_a + _b + _c) / 2, _三角形の面積 is sqrt(_周囲の半分 * (_周囲の半分 - _a) * (_周囲の半分 - _b) * (_周囲の半分 - _c)). 大きい順に([],[]). 大きい順に([_軸要素|L1],L2) :- 大きい順に分割する(_軸要素,L1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび), 大きい順に(_軸要素に等しいか大きい要素ならび,_大きい順に整列した軸要素に等しいか大きい要素ならび), 大きい順に(_軸要素より小さい要素ならび,_大きい順に整列した軸要素より小さい要素ならび), append(_大きい順に整列した軸要素に等しいか大きい要素ならび,[_軸要素|_大きい順に整列した軸要素より小さい],L2). 大きい順に分割する(_,[],[],[])). 大きい順に分割する(_軸要素,[_要素|R1],[_要素|_軸要素に等しいか大きい要素ならび],_軸要素より小さい要素ならび) :- _要素 @>= _軸要素, 大きい順に分割する(_軸要素,R1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび). 大きい順に分割する(_軸要素,[_要素|R1],_軸要素に等しいか大きい要素ならび,[_要素|_軸要素より小さい要素ならび]) :- _要素 @< _軸要素, 大きい順に分割する(_軸要素,R1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび). 表示する(_,[],_). 表示する(_順位_0,[[_面積,_相対番号]|R1],_n個の三角形ならび) :- _順位 is _順位_0 + 1, nth1(_相対番号,_n個の三角形ならび,[_a,_b,_c]), writef('%t 番目に大きい三角形は3 辺が( %t, %t, %t ) で面積は%t\n',[_順位,_a,_b,_c,_面積]), 表示する(_順位,R1,_n個の三角形ならび). % 以下のサイトは # # 等差数列の再帰的ではない定義(実は再帰的なのだが) # 等差数列とは隣り合う2つの項の差が全て等しい数列である(_等差数列) :- 隣り合う2つの項の差が(_等差数列,_隣り合う2つの項の差のリスト), 全て等しい(_隣り合う2つの項の差のリスト,_). 隣り合う2つの項の差が(_等差数列,_隣り合う2つの項の差のリスト) :- findall(_差,( append(_,[A,B|_],_等差数列), _差 is B - A), _隣り合う2つの項の差のリスト). 全て等しい([A],A). 全て等しい([A|R],A) :- 全て等しい(R,A). % 以下のサイトは # # 等差数列の再帰的ではない定義(実は再帰的なのだが) # 等差数列(_等差数列) :- 数列の差が(_等差数列,_差のリスト), 全て等しい(_差のリスト,_). 数列の差が(_等差数列,_差のリスト) :- findall(_差,( append(_,[A,B|_],_等差数列), _差 is B - A), _差のリスト). 全て等しい([A],A). 全て等しい([A|R],A) :- 全て等しい(R,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/667 # # [1] 授業単元:C言語 # [2] 問題文: http://ime.nu/ideone.com/tRkzM # # 1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。 #   ただし数値は何番目に生成した数値かも表示する。 # #   例)1番目に小さい数は475番目の数10049です。 # # 2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を  表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。 # #   例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。 # # 3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。 #   ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15 は仮定する。 # #   例)program 5 # a,b,c,d,e # a,b,c,e,d # a,b,d,c,e # ・ #       ・ #     e,d,c,b,a 'n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15 は仮定する。'(_n) :- length(L,_n), 重複しないn文字を得る(_n,L), このn種類の文字を使って構成できるn文字列をすべて表示せよ(_n,L). 重複しないn文字を得る(0,L,L) :- !. 重複しないn文字を得る(N,L1,L) :- 'L1に重複しない一文字を追加する'(L1,L2), N_1 is N - 1, 重複しないn文字を得る(N_1,L2,L),!. 重複しないn文字を得る(N,L1,L) :- 重複しないn文字を得る(N,L1,L). 'L1に重複しない一文字を追加する'(L1,L2) :- write('一文字入力してください : '), get_char(_文字), \+(member(_文字,L1)), append(L1,[_文字],L2). このn種類の文字を使って構成できるn文字列をすべて表示せよ(_n,L) :- このn種類の文字を使って構成できるn文字列を(_n,L,_文字列ならび), append(_,[_文字列|R],_文字列ならび), writef('%t\n',[_文字列]), R = []. このn種類の文字を使って構成できるn文字列を(_n,L,_文字列ならび) :- findall(_文字列,( 順列(L,_n,L1), atomic_list_concat(L1,',',_文字列)), _文字列ならび). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(A,Y,Z), M is N - 1, 順列(Z,M,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/667 # # [1] 授業単元:C言語 # [2] 問題文: http://ime.nu/ideone.com/tRkzM # # 1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。 #   ただし数値は何番目に生成した数値かも表示する。 # #   例)1番目に小さい数は475番目の数10049です。 # # 2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を  表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。 # #   例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。 # # 3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。 #   ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15は仮定する。 # #   例)program 5 # a,b,c,d,e # a,b,c,e,d # a,b,d,c,e # ・ #       ・ #     e,d,c,b,a '10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を表示する。各数値は何番目に生成したかも表示する' :- '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび), '各数値と平均値との差をもとめ、その差が小さい順にその数値を表示する。各数値は何番目に生成したかも表示する'(_自然数ならび). '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび) :- findall(N,( between(1,10000,_), N is random(10000) + 10000), _自然数ならび). '各数値と平均値との差をもとめ、その差が小さい順にその数値を表示する'(_自然数ならび) :- 各数値と平均値との差をもとめ(_自然数ならび,_何番目かの情報を付けた平均との差ならび), その差が小さい順に(_何番目かの情報を付加した平均との差ならび,_小さい順に整列した何番目かの情報を付加した平均との差ならび), その数値を表示する(_小さい順に整列した何番目かの情報を付加した平均との差ならび). 各数値と平均値との差をもとめ(_自然数ならび,_何番目かの情報を付加した平均との差ならび) :- 平均値(_自然数ならび,_平均値), findall([_差,_何番目],( append(L0,[_数値|_],_自然数ならび), length([_|L0],_何番目), _差 is abs(_数値 - _平均値)), _何番目かの情報を付加した平均との差ならび). 平均値(_自然数ならび,_平均値) :- 相加平均(_自然数ならび,_平均値). 小さい順にこれら数値を表示する(_自然数ならび) :- 小さい順に数値を(_自然数ならび,_小さい順に整列した自然数ならび), 表示する(_小さい順に整列した自然数ならび) その差が小さい順に([],[]). その差が小さい順に([_軸要素|_残りならび],_小さい順に整列した自然数ならび) :- 分割(_軸要素,_残りならび,_軸要素と等しいか小さい自然数ならび,_軸要素より大きい自然数ならび), その差が小さい順に(_軸要素と等しいか小さい自然数ならび,_小さい順に整列した軸要素と等しいか小さい自然数ならび), その差が小さい順に(_軸要素より大きい自然数ならび,_小さい順に整列した軸要素より大きい自然数ならび), append(_小さい順に整列した軸要素と等しいか小さい自然数ならび,[_軸要素|_小さい順に整列した軸要素より大きい自然数ならび],_小さい順に整列した自然数ならび). 分割(_,[],[]). 分割(_軸要素,[A|R],[A|R1],R2) :- A @=< _軸要素, 分割(_軸要素,R,R1,R2). 分割(_軸要素,[A|R],R1,[A|R2]) :- A @> _軸要素, 分割(_軸要素,R,R1,R2). 'その数値を表示する。各数値は何番目に生成したかも表示する'(_,[]). 'その数値を表示する。各数値は何番目に生成したかも表示する'(_自然数ならび,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10|R]) :- '数値と何番目かを表示する'(_自然数ならび,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), 'その数値を表示する。各数値は何番目に生成したかも表示する'(_自然数ならび,R). '数値と何番目かを表示する'(_,[]) :- write('\n'). '数値と何番目かを表示する'(_自然数ならび,[[_,_位置]|R]) :- nth1(_位置,_自然数ならび,_数値), writef('%t(%t) ',[_位置,_数値]), '数値と何番目かを表示する'(_自然数ならび,R). 相加平均(_値ならび,_相加平均) :- length(_値ならび,_標本数), 相加平均(_値ならび,_標本数,0,_相加平均). 相加平均([],_標本数,_合計,_相加平均) :- _相加平均 is _合計 / _標本数,!. 相加平均([V|R],_標本数,_合計_1,_相加平均) :- _合計_2 is _合計_1 + V, 相加平均(R,_標本数,_合計_2,_相加平均). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/667 # # [1] 授業単元:C言語 # [2] 問題文: http://ime.nu/ideone.com/tRkzM # # 1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。 #   ただし数値は何番目に生成した数値かも表示する。 # #   例)1番目に小さい数は475番目の数10049です。 # # 2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を  表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。 # #   例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。 # # 3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。 #   ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15は仮定する。 # #   例)program 5 # a,b,c,d,e # a,b,c,e,d # a,b,d,c,e # ・ #       ・ #     e,d,c,b,a '10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示する' :- '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび), '小さい順にこれら数値を表示する'(_自然数ならび). '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび) :- findall(N,( between(1,10000,_), N is random(10000) + 10000), _自然数ならび). 小さい順にこれら数値を表示する(_自然数ならび) :- 小さい順に数値を(_自然数ならび,_小さい順に整列した自然数ならび), 表示する(_小さい順に整列した自然数ならび) 小さい順に数値を([],[]). 小さい順に数値を([_軸要素|_残りならび],_小さい順に整列した自然数ならび) :- 分割(_軸要素,_残りならび,_軸要素と等しいか小さい自然数ならび,_軸要素より大きい自然数ならび), 小さい順に数値を(_軸要素と等しいか小さい自然数ならび,_小さい順に整列した軸要素と等しいか小さい自然数ならび), 小さい順に数値を(_軸要素より大きい自然数ならび,_小さい順に整列した軸要素より大きい自然数ならび), append(_小さい順に整列した軸要素と等しいか小さい自然数ならび,[_軸要素|_小さい順に整列した軸要素より大きい自然数ならび],_小さい順に整列した自然数ならび). 分割(_,[],[]). 分割(_軸要素,[A|R],[A|R1],R2) :- A =< _軸要素, 分割(_軸要素,R,R1,R2). 分割(_軸要素,[A|R],R1,[A|R2]) :- A > _軸要素, 分割(_軸要素,R,R1,R2). 表示する([]). 表示する([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10|R]) :- writef('%t %t %t %t %t %t %t %t %t %t\n',[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), 表示する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/667 # # [1] 授業単元:C言語 # [2] 問題文: http://ime.nu/ideone.com/tRkzM # # 1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。 #   ただし数値は何番目に生成した数値かも表示する。 # #   例)1番目に小さい数は475番目の数10049です。 # # 2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を  表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。 # #   例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。 # # 3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。 #   ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15は仮定する。 # #   例)program 5 # a,b,c,d,e # a,b,c,e,d # a,b,d,c,e # ・ #       ・ #     e,d,c,b,a '10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示する' :- '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび), '小さい順にこれら数値を表示する'(_自然数ならび). '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび) :- findall(N,( between(1,10000,_), N is random(10000) + 10000), _自然数ならび). 小さい順にこれら数値を表示する(_自然数ならび) :- 小さい順に数値を(_自然数ならび,_小さい順に整列した自然数ならび), 表示する(_小さい順に整列した自然数ならび) 小さい順に数値を([],[]). 小さい順に数値を([_軸要素|_残りならび],_小さい順に整列した自然数ならび) :- 分割(_軸要素,_残りならび,_軸要素と等しいか小さい自然数ならび,_軸要素より大きい自然数ならび), 小さい順に数値を(_軸要素と等しいか小さい自然数ならび,_小さい順に整列した軸要素と等しいか小さい自然数ならび), 小さい順に数値を(_軸要素より大きい自然数ならび,_小さい順に整列した軸要素より大きい自然数ならび), append(_小さい順に整列した軸要素と等しいか小さい自然数ならび,[_軸要素|_小さい順に整列した軸要素より大きい自然数ならび],_小さい順に整列した自然数ならび). 分割(_,[],[]). 分割(_軸要素,[A|R],[A|R1],R2) :- A =< _軸要素, 分割(_軸要素,R,R1,R2). 分割(_軸要素,[A|R],R1,[A|R2]) :- A > _軸要素, 分割(_軸要素,R,R1,R2). 表示する([]). 表示する([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10|R]) :- writef('%t %t %t %t %t %t %t %t %t %t\n',[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), 表示する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/592 # # [1] 授業単元:データ構造入門 # [2] 問題文(含コード&リンク):問題文が長いためこちらに記載しました http://ime.nu/ideone.com/R8gaZ # # 【問題3】 # バブルソートを用いて、整数のデータ列を昇順に整列するプログラムを作成せよ。 # データ数をキーボード入力し、続いてその個数の整列していないデータを配列に格納し、 # データとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。 # 次にデータ列のソートを行い、結果の整列したデータ列をディスプレイ表示するとともに、 # 別のファイルへ出力する。なお、データ数は最大50として50をマクロ定義せよ。疑似乱数で # データを作成するために、【問題2】で作成した関数random_dataを使用すること。また、ソートには # 次の関数を作成して使うこと。 # ・void bubble(int data[],int num) # この関数はnum個の値が格納された配列data[]を、バブルソートアルゴリズムで昇順に並べ替える関数である。 'バブルソートを用いて、整数のデータ列を昇順に整列するプログラムを作成せよ。データ数をキーボード入力し、続いてその個数の整列していないデータを配列に格納しデータとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。 次にデータ列のソートを行い、結果の整列したデータ列をディスプレイ表示するとともに、別のファイルへ出力する。 なお、データ数は最大50として50をマクロ定義せよ。'(_出力ファイル名,_別の出力ファイル名) :- 'データ数は最大50としてデータ数をキーボード入力し、続いてその個数の整列していないデータを配列に格納しデータとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。 '(_出力ファイル名,_データ数,_データならび), 'データ列をバブルソートを用いて昇順に整列し、結果の整列したデータ列をディスプレイ表示するとともに、別のファイルへ出力する。'(_別の出力ファイル名,_データ数,_データならび,_整列したデータ列). 'データ数をキーボード入力し、続いてその個数の整列していないデータを配列に格納しデータとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。'(_出力ファイル名,_データ数,_データならび) :- 'データ数は最大50としてデータ数をキーボード入力し'(_データ数), 'その個数の整列していないデータを配列に格納し'(_データ数,_データならび), 'データとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。'(_出力ファイル名,_データ数,_データならび). 'データ数は最大50としてデータ数をキーボード入力し'(_データ数) :- 整数を得る(最大50のデータ数,between(1,50,_データ数),_データ数). 'その個数の整列していないデータを配列に格納し'(_データ数,_データならび) :- length(_データならび,_データ数), findall(N,( member(N,_データならび), N is random(_データ数) + 1), _データならび). 'データとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。'(_出力ファイル名,_データ数,_データならび) :- open(_述力ファイル名,write,Oustream), 'データと添え字番号を'(_データならび,_添え字番号,_データ), 'ディスプレイに一覧表示するとともにファイルへも出力する。'(Outstream,_添え字番号,_データ), close(Outstream). 'ディスプレイに一覧表示するとともにファイルへも出力する。'(Outstream,_添え字番号,_データ) :- writef('%t: %t\n',[_添え字番号,_値]), writef(Outstream,'%t: %t\n',[_添え字番号,_データ]), _添え字番号 = _データ数. 'データ列をバブルソートを用いて昇順に整列し、結果の整列したデータ列をディスプレイ表示するとともに、別のファイルへ出力する。'(_別の出力ファイル名,_データ数,_データならび,_昇順に整列したならび) :- 'データ列をバブルソートを用いて昇順に整列し'(_データならび,_昇順に整列したデータならび), '結果の整列したデータ列をディスプレイ表示するとともに、別のファイルへ出力する。'(_別の出力ファイル名,_昇順に整列したデータならび). 'データ列をバブルソートを用いて昇順に整列し'(_データならび,_昇順に整列したデータならび) :- バブルソート(_データならび,_昇順に整列したデータならび). '結果の整列したデータ列をディスプレイ表示するとともに、別のファイルへ出力する。'(_別の出力ファイル名,_昇順に整列したデータならび) :- open(_別のファイル名,write,Outstream), append(L0,[_データ|R],_昇順に整列したデータならび), writef('%t\n',[_データ]), writef(Outstream,'%t\n',[_データ]), R = [], close(Outstream). % 以下のサイトは # 出典:: 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/466 # # # [1] 授業単元:C言語 # [2] 問題文:プレイフェア暗号の作成 #       参考:http://ime.nu/www.tamagaki.com/math/PlayfairCipher.html # # #  プレイフェア暗号(Playfair cipher) # # プレイフェア暗号はイギリス人サー・チャールズ・ホイートストン(Sir Charles Wheatstone)により開発されライアン・プレイフェア(Lyon Playfair)が普及させました。プレイフェア暗号を用いて暗号化するとき、まずキーワードまたはキーフレーズをあらかじめ決めておきます。仮にキーワードをPlayfairとします。次にこのキーワードをアルファベットが重複することなく下の5×5の表に入れていきます。 # # ここで残りのセルに余ったアルファベットを挿入していくわけですが、アルファベットは26文字あって5×5では一字余ります。そこで I と J は同じセルに入れるとあらかじめ決めておきます。そこで新たに作られた表が下のようになります。 # # 準備ができたところで、次のメッセージを暗号化してみましょう。 # # メッセージ Abandon hope, all ye who enter here. # # このメッセージをまず二文字ずつ区切っていきます。 # # Ab-an-do-nh-op-ea-ll-ye-wh-oe-nt-er-he-re # # ここで7番目に ll と同じ文字が重複しているので間に x を入れます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-e # # そうすると最後に e が一つ余ります。ここにもやはり x を入れておきます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # まず最初の二文字 ab を暗号化してみましょう。ab は先ほど作った表では同じ列にあります。このときは ab の列のすぐ下の文字で置き換えます。 # # つまり ab は BH に変わります。ただし一番下の文字例えば w は一番上の文字 A に変換されます。 # # 同様に同じ行に入る二文字も出てきたとします。例えば ap などは右隣の文字に置き換えます。 # # つまり ap は YL になるわけですね。この場合も一番右の文字例えば f は一番左の文字 p に変換されます。 # # 最後に行も列も違う二文字が出てきた場合は次のようにします。例えば an を考えます。下の表のように a n それぞれの行および列を塗り分け、その交点となる文字を見ます。この場合、P と Q になります。 # # そこで a は、a h と同じ行の P に、n は、n と同じ行の Q に変換します。つまり、 # # do → RT # # nh → QE # # op → NL # # となるわけです。このルールに従って、先ほどのメッセージを暗号化すると、 # # 平文  Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # 暗号文 BH PQ RT QE NL HP YV AF HU GQ NU NM BG GI KU # # これでプレイフェア暗号による暗号化が終了したわけです。 # # この暗号はイギリスがボーア戦争(ブール戦争 BoreWar)で使用したといわれています。 プレイフェア暗号表の作成(_鍵文,_暗号表) :- 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字以外の変数ならび), 'Jを除いたA-Zならびを切る'(_Jを除いたA_Zならび), 変数を埋める(_Jを除いたA_Zならび,Chars,_鍵文字以外の変数ならび), 'N個組'(5,_25要素のならび,_暗号表). 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字ならび,_鍵文字以外の変数ならび) :- length(_25要素ならび,25), atom_chars(_鍵文,_鍵文字ならび), append(_鍵文字ならび,_鍵文字以外の変数ならび,_25要素ならび). 'A-Zならびを切る'(_Jを除いたA_Zならび) :- _切る回数 is random(113) + 1, トランプを切るようにならびを切る(_切る回数,25,['A','B','C','D','E','F','G','H','I','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_Jを除いたA_Zならび). 変数を埋める(_,_,[]). 変数を埋める(L_1,Chars,[V|R]) :- select(V,L_1,L_R), \+(member(V,Chars)), 変数を埋める(L_R,Chars,R). プレイフェア暗号による暗号化(_平文,_暗号文) :- メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび), atomic_list_concat(_暗号文字ならび,_暗号文). メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび) :- atom_chars(_平文,Chars), すべての文字を大文字に変換(Chars,_大文字の文字ならび), メッセージをまず二文字ずつ区切っていきます(_大文字の文字ならび,_二文字ずつに区切られたならび). メッセージをまず二文字ずつ区切っていきます([],[]). メッセージをまず二文字ずつ区切っていきます(['J'|R1],[['J','J']|R2]) :- メッセージをまず二文字ずつ区切っていきます(R1,R2). メッセージをまず二文字ずつ区切っていきます([A],[[A,'X']]). メッセージをまず二文字ずつ区切っていきます([A,A|R1],[[A,'X']|R2]) :- メッセージをまず二文字ずつ区切っていきます([A|R1],R2). メッセージをまず二文字ずつ区切っていきます([A,B|R1],[[A,B]|R2]) :- \+(A=B), メッセージをまず二文字ずつ区切っていきます(R1,R2). プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび) :- 暗号表(_暗号表), 転置(_暗号表,_転置された暗号表), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号表,_転置された暗号表,_暗号文字ならび). プレイフェア暗号化([],_,_,[]). プレイフェア暗号化([['J','J']|R1],_暗号表,_転置された暗号表,['J'|R2]) :- プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). プレイフェア暗号化([[A,B]|R1],_暗号表,_転置された暗号表,[C,D|R2]) :- 暗号に変換(A,B,_暗号表,C,D), プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_転置された暗号表), 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_暗号表), 'A,Bが暗号表の同一行にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- 暗号コードは矩形を仮想した時の他の二角(A,B,_暗号表,C,D). 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D) :- member(A,L), member(B,L), 'A,Bの次の要素'(L,A,C), 'A,Bの次の要素'(L,B,D). 'A,Bの次の要素'(L,X,Y) :- append([Y|_],[X],L). 'A,Bの次の要素'(L,X,Y) :- append(_,[X,Y|_],L). 暗号コードは矩形を仮想した時の他の二角(A,B,_表,C,D) :- 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B), nth1(_列_B,L_1,C), nth1(_列_A,L_2,D). 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B) :- nth1(_行_A,_表,L_1), nth1(_列_A,L_1,A), nth1(_行_B,_表,L_2), nth1(_列_B,L_2,B). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/465 # # [1] 授業単元:C言語徹底入門 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/lgXR0ur1 # 次のプログラムは書式指定可能な10進16進変換表示を行う関数プログラムである。 # 関数の機能についてコメントで解説を入れ、同時にプログラムの流れを説明せよ。 # '16進数文字表現'(N,_16進数文字表現) :- findall(A,'16進数の下から一桁ずつ16進数0-15文字表現'(N,A),L), 反転して16進数文字表現に変換(L,_16進数文字表現). '16進数の下位桁から一桁ずつ16進数0-15文字表現'(N,A) :- '16進数の下一桁'(N,M), '16進数0-15文字表現'(M,A). '16進数0-15文字表現'(N,A) :- length(L,N), append([_|L],_,['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']), last([_|L],A). '16進数の下一桁'(0,_) :- !,fail. '16進数の下一桁'(N,M) :- 最下位桁を得る(N,M). '16進数の下一桁'(N,M) :- 上位桁の16進数の下一桁(N,M). 最下位桁を得る(N,M) :- M is N mod 16. 上位桁の16進数の下一桁(N,M) :- D is N // 16, '16進数の下一桁'(D,M). 反転して16進数文字表現に変換(_下位桁からの16進数文字ならび,_16進数文字表現) :- reverse(_下位桁からの16進数文字ならび,_16進数文字ならび), atomic_list_concat(_16進数文字ならび,_16進数文字表現). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/465 # # [1] 授業単元:C言語徹底入門 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/lgXR0ur1 # 次のプログラムは書式指定可能な10進16進変換表示を行う関数プログラムである。 # 関数の機能についてコメントで解説を入れ、同時にプログラムの流れを説明せよ。 # '16進数文字表現'(N,_16進数文字表現) :- findall(A,'16進数の下から一桁ずつ16進数0-15文字表現'(N,A),L), 反転して16進数文字表現に変換(L,_16進数文字表現). '16進数の下位桁から一桁ずつ16進数0-15文字表現'(N,A) :- '16進数の下一桁'(N,M), '16進数0-15文字表現'(M,A). '16進数0-15文字表現'(N,A) :- length(L,N), append([_|L],_,['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']), last([_|L],A). '16進数の下一桁'(0,_) :- !,fail. '16進数の下一桁'(N,M) :- M is N mod 16. '16進数の下一桁'(N,M) :- D is N // 16, '16進数の下一桁'(D,M). 反転して16進数文字表現に変換(_下位桁からの16進数文字ならび,_16進数文字表現) :- reverse(_下位桁からの16進数文字ならび,_16進数文字ならび), atomic_list_concat(_16進数文字ならび,_16進数文字表現). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/465 # # [1] 授業単元:C言語徹底入門 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/lgXR0ur1 # 次のプログラムは書式指定可能な10進16進変換表示を行う関数プログラムである。 # 関数の機能についてコメントで解説を入れ、同時にプログラムの流れを説明せよ。 # '16進数文字表現'(N,_16進数文字表現) :- '16進数文字表現ならび'(N,[],L), atomic_list_concat(L,_16進数文字表現). '16進数文字表現ならび'(0,L,L) :- !. '16進数文字表現ならび'(N,L1,L) :- M is N mod 16, '16進数0-16文字表現'(M,A), N_1 is N // 16, '16進数文字表現ならび'(N_1,[A|L1],L). '16進数0-16文字表現'(N,A) :- length(L,N), append([_|L],_,['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']), last([_|L],A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/830 # # 誰か助けて # # 問題1 # はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示するプログラムをex08-02.rbで保存して実行してください. # # 問題2 # 問題1のプログラムは、nilのスロットが指定されると、そのままnilを返します.このときには「そのスロットには文字列はありません.」と表示されるように、書き換えて、ex08-03.rbで保存して実行してください. # # 問題3 # はじめに文字列の値を設定した配列変数の各スロットについて、その文字列の文字数を表示するプログラムをex08-04.rbで保存して実行してください.たとえばstrings=[’dog’,’cat’,’mouse’]の場合、以下のように出力させます. # dogは3文字 # catは3文字 # mouseは5文字 # # 問題4 # はじめに文字列の値を設定した配列変数の各スロットの内容を3回ずつ表示するプログラムをex08-05.rbで保存して実行してください. # # 問題5 # 以下のように入力したいだけの文字列を入力するよう求めて、Enterが押されたらそれを入力した順につなげて1行に出力するプログラムをex08-07.rbで保存して実行してください. # 文字列を入力してください # dog[Enter] # 文字列を入力してください # cat[Enter] # 文字列を入力してください # elephant[Enter] # 文字列を入力してください # [Enter] # あなたの入力した文字列は # dog,cat,elephant # です. # # 問題6 # 問題5のプログラムを、文字列を入力とは逆順に出力するように書き換えたプログラムをex08-08.rbで保存して実行してください. # # 問題7 # 問題5のプログラムを、3文字の文字列のみを出力するように書き換えたプログラムをex08-09.rbで保存して実行してください. # # '問題1: はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示する' :- 入力された数字(_入力された数字), 文字列ならび(_文字列ならび), nth1(_入力された数字,_文字列ならび,_文字列), writef('%t\n',[_文字列]). 入力された数字(_入力された数字) :- 数を得る(数字,_入力された数字). '問題2: はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する' :- 入力された数字(_入力された数字), 文字列ならび(_文字列ならび), nth1(_入力された数字,_文字列ならび,_文字列), 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'(_文字列). 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'('') :- writef('%t\n',['そのスロットには文字列はありません.']). 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'(_文字列) :- \+(_文字列=''), writef('%t\n',[_文字列]). '問題3: はじめに文字列の値を設定した配列変数の各スロットについて、その文字列の文字数を表示する' :- 文字列ならび(_文字列ならび), append(_,[_文字列|R],_文字列ならび), atom_length(_文字列,_文字数), writef('%tの文字数は%t\n',[_文字列,_文字数]), R = []. '問題4: はじめに文字列の値を設定した配列変数の各スロットの内容を3回ずつ表示する' :- 文字列ならび(_文字列ならび), append(_,[_文字列|R],_文字列ならび), writef('%t\n%t\n%t\n',[_文字列,_文字列,_文字列]), R = []. '問題5: 入力したいだけの文字列を入力するよう求めて、Enterが押されたらそれを入力した順につなげて1行に出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), それを入力した順につなげて1行に出力する(_文字列ならび). 文字列を入力する(_文字列) :- writef('%t ',[文字列を入力してください]), get_line(_文字列). 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'('',[]) :- !. 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列,[_文字列|R]) :- 文字列を入力する(_文字列_2), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_2,R). それを入力した順につなげて1行に出力する(_行ならび) :- atomic_list_concat(_行ならび,_表示文字列), writef('%t\n',[_表示文字列]). '問題6: 問題5のプログラムを、文字列を入力とは逆順に出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), reverse(_文字列ならび,_反転した文字列ならび), 各文字列を反転して表示する(_反転した文字列ならび). 各文字列を反転して表示する(_反転した文字列ならび) :- append(_,[_文字列|R],_反転した文字列ならび), 文字列を反転する(_文字列,_反転した文字列), writef('%t\n',[_反転した文字列]), R = []. 文字列を反転する(_文字列,_反転した文字列) :- atom_chars(_文字列,Chars), reverse(Chars,Chars_2), atom_chars(_反転した文字列,Chars_2). '問題7: 問題5のプログラムを、3文字の文字列のみを出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), '入力された文字列のうち3文字の文字列のみを出力する'(_文字列ならび). '入力された文字列のうち3文字の文字列のみを出力する'([]). '入力された文字列のうち3文字の文字列のみを出力する'([_文字列|R]) :- '3文字の文字列のみを出力する'(_文字列), '入力された文字列のうち3文字の文字列のみを出力する'(R). '3文字の文字列のみを出力する'(_文字列) :- atom_length(_文字列,3), writef('%t\n',[_文字列]),!. '3文字の文字列のみを出力する'(_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/829 # # 問題 # 数独の解答が9行9列の文字列で与えられたとき正しいかどうか判定せよ。 # # '数独の解答が9行9列の文字列で与えられたとき正しいかどうか'(_文字列) :- '数独の解答が9行9列の文字列で与えられたとき'(_文字列,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/243 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文(含コード&リンク): # ・問 マルチキークイックソートを非再帰で実装せよ。 # マルチキークイックソートは文字列を辞書順にソートする手法である。 # 例えば、文字列appleを5回巡回し、5つの文字列を生成する。 # この5つの文字列を辞書順にソートすると、以下のようになる。 # # 巡回     ソート後 # apple apple # pplea  eappl # pleap  → leapp # leapp pleap # eappl pplea # # 実際には文字列appleを2倍にし巡回文字列を得る。 # 例 : appleapple # この文字列に対して非再帰のマルチキークイックソートを適用せよ。 # マルチキークイックソートは文字列を辞書順にソートする(_文字列,_辞書順に整列した文字列) :- マルチキークイックソートの整列対象文字列の生成(_文字列,_整列対象文字列ならび), 辞書順整列(_整列対象文字列ならび,_辞書順に整列した文字列). マルチキークイックソートの整列対象文字列の生成(_文字列,_整列対象文字列ならび) :- atom_chars(_文字列,_文字ならび), atom_length(_文字列,_n), findall(_回転した文字列,( between(1,_n,N), ならびの回転(左方向,N,L,_回転した文字ならび), atom_chars(_回転した文字列,_回転した文字ならび)), _整列対象文字列ならび). 辞書順整列([],[]). 辞書順整列([_軸要素文字列|_残り文字列],_辞書順に整列した文字列) :- 辞書順分割(_軸要素文字列,_残り文字列,_より小さい文字列,_等しいかより大きい文字列), 辞書順整列(_より小さい文字列,_整列したより小さい文字列), 辞書順整列(_等しいかより大きい文字列,_整列した等しいかより大きい文字列), append(_整列したより小さい文字列,[_軸要素文字列|_整列した等しいかより大きい文字列],_辞書順に整列した文字列). 辞書順分割(_軸要素文字列,[],[],[]). 辞書順分割(_軸要素文字列,[_文字列|R1],L1,L2) :- atom_chars(_軸文字列,_文字ならび_1), atom_chars(_文字列,_文字列ならび_2), 辞書順分割(_文字ならび_1,_文字ならび_2,L1,L2,R1,R2), 辞書順分割(_軸要素文字列,R1,R1,R2). 辞書順分割(_文字ならび_1,_文字ならび_2,L1,R2,R1,R2) :- 辞書順文字列の比較(_軸要素文字ならび_1,_文字ならび,_文字ならび,_), atom_chars(_文字列,_文字ならび), L1 = [_文字列|R1],!. 辞書順分割(_文字ならび_1,_文字ならび_2,R1,L2,R1,R2) :- 辞書順文字列の比較(_軸要素文字ならび_1,_文字ならび,_,_文字ならび), atom_chars(_文字列,_文字ならび), L2 = [_文字列|R2],!. 辞書順文字列の比較([],[],[],[]) :- !. 辞書順文字列の比較(L,[],[],L) :- !. 辞書順文字列の比較([],L,[],L) :- !. 辞書順文字列の比較([_文字|R1],[_文字|R2],[_文字|R3],[_文字|R4]) :- 辞書順文字列の比較(R1,R2,R3,R4),!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_1|R1],[_文字_2|R2]) :- 英大文字(_文字_1), 英小文字(_文字_2), to_upper(_文字_2,_文字_1),!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_2|R2],[_文字_1|R1]) :- 英小文字(_文字_1), 英大文字(_文字_2), to_upper(_文字_1,_文字_2),!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_1|R1],[_文字_2|R2]) :- _文字_1 @< _文字_2,!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_2|R2],[_文字_1|R1]) :- _文字_1 @>= _文字_2,!. 英小文字(_英小文字) :- _英小文字 @>= 'a', _英小文字 @=< 'z'. 英大文字(_英大文字) :- _英大文字 @>= 'A', _英大文字 @=< 'Z'. % 以下のサイトは 相対番号を付加して降順に整列する(_対象ならび,_降順に整列したならび) :- 相対番号を付加する(1,_対象ならび,_相対番号付きならび), 相対番号を付加されたならびを降順に整列する(_相対番号付きならび,_降順に整列した相対番号付きならび), 相対番号を鍵に対象ならびから降順に整列したならびを得る(_降順に整列した相対番号付きならび,_対象ならび,_降順に整列したならび). 相対番号を付加する(_,[],[]). 相対番号を付加する(N,[A|R1],[[A,N]|R2]) :- N_2 is N + 1, 相対番号を付加する(N_2,R1,R2). 相対番号を付加されたならびを降順に整列する([],[]). 相対番号を付加されたならびを降順に整列する([[_軸要素,_相対番号]|_残り要素],_降順に整列した相対番号付きならび) :- 降順分割([_軸要素,_相対番号],_残り要素,_軸要素より大きい要素のならび,_軸要素に等しいか小さいならび), 相対番号を付加されたならびを降順に整列する(_軸要素より大きい要素のならび,_降順に整列した軸要素より大きいならび), 相対番号を付加されたならびを降順に整列する(_軸要素に等しいか小さいならび,_降順に整列した軸要素に等しいか小さいならび), append(_降順に整列した軸要素より大きいならび,[[_軸要素,_軸要素の相対番号]|_降順に整列した軸要素に等しいか小さいならび],_降順に整列した相対番号付きならび). 降順分割(_,[],[],[]). 降順分割(_軸要素,[_要素|R1],[_要素|R2],R3) :- _要素 @> _軸要素, 降順分割(_軸要素,R1,R2,R3). 降順分割(_軸要素,[_要素|R1],R2,[_要素|R3]) :- _要素 @=< _軸要素, 降順分割(_軸要素,R1,R2,R3). 相対番号を鍵に対象ならびから降順に整列したならびを得る([],_,[]). 相対番号を鍵に対象ならびから降順に整列したならびを得る([[_,_nth1]|R1],_対象ならび,[_対象ならび要素|R2]) :- nth1(_nth1,_対象ならび,_対象ならび要素),