このディレクトリの索引

% 以下のサイトは # 出典 :: 「受験全解算数」日能研発行 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). % 以下のサイトは # 出題場所 :: 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)),!. % 以下のサイトは % % カレンダーの形式(何曜日から始まるか)と % 月日数と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). % 以下のサイトは # 出典:: 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/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). % 以下のサイトは # 出典:: 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). % 以下のサイトは % % 第二引数も順にコピーするリストの結合の途中経過を示す非決定性の述語 % % 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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/260 # # ttp://codepad.org/pWDlCcF7 # ここまでは出来たんだけど、txtファイルの結果を # *|** # ***|**** # *****|****** # *******|******** # *********|********** # こんな感じに揃えるにはどうすればいいんですか? # # 'ここまでは出来たんだけど、txtファイルの結果を # *|** # ***|**** # *****|****** # *******|******** # *********|********** # こんな感じに揃えるにはどうすればいいんですか?' :- ならびを変化させる(L1,L2,L), 描画する(L1,L2,L), L2 = []. ならびを変化させる(L1,L2,L) :- length(L8,8), '空白と*を配分する'(L8,L1,L2), append(L2,L1,L3), append(L1,L2,L4), append(L3,['*','|','*','*'|L4],L). '空白と*を配分する'(L8,L1,L2) :- append(L1,L2,L8), length(L1,Len1), 0 is Len1 mod 2, all(L2,' '), all(L1,'*'). 描画する(L1,L2,L) :- concat_atom(L,S), writef(' %t\n',[S]). % 以下のサイトは search(_文字列,_選択範囲起点,_選択範囲中央,_選択範囲終点,S1,S2,S3,L1,L2,L3) :- sub_atom_search(_文字列,_選択範囲起点,_選択範囲中央,_選択範囲終点,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- list(_選択範囲起点ならび), list(_選択範囲終点ならび), atom_chars(_選択範囲起点,_選択範囲起点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- atom(_選択範囲起点), list(_選択範囲終点ならび), atom_chars(_選択範囲起点,_選択範囲起点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点,S1,S2,S3,L1,L2,L3) :- list(_選択範囲起点ならび), atom(_選択範囲終点), atom_chars(_選択範囲終点,_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点,_選択範囲中央,_選択範囲終点,S1,S2,S3,L1,L2,L3) :- atom(_選択範囲起点), atom(_選択範囲終点), atom_chars(_選択範囲起点,_選択範囲起点ならび), atom_chars(_選択範囲終点,_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- var(_選択範囲起点ならび), list(_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- list(_選択範囲起点ならび), var(_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点,S1,S2,S3,L1,L2,L3) :- var(_選択範囲起点ならび), atom(_選択範囲終点ならび), atom_chars(_選択範囲終点,_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- atom(_選択範囲起点), var(_選択範囲終点ならび), atom_chars(_選択範囲起点,_選択範囲起点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- var(_選択範囲起点ならび), var(_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(_選択範囲起点ならび,_選択範囲中央ならび,_選択範囲終点ならび,L2), \+(append(_,_選択範囲起点ならび,_,_選択範囲中央ならび)), \+(append(_,_選択範囲終点ならび,_,_選択範囲中央ならび)), atom_chars(_選択範囲中央,_選択範囲中央ならび). % sub_atom/10 % 以下のサイトは # # @haroperiさんの20120420のツイートより # # 双方向性のあるQuicksortが書けないので寝るです。だめだもうだめだ。 *喪中* # 双方向性のあるQuicksort([],[]). 双方向性のあるQuicksort(L1,L2) :- 最初にL1とL2の要素数を揃える(L1,L2),!, append(L0,[A|R0],L1), append(L0,R0,L11), append(L5,[A|L6],L2), 整列のための分割(A,L11,L3,L4), 双方向性のあるQuicksort(L3,L5), 双方向性のあるQuicksort(L4,L6). 整列のための分割(A,[],[],[]). 整列のための分割(A,[B|R1],[B|R2],L) :- B @< A, 整列のための分割(A,R1,R2,L). 整列のための分割(A,[B|R1],L,[B|R2]) :- B @>= A, 整列のための分割(A,R1,L,R2). 最初にL1とL2の要素数を揃える(L1,L2) :- length(L2,Len), length(L1,Len). % % 現在のエラーは % 普通のソートの時、複数解(同一解)出力されてしまう。 % これを直すのは難しいだろう。 % % 以下のサイトは # http://www.ioi-jp.org/joi/2011/2012-yo/2012-yo-t1/2012-yo-t1.html # 問題 # 1    ランチ (Lunch) # 問題 # # JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが # 好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと # 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を # 引いた金額が代金となる. # # ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの # 代金の最小値を求めるプログラムを作成せよ. # # 入力 # # 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. # 1 行目の整数は 1 つ目のパスタの値段である. # 2 行目の整数は 2 つ目のパスタの値段である. # 3 行目の整数は 3 つ目のパスタの値段である. # 4 行目の整数は 1 つ目のジュースの値段である. # 5 行目の整数は 2 つ目のジュースの値段である. # ただし,与えられる入力データにおいては全てのパスタとジュースの値段は # 100 円以上 2000 円以下であることが保証されている. # # 出力 # # その日のセットメニューの代金の最小値を 1 行で出力せよ. # # 入出力例 # # 入力例 1 入力例 2 # 800 1999 # 700 1999 # 900 100 # 198 189 # 330 100 # # 出力例 1 出力例 2 # 848 150 # # # 入出力例 1 では,2 つ目のパスタと 1 つ目のジュースを組み合わせた場合の 700 + 198 - 50 = 848 がその日のセットメニューの代金の最小値である. # # 入出力例 2 では,3 つ目のパスタと 2 つ目のジュースを組み合わせた場合の 100 + 100 - 50 = 150 がその日のセットメニューの代金の最小値である. # # ※各入出力例のデータは,右クリック等によりファイルに保存して利用可能です. # program :- 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める'. 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める' :- '3書類のパスタと2種類のジュースの価格を得る'(_3種類のパスタの価格,_2種類のジュースの価格), 最小値を探しだす(_セットメニューの代金,( セットメニューを代金を得る(_3種類のパスタの価格,_2種類のジュースの価格,_セットメニューの代金)), _その日のセットメニューの代金の最小値), writef('%t\n',[_その日のセットメニューの代金の最小値]). '3書類のパスタと2種類のジュースの価格を得る'(_3種類のパスタの価格,_2種類のジュースの価格) :- '3種類のパスタの価格を得る'(_3種類のパスタの価格), '2種類のジュースの価格を得る'(_2種類のジュースの価格). '3種類のパスタの価格を得る'(_3種類のパスタの価格) :- length(_3種類のパスタの価格,3), findall(_パスタの価格,( append(_,[_パスタの価格|_],_3種類のパスタの価格), 整数入力(_パスタの価格)), _3種類のパスタの価格). '2種類のジュースの価格を得る'(_2種類のジュースの価格) :- length(_2種類のジュースの価格,2), findall(_ジュースの価格,( % _パスタの価格となっていた 12/23訂正 append(_,[_ジュースの価格|_],_2種類のジュースの価格), 整数入力(_ジュースの価格)), _2種類のジュースの価格). 最小値を探しだす(_対象となる値,_副目標,_最小値) :- findall(_対象となる値,_副目標,L), 最小値(L,_最小値). 最小値(L,_最小値) :- append(L1,[_最小値|L2],L), \+((append(_,[A|_],L1),A @< _最小値)), \+((append(_,[B|_],L2),B @< _最小値)),!. セットメニューを代金を得る(_3種類のパスタの価格,_2種類のジュースの価格,_セットメニューの代金) :- append(_,[_パスタの価格|_],_3種類のパスタの価格), append(_,[_ジュースの価格|_],_2種類のジュースの価格), _セットメニューの代金 is _パスタの価格 + _ジュースの価格 - 50. 整数入力(N) :- get_line(Line), 整数入力診断(Line,N),!. 整数入力(N) :- 整数入力(N). 整数入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数入力診断(Line,N) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. get_line(Line) :- get_char(Char), get_line_2(Char,Chars), atom_chars(Line,Chars). get_line_2(end_of_file,[]) :- !. get_line_2('\n',[]) :- !. get_line_2(Char,[Char|R]) :- get_char(Char2), get_line_2(Char2,R). % 以下のサイトは # http://www.ioi-jp.org/joi/2011/2012-yo/2012-yo-t1/2012-yo-t1.html # 問題 # 1    ランチ (Lunch) # 問題 # # JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが # 好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと # 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を # 引いた金額が代金となる. # # ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの # 代金の最小値を求めるプログラムを作成せよ. # # 入力 # # 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. # 1 行目の整数は 1 つ目のパスタの値段である. # 2 行目の整数は 2 つ目のパスタの値段である. # 3 行目の整数は 3 つ目のパスタの値段である. # 4 行目の整数は 1 つ目のジュースの値段である. # 5 行目の整数は 2 つ目のジュースの値段である. # ただし,与えられる入力データにおいては全てのパスタとジュースの値段は # 100 円以上 2000 円以下であることが保証されている. # # 出力 # # その日のセットメニューの代金の最小値を 1 行で出力せよ. # # 入出力例 # # 入力例 1 入力例 2 # 800 1999 # 700 1999 # 900 100 # 198 189 # 330 100 # # 出力例 1 出力例 2 # 848 150 # # # 入出力例 1 では,2 つ目のパスタと 1 つ目のジュースを組み合わせた場合の 700 + 198 - 50 = 848 がその日のセットメニューの代金の最小値である. # # 入出力例 2 では,3 つ目のパスタと 2 つ目のジュースを組み合わせた場合の 100 + 100 - 50 = 150 がその日のセットメニューの代金の最小値である. # # ※各入出力例のデータは,右クリック等によりファイルに保存して利用可能です. # 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める' :- '3書類のパスタと2種類のジュースの価格を得る'(_3種類のパスタの価格,_2種類のジュースの価格), 最小値を探しだす(_セットメニューの代金,( セットメニューを代金を得る(_3種類のパスタの価格,_2種類のジュースの価格,_セットメニューの代金)), _その日のセットメニューの代金の最小値), writef('%t\n',[_その日のセットメニューの代金の最小値]). '3書類のパスタと2種類のジュースの価格を得る'(_3種類のパスタの価格,_2種類のジュースの価格) :- '3種類のパスタの価格を得る'(_3種類のパスタの価格), '2種類のジュースの価格を得る'(_2種類のジュースの価格). '3種類のパスタの価格を得る'(_3種類のパスタの価格) :- length(_3種類のパスタの価格,3), findall(_パスタの価格,( append(_,[_パスタの価格|_],_3種類のパスタの価格), readln([_パスタの価格])), _3種類のパスタの価格). '2種類のジュースの価格を得る'(_2種類のジュースの価格) :- length(_2種類のジュースの価格,2), findall(_ジュースの価格,( % _パスタの価格となっていた 12/23訂正 append(_,[_ジュースの価格|_],_2種類のジュースの価格), readln([_ジュースの価格])), _2種類のジュースの価格). 最小値を探しだす(_対象となる値,_副目標,_最小値) :- findall(_対象となる値,_副目標,L), 最小値(L,_最小値). 最小値(L,_最小値) :- append(L1,[_最小値|L2],L), \+((append(_,[A|_],L1),A @< _最小値)), \+((append(_,[B|_],L2),B @< _最小値)),!. セットメニューを代金を得る(_3種類のパスタの価格,_2種類のジュースの価格,_セットメニューの代金) :- append(_,[_パスタの価格|_],_3種類のパスタの価格), append(_,[_ジュースの価格|_],_2種類のジュースの価格), _セットメニューの代金 is _パスタの価格 + _ジュースの価格 - 50. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/962 # # 対象 # ABCこの間に文字列があったりなかったりDEF # # 結果 # DEF # # "ABC"よりも後続にある(最初の)"DEF"だけを対象としたいです # 戻り読み条件が、長さ一定でなくてもOKならばできるのですが・・・ # # '"ABC"よりも後続にある(最初の)"DEF"だけを対象としたいです。戻り読み条件が、長さ一定でなくてもOKならばできるのですが・・・ '(_文字列,_前文字列,'DEF',_後文字列) :- atom_chars(_文字列,Chars), append(L1,['A','B','C'|R1],Chars), append(L2,['D','E','F'|R2],R1), append(L1,['A','B','C'|L2],Chars1), atom_chars(_前文字列,Chars1), atom_chars(_後文字列,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/777 # # JavaScriptで # aa1 # っていう文字列の塊を1セットで[a-z]{2}[0-9]と表します # この文字列が # fi1cs2bc3wr4 # ってう風に4回繰り返されている場合にヒットさせる正規表現はどうかくのでしょうか? # ([a-z]{2}[0-9]){4}って感じで書いてみたんですけど(〜){数字}のケースって見たことないんですがどうでしょうか # # ある文字パターンが四回繰り返されているパターン(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), ある文字パターンが四回繰り返されている(L2). ある文字パターンが四回繰り返されている(L) :- append(A,B,L1), append(L1,C,L2), append(L2,D,L). 同一パターン([A,B,C,D],_). 同一パターン([],_) :- !. 同一パターン([A|R],N) :- パターン候補(A,1), 同一パターン(R,N). パターン候補(A,1) :- 一文字目がアルファベット(A), 二文字目がアルファベット(A), 三文字目が数字(A). 一文字目が英文字(A) :- sub_atom(A,0,1,_,A1), 英文字(A1),!. 二文字目が英文字(A) :- sub_atom(A,1,1,_,A2), 英文字(A2),!. 三文字目が数字(A) :- sub_atom(A,2,1,_,A3), A3 @>= '0', A3 @=< '9',!. 英文字(A) :- A @>= 'a', A @=< 'z',!. 英文字(A) :- A @>= 'A', A @=< 'Z',!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/455 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 置換 # # ●説明 # <b></b>で挟まれた文章を抜き出す # # ●対象データ # <table width="100%" border="1" cellspacing="0" cellpadding="10"> # <tr><td><b>ERROR!!<br><br>多重書き込みです。 あと 17秒お待ちください。</b></td></tr> # </table> # # ●希望する結果 # ERROR!!<br><br>多重書き込みです。 あと 17秒お待ちください。 # # ==== # これを実行するのに、 # responseStr = System.Text.RegularExpressions.Regex.Replace( # responseStr, # @"(.|\n)*<b>(?<sentence>.*?)</b>(.|\n)*", # "${sentence}"); # # とやっているのですが、 # 「任意の一文字(改行文字も含む)」 # という表現は(.|\n)が最適なのでしょうか。 # もっとベターなやりかたがあったら教えて下さい。 # # 'で挟まれた文章を抜き出す'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append([<,b,>|R1],[<,/,b,>],R1), \+(append(_,[<,b,>|_],R1)), \+(append(_,[<,/,b,>|_],R1)), atom_chars(_適合文字列,R1), concat_atom([S1,''],_前文字列), concat_atom(['',S3],_後文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/381 # # ●正規表現の使用環境 # C# 4.0 # # ●検索か置換か? # 置き換え # # ●説明 # html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換えたい # ためしに<dd>とだけやってみましたが、<dd>タグは置き換えされませんでした # # ●対象データ # <dd>文章1</dd> # <dd>文章2</dd> # # ●希望する結果 # 文章1 # 文章2 # 'html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換える'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[<,d,d,>|R1],L3), append(_[/,<,d,d,>|_],L1), append(L11,[/,<,d,d,>],R1), \+(append(L11,[/,<,d,d,>],L11)), atom_chars(_ddタグを削除された文字列,L11), concat_atom([L1,L11,L2],_置換された文字列). 'html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換える'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[<,d,d,>|R1],L3), append(_[/,<,d,d,>|_],L1), append(L11,[/,<,d,d,>],R1), \+(append(L11,[/,<,d,d,>],L11)), 'html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換える'(L3,_置換された文字列のニ), concat_atom([L1,L11,_置換された文字列のニ],_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/282 # # ○ds # ○nds # ○gameds # ○gamends # ×legends # 検索したときに、○だけヒットさせるにはどうすればいいか教えてください # # dsで終わる文字列でleからはじまらないもの(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), append(L0,[d,s],L2), \+(append(_,[d,s|_],L2)), \+(append([l,e],_,L0)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/279 # # ●正規表現の使用環境 # C# 4.0 # # ●検索か置換か? # 置換です # # ●説明 # HTMLファイルのソースコードの # <script type="text/javascript">〜省略〜</script> # scriptタグ開始を含めてscriptタグ終了タグまでを消去したいんです # # ●対象データ # <script type="text/javascript"> # <!-- # // 〜コメント〜 # 内容 # // --> # </script> # # <script type="text/javascript" src="script.js"></script> # # 上記のどちらも以下のものでやったのですが、どうもヒットしません # <script\s[a-zA-Z0-9<>()-\.!_~*,;/:@&=+$,%#'""]+>[a-zA-Z0-9<>()-\.!_~*,;/:@&=+$,%#]+\</script> # # 解答よろしくお願いします # # 'scriptタグ開始を含めてscriptタグ終了タグまでを消去'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [<,s,c,r,i,p,t,' '|R2], append(R20,[/,s,c,r,i,p,t,>],R2), \+(append(_,[<,s,c,r,i,p,t,' '|_],R20)), \+(append(_,[/,s,c,r,i,p,t,>|_],R20)), 'scriptタグ開始を含めてscriptタグ終了タグまでを消去'(S3,_置換された文字列2), concat_atom([S1,_置換された文字列2],_置換された文字列),!. 'scriptタグ開始を含めてscriptタグ終了タグまでを消去'(_文字列,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/623 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # n個のデータを降順に並び変える関数を作成しなさい。 # ただし、個数nを先に入力し、必要なメモリ領域を関数malloc()を用いて確保すること。 # すなわち、配列による宣言はせずに、ポインタで宣言する。 # また、2つの変数の値を入れ替える関数swap()も作成すること。 # http://ime.nu/codepad.org/hZCN4vEh # 上の課題を提出したのですが、再提出を要求されました。 # コメントに対する直しがわかる方よろしくお願いします。 # 'n個のデータを降順に並び変える'(_n個) :- length(L1,_n個), n個の要素に値を詰める(L1), 降順にならび変える(L1,L2). '二つの要素を入れ替える'(_m番目,_n番目,L1,L2) :- length([_|L01],_m番目), length([_|L02],_n番目), append(L01,[A|R1],L1), append(L01,[B|R1],L3), append(L02,[B|R2],L3), append(L02,[A|R2],L2),!. n個の要素に値を詰める(L1) :- findall(N,( append(_,[_|_],L1), N is random(1000)), L1). 降順にならび変える([],[]) :- !. 降順にならび変える(L1,L2) :- L1 = [A|R], 降順にならび変える(A,R,L2). 降順にならび変える(A,L1,L2) :- 分割(A,L1,_より大きいならび,_より小さいならび), 降順にならび変える(_より大きいならび,L3), 降順にならび変える(_より小さいならび,L4), append(L3,[A|L4],L2). 分割(_,[],[],[]) :- !. 分割(A,[B|R1],[B|R2],R3) :- B @> A, 分割(A,R1,R2,R3). 分割(A,[B|R1],R2,[B|R3]) :- B @=< A, 分割(A,R1,R2,R3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1306768580/535 # # 要素数7のリストで6番目からスタートして最後まで来たら最初に戻り5番目を取り出して終わる # '要素数7のリストで6番目からスタートして最後まで来たら最初に戻り5番目を取り出して終わる'(_要素,_要素数7のならび) :- length([_|Ln],6), append(L0,[A|R],_要素数7のならび), append([A|R],L0,L2), append(_,[_要素|_],L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/266 # # ●正規表現の使用環境 # PHP 5.2.5 # # ●検索か置換か? # 置換 # # ●説明 # <a>でリンクされていないURLだけをリンクしたい # # ●対象データ # <a href='http://ime.nu/aaaaaa/aaa'>http://aaaaaa/aaa</a> # <a href='http://ime.nu/aaaaaa/aaa'>bbb</a> # http://ime.nu/aaaaaa/aaa # http://ime.nu/aaaaaa/aaa # # (httpの前に改行は無いです) # # ●希望する結果 # # <a href="http://ime.nu/aaaaaa/aaa">http://ime.nu/aaaaaa/aaa</a> # <a href="http://ime.nu/aaaaaa/aaa">bbb</a> # <a href="http://ime.nu/aaaaaa/aaa">http://ime.nu/aaaaaa/aaa</a> # <a href="http://ime.nu/aaaaaa/aaa">http://ime.nu/aaaaaa/aaa</a> # # # ↓これではダメでした。。 # /((?![\"\'>])(https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)(?![\"\'<]))/ # 'AタグでリンクされていないURLだけをリンクしたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L1 = [<,a,>|R1], append(R0,[<,/,a,>],R1), \+(append(_,[<,a,>|_],R0)), \+(append(_,[<,/,a,>|_],R0)), 'AタグでリンクされていないURLだけをリンクしたい'(S3,_置換された文字列のニ), concat_atom([S1,S2,_置換された文字列のニ],_置換された文字列),!. 'AタグでリンクされていないURLだけをリンクしたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L1 = [h,t,t,p,:,/,/|R1], member(C,R1), \+(member(C,[' ',',','\n'])), concat_atom([S1,'',S2,'\n'],S4), concat_atom([S4,_置換された文字列のニ],_置換された文字列),!. 'AタグでリンクされていないURLだけをリンクしたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L1 = [h,t,t,p,:,/,/|R1], last(R1,C), member(C,[' ',',','\n']), concat_atom([S1,'',S2,'\n'],S4), 'AタグでリンクされていないURLだけをリンクしたい'(S3,_置換された文字列のニ), concat_atom([S4,_置換された文字列のニ],_置換された文字列),!. 'AタグでリンクされていないURLだけをリンクしたい'(_文字列,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/741 # # 全てのdivを削除したい訳でなく、<td....></td>間にある<div></div>を削除したいのです。 # <td....></td>間にあるものは削除して、それ以外は改行したいのです。 # 'tdタグの中のdivタグを取り除く'(_文字列,_取り除かれた文字列) :- atom_chars(_文字列,Chars), append(L0,[<,t,d,>|L],[<,/,t,d>|R1],Chars), \+(append(_,[<,t,d,>|R2],L)), \+(append(_,[|R3],R2)), append(L01,[<,d,i,v,>|L2],[<,/,d,i,v>|R3],L), append(L0,[<,t,d,>|L01],R3,L1), append(L1,[<,/,t,d|R1],Chars2), atom_chars(_取り除かれた文字列,Chars2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/953 # # ../test/read.cgi/tech/1307166756/928です # 小出しになってしまって申し訳ないのですがもう1つお願いします # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 長いのでろだにうpしました # http://ime.nu/www.dotup.org/uploda/www.dotup.org1726929.txt # # file03.txt # http://ime.nu/www.dotup.org/uploda/www.dotup.org1726932.txt # 'file1を読み込み、n1行目からn2(n2>=n1)行目までをコピーして、m行目とm+1行目の間に入れfile2に書き込む'(_n1,_n2,_m) :- 'file1を読み込み'(LL1), 'n1行目からn2(n2>=n1)行目までをコピーして'(LL1,_n1,_n2,LL2), 'm行目とm+1行目の間に入れ'(LL1,_m,_LL2,LL3), 'file2に書き込む'(LL3). 'file1を読み込み'(LL1) :- get_lines(file1,LL1),!. 'n1行目からn2(n2>=n1)行目までをコピーして'(LL,_n1,_n2,_コピー) :- length([_|LL0],_n1), append(LL0,_,LL), length(LL02,_n2), append(LL02,_,LL), append(LL0,_コピー,LL02),!. 'm行目とm+1行目の間に入れ'(LL,_m,_コピー,LL3) :- length(LL0,_m), append(LL0,LL1,LL), append(LL0,_コピー,LL2), append(LL2,LL1,LL3),!. 'file2に書き込む'(LL) :- open(file2,write,Outstream), append(_,[Line|R],LL), writef(Outstream,'%t\n',[Line]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/885 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # file1を読み込み、n1行目からn2 (n2>=n1)行目までを削除し、file2に書き込むファイル、ensyu03.cを作成せよ # 注意:切り取った際、文章は上に詰めること # erase_multiline( ”file1”, ”file2”, n1, n2 ) ; # # file1を読み込み、n行目とm行目を入れ替え、file2に書き込むファイル、ensyu04.cを作成せよ # replace_lines( ”file1”, ”file2”, n, m ) ; # # file1を読み込み、特定の文字列string を含む行を削除し、file2に書き込むファイル、ensyu05.cを作成せよ # erase_string( ”file1”, ”file2”, ”string” ) ; # # file1を読み込み、特定の文字c を削除し、file2に書き込むファイル、ensyu06.cを作成せよ # erase_char( ”file1”, ”file2”, ’c’ ) ; # 'file1を読み込み、n1行目からn2 (n2>=n1)行目までを削除し、file2に書き込む'(_n1行目,_n2行目) :- file1を読み込み(Lines), 'n1行目からn2 (n2>=n1)行目までを削除し'(Lines,_n1行目からn2行目までを削除されたならび), file2に書き込む(_n1行目からn2行目までを削除されたならび),!. file1を読み込み(Lines) :- get_lines(file1,Lines). 'n1行目からn2 (n2>=n1)行目までを削除し'(Lines,_n1行目からn2行目までを削除されたならび) :- length([_|L0],_n1行目), length(L2,_n2行目), append(L0,L1,L2), append(L2,L3,Lines), append(L0,L3,_n1行目からn2行目までを削除されたならび),!. file2に書き込む(_n1行目からn2行目までを削除されたならび) :- open(file2,write,Outstream), append(_,[Line|R],_n1行目からn2行目までを削除されたならび), writef('%t\n',[Line]), R = [], close(Outstream),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/883 # # あと、もうひとつ問題 # 2.201003121(10進数9桁)、性別(男:1、女:2)、年令(未成年:0,成年:1,高齢:2,後期高齢:3)、 # 職業(無:0、有:1)で個々人が16分類される。それぞれを数字(コード)で入力させ、 # その人の状態を一旦ディスプレイに表示し、if文を使って、自然な文章で最後に表示するプログラムを作れ # 'それぞれを数字(コード)で入力させ、その人の状態を一旦ディスプレイに表示し、if文を使って、自然な文章で最後に表示する' :- 'それぞれを数字(コード)で入力させ'(_個人ID,_分類コード), 分類コードの生成([_分類コード,_性別,_年齢,_職業],_分類表示), writef('%t\n',[_分類表示]), 自然な文章で最後に表示する(_個人ID,_性別,_年齢,_職業). 'それぞれを数字(コード)で入力させ'(_個人ID,_分類コード) :- 個人IDの入力(_個人ID), 分類コードの入力(_分類コード),!. 個人IDの入力(_個人ID) :- write('個人IDを入力してください : '), get_line(Line), 個人ID入力診断(Line,_個人ID),!. 個人IDの入力(_個人ID) :- 個人IDの入力(_個人ID). 個人ID入力診断(Line,_個人ID) :- atom_to_term(Line,_個人ID,_), integer(_個人ID), _個人ID >= 100000000, _個人ID =< 999999999,!. 個人ID入力診断(Line,_個人ID) :- writef('入力された %t からは適切な個人IDが得られませんでした。再入力をお願いします。\n',[Line]), fail. 分類コードの入力(_分類コード) :- 分類コード表示, write('分類コードを入力してください : '), get_line(Line), 分類コード入力診断(Line,_分類コード),!. 分類コードの入力(_分類コード) :- 分類コードの入力(_分類コード). 分類コード入力診断(Line,_分類コード) :- atom_to_term(Line,_分類コード,_), integer(_分類コード), _分類コード >= 0, _分類コード =< 15,!. 分類コード入力診断(Line,_分類コード) :- writef('入力された %t からは分類コードが得られませんでした。再入力をお願いします。\n',[Line]), fail. 分類コードの生成([_分類コード,_性別,_年齢,_職業],_分類表示) :- append(L01,[_性別|_],['男','女']), append(L02,[_年齢|_],['未成年','青年','高齢者','後期高齢者']), append(L03,[_職業|_],['無','有']), length(L01,N1), length(L02,N2), length(L03,N3), _分類コード is N1 * 8 + N2 * 2 + N3, concat_atom(['分類コード ',_分類コード,' [','性別:',_性別,' ','年齢: ',_年齢,' ','職業: ',_職業,']'],_分類表示). 分類コード表示 :- 分類コードの生成([_分類コード,_性別,_年齢,_職業],_分類表示), writef('%t\n',[_分類表示]), fail. 分類コード表示. 自然な文章で最後に表示する(_個人ID,_性別,_年齢,_職業) :- writef('個人IDが%tの人は、%tで',[_個人ID,_性別]), 自然な年齢表現(_年齢), 自然な職業表現(_職業). 自然な年齢表現(_年齢) :- writef('年齢分類は%t、',[_年齢]). 自然な職業表現(有) :- write('職業に就いています。\n'). 自然な職業表現(無) :- write('無職です。\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/617 # # 【1】C言語 # 【2】キャラクタでピラミッドを表示するプログラムを作成せよ # 実行結果 # 何段にしますか? # 7 # #       # #      ### #     ##### #    ####### #   ######### #  ########### # ############# # 【3】UNIXのC言語 # 【4】6/17まで # お願いします # # キャラクタでピラミッドを表示する :- 何段にしますか(_段数), 表示枠を作る(_段数,_表示枠), 表示する(_表示枠), R = []. 何段にしますか(_段数) :- write('何段にしますか : '), readln([_段数]), integer(_段数),!. 何段にしますか(_段数) :- write('整数を入力してください。 '), 何段にしますか(_段数). 表示枠を作る(_段数,_表示枠) :- length(L,_段数), append(L0,[_|R],L), '#を嵌めこむ'(L0,R), append(L0,R,L1), append(R,L0,L2), append(L2,['#'|L1],_表示枠). '#を嵌めこむ'(L0,R) :- all(R,' '), all(L0,'#'). 表示する(L3) :- concat_atom(L3,S), writef('%t\n',[S]). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/543 # # どなたかお願致します。(問題文にある ”状態遷移図を作れ” は無視してもらって結構です) # # [1] 授業単元: ソフトウェア設計法 # [2] 問題文 # # Cのソ-スプログラムを読んで、コメント(/* と */で囲まれた文字列)だけを取り出すプログラムの状態遷移図 # を作れ。このとき、文字列(" と "で囲まれた文字列)中の/* や */はコメントにならないことに注意すること。 # さらに、コメント中の文字列は文字列にならない。この状態遷移図をもとに、制御のデータ化を使ったプログラムを作れ。 # # ※実行例、図などは記載されていませんでした # 'Cのソ-スプログラムを読んで、コメント(/* と */で囲まれた文字列)だけを取り出す。このとき、文字列(" と "で囲まれた文字列)中の/* や */はコメントにならないことに注意すること。さらに、コメント中の文字列は文字列にならない。'(File) :- get_chars(File,Chars), 'コメント(/* と */で囲まれた文字列)だけを取り出す'(Chars,_コメントならび). 'コメント(/* と */で囲まれた文字列)だけを取り出す'([],[]) :- !. 'コメント(/* と */で囲まれた文字列)だけを取り出す'(['/','*'|R1],[_コメント|R2]) :- append(L0,['*','/'|R3],R1), \+(append(_,['*','/'|_],L0)), \+(append(_,['/','*'|_],L0)), concat_atom(L0,_コメント), 'コメント(/* と */で囲まれた文字列)だけを取り出す'(R3,R2),!. 'コメント(/* と */で囲まれた文字列)だけを取り出す'(['"'|R1],R2) :- append(L0,['"'|R3],R1), \+(append(_,['"'|_],L0)), 'コメント(/* と */で囲まれた文字列)だけを取り出す'(R3,R2). 'コメント(/* と */で囲まれた文字列)だけを取り出す'([_|R1],R2) :- 'コメント(/* と */で囲まれた文字列)だけを取り出す'(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/845 # # [1] 授業単元:ポインタ型、配列型の派生 # [2] 問題文(含コード&リンク): #  [A]宣言による場合   short d[L][M][N]; #  [B]動的確保による場合 ([A]と同じサイズ。生成法は講義時と同様:参考コードhttp://ime.nu/ideone.com/nWTXg) #  short型の3次元配列を生成した場合について、(1)〜(7)の解答を導け。 #  (上の宣言による場合と動的確保による場合の両方について答えよ。 #   なお、short型とポインタ型のサイズはそれぞれ2バイトと8バイトとする) # #  (1)要素d[i][j][k]へのアクセス手順 #  (2)要素d[i][j][k]へのアクセスに要するアドレス計算とメモリアクセスの回数 #  (3)メモリ使用量(L,M,Nを用いて表せ)・・・書き方の例:M×N×sizeof(X)+M×sizeof(X*)+sizeof(X**)バイト #  (4)L=3,M=N=512の場合のメモリ使用量(KB単位、小数点以下1桁まで。1KBは1024Bとする。) #  (5)L=M=512,N=3の場合のメモリ使用量(上と同じ条件) #  (6)関数への渡し方・・・書き方の例:func(aax); #  (7)関数での受け方・・・書き方の例:func(int **aay){ } # '要素d[i][j][k]へのアクセス手順'(L,_i,_j,_k,_d_i_j_k) :- length(L01,_i), length(L02,_j), length(L03,_k), append(L01,[L1|_],L), append(L02,[L2|_],L1), append(L03,[_d_i_j_k|_],L2). % 以下のサイトは # 問題 'Listの要素が[A,B]であり、A,BはそれぞれList1,List2の要素である'(List,List1,List2,A,B) :- append(_,[[A,B]|_],List), append(_,[A|_],List1), append(_,[B|_],List2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1276873238/534 # # テキストボックスに # A222BあああA555BえええAおおおB55A454B # と入っていたとします。 # この文字列の # AとBとその間の文字を1セットにして、AとBの間の文字に5が入っていたときだけ、AとBを削除する # # このようなロジックをつくっていただけないでしょうか? # 'AとBとその間の文字を1セットにして、AとBの間の文字に5が入っていたときだけ、AとBを削除する'(_文字列,_削除された文字列) :- atom_chars(_文字列,Chars), '間に5を含むAとBを削除する'(Chars,Chars2), atom_chars(_削除された文字列,Chars2). '間に5を含むAとBを削除する'([],[]) :- !. '間に5を含むAとBを削除する'(['A'|R1],L) :- 最初に現れるBの間に5が存在する(R1,L0,R2), '間に5を含むAとBを削除する'(R2,L2), append(L0,L2,L),!. '間に5を含むAとBを削除する'([_文字|R1],[_文字|R2]) :- '間に5を含むAとBを削除する'(R1,R2). 最初に現れるBの間に5が存在する(R1,L0,L2) :- append(L0,['B'|L2],R1),!, \+(append(_,['A'|_],L0)), append(_,['5'|_],L0),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1200175247/927 # # n=12 # x=[2,6,20,15,8,21,8,22,15,20,1,15] # y=["Jan","Feb","Mar","Apr","Mey","Jun","Jul","Aug","Sep","Oct","Nov","Dec"] # sx=0 # upper=0 # middle=0 # lower=0 # xmax=0 # xmin=0 # best_x=0 # worst_x=0 # # for i in 0..n-1 # sx=sx+x[i] # end # xave=sx/n # print "Sipments:Total=",sx," Average=",xave,"\n" # puts # for i in 0..n-1 # if x[i] >= xave*1.5 then # upper = upper + 1 # elsif x[i] <= xave*1.5*0.5 # middle = middle + 1 # else x[i] <= xave/2 # lower = lower + 1 # end # end # print "Sales:Upper=",upper," Middle=",middle," Lower=",lower,"\n" # puts # xmax=x[0] # xmin=x[0] # for i in 0..n-1 # if xmax >= x[i] then # best_x = best_x + 1 # else xmin <= x[i] # worst_x = worst_x + 1 # end # end # print "Best Month:",best_x, " Worst Month:",worst_x,"\n" # puts # 出力結果 # Sipments:Total=153 Average=12 # Sales:Upper=4 Middle=5 Lower=3 # Best Month:2 Worst Month:10 # 本当はBest Month:Aug、Worst Month:Novとしたいんですけど、どうしたらいいですか? # やっぱり変数がおかしいんですか?それとも条件の書き方ですか?? 値([2,6,20,15,8,21,8,22,15,20,1,15]). 月表示(['Jan','Feb','Mar','Apr','Mey','Jun','Jul','Aug','Sep','Oct','Nov','Dec']). 月毎の売上分析 :- 値(_値ならび), 月表示(_月表示ならび), 値と月表示を対にする(_値ならび,_月表示ならび,_値・月表示ならび), sum(_値ならび,_合計値), avg(_値ならび,_平均値), 月値評価度数(_値ならび,_平均値,_上,_中の上,_中の下,_下), max(_値・月表示ならび,[_Max,_最良月]), min(_値・月表示ならび,[_Min,_最悪月]), writef('合計値=%t,平均値=%t\n',[_合計値,_平均値]), writef('上=%t,中の上=%t,中の下=%t,下=%t\n',[_上,_中の上,_中の下,_下]), writef('最良月=%t,最悪月=%t\n',[_最良月,_最悪月]),!. 値と月表示を対にする([],[],[]). 値と月表示を対にする([_値|R1],[_月表示|R2],[[_値,_月表示]|R3]) :- 値と月表示を対にする(R1,R2,R3). 月値評価度数(_値ならび,_平均値,_上,_中の上,_中の下,_下) :- count((append(_,[_値|_],_値ならび),_値 >= _平均値 * 1.5),_上), count((append(_,[_値|_],_値ならび),_値 >= _平均値 * 1.5 / 2,_値 < _平均値 * 1.5),_中の上), count((append(_,[_値|_],_値ならび),_値 >= _平均値 * 0.5,_値 < _平均値 * 1.5 / 2),_中の下), count((append(_,[_値|_],_値ならび),_値 < _平均値 * 0.5),_下). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/921 # # <p>text</p> を <h3>text</h3> に変換したいんです。 # # ただし text がない<p></p>はそのままで。 # # '/<p>(.+?)<\/p>/is', '<h3>$1</h3>' # # ここから進まない… 助けて # % % 最初から順に変換していく非決定性の述語とすべてを一気に変換してしまう決定性の述語の両例を示す。 %%%%%% 最初から順に変換していく。以前に変換された部分が変換前の状態に戻ることがないように注意する %%%%% '

text

text

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

text

text

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

text

text

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

text

text

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

text

text

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

text

text

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

text

text

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

text

text

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

text

text

に変換し、変換部分までのならびとする'(_文字列,[_文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/865 # # 質問させてください。 # 「<img」以外の「<」を「&lt;」に置き換えるにはどう書けば良いでしょうか? # #「img(中略)>」以外の「>」も「&gt;」に置き換える必要ありがますが、そちらはまた別途考えるとして。。 # 言語はPHPです。よろしくお願いします。 # '「|R3]), '「|R3],_置換した部分までの文字列,_残り文字列), concat_atom([_置換した部分までの文字列,_残り文字列],_置き換えた文字列). '「|R3]), '「|R3],_置換した部分までの文字列,_残り文字列) :- \+(append(_,[<|_],R2)), \+(append(_,[>|_],R2)), append(L1,['<'|R2],['>'],L4), concat_atom(L4,_置換した部分までの文字列), concat_atom(R3,_残り文字列),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/702 # # 次の正規表現でhogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換しております。 # # RewriteRule ^/hoge(.*)/(.*).html$ http://ime.nu/example.com/hoge/$1/i/$2.html [L] # # # # 下記のような場合は問題ないのですが # # http://ime.nu/example.com/hoge → http://ime.nu/example.com/hoge/i/ # http://ime.nu/example.com/hoge/saitama/2011/01/index.html → http://ime.nu/example.com/hoge/saitama/2011/01/i/index.html # # # # ↓のようにhogeで始まるディレクトリまでも変換されてしまいます。 # http://ime.nu/example.com/hogehoge/kankeinai.html # # hogeフォルダ配下のみ変換されるようにするには、どうしたらいいでしょうか? # # 環境は # CentOS5 # Apache2 # # # 'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :- sud_atom(_文字列,_,_,_,S1,'/hoge',S3,L1,L2,L3), L3=[], concat_atom([S1,S2,'/i/'],_変換された文字列),!. 'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :- sud_atom(_文字列,_,_,_,S1,'/hoge',S3,L1,L2,[' '|R3]), concat_atom([S1,S2,'/i/',S3],_変換された文字列),!. 'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :- sud_atom(_文字列,_,_,_,S1,'/hoge/',S3,L1,L2,[' '|R3]), concat_atom([S1,S2,'i/',S3],_変換された文字列),!. 'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :- sud_atom(_文字列,_,_,_,S1,'/hoge/',S3,L1,L2,L3), '最後の「/」の後に「i/」が挟まるように'(S3,S4), concat_atom([S1,S2,S4],_変換された文字列). '最後の「/」の後に「i/」が挟まるように'(S1,S2) :- atom_chars(S1,L), append(L0,['/'|R],L), \+(append(_,[' '|_],L0)), \+(append(_,['/'|_],R)), append(L0,['/i/'|R],L2), atom_chars(S2,L2),!. '最後の「/」の後に「i/」が挟まるように'(S1,S2) :- concat_atom(['i/',S1],S2),). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/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,Len), length(Len,_編集距離),!. ならびの編集距離([],LY,LY). ならびの編集距離(LX,[],LX). ならびの編集距離(LX,LY,Len) :- append(L0,L1,L2,LX), \+(L1 = []), append(L01,L1,L21,LY), append(L01,L21,LYR), append(L0,Len1,Len), ならびの編集距離(L2,LYR,Len1). ならびの編集距離(LX,LY,LZ) :- append(LX,LY,LZ). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/27 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/zKDn7mD5 # # # 壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁S壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁 # 壁 壁   壁   壁 壁     壁 壁   壁 壁   壁 # 壁 壁 壁壁壁 壁 壁 壁 壁壁壁 壁 壁 壁 壁 壁壁壁 壁 # 壁 壁   壁 壁 壁 壁 壁   壁   壁 壁 壁   壁 # 壁 壁壁壁 壁 壁 壁 壁 壁 壁壁壁 壁壁壁壁壁 壁壁壁 壁 # 壁     壁 壁     壁   壁 壁   壁 壁   壁 # 壁 壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁 壁 壁 壁壁壁 壁壁壁 壁 # 壁     壁   壁   壁 壁 壁     壁 壁   壁 # 壁 壁壁壁壁壁壁壁 壁 壁 壁 壁 壁 壁壁壁壁壁 壁壁壁 壁 # 壁     壁     壁 壁   壁   壁 壁 壁   壁 # 壁壁壁 壁 壁壁壁 壁 壁 壁 壁 壁 壁壁壁 壁 壁壁壁 壁 # 壁   壁 壁   壁 壁 壁 壁 壁     壁 壁   壁 # 壁 壁 壁 壁 壁壁壁 壁 壁 壁 壁壁壁壁壁 壁 壁壁壁 壁 # 壁 壁 壁 壁   壁 壁 壁 壁       壁 壁 壁 壁 # 壁 壁壁壁壁壁壁壁 壁 壁 壁 壁 壁壁壁壁壁 壁 壁 壁 壁 # 壁     壁   壁 壁   壁 壁     壁 壁 壁 壁 # 壁 壁壁壁 壁 壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁 壁 壁 壁 # 壁 壁   壁     壁 壁   壁     壁 壁 壁 壁 # 壁 壁壁壁壁壁 壁 壁 壁 壁壁壁 壁壁壁 壁壁壁 壁 壁 壁 # 壁     壁 壁 壁   壁   壁     壁     壁 # 壁壁壁壁壁 壁 壁壁壁壁壁壁壁 壁 壁 壁 壁壁壁 壁壁壁壁壁 # 壁             壁 壁 壁 壁   壁     壁 # 壁 壁壁壁 壁壁壁壁壁壁壁 壁 壁 壁 壁壁壁壁壁壁壁壁壁 壁 # 壁 壁   壁         壁       壁   壁 壁 # 壁 壁 壁 壁 壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁 壁 壁 # 壁 壁 壁 壁 壁           壁   壁     壁 # 壁 壁 壁 壁 壁 壁壁壁壁壁壁壁 壁 壁 壁 壁壁壁壁壁 壁 # 壁 壁 壁 壁         壁 壁 壁 壁 壁     壁 # 壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁 壁 壁 壁 壁 壁 壁壁壁壁壁 # 壁       壁 壁   壁 壁 壁   壁 壁 壁   壁 # 壁壁壁壁壁壁壁 壁 壁 壁壁壁 壁 壁壁壁 壁 壁 壁壁壁 壁 # 壁               壁 壁   壁 壁 壁 壁 壁 # 壁 壁 壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁 壁 壁 壁 壁 # 壁 壁 壁 壁       壁 壁     壁 壁 壁 壁 壁 # 壁壁壁 壁 壁 壁壁壁 壁 壁 壁 壁壁壁壁壁 壁 壁 壁 壁 # 壁         壁 壁   壁             壁 # 壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁G壁 迷路探索(_迷路ファイル,_経路) :- 迷路情報の取得(_迷路ファイル,_迷路情報), Sの位置は(_迷路情報,_行S,_列S), Gの位置は(_迷路情報,_行G,_列G), 迷路探索(_迷路情報,_置換された迷路情報,_行S,_列S,_行G,_列G,[],Log), reverse(Log,Log2), 経路の整理(Log2,_経路). 迷路情報の取得(_迷路ファイル,_迷路情報) :- get_chars(_迷路ファイル,Chars), 改行文字で分割(Chars,_迷路情報),!. Sの位置は(LL1,_行,_列) :- append(L0,[L|_],LL1), length([_|L0],_行), append(L1,[S|_],L), length([_|L1],_列),!. Gの位置は(LL1,_行,_列) :- append(L0,[L|_],LL1), length([_|L0],_行), append(L1,[G|_],L), length([_|L1],_列),!. 改行文字で分割([],[]) :- !. 改行文字で分割(L1,[L0|R2]) :- append(L0,['\n'|R],L1),!, 改行文字で分割(R,R2). 迷路探索(LL1,_行G,_列G,_行G,_列G,Log,Log) :- !. 迷路探索(LL1,_行,_列,Log1,Log) :- append(L0,[L|_],LL1), length([_|L0],_行), append(L1,[A|_],L), length([_|L1],_列), 次の選択(LL1,_行,_列,Log1,_行2,_列2), 迷路探索(LL1,_行2,_列2,_行G,_列G,[[_行,_列,_行2,_列2]|Log1],Log). 次の選択(LL1,_行,_列,Log1,_行2,_列) :- _行2 is _行 + 1, \+(append(_,[[_行2,_列,_行,_列]|_],Log1), \+(append(_,[[_行,_列,_行2,_列]|_],Log1), append(L0,[L|_],LL1), length([_,_|L0],_行), append(L1,[A|_],L), length([_|L1],_列), \+(A = 壁). 次の選択(LL1,_行,_列,Log1,_行2,_列) :- _行2 is _行 - 1, \+(append(_,[[_行2,_列,_行,_列]|_],Log1), \+(append(_,[[_行,_列,_行2,_列]|_],Log1), append(L0,[L|_],LL1), length(L0,_行), append(L1,[A|_],L), length([_|L1],_列), \+(A = 壁). 次の選択(LL1,_行,_列,Log1,_行2,_列) :- _列2 is _列 + 1, \+(append(_,[[_行,_列2,_行,_列]|_],Log1), \+(append(_,[[_行,_列,_行,_列2]|_],Log1), append(L0,[L|_],LL1), length([_|L0],_行), append(L1,[A|_],L), length([_,_|L1],_列), \+(A = 壁). 次の選択(LL1,_行,_列,Log1,_行2,_列) :- _列2 is _列 - 1, \+(append(_,[[_行,_列2,_行,_列]|_],Log1), \+(append(_,[[_行,_列,_行,_列2]|_],Log1), append(L0,[L|_],LL1), length([_|L0],_行), append(L1,[A|_],L), length(L1,_列), \+(A = 壁). 経路の整理([[_行1,_列1,_行2,_列2]],[[行1,_列1],[_行2,_列2]]) :- !. 経路の整理([[_行1,_列1,_行2,_列2]|R1],[[行1,_列1]|R2]) :- !. 経路の整理([R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/554 # # PHPでPerl互換のpreg_replace関数を使った置換を行おうとしているのですが、 # やりたいことがうまく実現できません。 # # やりたいことは、 # # ・<tagA>という文字列と</tagA>のあいだに<tagInsert>という文字列を挿入したい # ・ただし、<tagA>の中に<tagB>という文字列がある場合は、その<tagB>の下に挿入したい # # # <失敗した正規表現> # $new_str = preg_replace("/<tagA(.*?)>(.*?)(<(?!tagB).)*/", '<tagA\\1>\\2<tagInsert>\\3', $str); # # <実現したい例> # <tagA> # <tagB> # <tagB> # <tagC> # </tagA> # # ↓置換実行 # <tagA> # <tagB> # <tagB> # <tagInsert> # <tagC> # </tagA> # # 'という文字列とのあいだにという文字列を挿入したい。ただし、の中にという文字列がある場合は、そのの下に挿入する'(Lines1,Lines2) :- append(L1,[''|R2],[''|R3],Lines1), \+(append(_,[''|_],R3)), append(_,[''|_],R3), append(L1,[''|R2],['',''|R3],Line2),!. 'という文字列とのあいだにという文字列を挿入したい。ただし、の中にという文字列がある場合は、そのの下に挿入する'(Lines1,Lines2) :- append(L1,[''|R2],[''|R3],Lines1), append(L1,['',''|R2],[''|R3],Line2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/506 # # 下記の2文にあるfontタグを消したいです。 # 正規表現を用いた1度の置換で消せますか? # # <dd><font style="font-size:;color:;"> テスト <br> テスト </font><br><br></dd> # <dd><font style="font-size:;color:;"> テスト2 <br> テスト2 </font><br><br></dd> # # # 考え方として # <dd><font style="font-size:;color:;">がある行のうち</font>を削除し、そのあと<font style="font-size:;color:;">を削除 # これで行けそうかと思ったのですが、●●がある行のうち○○を削除、という正規表現がわかりませんでした・・・ # # 'fontタグのみ削除する'(_文字列,_fontタグが削除された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append([<,f,o,n,t|R1],[>],L2), \+(append(_,[>|_],R2)), append(L3_0,[<,/,f,o,n,t,>|R3],L3), \+(append(_,[<,/,f,o,n,t,>|_],L3_0)), append(L1,L3_0,R3,L4), atom_chars(_fontタグが削除された文字列,L4). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/972 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 5列5行の多次元配列(0または1が適当に並べられているもの)を用意し # 1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更し # そうでない場合は1のままにする この操作を10回行った配列を求めるプログラムを作成する # またこの配列は上下左右繋がっていて1,1の配列の場合上は1,5、左は5.1である # % http://nojiriko.asia/prolog/c144_919.html から述語を借用する。 '5列5行の行列(0または1が適当に並べられているもの)を用意し1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにする。この操作を10回行う'(_ならび) :- '5列5行の行列(0または1が適当に並べられているもの)を用意し'(LL1), length(Ln,10), '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにするこの操作を10回行う'(Ln,LL1,LL2). '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにするこの操作を10回行う'([],LL,LL) :- !. '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにするこの操作を10回行う'([_|Ln],LL1,LL) :- '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにする'(LL1,LL2), '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにするこの操作を10回行う'(Ln,LL2,LL). '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにする'(LL1,LL2) :- length(LL2,5), findall(_マス目の値2,( length(Line,5), append(L00,[Line|_],LL2), append(L01,[_マス目の値2|_],Line), length(L00,_行の一), length(L01,_列の一), _行 is _行の一 + 1, _列 is _列の一 + 1, マス目の周囲(LL1,_行,_列,_マス目の値1,_マス目の周辺), マス目の状態診断(_マス目の値1,_マス目の周辺,_マス目の値2)), LL2). '5列5行の行列(0または1が適当に並べられているもの)を用意し'(LL) :- length(LL,5), findall(L,( length(L,5), append(_,[A|_],L), A is random 2), LL). マス目の周囲(LL,1,_マス目の列,_マス目の値,_マス目の周辺ならび) :- append(LL0,[L],LL), append(LL,[L],LL1), マス目の周囲(LL,2,_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲(LL,5,_マス目の列,_マス目の値,_マス目の周辺ならび) :- LL = [L1|R], append(R,L1,LL2), マス目の周囲(LL,4,_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲(LL,_マス目の行,_マス目の列,_マス目の値,_マス目の周辺ならび) :- _マス目の行 >= 2, _マス目の行 =< 4, Nth1 is _マス目の行 - 2, length(L0,Nth1), append(L0,[Line1,Line2,Line3|_],LL), マス目の周囲([Line1,Line2,Line3],_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],1,_マス目の値,_マス目の周辺ならび),!. length(L0,4), findall(L,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,L1,Line), append(L1,L0,L)), LL), マス目の周囲(Line1,Line2,Line3,2,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],5,_マス目の値,_マス目の周辺ならび) :- length(L1,4), findall(L,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,L1,Line), append(L1,L0,L)), LL), マス目の周囲(Line1,Line2,Line3,4,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],_マス目の列,_マス目の値,[A2,A4,A6,A8]) :- _マス目の列 >= 2, _マス目の列 =< 4, Nth1 is _マス目の列 - 2, length(L0,Nth1), findall(U,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,[A,B,C|_],Line), append(_,[U|_],[A,B,C])), L), L = [A1,A2,A3,A4,_マス目の値,A6,A7,A8,A9],!. マス目の状態診断(_マス目の値,_マス目の周囲,0) :- '1のマス目の周囲に2つか3つの1のマス目があれば0に変更される'(_マス目の値,_マス目の周囲,'0'),!. マス目の状態診断(_マス目の値,_マス目の周囲,_マス目の値). '1のマス目の周囲に2つか3つの1のマス目があれば0に変更される'(1,_マス目の周囲) :- count((append(_,[1|_],_マス目の周囲),Count), Count >= 2, Count =< 3,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/425 # # Jeditで # 【あいう】を【6あいう】 # 【かき】を【4かき】 # のように【 】でははさまれた文字列の頭に文字数×2の数値を追加したいのですが # どのように検索してどのように置換すればよいでしょうか? # 【 】ではさまれた文字数はまちまちです。 # よろしくお願いします。 # '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加したいのですがどのように検索してどのように置換すればよいか'(_文字列,_置換された文字列) :- atom_chars(_文字列,Chars), '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(Chars,L), concat_atom(L,_置換された文字列). '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(Chars,[S|R]) :- append(L0,['['|R1],[']'|R2],Chars), \+(append(_,['['|_],R1)), \+(append(_,[']'|_],R1)), length(R0,Len), Len2 is Len * 2, append(L0,['[',Len2|R0],[']'],L3), concat_atom(L3,S), '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(R2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/919 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/v82fx # # 以下のパズルを解くプログラムを作りなさい. # 30x30の格子状のマス目を考える.各マス目はONまたはOFFのどちらかの状態をとる. # パズルの問題として30x30(すなわち900個)のマス目のON,OFFの状態が与えられる. # この初期状態から以下のルールを用いて各マス目のON,OFFの状態を変化させる. # ルール1: OFFのマス目の周囲に3つのONのマス目があれば次のステップではONになる. # ルール2: ONのマス目の周囲に2つか3つのONのマス目があれば次のステップでもONが維持される. # ルール3: 上以外の場合には次のステップではOFFになる. # 但し,ここでの周囲とはマスに接している8マスを指し,30x30のマスのうち上端と下端, 右端と左端は接続されているものとする. # # この変化を100回繰り替えした時の各マスの状態を求めよ 'パズルの問題として30x30(すなわち900個)のマス目のON,OFFの状態が与えられる. この初期状態から以下のルールを用いて各マス目のON,OFFの状態を変化させる.'(LL1,LL2) :- length(LL2,30), findall(_マス目の値2,( length(Line,30), append(L00,[Line|_],LL2), append(L01,[_マス目の値2|_],Line), length(L00,_行の一), length(L01,_列の一), _行 is _行の一 + 1, _列 is _列の一 + 1, マス目の周囲(LL1,_行,_列,_マス目の値1,_マス目の周辺), マス目の状態診断(_マス目の値1,_マス目の周辺,_マス目の値2)), LL2). マス目の周囲(LL,1,_マス目の列,_マス目の値,_マス目の周辺ならび) :- append(LL0,[L],LL), append(LL,[L],LL1), マス目の周囲(LL,2,_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲(LL,30,_マス目の列,_マス目の値,_マス目の周辺ならび) :- LL = [L1|R], append(R,L1,LL2), マス目の周囲(LL,29,_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲(LL,_マス目の行,_マス目の列,_マス目の値,_マス目の周辺ならび) :- _マス目の行 >= 2, _マス目の行 =< 29, Nth1 is _マス目の行 - 2, length(L0,Nth1), append(L0,[Line1,Line2,Line3|_],LL), マス目の周囲([Line1,Line2,Line3],_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],1,_マス目の値,_マス目の周辺ならび),!. length(L0,29), findall(L,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,L1,Line), append(L1,L0,L)), LL), マス目の周囲(Line1,Line2,Line3,2,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],30,_マス目の値,_マス目の周辺ならび) :- length(L1,29), findall(L,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,L1,Line), append(L1,L0,L)), LL), マス目の周囲(Line1,Line2,Line3,29,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],_マス目の列,_マス目の値,[A1,A2,A3,A4,A6,A7,A8,A9]) :- _マス目の列 >= 2, _マス目の列 =< 29, Nth1 is _マス目の列 - 2, length(L0,Nth1), findall(U,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,[A,B,C|_],Line), append(_,[U|_],[A,B,C])), L), L = [A1,A2,A3,A4,_マス目の値,A6,A7,A8,A9],!. マス目の状態診断(_マス目の値,_マス目の周囲,'ON') :- 'OFFのマス目の周囲に3つのONのマス目があれば次のステップではONになる'(_マス目の値,_マス目の周囲,OFF). マス目の状態診断(_マス目の値,_マス目の周囲,'ON') :- 'ONのマス目の周囲に2つか3つのONのマス目があれば次のステップでもONが維持される'(_マス目の値,_マス目の周囲,'ON'),!. マス目の状態診断(_,_マス目の周囲,'OFF') :- 上以外の場合には次のステップではOFFになる. 上以外の場合には次のステップではOFFになる. 'OFFのマス目の周囲に3つのONのマス目があれば次のステップではONになる'('OFF',_マス目の周囲,'ON') :- count((append(_,['ON'|_],_マス目の周囲),2),!. 'ONのマス目の周囲に2つか3つのONのマス目があれば次のステップでもONが維持される'('ON',_マス目の周囲) :- count((append(_,['ON'|_],_マス目の周囲),Count), Count >= 2, Count =< 3,!. 'この変化を100回繰り替えした時の各マスの状態を求めよ'(LL1,LL2) :- length(Ln,100), 'この変化を100回繰り替えした時の各マスの状態を求めよ'(Ln,LL1,LL2). 'この変化を100回繰り替えした時の各マスの状態を求めよ'([],LL,LL) :- !. 'この変化を100回繰り替えした時の各マスの状態を求めよ'([_|Ln],LL1,LL2) :- 'パズルの問題として30x30(すなわち900個)のマス目のON,OFFの状態が与えられる. この初期状態から以下のルールを用いて各マス目のON,OFFの状態を変化させる.'(LL1,LL3), 'この変化を100回繰り替えした時の各マスの状態を求めよ'(Ln,LL3,LL2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/193 # # <TD width="52" height="25" bordercolor="#CCCCCC" valign="middle"> # <div align="center">F8FA</div> # </TD> # # これの # # 「F8FA」の部分をpreg_match_all取得したいのですが、 # '/<TD .*><div .*>(.*)</div><\/TD>/Ums' # # としたのですが、何も取得されません。 # どのように表記すれば良いのでしょうか? # 'TDタグの中のdivタグの値'(_文字列,_前文字列,_タグの値,_後文字列) :- sPLIT(_文字列,['','','',''|R2],L), append(L02,[''|R22],R2), append(L03,[''|R3],R22), append(L04,[''|R4],R3). concat_atom(L03,_タグの値), append(L01,[''|L02],L3), append(L3,[''],L4), concat_atom(L4,_前文字列), concat_atom([''|R3],_後文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/678 # # ●正規表現の使用環境 # Devas(ディレクトリ内の再帰検索及び置換ソフトでGrep互換) # # ●検索か置換か? # 検索と置換 # # ●説明 # HTMLのaタグにonclick属性を追加,または追記したい # # ●対象データ # 数百のSmartyテンプレート # (HTMLやフレームワークのコードを含む文字列) # 単純に<a hrefで始まるものばかりではなく,<a class等で始まるものもある # # ●希望する結果 # htmlのaタグから # href="xxxxx-regist"を含んでおり, # かつonclick="xxx"含んでいる または 含んでいないものを検索,置換し # onclickにアクションを追加または追記 # # <a href="xxx-regist" onclick="追加または追記したい"> # # # # 対象ページが数百もあり,とても手作業で修正できないため正規表現の力を借りたいです # aタグはすぐにhrefで始まるものばかりではないため,以下のような正規表現を考えたのですが, # なぜか複数行に渡ってしまう結果が抽出されたりとうまくいきません # # href=".+\-regist".+?(onclick="(.+)")?.+?\n # # # ご教授いただけないでしょうか・・ # # 数百のSmartyテンプレートのonclickタグを追加または変更する(_ファイル名ならび) :- append(_,[_ファイル|R],_ファイル名ならび), 'htmlのaタグからhref="xxxxx-regist"を含んでおり,かつonclick="xxx"含んでいる。または含んでいないものを検索,置換しonclickにアクションを追加または追記'(_ファイル), R = [],!. 'htmlのaタグからhref="xxxxx-regist"を含んでおり,かつonclick="xxx"含んでいる。または含んでいないものを検索,置換しonclickにアクションを追加または追記'(_ファイル) :- get_chars(_ファイル,Chars), 'onclickにアクションを追加または追記'(Chars),!. 'onclickにアクションを追加または追記'(Chars) :- 'aタグを選別'(Chars,L0,R1,R2,_Atag), 'onclick要素候補'(_Atag,_onclick要素候補), 'onclick句の生成'(_onclick要素候補,_onclick句), put_chars(L0), '現在のonclick句の削除'(R1,R11), append(R11,_onclick句,R12), put_chars(['<',a,' '|R12]), put_chars(['<','/',a,'>']), 'onclickにアクションを追加または追記'(R2). 'aタグを選別'(Chars,L0,R1,R2,_Atag) :- append(L0,['<',a,' '|R1],['<','/',a,'>'|R2],Chars), \+(append(_,['<','a',' '|_],R1)), \+(append(_,['<','/',a,'>'|_],R1)), _Atag = ['<',a',' '|R1]. 'onclick要素候補'(_Atag,_onclick要素候補) :- append(L0,[h,r,e,f,'=','"'|_onclick要素候補],['-',r,e,g,i,s,t,'"'|R2],_Atag),!. 'onclick句の生成'(_onclick要素候補,_onclick句) :- append([' ',o,n,c,l,i,c,k,'=','"'|_onclick要素候補],['"',' '],_onclick句). '現在のonclick句の削除'([],[]) :- !. '現在のonclick句の削除'([' ',o,n,c,l,i,c,k,'=','"'|R1],[' '|R2]) :- append(_,['"',' '|R2],R1),!. '現在のonclick句の削除'([A|R1],[A|R2]) :- '現在のonclick句の削除'(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/151 # # 次のような宿題が出たのですが、まったく分かりません。 # ぜひ教えてください。お願いします。 # # • void concat(struct node *p, struct node *q) # ノード*p以降のリストの後に,ノード*q以降のリストを連結 # する関数 # # • int length(struct node *p) # ノード*p以降のリストの長さを返す関数 # # 'ノード*p以降のリストの後に,ノード*q以降のリストを連結'(L1,_ノードp以降のならび,L2,_ノードq以降のならび,L) :- append(_,_ノードp以降のならび,L1), append(_,_ノードq以降のならび,L2), append(_ノードp以降のならび,_ノードq以降のならび,L). 'ノード*p以降のリストの長さを返す関数'(L,_ノードp以降のならび,Length) :- append(_,_ノードp以降のならび,L), \+(var(_ノードp以降のならび)), length(_ノードp以降のならび,Length). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/22 # # 口頭で説明されたものを書くので分かりづらかったらごめんなさい # 【質問テンプレ】 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 5種類の通貨(a,b,c,d,e)が存在する # 最初に幾らかのお金を渡されるそのお金はa,b,c,d,e以外にも # aとしてもbとしても使えるものbとしてもdとしても使えるものなどがある # そのお金を持って商品を買うが商品には特定の通貨しか使えない # ただし、a,bどちらでも払える商品やb,dどちらでも払える商品もある # それらの商品の合計が渡されるのでソレを手持ちのお金で変えるかどうかを答えよ # 合計は配列p[15]として辞書順で与えられる(例えばaで払えるものp[0]bとcで払えるものはp[7]) # ex)p={3,2,0,0,0,0,2,0,0,0,0,0,0,0,0} # だとa=3,ab=2,bc=2なので # 手持ちが{5,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0} # a=5,b=2ならはらえる # 商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか(_商品の合計のならび,_手持ちのお金ならび) :- 利用可能ならびの形式(_利用可能ならびの形式), 数値表現をならび表現に変換(_商品の合計ならび,LA), 数値表現をならび表現に変換(_手持ちのお金ならび,LB), 商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか(_利用可能ならびの形式,LA,LB). 商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか([],[],_). 商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか([_|R1],[[]|R2],K1) :- 商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか(R1,R2,K1). 商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか([[_第一候補,_第二候補]|R1],[_商品の合計|R2],_拠出前の手持ちのお金) :- ならび表現による要素位置指定による、ならびからの値の取得(_第一候補,_拠出前の手持ちのお金,_第一候補の手持ちのお金), ならび表現による要素位置指定による、ならびからの値の取得(_第二候補,_拠出前の手持ちのお金,_第二候補の手持ちのお金), append(_第一候補からの拠出金,_第二候補からの拠出金,_商品の合計), append(_第一候補からの拠出金,_第一候補の残りの手持ちのお金,_第一候補の手持ちのお金), append(_第二候補からの拠出金,_第二候補の残りの手持ちのお金,_第二候補の手持ちのお金), 手持ち金から利用分を差し引く([_],_第一候補,_第一候補の残りの手持ちのお金,_第二候補,_第二候補の残りの手持ちのお金,_拠出前の手持ちのお金,_拠出後の手持ちのお金), 商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか(R1,R2,_拠出後の手持ちのお金). 手持ち金から利用分を差し引く(_,_,_,_,_,[],[]). 手持ち金から利用分を差し引く(L,_,_,L,_第二候補の手持ちのお金,[_|R1],[_第二候補の手持ちのお金|R1]) :- !. 手持ち金から利用分を差し引く(L,L,_第一候補の手持ちのお金,_第二候補,_第二候補の手持ちのお金,[_|R1],[_第一候補の手持ちのお金|R2]) :- 手持ち金から利用分を差し引く([_|L],L,_第一候補の手持ちのお金,_第二候補,_第二候補の手持ちのお金,R1,R2). 手持ち金から利用分を差し引く(L,_第一候補,_第一候補の手持ちのお金,_第二候補,第二候補の手持ちのお金,[U|R1],[U|R2]) :- 手持ち金から利用分を差し引く([_|L],_第一候補,_第一候補の手持ちのお金,_第二候補,第二候補の手持ちのお金,R1,R2). 利用可能ならびの形式(_利用可能ならびの形式) :- findall(U,組み合わせ([1,2,3,4,5,0],2,U),L1), sort(L1,L2), 数値表現をならび表現に変換(L2,_利用可能ならびの形式). 数値表現をならび表現に変換([],[]) :- !. 数値表現をならび表現に変換([L|R1],[L2|R2]) :- list(L), 数値表現をならび表現に変換(L,L2), 数値表現をならび表現に変換(R1,R2),!. 数値表現をならび表現に変換([N|R1],[L2|R2]) :- length(L2,N), 数値表現をならび表現に変換(R1,R2). ならび表現による要素位置指定による、ならびからの値の取得(_ならび表現による要素位置,_ならび,_値) :- append(L0,[_],_ならび表現による要素位置), append(L0,[_値|_],_ならび),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/135 # # 配列a[n],配列b[n] と配列の大きさn を渡すと配列の # 要素を入れ換えるプログラムをポインタを用いて作成せよ. # 例えば,a[3]={1,2,3},b[3]={101,102,103}とすると # き,結果として,a[3]={101,102,103},b[3]={1,2,3}と # なるようにせよ. # # よろしくお願いします! # # 二つのリストの最初のN要素だけ入れ替える(L1_1,L2_1,N,L1_2,L2_2) :- length(L1_0,N), length(L2_0,N), append(L1_0,R1,L1), append(L2_0,R2,L2), append(L2_0,R1,L3), append(L1_0,R2,L4),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 二つのリストの最初のN要素だけ入れ替える(L1_1,L2_1,N,L1_2,L2_2) :- integer(N), length(LN,N), 二つのリストの最初のN要素だけ入れ替える(L1_1,L2_1,LN,L1_2,L2_2). 二つのリストの最初のN要素だけ入れ替える(R1,R2,[],R1,R2). 二つのリストの最初のN要素だけ入れ替える([A|R1_1],[B|R2_1],[_|R],[B|R1_2],[A|R2_2]) :- 二つのリストの最初のN要素だけ入れ替える(R1_1,R2_1,R,R1_2,R2_2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 二つのリストの最初のN要素だけ入れ替える(R1,R2,0,R1,R2). 二つのリストの最初のN要素だけ入れ替える([A|R1_1],[B|R2_1],N,[B|R1_2],[A|R2_2]) :- N1 is N - 1, 二つのリストの最初のN要素だけ入れ替える(R1_1,R2_1,N1,R1_2,R2_2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255277760/128 # # 【問題1:時計】 # 現在時刻をアスキーアートで表示せよ # # 【表示例】 # ●●○○○●○○○○○○●○●○○●● # ○○●○●○●○○●○○●○●○●○○ # ○●●○●○●○○○○○●●●○●●● # ●○○○●○●○○●○○○○●○●○● # ●●●○○●○○○○○○○○●○●●● # # 【難易度】 # 40分で初級 # # # 現在時刻をアスキーアートで表示(_時:_分) :-    _時_1 is _時 // 10,    _時_2 is _時 mod 10,    _分_1 is _分 // 10,    _分_2 is _分 mod 10,    現在時刻をアスキーアートで表示(_時_1,_時_2,_分_1,_分2). 現在時刻をアスキーアートで表示(_時_1,_時_2,_分_1,_分2) :-    数字のアスキーアート(_時_1,L1),    数字のアスキーアート(_時_2,L2),    数字のアスキーアート(_分_1,L3),    数字のアスキーアート(_分_2,L4),    英記号のアスキーアート(';',L5),    L0 = [[○],[○],[○],[○],[○]],    同一行数の行列のappend(L1,L0,L2,LA),    同一行数の行列のappend(LA,L0,L5,LB),    同一行数の行列のappend(LB,L0,L3,LC),    同一行数の行列のappend(LC,L0,L4,LX),    アスキーアートで表示(LX). アスキーアートで表示([]). アスキーアートで表示([L|R]) :- concat_atom(L,S),write_formatted('%t\n',[S]),アスキーアートで表示(R). '同一行数の行列のappend'([],[],[],[]). '同一行数の行列のappend'([L1|R1],[L2|R2],[L3|R3],[L4|R4]) :-   append(L1,L2,L3,L4),   '同一行数の行列のappend'(R1,R2,R3,R4) . 数字のアスキーアート(0,[[○,●,○],[●,○,●],[●,○,●],[●,○,●],[○,●,○]]). 数字のアスキーアート(1,[[●,●,○],[○,●,○],[○,●,○],[○,●,○],[○,●,○]]). 数字のアスキーアート(2,[[●,●,●],[○,○,●],[●,●,●],[●,○,○],[●,●,●]]). 数字のアスキーアート(3,[[●,●,●],[○,○,●],[●,●,●],[○,○,●],[●,●,●]]). 数字のアスキーアート(4,[[○,○,●],[●,○,●],[●,●,●],[○,○,●],[○,○,●]]). 数字のアスキーアート(5,[[●,●,●],[●,○,○],[●,●,●],[○,○,●],[●,●,●]]). 数字のアスキーアート(6,[[○,●,●],[●,○,○],[●,●,●],[●,○,●],[●,●,●]]). 数字のアスキーアート(7,[[●,●,●],[●,○,●],[○,○,●],[○,●,○],[○,●,○]]). 数字のアスキーアート(8,[[○,●,○],[●,○,●],[○,●,○],[●,○,●],[○,●,○]]). 数記号のアスキーアート(':',[[○,○,○],[○,●,○],[○,○,○],[○,●,○],[○,○,○]]). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/321 # # # スコアランキングで、自分の上下4人を含めた9人分の情報を取ってきたいのですが、どのようにすればよいでしょうか? # (自分が1位などの場合は自分と下位8人分を取得します) # スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_自分,L) :-   findall([_スコア,_氏名],スコア(_氏名,_スコア),L1),   sort(L1,L2),   reverse(L2,L3),   append(L11,[[_スコア,_氏名]|L12],L3),   自分の最良の席を取る(L11,[_スコア,_自分],L12,L). 自分の最良の席を取る(L11,[_スコア,_自分],L12,L) :-   length(L12,Len2),Len2 =< 4,   Len1 is 9 - Len2 - 1,length(L1,Len1),   append(_,L1,L11),   append(L1,[[_スコア,自分]|,L12],L),!. 自分の最良の席を取る(L11,[_スコア,_自分],L12,L) :-   length(L11,Len1),Len1 =< 4,   Len2 is 9 - Len1 - 1,length(L2,Len2),   append(Len2,_,L12),   append(L11,[[_スコア,_自分]|L2],L),!. 自分の最良の席を取る(L11,[_スコア,_自分],L12,L) :-   length(L1,4),length(L2,4),   append(_,L1,L11),   append(L2,_,L12),   append(L1,[[_スコア,_自分]|L2],L),!. 自分の最良の席を取る(L11,[_スコア,_自分],L12,L) :- append(L11,[[_スコア,_自分]|L12],L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/725 # # [1] 授業単元: アルゴリズム[I] # [2] 問題文(含コード&リンク):a,b,c,d,eの5文字をアルファベットとして #  重複なく4文字をで構成される全てのwordのなかで部分文字列として、 #  ad,bd,deを含まないものを表示せよ 'a,b,c,d,eの5文字をアルファベットとして重複なく4文字で構成される全てのwordのなかで部分文字列として、ad,bd,deを含まないものを表示' :- 順列([a,b,c,d,e],4,L), \+(append(_,[a,d|_],L)), \+(append(_,[b,d|_],L)), \+(append(_,[d,e|_],L)), atom_chars(_語,L), write_formatted('%t\n',[_語]), fail. 'a,b,c,d,eの5文字をアルファベットとして重複なく4文字で構成される全てのwordのなかで部分文字列として、ad,bd,deを含まないものを表示'. % *** user: '順列' / 3 *** 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(A,Y,Z), M is N - 1, 順列(Z,M,X). % *** user: del / 3 *** del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1232627790/932 # # 【 課題 】ボウリングのスコアを付けるプログラムを作成せよ。 # 各投球ごとの倒れたピン数を入力し、スコア一覧を出力。 # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】4. 制限なし # 【 期限 】本日、7/10 15:00 # 【 Ver  】Eclipse Version: 3.4.2 # 【 補足 】1つのメソッド10行以内、引数・戻り値を持つ # メソッド最低3つ作成のこと。 ボーリングスコア(_ピンの倒れた数ならび,_得点表) :- 数値レングス変換(_ピンの倒れた数ならび,L1), ボーリングの得点(L1,[],L2), 数値レングス変換(_得点表,L2). ボーリングの得点([],_,[]). ボーリングの得点([[_,_,_,_,_,_,_,_,_,_],B,C],Y,[[[_,_,_,_,_,_,_,_,_,_]+B+C,Y2]]) :- append([_,_,_,_,_,_,_,_,_,_],B,C,Y1), append(Y,Y1,Y2). ボーリングの得点([[_,_,_,_,_,_,_,_,_,_],B,C|R],Y,[[[_,_,_,_,_,_,_,_,_,_],Y2]|R2]) :- append([_,_,_,_,_,_,_,_,_,_],B,C,Y1), append(Y,Y1,Y2), ボーリングの得点([B,C|R],Y2,R2). ボーリングの得点([A,B,C|R],Y,[[A+B,Y2]|R2]) :- append(A,B,[_,_,_,_,_,_,_,_,_,_]), append([_,_,_,_,_,_,_,_,_,_],C,Y1), append(Y,Y1,Y2), ボーリングの得点([C|R],Y2,R2). ボーリングの得点([A,B|R],Y,[[A+B,Y2]|R2]) :- append(A,B,Y1), append(Y,Y1,Y2), ボーリングの得点(R,Y2,R2). 数値レングス変換([],[]) :- !. 数値レングス変換([[M1+M2+M3,N]|R1],[[La+Lb+Lc,L2]|R2]) :- length(La,M1), length(Lb,M2), length(Lc,M3), length(L2,N), 数値レングス変換(R1,R2),!. 数値レングス変換([[M1+M2,N]|R1],[[La+Lb,L2]|R2]) :- length(La,M1), length(Lb,M2), length(L2,N), 数値レングス変換(R1,R2),!. 数値レングス変換([[M,N]|R1],[[La,L2]|R2]) :- length(La,M), length(L2,N), 数値レングス変換(R1,R2),!. 数値レングス変換([N|R1],[L|R2]) :- not(list(N)), length(L,N), 数値レングス変換(R1,R2),!. % 以下のサイトは 'URLのユーザー情報を取得する'(URL,_ユーザー情報) :- atom_chars(URL,Chars), append(L1,['://'|L2],Chars), append(L3,['/'|_],L2), append(L4,['@'|_],L3), concat_atom(L4,_ユーザー情報). % 以下のサイトは 'URLのポート番号を取得する'(URL,_ポート番号) :- atom_chars(URL,Chars), append(L1,['://'|L2],Chars), append(L3,['/'|_],L2), append(_,[':'|L4],L3), concat_atom(L4,_ポート番号). % 以下のサイトは base64g(Atom,X) :- replace_all(Atom,' ','',Atom2), base64(X,Atom2) . base64s(Atom,X) :- \+(var(Atom)), name2(Atom,L1), base64_2(L1,Y), concat_atom(Y,X) . base64(Atom,X) :- \+(var(Atom)), atom_codes(Atom,L1), kjtoeuc(CodeList,L1), base64_2(CodeList,Y), concat_atom(Y,X),!. base64(X,Atom) :- var(X), atom_chars(Atom,List), base64_1(Y,List), concat_atom(Y,Y2), atom_codes(Y2,Codes), kjtoeuc(Codes,Y3), atom_codes(X,Y3),!. base64_1([],[]) :- !. base64_1(X,[A,B,C,=]) :- base64_table(A1,A), base64_table(B1,B), base64_table(C1,C), append(A1,B1,L1), append(L1,C1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_1(X,[A,B,=,=]) :- base64_table(A1,A), base64_table(B1,B), append(A1,B1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_1(X,[A,B,C,D|R]) :- base64_table(A1,A), base64_table(B1,B), base64_table(C1,C), base64_table(D1,D), append(A1,B1,L1), append(L1,C1,L2), append(L2,D1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_table([0,0,0,0,0,0],'A'). base64_table([0,0,0,0,0,1],'B'). base64_table([0,0,0,0,1,0],'C'). base64_table([0,0,0,0,1,1],'D'). base64_table([0,0,0,1,0,0],'E'). base64_table([0,0,0,1,0,1],'F'). base64_table([0,0,0,1,1,0],'G'). base64_table([0,0,0,1,1,1],'H'). base64_table([0,0,1,0,0,0],'I'). base64_table([0,0,1,0,0,1],'J'). base64_table([0,0,1,0,1,0],'K'). base64_table([0,0,1,0,1,1],'L'). base64_table([0,0,1,1,0,0],'M'). base64_table([0,0,1,1,0,1],'N'). base64_table([0,0,1,1,1,0],'O'). base64_table([0,0,1,1,1,1],'P'). base64_table([0,1,0,0,0,0],'Q'). base64_table([0,1,0,0,0,1],'R'). base64_table([0,1,0,0,1,0],'S'). base64_table([0,1,0,0,1,1],'T'). base64_table([0,1,0,1,0,0],'U'). base64_table([0,1,0,1,0,1],'V'). base64_table([0,1,0,1,1,0],'W'). base64_table([0,1,0,1,1,1],'X'). base64_table([0,1,1,0,0,0],'Y'). base64_table([0,1,1,0,0,1],'Z'). base64_table([0,1,1,0,1,0],a). base64_table([0,1,1,0,1,1],b). base64_table([0,1,1,1,0,0],c). base64_table([0,1,1,1,0,1],d). base64_table([0,1,1,1,1,0],e). base64_table([0,1,1,1,1,1],f). base64_table([1,0,0,0,0,0],g). base64_table([1,0,0,0,0,1],h). base64_table([1,0,0,0,1,0],i). base64_table([1,0,0,0,1,1],j). base64_table([1,0,0,1,0,0],k). base64_table([1,0,0,1,0,1],l). base64_table([1,0,0,1,1,0],m). base64_table([1,0,0,1,1,1],n). base64_table([1,0,1,0,0,0],o). base64_table([1,0,1,0,0,1],p). base64_table([1,0,1,0,1,0],q). base64_table([1,0,1,0,1,1],r). base64_table([1,0,1,1,0,0],s). base64_table([1,0,1,1,0,1],t). base64_table([1,0,1,1,1,0],u). base64_table([1,0,1,1,1,1],v). base64_table([1,1,0,0,0,0],w). base64_table([1,1,0,0,0,1],x). base64_table([1,1,0,0,1,0],y). base64_table([1,1,0,0,1,1],z). base64_table([1,1,0,1,0,0],'0'). base64_table([1,1,0,1,0,1],'1'). base64_table([1,1,0,1,1,0],'2'). base64_table([1,1,0,1,1,1],'3'). base64_table([1,1,1,0,0,0],'4'). base64_table([1,1,1,0,0,1],'5'). base64_table([1,1,1,0,1,0],'6'). base64_table([1,1,1,0,1,1],'7'). base64_table([1,1,1,1,0,0],'8'). base64_table([1,1,1,1,0,1],'9'). base64_table([1,1,1,1,1,0],+). base64_table([1,1,1,1,1,1],/). base64_table([A,B,C,D],X) :- base64_table([A,B,C,D,0,0],X). base64_table([A,B],X) :- base64_table([A,B,0,0,0,0],X). base64_a2b([],[]). base64_a2b([Atom|R],[A,B,C,D,E,F,G,H|R2]) :- atob(Atom,[A,B,C,D,E,F,G,H]), base64_a2b(R,R2). base64_2([],[]) :- !. base64_2([A,B,C|R],X) :- base64_i2b([A,B,C],L), base64_3(L,Z), base64_2(R,R2), append(Z,R2,X),!. base64_2([A,B],X) :- base64_i2b([A,B],L), base64_3(L,Z), append(Z,[=],X),!. base64_2([Y],X) :- base64_i2b([Y],L), base64_3(L,Z), append(Z,[=,=],X),!. base64_3([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X],[Z1,Z2,Z3,Z4]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H,I,J,K,L],Z2), base64_table([M,N,O,P,Q,R],Z3), base64_table([S,T,U,V,W,X],Z4),!. base64_3([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P],[Z1,Z2,Z3]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H,I,J,K,L],Z2), base64_table([M,N,O,P],Z3),!. base64_3([A,B,C,D,E,F,G,H],[Z1,Z2]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H],Z2). base64_i2b([],[]) :- !. base64_i2b([X|R],[1,B,C,D,E,F,G,H|R2]) :- var(X), itob(X,[1,B,C,D,E,F,G,H]), base64_i2b(R,R2),!. base64_i2b([X|R],[0,B,C,D,E,F,G,H|R2]) :- var(X), itob(U,[0,B,C,D,E,F,G,H]), X is U - 128, base64_i2b(R,R2),!. base64_i2b([Code|R],[A,B,C,D,E,F,G,H|R2]) :- itob(Code,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,A,B,C,D,E,F,G,H]), base64_i2b(R,R2) . name2(X,Y) :- atom(X), strlen(X,Len), findall(N,(for(1,M,Len) , char_code1(X,M,N1) , (N1 < 0 , N is N1 + 256 ; N1 >= 0 , N = N1)),Y),!. name2(A,[N]) :- atomic(A), name(A,[N]),!. name2(A,L) :- var(A), name21(L,L2), atom_codes(A,L2),!. name21([],[]) :- !. name21([N1,N2|R],[N|R2]) :- N1 > 127, N2 > 127, N is N1 * 256 + N2, name21(R,R2),!. name21([N1,N2|R],[N|R2]) :- N1 > 127, N2 < 128, N is N1 * 256 + N2, name21(R,R2),!. name21([N1|R],[N1|R2]) :- name21(R,R2). itob(N,L) :- itob(N,[],L1), length(L1,Len), Len2 is 8 - Len, length(L2,Len2), all(L2,0), append(L2,L1,L). itob(0,X,X) :- !. itob(N,Y,X) :- M is N mod 2, N2 is N // 2, itob(N2,[M|Y],X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/851 # # あいうえお # /*かきくけこ*/ # さしす/*せそ # なにぬ*/ねの # # というファイル(test.txt)から文字数、改行数、コメント文字数をカウントし、出力するプログラムです。 # お願いいたします。 t274(_文字数,_改行数,_コメント文字数) :- get_chars('test.txt',Chars), length(Chars,_文字数), 改行数を数える(Chars,_改行数), コメント文字数を数える(Chars,_コメント文字数). 改行数を数える(Chars,_改行数) :- findall(_,append(_,['\n'|_],Chars),L), length(L,_改行数). コメント文字数を数える(Chars,_コメント文字数) :- append(_,['/','*'|L2],Chars), append(_コメント文字候補,['*','/'|_],L2), not(append(_,['/','*'|_],_コメント文字候補)), 改行を取り除く(_コメント文字候補,_改行を取り除いたコメント文字候補), length(_改行を取り除いたコメント文字候補,_コメント文字数). 改行を取り除く([],[]). 改行を取り除く(['\n'|R1],R2) :- 改行を取り除く(R1,R2),!. 改行を取り除く([A|R1],[A|R2]) :- not(A='\n'), 改行を取り除く(R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/482 # #[1] 授業単元:プログラミング基礎 #[2] 問題文 # # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9473.txt 193 :-   t193_1([' ',' ',' ',' ',★],[★,' ',' ',' ',' ']). t193_1(L1,L2) :-   L1=[★|_],   ★を表示(L1,L2),!. t193_1(L1,L2) :-   ★を表示(L1,L2),   append([A],R1,L1),   append(R1,[A],L3),   append(L4,[B],L2),   t_193_1(L3,[B|L4]). ★を表示([],[]) :- nl. ★を表示([' '|R1],[' '|R2]) :-   !,   write(' '),   ★を表示(R1,R2). ★を表示([_|R1],[_|R2]) :-   write(★),   ★を表示(R1,R2). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 127代目 #482 # [1] 授業単元:プログラミング基礎 # [2] 問題文 # # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9473.txt t183 :- t183_1([0,0,0,0,1],[1,0,0,0,0]). t183_1(L1,L2) :- L1=[1|_], '★を表示'(L1,L2),!. t183_1(L1,L2) :- '★を表示'(L1,L2), append([A],R1,L1), append(R1,[A],L3), append(L4,[B],L2), t183_1(L3,[B|L4]). '★を表示'([],[]) :- nl. '★を表示'([A|R1],[B|R2]) :- 1 is A \/ B, write('★'), '★を表示'(R1,R2). '★を表示'([A|R1],[B|R2]) :- 0 is A \/ B, write(' '), '★を表示'(R1,R2). % 以下のサイトは fizzbuzz(N) :- between(1,N,M), fizzbuzz_2(M,S), writef('%t ',[S]), N = N. fizzbuzz_2(N,'FizzBuzz') :- 0 is N mod 3, 0 is N mod 5,!. fizzbuzz_2(N,'Fizz') :- 0 is N mod 3,!. fizzbuzz_2(N,N,'Buzz') :- 0 is N mod 5,!. fizzbuzz_2(N,N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,N,M), fizzbuzz(M,X), writef('%t ',[X]), M = N. fizzbuzz(N,'Fizz') :- 0 is N mod 3,\+(0 is N mod 3). fizzbuzz(N,'Buzz') :- 0 is N mod 5,\+(0 is N mod 5). fizzbuzz(N,'FizzBuzz') :- 0 is N mod 3,0 is N mod 5. fizzbuzz(N,N) :- \+(0 is N mod 3),\+(0 is N mod 5). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(0) :- !. fizzbuzz(N) :- fizzbuzz(N,X), N_1 is N - 1, fizzbuzz(N_1), writef('%t ',[X]). fizzbuzz(M,'FizzBuzz') :- 0 is M mod 15,!. fizzbuzz(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz(M,N,'Buzz') :- 0 is M mod 5,!. fizzbuzz(M,M). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,N). fizzbuzz(M,N) :- M > N,!. fizzbuzz(M,N) :- fizzbuzz_2(M,X), writef('%t ',[X]). M_2 is M + 1, fizzbuzz(M_2,N). fizzbuzz_2(M,'FizzBuzz') :- 0 is M mod 15,!. fizzbuzz_2(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz_2(M,N,'Buzz') :- 0 is M mod 5,!. fizzbuzz_2(M,M). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- forall(( between(1,N,M), fizzbuzz_2(M,S), writef('%t ',[S])), true). fizzbuzz_2(M,'FizzBuzz') :- 0 is M mod 15,!. fizzbuzz_2(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz_2(M,N,'Buzz') :- 0 is M mod 5,!. fizzbuzz_2(M,M). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,M,N), fizzbuzz(N,[[1,N],[3,'Fizz'],[5,'Buzz']],L2), fizzbuzz_2(L2,S), writef('%t ',[S]), N = M. fizzbuzz(N,L1,L2) :- findall(S,( member([U,S],L1), 0 is N mod U), L2). fizzbuzz_2([N],N). fizzbuzz_2([_,A|L],S) :- atomic_list_concat([A|L],S). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,N,_n), findall(A,( member([_m,A],[[1,_n],[3,'Fizz'],[5,'Buzz']]), 0 is _n mod _m), L), fizzbuzz_2(L,S), writef('%t ',S), N = _n. fizzbuzz_2([N],N). fizzbuzz_2([_,A|L],S) :- atomic_list_concat([A|L],S). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,N). fizzbuzz(M,N) :- M > N,!. fizzbuzz(M,N) :- fizzbuzz表示(M), M_2 is M + 1, fizzbuzz(M_2,N). fizzbuzz表示(M) :- fizzbuzz表示(M,_表示), writef('%t ',[_表示]). fizzbuzz表示(M,'FizzBuzz') :- 0 is M mod 3, 0 is M mod 5,!. fizzbuzz表示(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz表示(M,'Buzz') :- 0 is M mod 5,!. fizzbuzz表示(M,M). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,N). fizzbuzz(N,Max) :- N > Max. fizzbuzz(N,Max) :- fizzbuzz_2(N,C), nth0(C,[N,'Fizz','Buzz','FizzBuzz'],X), writef('%t ',[X]), N_2 is N + 1, fizzbuzz(N_2,Max). fizzbuzz_2(N,C) :- 0 is N mod 3 -> A=1;A=0. 0 is N mod 5 -> B=1;B=0, C is A + 2 * B. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzに置換する(L,L1), buzzに置換する(L1,L2), 表示する(L2),!. fizzに置換する([_1,_2,_3|R1],[_1,_2,fizz|R2]) :- fizzに置換する(R1,R2). fizzに置換する(L,L). buzzに置換する([_1,_2,_3,_4,fizz|R1],[_1,_2,_3,_4,fizzbuzz|R2]) :- buzzに置換する(R1,R2). buzzに置換する([_1,_2,_3,_4,_5|R1],[_1,_2,_3,_4,buzz|R2]) :- buzzに置換する(R1,R2). buzzに置換する(L,L). 表示する(L) :- atomic_list_concat(L,' ',_表示文字列), writef('%t\n',[_表示文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(N,_fizzbuzzならび), fizzbuzzならびを表示する(_fizzbuzzならび),!. fizzbuzz(N,L2) :- 最初に自然数ならびを作り(N,_自然数ならび), fizzに置換する(_自然数ならび,L1), buzzに置換する(L1,L2). 最初に自然数ならびを作り(N,_自然数ならび) :- findall(M,between(1,N,M),_自然数ならび). fizzに置換する([_1,_2,_3|R1],[_1,_2,fizz|R2]) :- fizzに置換する(R1,R2). fizzに置換する(L,L). buzzに置換する(L1,L2) :- fizzbuzzも考慮しつつbuzzに置換する(L1,L2). buzzに置換する(L,L). fizzbuzzも考慮しつつbuzzに置換する([_1,_2,_3,_4,fizz|R1],[_1,_2,_3,_4,fizzbuzz|R2]) :- buzzに置換する(R1,R2). fizzbuzzも考慮しつつbuzzに置換する([_1,_2,_3,_4,_5|R1],[_1,_2,_3,_4,buzz|R2]) :- buzzに置換する(R1,R2). fizzbuzzならびを表示する(_fizzbuzzならび) :- atomic_list_concat(_fizzbuzzならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- length(L0,N), fizzbuzz([_],[_|L0],[_,_,_],[_,_,_,_,_]). fizzbuzz(Lm,Lm,_,_). fizzbuzz(L0,Lm,L1,L2) :- fizzbuzz(L0,L1,L2,L3,L4,_正解), writef('%t ',[_正解]), fizzbuzz([_|L0],Lm,L3,L4). fizzbuzz(_,[_],[_],[_,_,_],[_,_,_,_,_],'FizzBuzz'). fizzbuzz(_,[_],[_|L2],[_,_,_],L2,'Fizz'). fizzbuzz(_,[_|L1],[_],L1,[_,_,_,_,_],'Buzz'). fizzbuzz(L,[_|L1],[_|L2],L1,L2,N) :- length(L,N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz([_],[_],L). fizzbuzz(_,_,[]) :- !. 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('%t ',[A]), fizzbuzz([_|L1],[_|L2],R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz([_,_,_],[_,_,_,_,_],L). fizzbuzz(_,_,[]) :- !. 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('%t ',[A]), fizzbuzz(L1,L2,R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[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,_,C) :- atom_concat(A,B,C). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz(['','','Fizz'],['','','','','Buzz'],L). fizzbuzz(_,_,[]). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%t ',[C]), append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,C) :- atom_concat(A,B,C). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t%t%t',[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,_,' '). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t%t%t ',[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,_,''). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([],N,['','','Fizz'],['','','','','Buzz']),!. fizzbuzz(Ln,N,_,_) :- length(Ln,N). fizzbuzz(Ln,N,L1,L2) :- fizzbuzz_1([_|Ln],L1,L2,S), writef('%t ',[S]), fizzbuzz_2(L1,L2,L1_2,L2_2), fizzbuzz([_|Ln],N,L1_2,L2_2). fizzbuzz_1([_|Ln],[''|_],[''|_],N) :- length([_|Ln],N). fizzbuzz_1(_,[A|_],[B|_],S) :- atomic_list_concat([A,B],S). fizzbuzz_2([A|R1],[B|R2],L1_2,L2_2) :- append(R1,[A],L1_2), append(R2,[B],L2_2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([_],['','','',fizz],['','','','',buzz],Lnx), length(Lnx,N). fizzbuzz(Ln,[A|R1],[B|R2],Ln) :- 表示(Ln,A,B). fizzbuzz(Ln,[A|R1],[B|R2],Lnx) :- 回転([A|R1],[B|R2],L1,L2), fizzbuzz([_|Ln],L1_2,L2_2,Lnx). 回転([A|R1],[B|R2],L1,L2) :- append(R1,[A],L1), append(R2,[B],L2). 表示(Ln,A,B) :- 表示項(Ln,A,B,X), writef('%t '[X]). 表示項(Ln,'','',N) :- length(Ln,N),!. 表示項(_,A,B,C) :- atom_concat([A,B],C). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([],N,['','','Fizz'],['','','','','Buzz']). fizzbuzz(L,N,_,_) :- length(L,N),!. fizzbuzz(Ln,N,[_31,_32,_33],[_51,_52,_53,_54,_55]) :- fizzbuzz_1(_31,_51,Ln,A), writef('%t%t%t ',[_31,_51,A]), fizzbuzz([_|Ln],N,[_32,_33,_31],[_52,_53,_54,_55,_51]). fizzbuzz_1('','',Ln,M) :- length([_|Ln],M),!. fizzbuzz_1(_,_,_,''). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([_],[_,_],[_,_,_,_],Ln,X), writef('%t',[X]), length(Ln,N),!. fizzbuzz(L1,L2,L3,Ln,X) :- fizzbuzz_1(L1,L2,L3,L2_1,L3_1,Y), fizzbuzz_2(L1,L2_1,L3_1,Y,Ln,X). fizzbuzz_2(L1,L2,L3,X,L1,X). fizzbuzz_2(L1,L2,L3,_,Ln,X) :- fizzbuzz([_|L1],L2,L3,Ln,X). fizzbuzz_1(R1,[],[],[_,_],[_,_,_,_],'FizzBuzz '). fizzbuzz_1(R1,[],[_|R3],[_,_],R3,'Fizz '). fizzbuzz_1(R1,[_|R2],[],R2,[_,_,_,_],'Buzz '). fizzbuzz_1(R1,[_|R2],[_|R3],R2,R3,N) :- length(R1,N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(Nth,X) :- fizzbuzz([_],[_,_],[_,_,_,_],Nth,X). fizzbuzz(L1,L2,L3,Nth,X) :- length(L1,Nth_1), fizzbuzz_1(Nth_1,L2,L3,L2_1,L3_1,Y), fizzbuzz_2(L1,L2_1,L3_1,Nth_1,Nth,Y,X). fizzbuzz_2(L1,L2,L3,Nth,Nth,X,X). fizzbuzz_2(L1,L2,L3,_,Nth,_,X) :- fizzbuzz([_|L1],L2,L3,Nth,X). fizzbuzz_1(_,[],[],[_,_],[_,_,_,_],'FizzBuzz'). fizzbuzz_1(_,[],[_|R3],[_,_],R3,'Fizz'). fizzbuzz_1(_,[_|R2],[],R2,[_,_,_,_],'Buzz'). fizzbuzz_1(N,[_|R2],[_|R3],R2,R3,N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(M) :- fizzbuzz(M,[_],[_,_,_],[_,_,_,_,_]). fizzbuzz(M,[_|L],_,_) :- length(L,M),!. fizzbuzz(M,L,L1,L2) :- fizzbuzz(L,L1,L2,L_1,L1_1,L2_1,S), writef('%t ',[S]), fizzbuzz(M,L_1,L1_1,L2_1). fizzbuzz(L,L,L,[_|L],[_,_,_|L],[_,_,_,_,_|L],fizzbuzz) :- !. fizzbuzz(L,L,L2,[_|L],[_,_,_|L],L2,fizz) :- !. fizzbuzz(L,L1,L,[_|L],L1,[_,_,_,_,_|L],buzz). fizzbuzz(L,L1,L2,[_|L],L1,L2,N) :- length(L,N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(M) :- s(S,M), fizzbuzz(S,s(0),s(s(s(0))),s(s(s(s(s(0)))))). fizzbuzz(S,s(S),_,_) :- !. fizzbuzz(MS,S,S1,S2) :- fizzbuzz(S,S1,S2,S_1,S1_1,S2_1,A), writef('%t ',[A]), fizzbuzz(MS,S_1,S1_1,S2_1). fizzbuzz(S,S,S,s(S),s(s(s(S))),s(s(s(s(s(S))))),fizzbuzz) :- !. fizzbuzz(S,S,S2,s(S),s(s(s(S))),S2,fizz) :- !. fizzbuzz(S,S1,S,s(S),S1,s(s(s(s(s(S))))),buzz). fizzbuzz(S,S1,S2,s(S),S1,S2,N) :- s(S,N). s(0,0) :- !. s(s(S),N) :- var(N), s(S,N_1), succ(N_1,N). s(s(S),N) :- integer(N), succ(N_1,N), s(S,N_1). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% finzzbuzz(N) :- fizzbuzz([],N,['FizzBuzz',_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_],[]). fizzbuzz(Ln,N,_,_) :- length(Ln,N). fizzbuzz(Ln,N,Ln2,[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]) :- fizzbuzz(Ln,N,Ln2,[]). fizzbuzz(Ln,N,Ln2,L) :- append(_,[A|L],Ln2), fizzbuzz_2(Ln,A,B), writef('%t ',[B]), fizzbuzz([_|Ln],N,Ln2,[_|L]). fizzbuzz_2(Ln,A,A) :- atom(A). fizzbuzz_2(Ln,A,N) :- length([_|Ln],N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz(L,[_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz']). fizzbuzz([],_) :- !. fizzbuzz(L,[]) :- fizzbuzz(L,[_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz']). fizzbuzz([A|R1],[B|R2]) :- var(B), writef('%t ',[A]), fizzbuzz(R1,R2). fizzbuzz([A|R1],[B|R2]) :- atomi(B), writef('%t ',[B]), fizzbuzz(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'FizzBuzz'(N) :- findall(M,between(1,N,M),L1), 'FizzBuzz置換パターン'(L1,L2), atomic_list_concat(L2,' ',S), writef('%t\n',[S]). 'FizzBuzz置換パターン'([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15|R1],[_1,_2,'Fizz',_4,'Buzz','Fizz',_7,_8,'Fizz','Buzz',_11,'Fizz',_13,_14,'FizzBuzz'|R2]) :- 'FizzBuzz置換パターン'(R1,R2). 'FizzBuzz置換パターン'(L,R) :- length(L,Len), length(R,Len), append(L,_,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15]), append(R,_,[_1,_2,'Fizz',_4,'Buzz','Fizz',_7,_8,'Fizz','Buzz',_11,'Fizz',_13,_14,'FizzBuzz']). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 置換パターンならびを生成(_置換パターンならび), nth1(_nth1,_置換パターンならび,A), fizzbuzz_2(_nth1,A), _nth1 = N. 置換パターンならびを生成(_置換パターンならび) :- U is (N // 15) + 1, findall([_,_,'Fizz',_,'Buzz',_,_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,U,_),LL), flatten(LL,_置換パターンならび). fizzbuzz_2(_nth1,A) :- var(A), writef('%t ',[_nth1]). fizzbuzz_2(_,A) :- atom(A), writef('%t ',[A]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- M is N // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,M,_),LL), flatten(LL,L), forall(( append(L0,[A|R],L), length([_|L0],N_1), ( N_1 > Max,!,fail; fizzbuzz_2(A,N_1,B))), writef('%t ',[B])). fizzbuzz_2(A,N,N) :- var(A),!. fizzbuzz_2(A,N,A). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L), 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L,_順序数). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L,_順序数) :- nth1(_nth1,L,A), 表示項の選択(_nth1,A,_表示項), writef('%t ',[_表示項]), _nth1 = N,!. 表示項の選択(_nth1,_nth1,_nth1) :- !. 表示項の選択(_nth1,A,A). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L1), 変数だけ要素位置番号を埋める(N,L1,L2), forall(member(A,L2),writef('%t ')). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 変数だけ要素位置番号を埋める(N,L1,L2) :- findall(U,( nth1(_nth1,L1,U), _nth1 =< N, (U=_nth1;atom(U))), L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L1), 変数だけ要素位置番号を埋める(N,L1,L2), forall(member(A,L2),writef('%t ')). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 変数だけ要素位置番号を埋める(M,N,L) :- M > N,!. 変数だけ要素位置番号を埋める(M,N,[M|R]) :- M_2 is M + 1, 変数だけ要素位置番号を埋める(M_2,N,R). 変数だけ要素位置番号を埋める(M,N,[_|R]) :- M_2 is M + 1, 変数だけ要素位置番号を埋める(M_2,N,R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L1), 変数だけ要素位置番号を表示する(N,L1). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 変数だけ要素位置番号を表示する(N,L1) :- forall((nth1(_nth1,L1,U),_nth1 =< N,(U=_nth1;atom(U))),writef('%t ',[U])). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(0,N),!. fizzbuzz(N,M) :- append(L0,[A|R],[1,2,[3,fizz],4,[5,buzz],[6,fizz],7,8,[9,fizz],[10,buzz],11,[12,fizz],13,14,[15,fizzbuzz]]), 表示値(N,A,N3,_表示値), fizzbuzz_2(N,M,R,N3,_表示値). fizzbuzz_2(N,M,R,N3,_表示値) :- N3 > M. fizzbuzz_2(N,M,R,N3,_表示値) :- writef('%t ',[_表示値]), R = [], N4 is N + 15, fizzbuzz(N4,M). 表示値(N1,[N2,A],N3,A) :- N3 is N1 + N2,!. 表示値(N1,N2,N3,N3) :- N3 is N1 + N2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L1), forall((nth1(_nth1,L1,U),_nth1 =< N,(var(U),U=_nth1;atom(U))),writef('%t ',[U])). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L_f,L_b), 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L_f,L_b,_順序数). 'fizzbuzzパターンの形成'(N,L_f,L_b) :- N_f is (N - 1) // 3 + 1, findall(['','','Fizz'],between(1,N_f,_),LL_f), flatten(LL_f,L_f). N_b is (N - 1) // 5 + 1, findall(['','','','','Buzz'],between(1,N_b,_),LL_b), flatten(LL_b,L_b). 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L,_順序数) :- nth1(_nth1,L_f,F), nth1(_nth1,L_b,B), 表示項の選択(_nth1,F,B,_表示項), writef('%t ',[_表示項]), _nth1 = N,!. 表示項の選択(_nth1,'','',_nth1) :- !. 表示項の選択(_,A,B,_表示項) :- atomic_list_concat([A,B],_表示項). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # # FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 # 3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、 # 数値の代わりに出力することとする # 'FizzBuzzhoge' :- 'FizzBuzzhoge'([],['','','Fizz'],['','','','','','','Buzz'],['','','','','','','','','','','','','hoge']). 'FizzBuzzhoge'(Ln,_,_,_) :- length(Ln,100),!. 'FizzBuzzhoge'(Ln,L1,L2,L3) :- 'FizzBuzzhoge'([_|Ln],L1,L2,L3,_表示情報), writef('%t\n',[_表示情報]), 三つのリストの左シフト(L1,L2,L3,L1_2,L2_2,L3_2), 'FizzBuzzhoge'([_|Ln],L1_2,L2_2,L3_2). 'FizzBuzzhoge'(Ln,[''|_],[''|_],[''|_],_数値) :- length(Ln,_数値),!. 'FizzBuzzhoge'(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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(_まで) :- fizzbuzz([],_まで,あとふたつ,あとよっつ). fizzbuzz(L1,_まで,_,_) :- length(L1,_まで),!. fizzbuzz(L1,_まで,_Fizzまであといくつ_1,_Buzzまであといくつ_1) :- fizzbuzz_1([_|L1],_Fizzまであといくつ_1,_Buzzまであといくつ_1,_Fizzまであといくつ_2,_Buzzまであといくつ_2,Y), writef('%t ',[Y]), fizzbuzz([_|L1],_まで,_Fizzまであといくつ_2,_Buzzまであといくつ_2). fizzbuzz_1(_,ないよ,ないよ,あとふたつ,あとよっつ,'FizzBuzz'). fizzbuzz_1(_,ないよ,_Buzzまであといくつ_1,あとふたつ,_Buzzまであといくつ_2,'Fizz') :- ひとつ減らすよ(_Buzzまであといくつ_1,_Buzzまであといくつ_2). fizzbuzz_1(_,_Fizzまであといくつ_1,ないよ,_Fizzまであといくつ_2,あとよっつ,'Buzz') :- ひとつ減らすよ(_Fizzまであといくつ_1,_Fizzまであといくつ_2). fizzbuzz_1(L1,_Fizzまであといくつ_1,_Buzzまであといくつ_1,_Fizzまであといくつ_2,_Buzzまであといくつ_2,N) :- ひとつ減らすよ(_Fizzまであといくつ_1,_Fizzまであといくつ_2), ひとつ減らすよ(_Buzzまであといくつ_1,_Buzzまであといくつ_2), length(L1,N). ひとつ減らすよ(あとよっつ,あとみっつ). ひとつ減らすよ(あとみっつ,あとふたつ). ひとつ減らすよ(あとふたつ,あとひとつ). ひとつ減らすよ(あとひとつ,ないよ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 佑(_丈) :- 校([],_丈,碩,漁). 校(_里,_丈,_,_) :- length(_里,_丈),!. 校(_里,_丈,_部,_寓) :- 乾([_|_里],_部,_寓,_料,_勘,_公), writef('%t ',[_公]), 校([_|_里],_丈,_料,_勘). 乾(_,建,建,碩,漁,'FizzBuzz'). 乾(_,建,_寓,碩,_勘,'Fizz') :- 装(_寓,_勘). 乾(_,_発,建,_塔,漁,'Buzz') :- 装(_発,_塔). 乾(_里,_発,_寓,_塔,_勘,_論) :- 装(_発,_塔), 装(_寓,_勘), length(_里,_論). 装(漁,宜). 装(宜,碩). 装(碩,週). 装(週,建). % % 述語名、変数からシンボル性を除去した述語定義。 % 一つ上のFizzBuzz定義の述語名と変数名を無作為に全角漢字を % 引いてきて置き換えた。プログラミングにはこういう一面が常に % 多少はある。 % %%%%%%% デスマコロシアム(5) fizzbuzzをFIZZBUZZと表記する(1) %%%%%%%%%%% fizzbuzz(M) :- fizzbuzz(0,M,[_,_],[_,_,_,_],L), atomic_list_concat(L,A), write(A). fizzbuzz(M,M,_,_,[]). fizzbuzz(N,M,L1,L2,[A|R3]) :- succ(N,N_2), dt(N_2,L1,L2,R1,R2,A), fizzbuzz(N_2,M,R1,R2,R3). dt(_,[],[],[_,_],[_,_,_,_],'FIZZBUZZ') :- !. dt(_,[],[_|R],[_,_],R,fizz) :- !. dt(_,[_|R],[],R,[_,_,_,_],buzz) :- !. dt(N,[_|R1],[_|R2],R1,R2,N). %%%%%%% デスマコロシアム(5) fizzbuzzをFIZZBUZZと表記する(2) %%%%%%%%%%% fizzbuzz(N) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'fizz',_,'buzz','fizz',_,_,'fizz','buzz',_,'fizz',_,_,'FIZZBUZZ'],between(1,N_1,_),LL), flatten(LL,L1), forall((nth1(_nth1,L1,U),_nth1 =< N,(_nth1=U;atom(U))),writef('%t',[U])). %%%%%%% デスマコロシアム(5) fizzbuzzをFIZZBUZZと表記する(3) %%%%%%%%%%% fizzbuzz(N) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'fizz',_,'buzz','fizz',_,_,'fizz','buzz',_,'fizz',_,_,'FIZZBUZZ'],between(1,N_1,_),LL), flatten(LL,L), 表示(N,L). 表示(N,L) :- nth1(_nth1,L,U), 表示選択(_nth1,U), writef('%t',[U]), _nth1=N. 表示選択(_nth1,_nth1). 表示選択(_,U) :- atom(U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 最小文字数を競ってみよう(現在 147字) % fizzbuzz(N):-between(1,N,M),put(32),g(M,S),write(S),M=N. g(M,'Fizz'):-m(M,3). g(M,'Buzz'):-m(M,5). g(M,M):- \+m(M,3),\+m(M,5). m(M,N):-0=:=M mod N. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 述語名fizzbuzzをfにして良いなら 140字 (twitterの1twit限度文字数) % f(N):-between(1,N,M),put(32),g(M,S),write(S),M=N. g(M,'Fizz'):-m(M,3). g(M,'Buzz'):-m(M,5). g(M,M):- \+m(M,3),\+m(M,5). m(M,N):-0=:=M mod N. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % IF/Prolog (for/3,if/3 を使って) % % 述語名fizzbuzzをfにして良いなら 82字 % f(M):-for(1,N,M),nl,if((1>N mod 3,A=fizz;1>N mod 5,A=buzz),write(A),write(N)),MN mod 3,A=fizz;1>N mod 5,A=buzz),write(A))->write(N)),M