このディレクトリの索引

% 以下のサイトは # お題: # 例:数列[3,1,-7,1,5]について、 # ->[4,-3,-2,3] (累計) # ->12 (絶対値の合計) # のように計算する。 # 最初の数列の並び順を変えると、最後の合計計も変わる。 # 任意数列について、上記合計が最小になるように並び替える関数を作成 '例:数列[3,1,-7,1,5]について、 ->[4,-3,-2,3] (累計) ->12 (絶対値の合計) のように計算する。 任意数列について、上記合計が最小になるように並び替える'(_数列,_最小となる数列) :- 絶対値の合計が最小になるように並び替える(_数列,_,_最小となる数列). 絶対値の合計が最小になるように並び替える(_数列,_最小の絶対値,_絶対値の合計が最小となる数列):- length(_数列,_要素数), setof([_絶対値の合計,_順列], [_数列,_要素数,_順列,_絶対値の合計] ^ 並べ替える(_数列,_要素数,_順列,_絶対値の合計),_絶対値_数列ならび), 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_最小の絶対値,_絶対値の合計が最小となる数列). 並べ替える(_数列,_要素数,_順列,_絶対値の合計):- 順列(_数列,_要素数,_順列), 絶対値の合計(_順列,_絶対値の合計). 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_最小の絶対値,_絶対値の合計が最小となる数列) :- findmin(_絶対値,( member([_絶対値,_],_絶対値_数列ならび)),_最小の絶対値), member([_最小の絶対値,_絶対値の合計が最小となる数列],_絶対値_数列ならび). 絶対値の合計([_値],_絶対値の合計) :- _絶対値の合計 is abs(_値). 絶対値の合計(_値ならび,_絶対値の合計) :- 累計の途中経過得ながらそれを縮退して行って絶対値を得る(_値ならび,_絶対値の合計). 累計の途中経過得ながらそれを縮退して行って絶対値を得る(_値ならび,_絶対値の合計) :- 累計の途中経過を得る(_値ならび,_累計の途中経過ならび), 要素の絶対値の合計(_累計の途中経過ならび,_絶対値の合計). 累計の途中経過を得る([_],[]). 累計の途中経過を得る([_数_1,_数_2|R1],[_累計の途中経過|R2]) :- _累計の途中経過 is _数_1 + _数_2, 累計の途中経過を得る([_累計の途中経過|R1],R2). 要素の絶対値の合計(_累計の途中経過ならび,_絶対値の合計) :- findsum(_絶対値,( member(_値,_累計の途中経過ならび), _絶対値 is abs(_値)),_絶対値の合計). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 順列(_,0,[]). 順列(L1,N,[A|R]) :- select(A,L1,R1), N_1 is N - 1, 順列(R1,N_1,R). findmin(V,P,Min) :- findall(V,P,L), min_list(L,Min). findsum(V,P,Sum) :- findall(V,P,L), sum_list(L,Sum). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #674 # あなた(霧島京子) は20万人月の巨大なプロジェクトを一ヶ月で終わらせるために無数の下請け会社から人員をかき集める仕事をすることになりました。 # プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。 # # 各下請け会社の人員は、一部を使うなどは出来ず全員を使わなくてはいけません。 # プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、最も安くすむ合計金額(単位:万円)を出力してください。 # 各下請け会社の人員数の合計はプロジェクトの規模 m 人月以上になるものとします。 # ヒントを見る # ※ 実際のプロジェクトではこの様には行きませんので、人員を増やす場合は慎重に検討する事をお勧めいたします。 # ※この物語はフィクションであり、実在の人物・団体とは一切関係ありません # # # # 入力される値 # 入力は以下のフォーマットで与えられます。 # # m (プロジェクトに必要な人員数) # n (下請け会社の数) # q_1 r_1 (1番目の下請け会社の人員数 発注に必要な費用[単位:万円]) # q_2 r_2 (2番目の下請け会社の人員数 発注に必要な費用[単位:万円]) # ・・・ # q_i r_i (n 番目の下請け会社の人員数 発注に必要な費用[単位:万円]) # 条件 # 1 ≦ m ≦ 200000(プロジェクトに必要な人数:最大20万人) # 1 ≦ n ≦ 50(下請け会社数:最大50社) # 1 ≦ q_i ≦ 10000(各下請け会社の人員数:最大1万人) # 1 ≦ r_i ≦ 5000000(各下請け会社のへの発注費用[単位:万円]:1万円〜最大500億円) # m ≦ q_1 + q_2 + q_3 ... + q_i(各下請け会社の人員数の合計はプロジェクトに必要な人数 m 人以上になる) # 期待する出力 # 最もコストが安くなる組み合わせの総コストを出力して下さい。 # 最後は改行し、余計な文字、空行を含んではいけません。 # 入力例1 # 60 # 3 # 40 4300 # 30 2300 # 20 2400 # # # 出力例1 # 6600 # 入力例2 # 250 # 5 # 35 3640 # 33 2706 # 98 9810 # 57 5472 # 95 7790 # 出力例2 # 23072 'あなた(霧島京子) は20万人月の巨大なプロジェクトを一ヶ月で終わらせるために 無数の下請け会社から人員をかき集める仕事をすることになりました。 プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、 各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。 各下請け会社の人員は、一部を使うなどは出来ず全員を使わなくてはいけません。 プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を出力してください。 各下請け会社の人員数の合計はプロジェクトの規模 m 人月以上になるものとします。' :- 'プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、 各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。'(_m,_n,_下請け人数_費用ならび), findmin(_合計金額,( 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_下請け人数_費用ならび,0,0,_合計人数,_合計金額)),_最も安くすむ合計金額), '出力してください。'(_最も安くすむ合計金額). 'プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、 各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。'(_m,_n,_下請け人数_費用ならび) :- get_split_line([' ',','],[_m,_n]), findall([_下請け人数,_費用],( between(1,_n,_), get_split_line([' ',','],[_下請け人数,_費用])),_下請け人数_費用ならび). 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_下請け人数_費用ならび,_合計人数,_合計金額,_合計人数,_合計金額) :- _合計人数 >= _m,!. 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_下請け人数_費用ならび,_合計人数_1,_合計金額_1,_合計人数,_合計金額) :- ひとつ下請け人数と費用を取り出す(_下請け人数_費用ならび,_合計人数_1,_合計金額_1,_合計人数_2,_合計金額_2,_残りならび), 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_残りならび,_合計人数_2,_合計金額_2,_合計人数,_合計金額). ひとつ下請け人数と費用を取り出す(_下請け人数_費用ならび,_合計人数_1,_合計金額_1,_合計人数_2,_合計金額_2,_残りならび) :- select([_下請け人数_1,_費用_1],_下請け人数_費用ならび,_残りならび), _合計金額_2 is _合計金額_1 + _費用_1, _合計人数_2 is _合計人数_1 + _下請け人数_1. '出力してください。'(_最も安くすむ合計金額) :- writef('%t万円\n',[_最も安くすむ合計金額]). % 以下のサイトは # # 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]). % 以下のサイトは # # 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), findall([_t_1,_v_1],( member([_t_1,_v_1],_stack_1), \+((_t_1=_t,_v_1=_min))), _stack_2). 時刻tにおける最小値を出力する(_t,_stack_1,_stack_2) :- findmin(_v,member([_t,_v],_stack_1),_min), writef('%t',[_min]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/854 # 四つの塔がある。幽霊に任意の座標を与えたとき、そこから最も近くにある塔を出力しなさい。 # # 塔A、B、C、Dの座標: # A(2, 2) B(5, 2) C(2, 5) D(5, 5) # # 幽霊の座標: # 0≦y≦7, 0≦x≦7, # # 図1:塔の配置 # □□□□□□□□ # □□□□□□□□ # □□A □□B,□□ # □□□□□□□□ # □□□□□□□□ # □□C □□D,□□ # □□□□□□□□ # □□□□□□□□ # # 図2:幽霊の座標(3, 3) # □□□□□□□□ # □□□□□□□□ # □□A □□B,□□ # □□□幽□□□□ # □□□□□□□□ # □□C □□D,□□ # □□□□□□□□ # □□□□□□□□ # # 入力と出力例: # in  : (3, 3) # out : A # # 塔('A',2,2). 塔('B',5,2). 塔('C',2,5). 塔('D',5,5). '四つの塔がある。幽霊に任意の座標を与えたとき、そこから最も近くにある塔を出力しなさい。' :- '幽霊に任意の座標を与えたとき、'(X,Y), 'そこから最も近くにある塔を出力しなさい。'(X,Y). '幽霊に任意の座標を与えたとき、'(X,Y) :- 整数を得る('幽霊のX座標',(X >= 0,X =< 7),X), 整数を得る('幽霊のY座標',(Y >= 0,Y =< 7),Y). 'そこから最も近くにある塔を出力しなさい。'(X,Y) :- 幽霊と四つの塔との距離ならび(_距離と塔ならび), 最短距離は(_距離と塔ならび,_最短距離), '最も近くにある塔を出力しなさい。'(_距離と塔ならび,_最短距離). 幽霊と四つの塔との距離ならび(_距離と塔ならび) :- findall([_距離,_塔],(塔(_塔,_x,_y),_距離 is abs(X - _x) + abs(Y - _Y)),_距離と塔ならび). 最短距離は(_距離と塔ならび,_最短距離) :- findmin(_距離,member([_距離,_],_距離と塔ならび),_最短距離). '最も近くにある塔を出力しなさい。'(_距離と塔ならび,_最短距離) :- forall(member([_最短距離,_塔],_距離と塔ならび),writef('%t\n',[_塔])). % 以下のサイトは # お題: # 例:数列[3,1,-7,1,5]について、 # ->[4,-3,-2,3] (累計) # ->12 (絶対値の合計) # のように計算する。 # 最初の数列の並び順を変えると、最後の合計計も変わる。 # 任意数列について、上記合計が最小になるように並び替える関数を作成 '例:数列[3,1,-7,1,5]について、 ->[4,-3,-2,3] (累計) ->12 (絶対値の合計) のように計算する。 任意数列について、上記合計が最小になるように並び替える'(_数列,_最小となる数列) :- 絶対値の合計が最小になるように並び替える(_数列,_,_最小となる数列). 絶対値の合計が最小になるように並び替える(_数列,_最小の絶対値,_絶対値の合計が最小となる数列) :- length(_数列,_要素数), setof([_絶対値の合計,_順列], [_数列,_要素数,_順列,_絶対値の合計] ^ 並べ替える(_数列,_要素数,_順列,_絶対値の合計),_絶対値_数列ならび), 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_最小の絶対値,_絶対値の合計が最小となる数列). 並べ替える(_数列,_要素数,_順列,_絶対値の合計) :- 順列(_数列,_要素数,_順列), 絶対値の合計(_順列,_絶対値の合計). 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_最小の絶対値,_絶対値の合計が最小となる数列) :- findmin(_絶対値,( member([_絶対値,_],_絶対値_数列ならび)), _最小の絶対値), member([_最小の絶対値,_絶対値の合計が最小となる数列],_絶対値_数列ならび). 絶対値の合計([_値],_絶対値の合計) :- _絶対値の合計 is abs(_値),!. 絶対値の合計(_値ならび,_絶対値の合計) :- 累計の途中経過を得る(_値ならび,_累計の途中経過ならび), 要素の絶対値の合計(_累計の途中経過ならび,_絶対値の合計). 累計の途中経過を得る([_],[]). 累計の途中経過を得る([_数_1,_数_2|R1],[_累計の途中経過|R2]) :- _累計の途中経過 is _数_1 + _数_2, 累計の途中経過を得る([_累計の途中経過|R1],R2). 要素の絶対値の合計(_累計の途中経過ならび,_絶対値の合計) :- findsum(_絶対値,( member(_値,_累計の途中経過ならび), _絶対値 is abs(_値)), _絶対値の合計). 順列(_,0,[]). 順列(L1,N,[A|R]) :- select(A,L1,R1), N_1 is N - 1, 順列(R1,N_1,R). findmin(V,P,Min) :- findall(V,P,L), min_list(L,Min). findsum(V,P,Sum) :- findall(V,P,L), sum_list(L,Sum). % 以下のサイトは # お題: # 例:数列[3,1,-7,-1,5]について、 # ->[4,-3,-2,3] (累計) # ->12 (絶対値の合計) # のように計算する。 # 最初の数列の並び順を変えると、最後の合計計も変わる。 # 任意数列について、上記合計が最小になるように並び替える関数を作成 '例:数列[3,1,-7,-1,5]について、 ->[4,-3,-2,3] (累計) ->12 (絶対値の合計) のように計算する。 任意数列について、上記合計が最小になるように並び替える'(_数列,_最小となる数列) :- 絶対値の合計が最小になるように並び替える(_数列,_最小となる数列). 絶対値の合計が最小になるように並び替える(_数列,_絶対値が最小となる数列) :- length(_数列,_要素数), findall([_絶対値の合計,_順列],( 順列(_数列,_要素数,_順列), 絶対値の合計(_順列,_絶対値の合計)), _絶対値_数列ならび), 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_絶対値の合計が最小となる数列). 絶対値の合計(_数列,_絶対値の合計) :- 数列から累計を得る(_数列,_累計数列), 絶対値の合計を得る(_累計数列,_絶対値の合計). 数列から累計を得る([_数],_数) :- !. 数列から累計を得る([_数_1,_数_2|R1],[_数_3|R2]) :- _数_3 is _数_1 + _数_2, 数列から累計を得る([_数_3|R1],R2). 絶対値の合計を得る([],0). 絶対値の合計を得る([N|R1],_合計) :- 絶対値の合計を得る(R1,_合計_2), _合計 is abs(N) + _合計_2. 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_絶対値の合計が最小となる数列) :- findmin(_絶対値,( member([_絶対値,_],_絶対値_数列ならび)), _最小の絶対値), member([_最小の絶対値,_絶対値の合計が最小となる数列],_絶対値_数列ならび). 順列(_,0,[]). 順列(L1,N,[A|R]) :- select(A,L1,R1), N_1 is N - 1, 順列(R1,N_1,R). findmin(V,P,Min) :- findall(V,P,L), min(L,Min). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/879 # # # 問題 # 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 # 700 # 900 # 198 # 330 # # 1999 # 1999 # 100 # 189 # 100 # # 出力例 1 出力例 2 # 848 # # 150 # # 入出力例 1 では,2 つ目のパスタと 1 つ目のジュースを組み合わせた場合の 700 + 198 - 50 = 848 がその日のセットメニューの代金の最小値である. # # 入出力例 2 では,3 つ目のパスタと 2 つ目のジュースを組み合わせた場合の 100 + 100 - 50 = 150 がその日のセットメニューの代金の最小値である. # # ※各入出力例のデータは,右クリック等によりファイルに保存して利用可能です. 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる. ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求めるプログラムを作成せよ. 入力 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. 1 行目の整数は 1 つ目のパスタの値段である. 2 行目の整数は 2 つ目のパスタの値段である. 3 行目の整数は 3 つ目のパスタの値段である. 4 行目の整数は 1 つ目のジュースの値段である. 5 行目の整数は 2 つ目のジュースの値段である. ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている. 出力 その日のセットメニューの代金の最小値を 1 行で出力せよ.' :- '入力 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. 1 行目の整数は 1 つ目のパスタの値段である. 2 行目の整数は 2 つ目のパスタの値段である. 3 行目の整数は 3 つ目のパスタの値段である. 4 行目の整数は 1 つ目のジュースの値段である. 5 行目の整数は 2 つ目のジュースの値段である. ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている.'(_3種類のパスタの価格ならび,_2種類のジュースの価格ならび), 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる. ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める.'(_3種類のパスタの価格ならび,_2種類のジュースの価格ならび,_セットメニューの代金の最小値), 'その日のセットメニューの代金の最小値を 1 行で出力せよ.' (_セットメニューの代金の最小値). '入力 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. 1 行目の整数は 1 つ目のパスタの値段である. 2 行目の整数は 2 つ目のパスタの値段である. 3 行目の整数は 3 つ目のパスタの値段である. 4 行目の整数は 1 つ目のジュースの値段である. 5 行目の整数は 2 つ目のジュースの値段である. ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている.'([_1つ目のパスタの値段,_2つ目のパスタの値段,_3つ目のパスタの値段],[_1つ目のジュースの値段,_2つ目のジュースの値段]) :- '「ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている.」とあるから、整数範囲の検査は行わなくてよい。', '1 行目の整数は 1 つ目のパスタの値段である.'(_1つ目のパスタの値段), '2 行目の整数は 2 つ目のパスタの値段である.'(_2つ目のパスタの値段), '3 行目の整数は 3 つ目のパスタの値段である.'(_3つ目のパスタの値段), '4 行目の整数は 1 つ目のジュースの値段である.'(_1つ目のジュースの値段), '5 行目の整数は 2 つ目のジュースの値段である.'(_2つ目のジュースの値段). '1 行目の整数は 1 つ目のパスタの値段である.'(_1つ目のパスタの値段) :- 整数を得る(_1つ目のパスタの値段). '2 行目の整数は 2 つ目のパスタの値段である.'(_2つ目のパスタの値段) :- 整数を得る(_2つ目のパスタの値段). '3 行目の整数は 3 つ目のパスタの値段である.'(_3つ目のパスタの値段) :- 整数を得る(_2つ目のパスタの値段). '4 行目の整数は 1 つ目のジュースの値段である.'(_1つ目のジュースの値段) :- 整数を得る(_1つ目のジュースの値段). '5 行目の整数は 2 つ目のジュースの値段である.'(_2つ目のジュースの値段) :- 整数を得る(_2つ目のジュースの値段). 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる. ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める.'(_3種類のパスタの価格ならび,_2種類のジュースの価格ならび,_セットメニューの代金の最小値) :- findmin(_セットメニューの代金,( 'このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.'(_3種類のパスタの価格ならび,_2種類のジュースの価格ならび,_パスタの価格,_ジュースの価格), 'パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.'(_パスタの価格,_ジュースの価格,_セットメニューの代金)), _セットメニューの代金の最小値). 'このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.'(_3種類のパスタの価格ならび,_2種類のジュースの価格ならび,_パスタの価格,_ジュースの価格) :- member(_パスタの価格,_3種類のパスタの価格ならび), member(_ジュースの価格,_2種類のジュースの価格ならび). 'パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.'(_パスタの価格,_ジュースの価格,_セットメニューの合計) :- _セットメニーの合計 is _パスタの価格 + _ジュースの価格 - 50. 'その日のセットメニューの代金の最小値を 1 行で出力せよ.' (_セットメニューの代金の最小値) :- writef('その日のメニューの最小値は %t\n',[_セットメニューの代金の最小値]). '「ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている.」とあるから、整数範囲の検査は行わなくてよい。' :- true. findmin(A,P,_min) :- findall(A,P,L), min_list(L,_min). 整数を得る(_整数) :- read_line_to_codes(Codes), number_codes(_整数,Codes), integer(_整数),!. 整数を得る(_整数) :- 整数を得る(_整数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/959 # # MySQL 5.1です。 # # テーブル1 # 15:30:20 カツ丼 # 15:35:40 天丼 # 15:50:15 他人丼 # # テーブル2 # 15:30:30 400円 # 15:35:45 550円 # 15:51:00 480円 # # というテーブルがあって、テーブル1と2の時刻が近いものをマッチさせて # 15:30:20 カツ丼 400円 # 15:35:40 天丼 550円 # 15:50:15 他人丼 480円 # # のような結果を出したいのですが、どのようにすればいいでしょうか。 # # よろしくお願いします。 # # テーブル1と2の時刻が近いものをマッチさせる(_時刻,_商品名,_価格) :- テーブル1(_時刻,_商品名), テーブル1と2の時刻が近いもの(_時刻,_時刻以前,_時刻以後), 時刻が近いものをマッチさせる(_時刻,_時刻以前,_時刻以後,_価格). テーブル1と2の時刻が近いもの(_時刻,_時刻以前,_時刻以後) :- findmax(_時刻_2,( テーブル2(_時刻_2,_価格), _時刻 @>= _時刻_2), _時刻以前), findmin(_時刻_2,( テーブル2(_時刻_2,_価格), _時刻 @=< _時刻_2), _時刻以後). 時刻が近いものをマッチさせる(_,[],_時刻以後,_価格) :- テーブル2(_時刻以後,_価格),!. 時刻が近いものをマッチさせる(_,_時刻以前,[],_価格) :- テーブル2(_時刻以前,_価格),!. 時刻が近いものをマッチさせる(_時刻,_時刻以前,_時刻以後,_価格) :- '時刻を秒単位に変換してから、近い時刻を得る'(_時刻,_時刻以前,_時刻以後,_近い時刻), テーブル2(_近い時刻,_価格). '時刻を秒単位に変換してから、近い時刻を得る'(_時刻,_時刻以前,_時刻以後,_近い時刻) :- 時刻を秒単位に変換して(_時刻,_秒), 時刻を秒単位に変換して(_時刻以前,_秒_1), 時刻を秒単位に変換して(_時刻以後,_秒_2), 近い時刻を得る(_秒,_時刻以前,_秒_1,_時刻以後,_秒_2,_近い時刻). 時刻を秒単位に変換して(_時_1,_分_1,_秒_1,_秒) :- _秒 is 3600 * _時_1 + 60 * _分_1 + _秒_1. 近い時刻を得る(_秒,_時刻以前,_秒_1,_時刻以後,_秒_2,_時刻以前) :- abs(_秒_1 - _秒) =< abs(_秒_2 - _秒),!. 近い時刻を得る(_秒,_時刻以前,_秒_1,_時刻以後,_秒_2,_時刻以後). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/771 # # 【 課題 】迷路の最短経路を与えるプログラムを考えよ. # 壁は#, 通路は.で表されている. # また迷路の外側は全て壁(即ち#)となっている. # スタート地点はS, ゴール地点はGである. # スタートからゴールまでの道のりを表わせ. # 上へ移動する場合にはu, 同様に下はd, 右はr, 左はlとせよ. # 最短経路が複数ある場合は, それらのうちどれかひとつを出力せよ。 # # 例1) # ####### # #..S..# # #.....# # #..G..# # ####### # 答え) # dd # # 例2) # ####### # #.....# # #.G.#.# # #..#..# # #.#.S.# # #.....# # ####### # 答え) # ldlluuru # 最短経路(_迷路文字列ならび,_最短経路) :- 迷路の定義(_迷路文字列ならび), 出発点(Y0,X0), findmin([_距離,_経路],( 道に迷う([[Y0,X0]],Y0,X0,_方向ならび), length(_方向ならび,_距離), atom_chars(_経路,_方向ならび)), [_,_最短経路]). 道に迷う(_,Y,X,[]) :- 終着点(Y,X). 道に迷う(_既に通過した点ならび,Y_1,X_1,[_方向|R]) :- 隣接点を得る(_既に通過した点ならび,Y_1,X_1,Y_2,X_2,_方向), 道に迷う([[Y_2,X_2]|_既に通過した点ならび],Y_2,X_2,R). 隣接点を得る(_既に通過した点ならび,Y_1,X_1,Y_2,X_2,_方向) :- member([_方向,A,B],[[r,1,0],[l,-1,0],[d,0,1],[u,0,-1]]), Y_2 is Y_1 + B, X_2 is X_1 + A, 道(Y_2,X_2), \+(member([Y_2,X_2],_既に通過した点ならび)). 迷路の定義(_行文字列ならび) :- append(L0,[_行文字列|R],_行文字列ならび), length(L0,Y), sub_atom(_行文字列,X,1,_,_点), 迷路の道部分の点定義(_点,Y,X), R = []. 迷路の道部分の定義(_点,Y,X) :- '道ならば位置を定義'(_点,Y,X), '出発点・終着点ならば位置を定義'(_点,Y,X),!. 迷路の道部分の定義(_,_,_). '出発点・終着点ならば位置を定義'('S',Y,X) :- assertz(出発点(Y,X)),!. '出発点・終着点ならば位置を定義'('G',Y,X) :- assertz(終着点(Y,X)),!. 道ならば位置を定義(A,Y,X) :- \+(A = '#'), assertz(道(Y,X)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1332279659/170 # # 円の内部(円周上を含む)に点を指定した数だけ打ちたい # それぞれの点の距離を最大化するように打つにはどうすればいい? # '原点を中心とした円内にランダムに3つの点を追加して行き、追加する毎に最短の距離の二点を取り除く'(0,_,_座標ならび,_座標ならび). '原点を中心とした円内にランダムに3つの点を追加して行き、追加する毎に最短の距離の二点を取り除く'(_試行回数,_半径,_座標ならび,_試行回数分の点を追加された座標ならび) :- 三座標を得る(_半径,X1,Y1,X2,Y2,X3,Y3), 座標ならびから最短の二座標を取り除く([[X1,Y1],[X2,Y2],[X3,Y3]|_座標ならび],_最短の二座標を取り除いた座標ならび), _試行回数_1 is _試行回数 - 1, '原点を中心とした円内にランダムに3つの点を追加して行き、追加する毎に最短の距離の二点を取り除く'(_試行回数_1,_半径,_最短の二座標を取り除いた座標ならび,_試行回数分の点を追加された座標ならび). 三座標を得る(_半径,X1,Y1,X2,Y2,X3,Y3) :- 座標点を得る(_半径,X1,Y1), 座標点を得る(_半径,X2,Y2), 座標点を得る(_半径,X3,Y3),!. 座標点を得る(_半径,X,Y) :- 座標点の位置要素(_半径,X), 座標点の位置要素(_半径,Y),!. 座標点の位置要素(_半径,_位置要素) :- M is truncate(_半径 * 1000), M_2 is M // 2, N is truncate(M), _位置要素 is (random(N+1) - M_2) / 1000. 座標ならびから最短の二座標を取り除く(_座標ならび,_最短の二座標を取り除いた座標ならび) :- findmin([_二点間の距離,[X1,Y1],[X2,Y2]],( 組み合わせ(_座標ならび,2,[[X1,Y1],[X2,Y2]]), _二点間の距離 is sqrt((X2-X1) * (X2-X1) + (Y2-Y1) * (Y2-Y1)), [_,[X1,Y1],[X2,Y2]]), ならびから一要素だけ削除([X1,Y1],_座標ならび,_座標ならびの一), ならびから一要素だけ削除([X2,Y2],_座標ならびの一,_最短の二座標を取り除いた座標ならび). ならびから一要素だけ削除(_削除する要素,_座標ならび,_一要素だけ削除されたならび) :- select(_削除する要素,_座標ならび,_一要素だけ削除されたならび),!. 可能な限り分散して円内にN個の点を打つ(N,_半径,_座標ならび) :- 円内にランダムに十分な点を打つ(N,_半径,[],L1), 最短点を持つ二座標を取り除く(L1,_座標ならび), length(_座標ならぴ,N). 円内にランダムに十分な点を打つ(N,_半径,L) :- M is 5 * N, 円内にランダムに十分な点を打つ(N,_半径,[],L). 円内にランダムに十分な点を打つ(N,_半径,L1,L) :- 座標点を得る(_半径,X,Y), N_1 is N - 1, 円内にランダムに十分な点を打つ(N_1,_半径,[[X,Y]|L1],L). 最短点を持つ二座標を取り除く(L1,L) :- 座標ならびから最短の二座標を取り除く(L1,L2), 最短点を持つ二座標を取り除くの二(L2,L). 最短点を持つ二座標を取り除くの二(L,L). 最短点を持つ二座標を取り除くの二(L2,L) :- 最短点を持つ二座標を取り除く(L2,L). % 以下のサイトは # 座標が[[X1,Y1],[X2,Y2],... [Xn,Yn]]のように保持されている。このなかで # 最も二点間の距離が近い二つの座標を取り除く述語を定義しなさい。 座標ならびから最短の二座標を取り除く(_座標ならび,_最短の二座標を取り除いた座標ならび) :- findmin([_二点間の距離,[X1,Y1],[X2,Y2]],( 組み合わせ(_座標ならび,2,[[X1,Y1],[X2,Y2]]), _二点間の距離 is sqrt((X2-X1) * (X2-X1) + (Y2-Y1) * (Y2-Y1)), [_,[X1,Y1],[X2,Y2]]), ならびから一要素だけ削除([X1,Y1],_座標ならび,_座標ならびの一), ならびから一要素だけ削除([X2,Y2],_座標ならびの一,_最短の二座標を取り除いた座標ならび). ならびから一要素だけ削除(_削除する要素,_座標ならび,_一要素だけ削除されたならび) :- select(_削除する要素,_座標ならび,_一要素だけ削除されたならび),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/89 # # 質問テンプレ】 # [1] 授業単元:組合せ最適化 # [2] 問題文(含コード&リンク): # # 以下のアルゴリズムを実装せよ。 # Find(j) # if j=0 何もしない # else # ・e[i][j]+C+OPT(i-1)を最小にするiを計算する # ・{p[i],p[i+1],・・・・,p[j]}を出力し、Find(i-1)を実行。 # # なおFind()は関数とし、変数はすべて計算済みとする。 # # iの範囲-> 1<=i<=j を満たす。 # e[i][j]+C+OPT(i-1)の型 →型の意味がわからなくて説明の仕方がわかりません。 # pの型 →同上 # 出力形式 →printfで表示してください。 # OPT()も計算済みです。 # OPT(j)=e[i][j]+C+OPT(i-1)になります。 # e[i][j]=Σ(k=i〜j) (y[k]-a*x[k]-b)^2 # このy[k],x[k]は入力で与えられてます。 # a,bは最小二乗法で求めてあります。 # 'Find'(0). 'Find'(_j) :- findmin([X,_i],( between(1,_j,_i), 'e[i][j]+C+OPT(i-1)'(_i,_j,X)), [_,_i]), '{p[i],p[i+1],・・・・,p[j]}を出力し'(_i,_j), _j_1 is _i - 1, 'Find'(_j_1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/189 # # 1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/kGj9u7Sm # #include # typedef int (*f)(int); # int charge1(int x) # { # return 3000 + 1200 * x; # } # int charge2(int x) # { # return 5000 + 600 * x; # } # int charge3(int x) # { # return 7000 + 300 * x; # } # int main(void) # { # f func[] = { charge1, charge2, charge3 }; # int hour, i; # for (hour = 1; hour <= 10; hour++) { # printf("%d時間利用の場合\n", hour); # for (i = 0; i < 3; i++) { # printf("サービス%d:%d円\n", i + 1, func[i](hour)); # } # putchar('\n'); # } # return 0; # } # # 利用時間x分を入力すると、上記にあるプログラムのサービスのうち、最も安いサービスの名称とその料金を計算し出力するプログラムを関数charge1、 charge2、 charge3を利用して作成しなさい。 # charge1(_x,_charge) :- _charge is 3000 + 1200 * _x. charge2(_x,_charge) :- _charge is 5000 + 600 * _x. charge3(_x,_charge) :- _charge is 7000 + 300 * _x. '利用時間x時間を入力すると、上記にあるプログラムのサービスのうち、最も安いサービスの名称とその料金を計算し出力するプログラムを関数charge1、 charge2、 charge3を利用して作成しなさい。'(_x,_サービス名,_最小charge) :- 利用時間x時間を入力すると(_x), '上記にあるプログラムのサービスのうち、最も安いサービスの名称とその料金を計算し'(_x,_最も安いサービスの名称,_料金), 出力する(_x,_料金,_最も安いサービスの名称). 利用時間x時間を入力すると(_x) :- write('利用時間x時間を入力してください : '), get_line(Line), 利用時間x時間の入力診断(Line,_x),!. 利用時間x時間を入力すると(_x) :- 利用時間x時間を入力すると(_x). 利用時間x時間の入力診断(Line,_x) :- atom_to_term(Line,_x,_), integer(_x), _x >= 0,!. 利用時間x時間の入力診断(Line,_x) :- writef('入力された %t からは適切な利用時間が得られませんでした。再入力をお願いします。\n',[Line]), fail. '上記にあるプログラムのサービスのうち、最も安いサービスの名称とその料金を計算し'(_x,_最も安いサービスの名称,_料金) :- charge1(_x,_charge1), charge2(_x,_charge2), charge3(_x,_charge3), findmin([_charge,_サービス名],( member([_charge,_サービス名],[[_charge1,charge1],[_charge2,charge2],[_charge3,charge3]])), [_料金,_最も安いサービスの名称]). 出力する(_x,_料金,_最も安いサービスの名称) :- writef('%t時間 %t円 %t\n',[_x,_料金,_最も安いサービスの名称]). % 以下のサイトは # 2と3だけを複数回かけてある数Aにもっとも近い数を作りたーい :- dynamic('_m ^ _n'/3). '2と3だけを複数回かけてある数Aにもっとも近い数を作る'(_ある数,_2を掛ける回数,_3を掛ける回数,_もっとも近い数) :- '2と3だけを複数回かけてある数Aにもっとも近い数を作る'(_ある数A,2,1,1,_現在のある数Aとの差,_2を掛ける回数,_3を掛ける回数,_ある数Aにもっとも近い数). '2と3だけを複数回かけてある数Aにもっとも近い数を作る'(_ある数A,_組合せ数,_現在のある数Aとの差,_m,_n,_ある数Aにもっとも近い数) :- findall(N,( for(1,N,_組合せ数)), L1), 差の絶対値と差(L1,_ある数A,_m_1,_n_1,_差の絶対値,_差), '2と3だけを複数回かけてある数Aにもっとも近い数を作る'(_ある数A,_組合せ数,_m_1,_n_1,_差の絶対値,_差,_現在のある数Aとの差,_m,_n,_ある数Aにもっとも近い数). '2と3だけを複数回かけてある数Aにもっとも近い数を作る'(_ある数A,_組合せ数,_m,_n,_差の絶対値,_差,_現在のある数Aとの差,_m,_n,_ある数Aにもっとも近い数) :- abs(_現在のある数Aとの差) =< _差の絶対値, _ある数Aにもっとも近い数 is _ある数A + _現在のある数Aとの差,!. '2と3だけを複数回かけてある数Aにもっとも近い数を作る'(_ある数A,_組合せ数,_m_1,_n_1,_m,_n,_差の絶対値,_差,_現在のある数Aとの差,_ある数Aにもっとも近い数) :- _組合せ数の二 is _組合せ数 + 1, '2と3だけを複数回かけてある数Aにもっとも近い数を作る'(_ある数A,_組合せ数の二,_m,_n,_差,_ある数Aにもっとも近い数). 差の絶対値と差(L1,_ある数A,_m,_n,_差の絶対値,_差) :- findmin([_差の絶対値,_差,_m,_n],( 総当り(L1,_m,_n), Z is 2 ^ _m * 3 ^ _n, _差 is _ある数A - Z), _差の絶対値 is abs(_差)), [_差の絶対値,_差,_m,_n]),!. 総当り(L,_m,_n) :- member(_m,L), member(_n,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/489 # # [1] 授業単元:C言語演習 # [2] 問題文: # キーボードで入力された名前をchar型の一次元の配列nameに入れていきます。 # 各名前の先頭アドレスをp_nameに入れます。 # p_nameのアドレスをptrptrに入れます。 # 最後に一番長い名前と一番短い名前、変数ptrptr、p_name、nameのアドレスを表示します。 # 実行例: # 名前を10個まで入力できます。桁数は最大30です。 # name1: tanaka # name2: nakabayashi # name3: hama #    ・ #    ・ # 一番長いのは"nakabayashi"で、11桁。 # 一番短いのは"hama"で、4桁。 # Adress of name: 231191 Adress of p_name: 231511 Adress of ptrptr: 231551 # # 'キーボードで入力された名前をならび_nameに入れていきます。一番長い名前と一番短い名前を表示します。' :- キーボードで入力されたならび_nameに入れていきます(_name), 一番長い名前と一番短い名前を表示します(_name). 一番長い名前と一番短い名前を表示します(_name) :- 一番長い名前(_name,_一番長い名前ならび), 一番短い名前(_name,_一番短い名前ならび), 表示します(_一番長い名前ならび,_一番短い名前ならび). 一番長い名前(_name,_一番長い名前ならび) :- findmax(_名前の長さ,( member(_名前,_name), sub_atom(_名前,0,_名前の長さ,0,_名前)), _一番長い長さ), findall(_名前,( member(_名前,_name), sub_atom(_名前,0,_一番長い長さ,_名前)), 一番長い名前ならび). 一番短い名前(_name,_一番短い名前ならび) :- findmin(_名前の長さ,( member(_名前,_name), sub_atom(_名前,0,_名前の長さ,0,_名前)), _一番短い長さ), findall(_名前,( member(_名前,_name), sub_atom(_名前,0,_一番短い長さ,_名前)), 一番短い名前ならび). 表示します(_一番長い名前ならび,_一番短い名前ならび) :- concat_atom(_一番長い名前ならび,' , ',_一番長い名前表示), writef('一番長い名前は %t です。\n',[_一番長い名前表示]), concat_atom(_一番短い名前ならび,' , ',_一番短い名前表示), writef('一番短い名前は %t です。\n',[_一番短い名前表示]). キーボードで入力された名前をならび_nameに入れていきます(_name) :- findall(_名前,( 名前を入力(_名前,_終了状態), ( _終了状態=終了,!,fail; true)), _name). 名前を入力(_名前,_終了状態) :- append(L0,_,_), length([_|L0],Nth), writef('名前[%t]: ',[Nth]), get_line(Line), 名前入力検査(Line,_名前,_終了状態). 名前入力検査('',_,終了) :- !. 名前入力検査(end_of_file,_,終了) :- !. 名前入力検査(名前,_名前,正常). % 以下のサイトは 最長共通部分列(_ならび1,_ならび2,_最長共通部分ならび) :- findmin(_要素数,( member(L,[_ならび1,_ならび2]), length(L,_要素数)), _短い方のならびの要素数), 最長共通部分列(_短い方のならびの要素数,_ならび1,_ならび2,_最長共通部分ならび). 最長共通部分列(_短い方のならびの要素数,_ならび1,_ならび2,_最長共通部分ならび) :- for(_短い方のならびの要素数,N,1), 共通部分列(N,_ならび1,_ならび2,_),!, 共通部分列(N,_ならび1,_ならび2,_最長共通部分ならび). 共通部分列(N,_ならび1,_ならび2,_共通部分ならび) :- 組合せ(_ならび1,N,_共通部分ならび), 組合せ(_ならび2,N,_共通部分ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findmin(V,P,Min) :- findall(V,P,L), min(L,Min). 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). % 以下のサイトは :- dynamic(cut,0). 最長共通部分列(_ならび1,_ならび2,_最長共通部分ならび) :- abolish(cut/0), findmin(_要素数,( member(L,[_ならび1,_ならび2]), length(L,_要素数)), _短い方のならびの要素数), 最長共通部分列(_短い方のならびの要素数,_ならび1,_ならび2,_最長共通部分ならび). 最長共通部分列(_短い方のならびの要素数,_ならび1,_ならび2,_最長共通部分ならび) :- for(_短い方のならびの要素数,N,1), ( cut,!,fail; 共通部分列(N,_ならび1,_ならび2,_最長共通部分ならび) ), cut_assert. cut_assert :- cut,!. cut_assert :- asserta(cut). 共通部分列(N,_ならび1,_ならび2,_共通部分ならび) :- 組合せ(_ならび1,N,_共通部分ならび), 組合せ(_ならび2,N,_共通部分ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findmin(V,P,Min) :- findall(V,P,L), min(L,Min). 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). % 以下のサイトは # 出典::SQL質疑応答スレ 12問目 #353 # MySQL 5.1 # 株価テーブル kabuka # stock_code ←銘柄コード # vol_date ←出来高年月日 # sp # hp # lp # cp # vol # # 銘柄マスタ stock_info # stoc_code ←銘柄コード # shkbn ←商品区分(0,1,2,3,4) # stk_name ← 銘柄名 # delete_flg 削除区分 # 〜その他いろいろな項目 # # 銘柄マスタの商品区分0及び1は除外して銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日の一覧を出したい # # select a.stock_code,stk_name,shkbn,min(vol_date),max(vol_date) # from kabuka a # inner join stock_info b # on a.stock_code = b.stock_code # where # a.stock_code in # (select b.stock_code from stock_info # where delete_flg=0 and shkbn not in(0,4)) # group by a.stock_code # order by shkbn,a.stock_code; # # で、上記のSQLを書いてみたんですが、shkbnが0及び4のもでてしまいます # 出さないようにするにはどうすればいいのでしょうか? # # 銘柄マスタの商品区分0及び1は除外して銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日の一覧を出したい :- 一覧を出したい(銘柄マスタの商品区分0及び1は除外して(_銘柄,_銘柄名), 銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日を表示する(_銘柄,_銘柄名)). 一覧を出したい(_表示対象,_表示する) :- forall(_表示対象,_表示する). 銘柄マスタの商品区分0及び1は除外して(_銘柄,_銘柄名) :- setof([_stoc_code,_stk_name],( [_stoc_code,_shkbn,_stk_name,_delete_flg] ^ stock_info(_stoc_code,_shkbn,_stk_name,_delete_flg), 商品区分0及び1は除外して(_shkbn)),LL), member([_銘柄,_銘柄名],LL). 商品区分0及び1は除外して(_shkbn) :- _shkbn=\=0, _shkbn=\=1. 銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日を表示する(_stock_code,_銘柄名) :- 銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日を(_stock_code,_最古登録日,_最新登録日), writef('%t,%t,最古登録日=%t,最新登録日=%t\n',[_stoc_code,_銘柄名,_最古登録日,_最新登録日]). 銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日を(_stock_code,_最古登録日,_最新登録日) :- '銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と'(_stock_code,_最古登録日), 最新登録日を(_stock_code,_最新登録日). 銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と(_stock_code,_最古登録日) :- findmin(_vol_date,kabuka(_stock_code,_vol_date,_sp,_hp,_lp,_cp,_vol),_最古登録日). 最新登録日を(_stock_code,_最新登録日) :- findmax(_vol_date,kabuka(_stock_code,_vol_date,_sp,_hp,_lp,_cp,_vol),_最新登録日). findmin(A,B,C) :- findall(A,B,L), 昇順整列した最初の要素(L1,C). 昇順整列した最初の要素(L1,C) :- sort(L,[C|_]). findmax(A,B,C) :- findall(A,B,L1), 昇順整列した最終要素(L1,C). 昇順整列した最終要素(L1,C) :- sort(L1,L2), last(L2,C). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/822 # # [1] 授業単元:c言語プログラミング # [2] 問題文(含コード&リンク):(1,2,3) (1,2,4)...といった数列が続くのlist.txtを読み込み、 # 左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむプログラムを作りなさい。 # (この場合、左が1と1かつ真ん中が2と2で右が3と4なので4の方が大きいので(1,2,4)を削除する) # '(1,2,3) (1,2,4)...といった数列が続くのlist.txtを読み込み、左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ' :- get_chars('list.txt',Chars), '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ'(Chars). '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ'(Chars) :- ならびに変換(Chars,LL1), '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し'(LL1,LL2), 'link2.txtに書きこむ'(LL2). ならびに変換([],[]). ならびに変換(['('|R1],[[A,B,C]|R2]) :- append(L0,[)|R3],R1), concat_atom(L0,S), atom_to_term(S,(A,B,C),_), ならびに変換(R3,R2),!. ならびに変換([_|R1],R2) :- ならびに変換(R1,R2). '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し'(LL1,LL2) :- 左の数字と真ん中の数字でグループを作る(LL1,LL3), グループの中の最小ならびを蒐める(LL3,LL2). 左の数字と真ん中の数字でグループを作る(LL1,LL3) :- findsetof([A,B],( append(_,[[A,B,_]|_],LL1)), LL3). グループの中の最小ならびを蒐める(LL3,LL2) :- findall(L,( グループの中での最小ならび(LL3,L)), LL2). グループの中での最小ならび(LL3,L) :- append(_,[[A,B]|_],LL3), findmin([A,B,C],( append(_,[[A,B,C]|_],LL1)), L). 'link2.txtに書きこむ'(LL2) :- open('link2.txt',write,Outstream), 'link2.txtに書きこむ'(Outstream,LL2), close(Outstream). 'link2.txtに書きこむ'(Outstream,LL2) :- append(_,[[A,B,C]|R],LL2), writef(Outstream,'(%t,%t,%t) ',[A,B,C]), R = [], 最後に改行(Outstream). 最後に改行(Outstream) :- write(Outstream,'\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/890 # # 初心者ですが失礼いたします。 # ID | DATA | TIME # --+------ # 1 | aaa | 01:02 # 2 | bbb | 03:42 # 1 | ccc | 02:11 # 3 | bbb | 01:32 # # というデータがあるとしまして # タイムが早い順に並べ替えて重複するIDを除外(この場合は1) # するにはどのようなクエリを書けばよいのでしょうか? # # select * from table ORDER BY `time` DESC # でタイム順には並べることができていますが重複するID(人物) # を除外したいのです。 # # % findsetof/3 % findmin/3 % を参照してください。 'タイムが早い順に並べ替えて重複するIDを除外する'(_ID,_DATA,_TIME) :- findsetof(_ID,( テーブル(_ID,_DATA,_TIME)), L1), append(_,[_ID|_],L1), findmax([_TIME,_ID,_DATA],( テーブル(_ID,_DATA,_TIME)), [_TIME,_ID,_DATA]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/487 # [1] 授業単元:計算機入門及び演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10311.txt # # 以下の問題を解くプログラムをC言語を用いて作成しなさい. # # AさんとBさんは点数が書かれたカードを何枚か持っている. Aさんのカードと # Bさんのカードを1枚ずつ交換して,Aさんの持つカードの合計点数とBさんの持つ # カード合計点数が等しくなるようにしたい. # このときどのカードとどのカードを交換したらよいか.ただし,カードを # 交換しなくても合計点数が等しい場合でも,必ずカードの交換を行うものとする. # # 入力は,いくつかのデータセットからなる.各データセットは次の形式で与えられる. n m # s1 # s2 # ... # sn # sn+1 # sn+2 # ... # sn+m # 各データセットの最初の行は空白ひとつで区切られたふたつの数 n と m を含み, # n はAさんのカードの枚数,m はBさんのカードの枚数を表す.続く n+m 行には, # 各カードの点数が 1 行にひとつずつ並ぶ. # 最初の n 個の点数 (s1 から sn まで) はAさんのカードの点数,残りの # m 個の点数 (sn+1 から sn+m まで) はBさんのカードの点数を表す. # n および m は 100 以下の正の整数とし,カードの点数は 0 以上 100 以下の # 整数値とする.入力の終わりは,空白ひとつで区切られたふたつの 0 を含む # 1 行で示される. # 各データセットに対し,Aさん,Bさんの交換前のすべてのカードと交換すべき2つの # カードを出力すること.形式は特に問わない(実行例を参考にすること). # なお,合計を等しくするようなカードの交換の方法が複数ある場合は, # 交換するカードの点数の和が最小となるもののみを出力すること. # また,カードの点数の合計を等しくするような交換が存在しない場合はその旨を # 出力すること. # 'AさんとBさんは点数が書かれたカードを何枚か持っている. AさんのカードとBさんのカードを1枚ずつ交換して,Aさんの持つカードの合計点数とBさんの持つカード合計点数が等しくなるようにする'(LA,LB,LX) :- quicksort(LA,LA1), quicksort(LB,LB1), length(LA1,LenA), length(LB1,LenB), append(LA1,LB1,L), findall([L1,L2],( 組合せ(L,LenA,L1), sum(L1,Sum), 'L1分をLから取り除く'(L1,L,L3), 組合せ(L3,LenB,L2),sum(L2,Sum)), LX), 最短手順を探る(LA1,LX,_交換候補). 'L1分をLから取り除く'([],L,L) :- !. 'L1分をLから取り除く'([A|R1],L1,L2) :- 'AをL1から取り除く'(A,L1,L3), 'L1分をLから取り除く'(R1,L3,L2). 'AをL1から取り除く'(A,L1,L2) :- append(L0,[A|R],L1), append(L0,R,L2),!. sum([],0) :- !. sum([A|R],X) :- sum(R,Y), X is A + Y. 最短手順を探る(LA1,LL,_放出,_受け取り) :- findall([_放出,_受取],( append(_,[[L1,_]|_],LL), 交換候補(LA1,L1,_放出,_受取)), LX), findmin(Len,( append(_,[[U1,U2]|_],LX), length(U1,Len)), Min), append(_,[[_放出,_受け取り]|_],LX), length(U1,Min). 交換候補([],L,[],L) :- !. 交換候補(L,[],L,[]) :- !. 交換候補([A|R1],[A|R2],R3,R4) :- 交換候補(R1,R2,R3,R4),!. 交換候補([A|R1],[B|R2],[A|R3],R4) :- A < B, 交換候補(R1,[B|R2],R3,R4),!. 交換候補([A|R1],[B|R2],R3,[B|R4]) :- A > B, 交換候補([A|R1],R2,R3,R4),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/249 # # [1] 授業単元: アルゴリズム # [2] 問題文(含コード&リンク): # # クラスカルのアルゴリズムを用いて最小木を求めるプログラムを作成せよ。 # 読み込むグラフのデータ(graph.txt)は、 # 頂点数 枝数 (1行目) # 始点 終点 枝の長さ (2〜枝の数だけ) # という形式で行こうと思っています。 # http://codepad.org/BxDa8z6P # 10 20 # 0 1 15 # 0 2 6 # 0 3 3 # 0 4 4 # 1 4 4 # 1 5 7 # 1 6 20 # 2 3 2 # 2 7 1 # 3 4 1 # 3 7 2 # 4 5 8 # 4 7 5 # 4 8 3 # 4 9 6 # 5 6 1 # 5 9 3 # 6 9 20 # 7 8 3 クラスカルのアルゴリズムを用いて最小木を求める :- 重み最小の枝を選択(_ノード1,_ノード2,_重み最小の枝), assertz(最小木(_ノード1,_ノード2,_重み最小の枝)), 閉路となる枝を刈取る(_ノード1,_ノード2), クラスカルのアルゴリズムを用いて最小木を求める. クラスカルのアルゴリズムを用いて最小木を求める. 重み最小の枝を選択(_ノード1,_ノード2) :- findmin(_枝の重み,( 木(_,_,_枝の重み)), _重み最小の枝), 木(_ノード1,_ノード2,_重み最小の枝),!. 閉路となる枝を刈取る(_ノード1,_ノード2) :- 閉路(_ノード1,_ノード2,_ノード3), retract(木(_ノード1,_ノード3)). 閉路となる枝を刈取る(_ノード1,_ノード2) :- 閉路となる枝を刈取る(_ノード2,_ノード1). 閉路(_ノード1,_ノード2,_ノード1,_ノード3) :- 木(_ノード1,_ノード2), 接続(_ノード2,_ノード3), 木(_ノード3,_ノード1). 接続(_ノード1,_ノード2) :- 木(_ノード1,_ノード2). 接続(_ノード1,_ノード2) :- 木(_ノード1,_ノード3), 接続(_ノード3,_ノード2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/470 # # # 入力ファイル(成績ファイル)の仕様 # # ファイル名は、ASCII文字で構成されるものとする。 # ファイル名の最大長は FILENAME_MAX である(第2回の課題0を参照)。 # 1行は、「学生番号」、「氏名」、「成績」の順に記述したもので、 # 各項目の区切り文字は、「タブ('\t')」1個である。 # 学生番号は、英数字からなる6桁の文字列である。 # 氏名の文字列長の最大は20バイトとする。 # 成績は、0〜100までの整数である。 # 入力は、最大500行と仮定してよい。 # # 出力形式 # 入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する。 # 次に、成績の降順にソートして出力する。各項 目間は、「タブ('\t')」1個で区切る。 # 平均点は、小数点以下1桁まで出力する。 # 出力形式は、実行例を参照せよ。 # エラー処理 # 呼出しでファイル名が指定されない場合はエラーとし、「ファイル名を指定してください」と表示し、プログラムを終了する。 # 指定されたファイルのオープンに失敗した場合に、「ファイルを開けませんでした」と表示し、プログラムを終了する。 # 今回のプログラムでは、a. b. 以外のエラー処理はしなくてよい。 # # % cat sample.txt # 03888 八 90 # 03111 一 100 # 03222 二 30 # 03666 六 70 # 03555 五 60 # 03333 三 80 # 03777 七 40 # 03999 九 20 # 03444 四 50 # % ./work31.exe sample.txt # 最高点:100 # 最低点: 20 # 平均点: 60.0 # 100 03111 一 # 90 03888 八 # 80 03333 三 # 70 03666 六 # 60 03555 五 # 50 03444 四 # 40 03777 七 # 30 03222 二 # 20 03999 九 # % # # 言語はCです # よろしくおねがいします # program :- user_parameters([_ファイル名]), '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t''[B')」1個で区切る。' (_ファイル名). '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(_ファイル名) :- 入力ファイルを読み込み(_ファイル名,LL), '最初に、成績の最高点と最低点と平均点を出力する'(LL), '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL). 入力ファイルを読み込み(_ファイル名,LL) :- get_lines(_ファイル名,Lines), 三項ならびに変換(Lines,LL). 三項ならびに変換([],[]) :- !. 三項ならびに変換([Line|R1],[[_成績,_学生番号,_氏名]|R2]) :- atom_chars(Line,Chars), append(L0,['\t'|L1],['\t'|L2],Chars), atom_chars(_学生番号,L0), atom_chars(_氏名,L1), atom_chars(_成績文字列,L2), atom_to_term(_成績文字列,_成績,_), 三項ならびに変換(R1,R2). 最初に、成績の最高点と最低点と平均点を出力する(LL) :- findmax(_成績, append(_,[[_成績,_,_]|_],LL), _最高点成績), findmin(_成績, append(_,[[_成績,_,_]|_],LL), _最低点成績), findavg(_成績, append(_,[[_成績,_,_]|_],LL), _平均点), writef('最高点: %t\n',[_最高点成績]), writef('最低点: %t\n',[_最低点成績]), writef('平均点: %t\n',[_平均点]),!. '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL) :- sort(LL,LL1), reverse(LL1,LL2), append(_,[L|R],LL2), writef('%t\t%t\t%t\t\n',L), R = [],!. % *** user: append / 4 *** append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % *** user: findmax / 3 *** findmax(V,P,Max) :- findall(V,P,L), max(L,Max). % *** user: findmin / 3 *** findmin(V,P,Max) :- findall(V,P,L), min(L,Max). % *** user: findavg / 3 *** findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. % *** user: sum / 2 *** sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/15 # # select id, info_date from t_information order by info_date desc; # というクエリで、 # +----+---------------------+ # | id | info_date | # +----+---------------------+ # | 18 | 2011-03-03 17:00:00 | # | 17 | 2011-03-03 15:00:00 | # | 16 | 2011-03-01 10:00:00 | # | 4 | 2011-01-13 14:00:00 | # | 3 | 2011-01-13 07:00:00 | # | 2 | 2011-01-13 03:00:00 | # | 1 | 2011-01-13 00:00:00 | # | 15 | 2011-01-12 00:00:00 | # +----+---------------------+ # というデータの場合に # info_dateを基準に目的idの次のidを取得したいです。 # 例えば目的idが15とすると、1を取得したいです。 # # mysqlです。 # よろしくおねがいします。 # t_information(18,'2011-03-03 17:00:00'). t_information(17,'2011-03-03 15:00:00'). t_information(16,'2011-03-01 10:00:00'). t_information( 4,'2011-01-13 14:00:00'). t_information( 3,'2011-01-13 07:00:00'). t_information( 2,'2011-01-13 03:00:00'). t_information( 1,'2011-01-13 00:00:00'). t_information(15,'2011-01-12 00:00:00'). 'キー値を基準に目的idの次のidを取得する'(_キー値,_id) :- findmin([_info_date,_id],( t_information(_id,_info_date), _info_date @> _キー値), [_info_date,_id]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/122 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1311028.txt.html # # Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 # 県と県の間を半角開ける # # 1.北海道 2.青森県・・・47.沖縄県を表示 # 一行につき6県 # # (例) # _1.北海道____2.鹿児島県__3. # # ↑ # 桁が上がったとき用 # # # 43.□□□___44.□□ # # # 次に47都道府県のうち出発地と目的地の入力を要求する. # # 「出発の県を入力してください」 # 「目的の県を入力してください」 # # # # # 次に結果を表示. # # ・距離と経路を出力 # # 経路 # □□□□→□□□□→・・・→□□□□ # # -10byte-- # # 経路は7県まで # # # # とする # # # # map.datの中身は↓です # # 北海道,青森県,岩手県,宮城県,秋田県,山形県,福島県,茨城県,栃木県,群馬県,埼玉県,千葉県,東京都,神奈川県,新潟県,富山県,石川県,福井県,山梨県,長野県,岐阜県,静岡県,愛知県,三重県,滋賀県,京都府,大阪府,兵庫県,奈良県,和歌山県,鳥取県,島根県,岡山県,広島県,山口県,徳島県,香川県,愛媛県,高知県,福岡県,佐賀県,長崎県,熊本県,大分県,宮崎県,鹿児島県,沖縄県 # # 北海道,0,426,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 青森県,426,0,187,-1,190,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岩手県,-1,187,0,193,108,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 宮城県,-1,-1,193,0,258,72,84,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 秋田県,-1,190,108,258,0,212,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山形県,-1,-1,-1,72,212,0,102,-1,-1,-1,-1,-1,-1,-1,169,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 福島県,-1,-1,-1,84,-1,102,0,203,172,275,-1,-1,-1,-1,189,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 茨城県,-1,-1,-1,-1,-1,-1,203,0,76,-1,-1,116,128,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 栃木県,-1,-1,-1,-1,-1,-1,172,76,0,109,100,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 群馬県,-1,-1,-1,-1,-1,275,-1,109,0,103,-1,-1,-1,220,-1,-1,-1,-1,151,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 埼玉県,-1,-1,-1,-1,-1,-1,116,100,103,0,69,24,-1,-1,-1,-1,-1,157,215,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 千葉県,-1,-1,-1,-1,-1,-1,128,-1,-1,69,0,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 東京都,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,50,0,37,-1,-1,-1,-1,133,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 神奈川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,37,0,-1,-1,-1,-1,134,-1,-1,240,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 新潟県,-1,-1,-1,-1,169,189,-1,-1,220,-1,-1,-1,-1,0,250,-1,-1,-1,208,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 富山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,250,0,61,-1,-1,196,294,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 石川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,61,0,83,-1,-1,235,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 福井県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,83,0,-1,-1,160,-1,-1,-1,176,188,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山梨県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,164,-1,126,134,-1,-1,-1,-1,0,162,-1,109,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 長野県,-1,-1,-1,-1,-1,-1,-1,-1,-1,151,220,-1,-1,-1,208,196,-1,-1,162,0,295,271,272,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岐阜県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,294,235,160,-1,295,0,-1,43,113,128,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 静岡県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,167,-1,-1,-1,-1,109,271,-1,0,181,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 愛知県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,272,43,181,0,82,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 三重県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,-1,82,0,95,107,-1,-1,91,91,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 滋賀県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,176,-1,-1,128,-1,-1,95,0,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 京都府,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,188,-1,-1,-1,-1,-1,107,14,0,49,75,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 大阪府,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,49,0,45,33,80,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 兵庫県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,75,45,0,-1,-1,180,-1,139,-1,-1,115,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 奈良県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,-1,48,33,-1,0,98,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 和歌山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,-1,-1,-1,-1,98,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 鳥取県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,180,-1,-1,0,128,167,296,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # 島根県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,80,-1,128,0,-1,212,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岡山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,139,-1,-1,167,-1,0,165,-1,-1,70,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 広島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,296,212,165,0,131,-1,-1,190,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山口県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,131,0,250,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 徳島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,-1,-1,-1,-1,-1,-1,250,0,73,191,161,-1,-1,-1,-1,-1,-1,-1,-1 # # 香川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,-1,-1,73,0,156,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 愛媛県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,190,-1,191,156,0,156,-1,-1,-1,-1,-1,-1,-1,-1 # # 高知県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,161,-1,156,0,-1,-1,-1,-1,-1,-1,-1,-1 # # 福岡県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,165,-1,-1,-1,-1,0,61,-1,117,159,-1,-1,-1 # # 佐賀県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,61,0,109,-1,-1,-1,-1,-1 # # 長崎県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,109,0,-1,-1,-1,-1,-1 # # 熊本県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,117,-1,-1,0,218,192,187,-1 # # 大分県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,159,-1,-1,218,0,181,-1,-1 # # 宮崎県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,192,181,0,158,-1 # # 鹿児島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,187,-1,158,0,733 # # 沖縄県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,733,0 # '47都道府県のうち出発地と目的地の入力して最短経路を求めて距離と順路を表示する(ただし経路は7以下とする)' :- 'Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 県と県の間を半角 開ける'(_都道府県名ならび), '47都道府県のうち出発地と目的地の入力する'(_都道府県名ならび,_出発地,_目的地), 最短経路(_出発地,_目的地,_距離,_順路), 距離と経路の表示(_出発地,_目的地,_距離,_順路). '47都道府県のうち出発地と目的地の入力する'(_都道府県名ならび,_出発地,_目的地) :- 出発地を入力する(_都道府県名ならび,_出発地), 目的地を入力する(_都道府県名ならび,_目的地). 出発地を入力する(_都道府県名ならび,_出発地) :- write('出発地の都道府県名番号を入力してください : '), get_line(Line), 出発地を入力診断(Line,_都道府県名ならび,_出発地),!. 出発地を入力する(_都道府県名ならび,_出発地) :- 出発地を入力する(_都道府県名ならび,_出発地). 出発地を入力診断(Line,_都道府県名ならび,_出発地) :- atom_to_term(Line,_出発地番号,_), integer(_出発地番号), _出発地番号 > 1, _出発地番号 =< 47, list_nth(_出発地番号,_都道府県名ならび,_出発地),!. 出発地を入力診断(Line,_都道府県名ならび,_出発地) :- write_formatted('入力された %t から適切な出発地を得ることができません。再入力をお願いします。\n',[Line]), fail. 目的地を入力する(_都道府県名ならび,_目的地) :- write('目的地の都道府県名番号を入力してください : '), get_line(Line), 目的地を入力診断(Line,_都道府県名ならび,_目的地), 目的地を入力する(_都道府県名ならび,_目的地) :- 目的地を入力する(_都道府県名ならび,_目的地). 目的地を入力診断(Line,_都道府県名ならび,_目的地) :- atom_to_term(Line,_目的地番号,_), integer(_目的地番号), _目的地番号 > 1, _目的地番号 =< 47,!. 目的地を入力診断(Line,_,_目的地) :- write_formatted('入力された %t から適切な目的地を得ることができません。再入力をお願いします。\n',[Line]), fail. 距離と経路の表示(_出発地,_目的地,_距離,_順路) :- write_formatted('距離は %t,経路は %t',[_距離,_出発地]), append(_,[[A,B]|R],_順路), write_formatted(' -> %t ',[B]), R = [], write('\n'),!. 'Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 県と県の間を半角 開ける'(_都道府県名ならび) :- get_split_lines('Map.dat',[','],LL), 第要素は都道府県名、残りは経路情報(LL,_都道府県名ならび,_経路情報ならび), append(L0,[[_県名|_隣接情報ならび]|R2],_経路情報ならび), 隣接情報の登録(_県名,_都道府県名ならび,_隣接情報ならび), length([_|L0],_都道府県番号), write('%2d.%t ',[_都道府県番号,_県名]), R2 = [], write('\n'). 第一要素は都道府県名、残りは経路情報(LL,_都道府県名ならび,_経路情報ならび) :- LL = [_都道府県名ならび|_経路情報ならび],!. 隣接情報の登録(_都道府県名,_都道府県名ならび,L1) :- abolish(隣接県距離/3), append(L0,[_距離|R],L1), \+(_距離 = (-1)), \+(_距離 = 0), length([_|L0],Nth), list_nth(Nth,_都道府県名ならび,_都道府県名2), assertz(隣接県距離(_都道府県名,_件名2,_距離)), fail. 隣接情報の登録(_,_,_). 最短経路(_出発地,_目的地,_距離,_順路) :- findall([_順路,_距離],( 到達(_出発地,_目的地,_距離,[],_順路)), _順路・距離ならび), findmin(_距離,append(_,[[_,_距離]|_],_順路・距離ならび),_最短距離), append(_,[[_順路,_最短距離]|_],_順路距離ならび). 到達(_都道府県名1,_都道府県名2,_距離,_順路1,_順路) :- 隣接県距離(_都道府県名1,_都道府県名2,_距離), append(_順路1,[[_都道府県名1,_都道府県名2]],_順路),!. 到達(_都道府県名1,_都道府県名2,_距離,_順路1,_順路) :- length(_順路1,_経路数), _経路数 < 7, 隣接県距離(_都道府県名1,_都道府県名3,_距離1), この経路は選択されたことがない(_都道府県名1,_都道府県名2), append(_順路1,[[_都道府県名1,_都道府県名3]],_順路2), 到達(_都道府県名1,_都道府県名2,_距離2,_順路2,_順路), _距離 is _距離1 + _距離2. この経路は選択されたことがない(_都道府県名1,_都道府県名2) :- \+(append(_,[[_都道府県名1,_都道府県名3]|_],_順路1)), \+(append(_,[[_都道府県名3,_都道府県名1]|_],_順路1)),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/778 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # n本の棒がある。棒i(3<n<100)の長さはa_i(1<a_i<10^4)である。 # あなたは、それらの棒から3本を選び、「できるだけ周長の長い三角形」と「できるだけ周長の短い三角形」 # を作ろうと考えている。それぞれ最大・最短の周長と選択した棒の組を求めるプログラムを作成せよ。 # ただし、どのような棒の組を選んでも三角形が作れない場合、0を答えとして返せ。 # プログラムの要件として、以下の事項を定める。 # ・引数として棒の長さデータが収められたファイル名のみが与えられるものとする。 # ・結果として、標準出力に、最大周長と棒の組み合わせ、最短周長と棒の組み合わせが出力されること。 # # % cat length.dat # 2 3 4 5 10 # % ./a.out length.dat # 最大周長=12 (3 4 5) # 最短周長=9 (2 3 4) # # %cat length.dat # 4 5 10 20 # % ./a.out length.dat # 0 # program :- user_parameters([_ファイル名]), get_lines(_ファイル名,Lines), findall(N,( append(_,[Line|_],Lines), sqlit(Line,[' '],L2), append(_,[N|_],L2)), _棒の長さならび), 周囲が最大の三角形(_棒の長さならび,[A1,B1,C1]), 周囲が最短の三角形(_棒の長さならび,[A2,B2,C2]), write_formatted('最大周長=%t (%t %t %t)\n',[_最大周長,A1,B1,C1]), write_formatted('最短周長=%t (%t %t %t)\n',[_最短周長,A2,B2,C2]). fail. program. 周囲が最大の三角形(_棒の長さならび,[A,B,C],_最大周長) :- 最大周長を得る(_棒の長さならび,_最大周長), 周長から三辺を得る(_棒の長さならび,_最大周長,A,B,C). 最大周長を得る(_棒の長さならび,_最大周長) :- findmax(_周囲,( 組み合わせ(_棒の長さならび,3,[A,B,C]), C > A + B, B > A + C, A > B + C, _周囲 is A + B + C), _最大周長),!. 周囲が最短の三角形(_棒の長さならび,[A,B,C]) :- 最短周長を得る(_棒の長さならび,_最短周長), 周長から三辺を得る(_棒の長さならび,_最大周長,A,B,C). 最短周長を得る(_棒の長さならび,_最短周長) :- findmin(_周囲,( 組み合わせ(_棒の長さならび,3,[A,B,C]), C > A + B, B > A + C, A > B + C, _周囲 is A + B + C), _最短周囲). 周長から三辺を得る(_棒の長さならび,_周長,A,B,C) :- 組み合わせ(組み合わせ(_棒の長さならび,3,[A,B,C]), 組み合わせ(_棒の長さならび,3,[A,B,C]), _周長 is A + B + C, C > A + B, B > A + C, A > B + C. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/710 # # [1] プログラミング実習(ゲーム科課題) # [2] http://ime.nu/www.dotup.org/uploda/www.dotup.org1373468.txt.html # # [2] 入力した要素名からその要素がもっている数値を規定値Nより引き、最終的に予めテキストに # 保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ # 例:規定値Nには「x=1000,y=1500,z=2000」 # 要素名A「x=100,y=200,z=300」B「x=50,y=60,z=70」C「x=10,y=20,z=30」という内容を持ったデータを # 予め作成し保存 # 入力するのはx,y,zの数値ではなくA、B、Cといった要素名 # # 動作例: # 要素名入力:A # 内部動作 # N=N‐A # (x=1000-100 y=1500-200 z=2000-300) # (= x=900 y=1300 z=1700) # これを任意の回数繰り返し、Nを入力すると終了する等にてループを抜け # 最終的にNの中の値とA,B,Cより値よち最も近い要素名を出力する(複数可) # 例えばNの中身がx=200 y=300 z=300となった時に終了すると「近似要素名出力:A」 # と出力されるようにせよ # # /*追加評価 # APIを利用し、UIを作る # よりわかりやすいインターフェースにする # 等、その他、鋭意工夫を期待しています # (と書いてありましたが、そこまでは必要ないと思います。) # パワーポイントに長々と書いてあったのを要約したのですが、それでも長くなってすみません*/ '入力した要素名からその要素がもっている数値を規定値Nより引き、最終的に予めテキストに保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ'(_規定値ならび) :- 催促付き文字列入力('要素名を入力してください : ',_要素名), '入力した要素名からその要素がもっている数値を規定値Nより引き、最終的に予めテキストに保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ'(_要素名,_規定値ならび). '入力した要素名からその要素がもっている数値を規定値Nより引き、最終的に予めテキストに保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ'(_要素名,_規定値ならび) :- '入力した要素名からその要素がもっている数値を規定値Nより引き'(_要素名,_規定値ならび,_値の差), write_formatted('入力された要素と規定値の差は %t です\n',[_値の差]), 催促付き文字列入力('要素名を入力してください : ',_要素名_2), \+(_要素名_2 = q), '入力した要素名からその要素がもっている数値を規定値Nより引き、最終的に予めテキストに保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ'(_要素名_2,_規定値ならび),!. '入力した要素名からその要素がもっている数値を規定値Nより引き、最終的に予めテキストに保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ'(_直前の要素名,_規定値ならび) :- '予めテキストに保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ'(_直前の要素名,_規定値ならび),!. '入力した要素名からその要素がもっている数値を規定値Nより引き'(_要素名,_規定値ならび,_値の差) :- 要素名(_要素名,_値ならび), 値の差を取る(_規定値,_値ならび,_値の差), 値の差を取る([],_,Y,X) :- X is abs(sqrt(Y)),!. 値の差を取る([A|R1],[B|R2],S1,X) :- C is (A - B) * (A - B), S2 is S1 + C, 値の差を取る(R1,R2,S2,X). '予めテキストに保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ'(_直前の要素名,_規定値ならび) :- findmin([_値の差,_要素名],( 要素名(_要素名,_値ならび), 値の差を取る(_規定値ならび,_値ならび,_値の差)), [_最も近い値,_要素名]), write_formatted('あなたの選択した要素名は %t ,最も近い要素名は %t です\n',[_直前の要素名,_要素名]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/239 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 縦は無数、横が10列で数字が書き込まれているecxelファイルを読み込む(ファイル名は何でもいいです) # 読み込む時は今後の処理を考えてなるべく配列で # その後各列を縦に参照していき、正の値が出たときは別の同じ型の配列の同じ位置に代入していく # 負の値が出たときに、そのセルの列の前5個、後ろ5個を参照し以下の処理を行う # 前にも後ろにも正の値が検出された場合 → 参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する # 前あるいは後ろの片方にしか正の値が検出されなかった場合 → 一番近い値をそのまま別の配列に格納する # 前にも後ろにも正の値が無い場合 → そのままの負の値で別の配列に格納する # # 最後に値の変更を終えた別の配列をそのままresult.csvとして出力する # # # 'ファイルからcsvファイルを読み取りルールにしたがってすべてのセルを書き換え、result.csvファイルに出力する'(_ファイル,LL) :- '縦は無数、横が10列で数字が書き込まれているecxelファイルを読み込む'(_ファイル,LL1), 転置(LL1,LL2), ルールにしたがってすべてのセルを書き換える(LL2,LL3), 転置(LL3,LL), 'result.csvファイルとして出力する'(LL). '縦は無数、横が10列で数字が書き込まれているecxelファイルを読み込む'(_ファイル,LL) :- get_split_lines(_ファイル,[' '],LL). ルールにしたがってすべてのセルを書き換える(L,[]) :- !. ルールにしたがってすべてのセルを書き換える([L1|R1],[L2|R2]) :- length(L1,Len), ルールにしたがってすべての行を書き換える(1,Len,L1,[_セル2|R2]) :- ルールにしたがってすべてのセルを書き換える(R1,R2). ルールにしたがってすべての行を書き換える(M,Len,[]) :- M > Len,!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_セル1|R2]) :- list_nth(M1,L,_セル1), _セル1 >= 0, M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_参照しているセルに一番近い値|R2]) :- そのセルの列の前5個、後ろ5個を参照し(L,M1,Len,_前5個ならび,_そのセル,_後ろ5個ならび), 前あるいは後ろの片方にしか正の値が検出されなかった場合(L,_前5個ならび,_そのセル,_後ろ5個ならび), '参照しているセルに一番近い値をそのまま別の配列に格納する'(_そのセルの位置,_前5個ならび,_そのセル,_後ろ5個ならび,_参照しているセルに一番近い値), M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_2つの平均値|R2]) :- そのセルの列の前5個、後ろ5個を参照し(L,M1,Len,_前5個ならび,_そのセル,_後ろ5個ならび), 前にも後ろにも正の値が検出された場合(_前5個ならび,_そのセル,_後ろ5個ならび), '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'(_前5個ならび,_そのセル,_後ろ5個ならび,_2つの平均値), M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_そのセル|R2]) :- そのセルの列の前5個、後ろ5個を参照し(L,M1,Len,_前5個ならび,_そのセル,_後ろ5個ならび), 前にも後ろにも正の値が無い場合(_前5個ならび,_そのセル,_後ろ5個ならび), M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. 前あるいは後ろの片方にしか正の値が検出されなかった場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセル < 0, append(_,[N1|_],_前5個ならび), N1 > 0, \+((append(_,[N2|_],_後ろ5個ならび),N2 > 0)),!. 前あるいは後ろの片方にしか正の値が検出されなかった場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセル < 0, \+((append(_,[N1|_],_前5個ならび),N1 > 0)), append(_,[N2|_],_後ろ5個ならび), N2 > 0,!. 前にも後ろにも正の値が検出された場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセル < 0, append(_,[N1|_],_前5個ならび), N1 > 0, append(_,[N2|_],_後ろ5個ならび), N2 > 0,!. 前にも後ろにも正の値が無い場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- \+((append(_,[N1|_],_前5個ならび),N1 > 0)), \+((append(_,[N2|_],_後ろ5個ならび),N2 > 0)),!. そのセルの列の前5個、後ろ5個を参照し(L,_そのセルの位置,Len,_前5個ならび,_そのセル,_後ろ5個ならび) :- Len < _そのセルの位置 + 5, _そのセルの位置 >= 6, len0 is _そのセルの位置 - 6, length(L0,Len0), length(_前5個ならび,5), append(_前5個ならび,[_そのセル|_後ろ5個ならび],L1), append(L0,L1,L),!. そのセルの列の前5個、後ろ5個を参照し(L,_そのセルの位置,Len,_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセルの位置 < 6, Len >= _そのセルの位置 + 5, _前5個ならびの長さ is _そのセルの位置 - 1, length(_前5個ならび,_前5個ならびの長さ), length(_後ろ5個ならび,5), append(_前5個ならび,[_そのセル|_後ろ5個ならび],L1), append(L1,L2,L),!. そのセルの列の前5個、後ろ5個を参照し(L,_そのセルの位置,Len,_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセルの位置 >= 6, Len >= _そのセルの位置 + 5, Len0 is _そのセルの位置 - 6, length(L0,Len0), length(_前5個ならび,5), append(_前5個ならび,[_そのセル|_後ろ5個ならび],L1), append(L0,L1,_,L),!. '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'([],_そのセル,_後ろ5個ならび,_値) :- findmin([M,N],( append(_,[N|_],_後5個ならび), M is abs(N - _そのセル)), [_差,_値]),!. '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'(_前5個ならび,_そのセル,[],_値) :- findmin([M,N],( append(_,[N|_],_前5個ならび), M is abs(N - _そのセル)), [_差,_値]), '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'(_前5個ならび,_そのセル,_後ろ5個ならび,_2つの平均値) :- findmin([M,N],( append(_,[N|_],_前5個ならび), M is abs(N - _そのセル)), [_差1,_値1]), findmin([M,N],( append(_,[N|_],_後5個ならび), M is abs(N - _そのセル)), [_差2,_値2]), _2つの平均値 is (_値1 + _値2) / 2. '参照しているセルに一番近い値をそのまま別の配列に格納する'(_前5個ならび,_そのセル,_後ろ5個ならび,_参照しているセルに一番近い値) :- append(_前5個ならび,_後ろ5個ならび,L), findmin([M,N],( append(_,[N|_],L), M is abs(N - _そのセル)), [_差2,_参照しているセルに一番近い値]),!. 'result.csvファイルとして出力する'(LL) :- open('result.csv',write,Outstream), 'result.csvファイルとして出力する'(Outstream,LL), close(Outstream). 'result.csvファイルとして出力する'(_,[]) :- !. 'result.csvファイルとして出力する'(Outstream,[L|R]) :- concat_atom(L,' ',S), write_formatted(Outstream,'%t\n',[S]), 'result.csvファイルとして出力する'(Outstream,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/32 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): #   巡回セールスマン問題 #   いくつかの都市と都市間を結ぶ経路があります。全ての都市を一巡するのに最も短い経路を求めるプログラムを作成せよ。 #   TSPのデータファイルはgr17.txtで、数字の部分が都市数です。 #   ファイルの記述の仕方が以下のようになっています。 # #   gr17.txtの例 # #   17   最初の数値は都市数 #   0    第0都市と第0都市との距離が0 #   633 0  第1都市と第0都市との距離が633、第1都市と第1都市との距離が0 #   257 390 0 第2都市と第0、第1、第2都市との距離がそれぞれ257,390,0 #   91 661 228 0 以下同様 #   412 227 169 383 0 # 150 488 112 120 267 0 #      以下略 # #   補足説明として #   ・同じ道を通ってもよい #   ・全ての都市を1回通ればよい(巡回しなくていい) #   ・全探索はなるべく使用しないで深さ優先探索、分子限定法を用いること # # 17 # 0 # 633 0 # 257 390 0 # 91 661 228 0 # 412 227 169 383 0 # 150 488 112 120 267 0 # 80 572 196 77 351 63 0 # 134 530 154 105 309 34 29 0 # 259 555 372 175 338 264 232 249 0 # 505 289 262 476 196 360 444 402 495 0 # 353 282 110 324 61 208 292 250 352 154 0 # 324 638 437 240 421 329 297 314 95 578 435 0 # 70 567 191 27 346 83 47 68 189 439 287 254 0 # 211 466 74 182 243 105 150 108 326 336 184 391 145 0 # 268 420 53 239 199 123 207 165 383 240 140 448 202 57 0 # 246 745 472 237 528 364 332 349 202 685 542 157 289 426 483 0 # 121 518 142 84 297 35 29 36 236 390 238 301 55 96 153 336 0 # # 'いくつかの都市と都市間を結ぶ経路があります。全ての都市を一巡するのに最も短い経路を求めるプログラムを作成せよ。'(_出発都市,_最短経路) :- グラフを読み取る(LL), グラフを作成する(LL,_都市数), findmin([_距離合計,_巡回ならび],( 巡回(_都市数,_出発都市,_巡回ならび,_距離合計)), [_距離合計,_最短経路]). グラフを読み取る(LL) :- get_split_lines('gr17.txt',[' '],LL). グラフを作成する([_都市数|R],_都市数) :- グラフを作成する([],R). グラフを作成する([],_) :- !. グラフを作成する([_|Ln],[L|R]) :- length(Ln,_都市N), 都市間の距離定義([],Ln,L), グラフを作成する(Ln,R). 都市間の距離定義(Ln,Ln,[]) :- !. 都市間の距離定義(Ln,_都市N,[A|R]) :- !. length(Ln,_都市M), assertz(都市間の距離(_都市N,_都市M,A)), assertz(都市間の距離(_都市M,_都市N,A)), 都市間の距離定義([_|Ln],_都市N,R). 巡回(_都市数,_出発都市,_巡回ならび,_距離合計) :- 都市間の距離(_出発都市,_隣接都市,_距離), 巡回(_都市数,_出発都市,_隣接都市,[_出発都市],_巡回ならび,_距離,_距離合計). 巡回(_都市数,_出発都市,_出発都市,_巡回ならび,_巡回ならび,距離合計,_距離合計) :- sort(_巡回ならび,_巡回ならびの二), length(_巡回ならびの二,_都市数),!. 巡回(_都市数,_出発都市,_隣接都市,_巡回ならびの一,_巡回ならび,距離合計の一,_距離合計) :- 都市間の距離(_隣接都市,_隣接都市の二,_距離), \+(append(_,[_隣接都市の二,_隣接都市|_],_巡回ならびの一)), _距離合計の二 is _距離合計の一 + _距離, 巡回(_都市数,_出発都市,_隣接都市の二,[_隣接都市|_巡回ならびの一],_巡回ならび,_距離合計の二,_距離合計). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/508 # # [1] 授業単元:画像処理 # [2] 問題文(含コード&リンク): すべての点について、もっとも近い点通しを結ぶ。 このとき、結んだ線分の # 長さの合計を求めなさい。 # すべての点について、もっとも近い点通しを結ぶ。このとき、結んだ線分の長さの合計を求めなさい。(_すべての点ならび,_長さの合計) :- すべての点について、もっとも近い点通しを結ぶ。(_すべての点ならび,_すべての点ならび,_重複を許す最も近い線分ならび), 重複する線分を取り除く(_重複を許す最も近い線分ならび,_最も近い線分ならび), このとき、結んだ線分の長さの合計を求める。(_最も近い線分ならび,_長さの合計). すべての点について、もっとも近い点通しを結ぶ。([],_,[]) :- !. すべての点について、もっとも近い点通しを結ぶ。([[_点X座標,_点Y座標]|R1],_すべての点ならび,[[_点X座標,_点Y座標,_最も近い点のX座標,_最も近い点のY座標]|R3]) :- findmin([_線分の長さ,_最も近い点のX座標,_最も近い点のY座標],( append(_,[[X,Y]|_],_すべての点ならび), \+((X=_点X座標,Y=_点Y座標)), _線分の長さ is sqrt((X-_点X座標) * (X-_点X座標) + (Y-_点Y座標) * (Y-_点Y座標)), [_線分の長さ,_最も近い点のX座標,_最も近い点のY座標]), すべての点について、もっとも近い点通しを結ぶ。(R1,_すべての点ならび,[[_点X座標,_点Y座標,_最も近い点のX座標,_最も近い点のY座標]|L1],R3). 重複する線分を取り除く(_重複をゆるされた最も近い線分ならび,_最も近い線分ならび) :- findall([X1,Y1,X2,Y2],( append(L0,[[X1,Y1,X2,Y2]|R],_重複をゆるされた最も近い線分ならび), \+(append(_,[[X2,Y2,X1,Y1]|_],L0))), _最も近い線分ならび),!. このとき、結んだ線分の長さの合計を求めなさい。([[X1,Y1,X2,Y2]|R1],_長さの合計) :- _長さ is sqrl((X1-X2) * (X1-X2) + (Y1-Y2) * (Y1-Y2)), このとき、結んだ線分の長さの合計を求めなさい。(R1,_長さの合計の二), _長さの合計 is _長さ + _長さの合計の二. このとき、結んだ線分の長さの合計を求める。(_最も近い線分ならび,_長さの合計) :- findsum(_距離,( append(L0,[[X1,Y1,X2,Y2]|_],_最も近い線分ならび), _長さ is sqrt((X1-X2) * (X1-X2) + (Y1-Y2) * (Y1-Y2))), _長さの合計),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/635 # # 宜しくお願いします。 # # ・DBMS名とバージョン # Oracle10g # # ・テーブルデータ # SALES # +------------+------+ # | 日時 | 数量 | # +------------+------+ # | 2010/03/01 | 1 | # | 2010/03/02 | 1 | # | 2010/03/23 | 2 | # | 2010/03/24 | 1 | # | 2010/04/05 | 5 | # | 2010/04/05 | 2 | # +------------+------+ # # ・欲しい結果 # テーブルから週毎(月曜基準)に合算した数量を取得したい。 # 但しデータがない週も0で表示したい。 # # ・説明 # 週毎に合算した数量は以下のSQLで取得できましたが、 # データがない週も表示する方法がわかりません。 # # SELECT NEXT_DAY(TO_DATE(日時,'yyyy/mm/dd'),2)-7 AS 日時, SUM(数量) # FROM SALES # GROUP BY NEXT_DAY(TO_DATE(日時,'yyyy/mm/dd'),2)-7; # # 宜しくお願い致します。 'テーブルから週毎(月曜基準)に合算した数量を取得したい。但しデータがない週も0で表示したい。'(_週区間下限,_週区間上限,_数量合計) :- 週グループを生成(_週区間ならび), 週区間ごとに数量を合計する(_週区間ならび,_週合計ならび), append(_,[[_週区間下限,_週区間上限,_数量合計]|R],_集合計ならび). 週グループを生成(_週区間ならび) :- findmin(_日時,'SALES'(_日時,_),_日付下限), findmax(_日時,'SALES'(_日時,_),_日付上限), 最も直前の月曜日(_日付下限,_日付下限の一), 最も直前の月曜日(_日付上限,_日付上限の一), findall([_月曜日,_直後の日曜日],( 週の切り取り(_日付下限の一,_月曜日,_日付上限の一), 直後の日曜日(_月曜日,_直後の日曜日)), _週区間ならび), length(_週区間ならび,Len),!. 週区間ごとに数量を合計する([],[]) :- !. 週区間ごとに数量を合計する([[_週区間下限,_週区間上限]|R1],[[_週区間下限,_週区間上限,_数量合計]|R2]) :- findsum(_数量,( 'SALES'(_日時,_数量),_数量合計), _日時 @>= _週区間下限, _日時 @=< _週区間上限), _数量合計), 週区間ごとに数量を合計する(R1,R2). 週の切り取り(_月曜日,_月曜日,_日付上限) :- _月曜日 @=< _日付上限. 週の切り取り(_月曜日の一,_月曜日,_日付上限) :- 直後の月曜日(_月曜日の一,_直後の月曜日), 週の切り取り(_直後の月曜日,_月曜日,_日付上限). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/627 # # mysql 5.0 (windows 7)です # 下記のようなテーブルで # amountの合計の最も多いidを取得するsql文がわかりません… # # select id, sum(amount) as "total" from orders # group by id order by total desc limit 1; # # とすれば一応取得できたのですが、別の方法はないでしょうか # 初歩的な質問ですみません… # # +------+------+--------+ # | id | name | amount | # +------+------+--------+ # | 1 | C1 | 3 | # | 1 | C2 | 10 | # | 2 | C2 | 5 | # | 2 | C3 | 10 | # | 3 | C3 | 2 | # +------+------+--------+ # 'amountの合計の最も多いidを取得する'(_最もaumout合計が多いid) :- find_sum_max([_id,_値],orders(_id,_,_値),[_最もamount合計が多いid,_最大合計値]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % _合計値 は任意の変数として、利用者が設定する find_sum_max([_鍵,_値],P,_合計値,_合計値の条件,[_鍵,_最大合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmax(_合計値,( append(_,[[_鍵,_合計値]|_],L), _合計値の条件), _最大合計値), append(_,[[_鍵,_最大合計値]|_],L). find_sum_min([_鍵,_値],P,_合計値,_合計値の条件,[_鍵,_最小合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmin(_合計値,( append(_,[[_鍵,_合計値]|_],L), _合計値の条件), _最小合計値), append(_,[[_鍵,_最小合計値]|_],L). find_sum_max([_鍵,_値],P,[_鍵,_最大合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmax(_合計値,append(_,[[_鍵,_合計値]|_],L),_最大合計値), append(_,[[_鍵,_最大合計値]|_],L). find_sum_min([_鍵,_値],P,[_鍵,_最小合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmin(_合計値,append(_,[[_鍵,_合計値]|_],L),_最小合計値), append(_,[[_鍵,_最小合計値]|_],L). 単一(A,P) :- findsetof(A,P,L),!, append(_,[A|_],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/508 # # [1] 授業単元:数値計算 # [2] 問題文(含コード&リンク):窓移動法 # j=|k|kbitの整数。 # while j>=0 do # if k[j]=0 then q=2*q j=j-1 # else do # tをj-t+1<=5とk[t]=1である最少の整数とする。 # h[j]=(k[j]k[j-1]..k[t])_2 # q=(2^(j-t+1))*q+p # j=t-1 # # [5] その他の制限: 多倍長演算ライブラリ使用 # 巨大整数から奇数整数ビット列を抜き出すプログラムです 窓移動法(_多倍長整数,_窓のビット長,_抜き出されたビット列) :- 二進数(_多倍長整数,_二進数ビットならび), length(L,_窓のビット長), findmin(L,( append(_,L,_,_二進数ビットならび)), _抜き出されたビット列). 二進数(_十進数値,_二進数値ならび) :- 二進数値の逆順ならび(_十進数値,_二進数値の逆順ならび), reverse(_二進数値の逆順ならび,_二進数値ならび). 二進数値の逆順ならび(0,[]) :- !. 二進数値の逆順ならび(N,[M|R]) :- M is N mod 2, N1 is N // 2, 二進数値の逆順ならび(N1,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/412 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):空欄を埋てください。 # 問題はユーザーから入力された100個の点の座標について、最も近い二点間距離を表示するプログラムを作る。 # # #include<stdio.h> # #include<math.h> # #define NUM 100 # typedef struct { double x, y; } COODINATE; # double dist(COODINATE, COODINATE); # void main(void) # { int i, j; # COODINATE p[NUM]; # double min; # for (i = 0; i < NUM; i++) # scanf("%lf %lf",&p[i].x, &p[i].y); # # 空欄 # # printf("Shotest distance = %lf\n", min); # } # double dist(COODINATE p0, COODINATE p1) # {return(sqrt((p0.x - p1.x) * (p0.x - p1.x) + # (p0.y - p1.y) * (p0.y - p1.y))); # } # #  [3.1] OS: windows コンパイラ名とバージョン: bcc32 言語: C # [4] 期限:今週中 # # お願いします。 # # ユーザーから入力された100個の点の座標について、最も近い二点間距離を表示する :- '100個の点をランダムに生成する'([],_100個の点の座標ならび), ユーザーから入力された100個の点の座標について、最も近い二点間距離を表示する(_100個の点の座標ならび). ユーザーから入力された100個の点の座標について、最も近い二点間距離を表示する(_100個の点の座標ならび) :- findall(N,for(1,N,100),L1), findmin(_距離,( 組み合わせ(L1,2,[Nth1,Nth2]), list_nth(Nth1,_100個の点の座標ならび,[X1,Y1]), list_nth(Nth2,_100個の点の座標ならび,[X2,Y2]), _距離 is sqrt((X2-X1)^2+(Y2-Y1)^2)), _最も近い二点間距離), write_formatted('最も近い二点間距離は %t です\n',[_最も近い二点間距離]). '100個の点をランダムに生成する'(L,L) :- length(L,100),!. '100個の点をランダムに生成する'(L1,L) :- X is random mod 300, Y is random mod 300, \+(append(_,[[X,Y]|_],L1)), '100個の点をランダムに生成する'([[X,Y]|L1],L),!. '100個の点をランダムに生成する'(L1,L) :- '100個の点をランダムに生成する'(L1,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/508 # # http://www.dotup.org/uploda/www.dotup.org1202425.jpg # # ItemTable # ItemID,ItemName,Price,Maker # -------------------------------------- # '0001','Red bollpen',150,'Four Diamond' # '0002','Sharp pen',250,'Four Diamond' # '0003','Metal ruler',200,'Pantel' # '0004','Eraser',100,'Four Diamond' # '0005','Pencil box',150,'Pantel' # # 対応するPrologコードを書きなさい。 # % テーブル構造(関係名,_属性番号,_属性名,_属性名の変数文字列表現). テーブル構造('ItemTable',1,'ItemID','ItemID'). テーブル構造('ItemTable',2,'ItemName','ItemName'). テーブル構造('ItemTable',3,'Price','Price'). テーブル構造('ItemTable',4,'Maker','Maker'). 'ItemTable'('0001','Red bollpen',150,'Four Diamond'). 'ItemTable'('0002','Sharp pen',250,'Four Diamond'). 'ItemTable'('0003','Metal ruler',200,'Pantel'). 'ItemTable'('0004','Eraser',100,'Four Diamond'). 'ItemTable'('0005','Pencil box',150,'Pantel'). # Q1. # SELECT MIN(Price) AS Result FROM ItemTable; 'Q1'(Result) :- findmin(Price,'ItemTable'(_,_,Price,_),MIN_Price). # Q2. # SELECT ItemName,Price FROM ItemTable WHERE Price >= 250; 'Q2'(ItemName,Price) :- 'ItemTable'(_,ItemName,Price,_), Price >= 250. # Q3. # SELECT MAX(Price) FROM ItemTable WHERE Maker = 'Pantel'; 'Q3'(MAX_Price) :- findmax(Price,'ItemTable'(_,_,Price,_),MAX_Price). # Q4. # SELECT MIN(Price) FROM ItemTable WHERE Price > (SELECT MIN(Price) FROM ItemTable); 'Q4'(Min_Price) :- findmin(Price,'ItemTable'(_,_,Price,_),MIN_Price1), findmin(Price,( 'ItemTable'(_,_,Price,_),Price > MIN_Price1)), MIN_Price). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/777 # # ・A, B, C, D・・・列があり、全て文字型(レコードは数値のみ)。 # A, Bがプライマリーキー # ・以下の条件を満たすA, Bの値 # Cが'04', '08', '09'のいずれかの行の中で、 # Dの値が最小のレコードのA, Bの組み合わせのうち、 # Bの値が最小のレコードすべてのA, B # ・説明 # 自分でsqlを作成すると、同じSELECT文が何度も出てきてしまいます。 # もっと重複のない文にできないのでしょうか? # select A, MIN(B) as B from # ( # (select A, B, D from foo where C in ('04', '08', '09')) T1 # inner join # ( # select A, MIN(D) as D from foo where C in ('04', '08', '09') # group by A # ) T2 # on T2.A = T1.A and T2.D = T1.D # ) T0 # group by A # # % ここでは要素をA,B,C,Dに限って考えることとする。 'Cが''04'', ''08'', ''09''のいずれかの行の中で、 Dの値が最小のレコードのA, Bの組み合わせのうち、 Bの値が最小のレコードすべてのA, B'(A,B) :- findmin([D,B],( foo(A,B,C,D),member(C,['04','08','09'])), L), foo(A,B,C,D), member([D,B],L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/5 # # 次の問題を解くプログラムを再帰を使って実装せよ。 # 問題 コインの種類として、1,5,8,10,15の5種類を与える。 # に対して、最小枚数のコインでmを支払うときの枚数を求めよ。 # 金種([15,10,8,5,1]). '与えられた金額に対して、最小枚数のコインでmを支払うときの枚数を求める'(_m,_最小コイン枚数) :- 金種(_金種ならび), sort(_金種ならび,_整列された金種ならび), reverse(_整列された金種ならび,_大きい順の金種ならび), 最小コイン枚数(_大きい順の金種ならび,_m,_最小コイン枚数). 最小コイン枚数([],X,X) :- !. 最小コイン枚数([N|R],U,X) :- M is U mod N, Y is U // N, U2 is U + M, 最小コイン枚数(R,U2,M,Y,X). 最小コイン枚数(R,U,M,Y,X) :- M =< 2,X is Y + M,!. 最小コイン枚数(R,U,M,Y,X) :- M >= 5,最小コイン枚数(R,M,Z),X is Y + Z,!. 最小コイン枚数(R,U,M,Y,4) :- M >= 3,M =< 4,U2 is U + M,最小コイン枚数(R,U2,Z),X is Z + Y - 1,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '与えられた金額に対して、最小枚数のコインでmを支払うときの枚数を求めよ。'(_m,_最小コイン枚数) :- 暫定候補枚数を得る(_m,[15,10,8,5,1],0,_暫定候補枚数), 最小枚数のコインでmを支払うときの枚数(_暫定候補枚数,_最小コイン枚数). 暫定候補枚数を得る(0,_,X,X) :- !. 暫定候補枚数を得る(_m,[P|R1],S1,X) :- D is _m // P, _m_2 is _m mod P, S2 is S + D, 暫定候補枚数を得る(_m_2,S2,X). 最小枚数のコインでmを支払うときの枚数(_m,_暫定候補枚数,_最小コイン枚数) :- findmin(_枚数,暫定候補枚数より少ない支払いを探す(_m,_暫定候補枚数,_枚数),_最小コイン枚数),!. 暫定候補枚数より少ない支払いを探す(_m,_暫定候補枚数,_枚数) :- for(0,A,_暫定候補枚数), for(0,B,_暫定候補枚数), for(0,C,_暫定候補枚数), for(0,D,_暫定候補枚数), for(0,E,_暫定候補枚数), _m is 1 * A + 5 * B + 8 * C + 10 * D + 15 * E, _枚数 A + B + C + D + e, _枚数 =< _暫定候補枚数. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/139 # # 期間の抽出について相談です。 # 元情報 # ID    START    END # -----   -----    ----- # 10    2010/06/01  2010/06/12 # 10    2010/06/13  2010/06/14 # 10    2010/06/15  NULL # 20    2010/06/01  2010/06/11 # 20    2010/06/13  2010/06/15 # ↓ # 欲しい情報 # ID    START    END # -----   -----    ----- # 10    2010/06/01  NULL # 20    2010/06/01  2010/06/11 # 20    2010/06/13  2010/06/15 # # ・開始日、終了日の期間重複はなし # ・IDごとにデータを抽出。抽出単位は連続している期間の最小開始日と最大終了日 # ・期間は綺麗に連続(ID=10)することもあれば非連続することもある(ID=20) # # アドバイス願います。 # # 'IDごとにデータを抽出。抽出単位は連続している期間の最小開始日と最大終了日' :- findsetof(_ID,期間(_ID,_期間下限,_期間上限),L1), findall([_ID,_最小開始日,_最大終了日],( member(_ID,L1), findmin([_ID,_開始日],開始日(_ID,_開始日),_最小開始日), findmax([_ID,_終了日],終了日(_ID,_終了日),_最大終了日)), L). write('ID START END \n----- ----- ----- \n'), append(_,[[_ID,_Start,_End]|R],L), write_formatted('%t %t %t\n',[_ID,_Start,_End]), R = []. 開始日(_ID,_開始日) :- 期間(_ID,_開始日,_). 終了日(_ID,_終了日) :- 期間(_ID,_開始日,_終了日),\+(_終了日='NULL'). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1268699491/881 # # アルゴリズムのヒントを教えてもらえませんか。Cの実装は自分でやります。 # ネタ元は↓の課題2です。 # ttp://cdn.cs50.net/2009/fall/psets/1/hacker1.pdf # # レジに入ってる小銭の枚数(25セント、10セント、5セント、1セント)と、 # お釣りの額を入力して、釣り銭の枚数が最少となる枚数を表示する。 # 釣り銭切れも考慮する。支払い不能な時は0を返す。 # # 例えば、硬貨がそれぞれ10枚、10枚、0枚、10枚あって、41セントのお釣りの時、 # 枚数が最少となるのは10セント×4枚+1セントとなって5枚が正解。 # 単純なgreedy algorithmだと最初に25セントを使うので、 # 残り16セントを支払うのに10セント+1セント×6枚となって計8枚になってしまう。 # 'レジに入ってる小銭の枚数(25セント、10セント、5セント、1セント)と、お釣りの額を入力して、釣り銭の枚数が最少となる枚数を表示する。'(_25セント枚数,_10セント枚数,_5セント枚数,_1セント枚数,_お釣り,_最少枚数) :- findmin(_枚数,( for(0,A,_25セント枚数), for(0,B,_10セント枚数), for(0,C,_5セント枚数), for(0,D,_1セント枚数), _お釣り is 25 * A + 10 * B + 5 * C + 1 * D, _枚数 is A + B + C + D), _最少枚数),!. 'レジに入ってる小銭の枚数(25セント、10セント、5セント、1セント)と、お釣りの額を入力して、釣り銭の枚数が最少となる枚数を表示する。'(_,_,_,_,_,0) :- '釣り銭切れも考慮する。支払い不能な時は0を返す'. '釣り銭切れも考慮する。支払い不能な時は0を返す'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'レジに入ってる小銭の枚数(25セント、10セント、5セント、1セント)と、お釣りの額を入力して、釣り銭の枚数が最少となる枚数を表示する。'(_25セント枚数,_10セント枚数,_5セント枚数,_1セント枚数,_お釣り,_最少枚数) :- _25セント枚数_1 is _お釣り // _25セント枚数, 少ない方は(_25セント,_25セント_1,_25セント_2), _10セント枚数_1 is _お釣り // _10セント枚数, 少ない方は(_10セント,_10セント_1,_10セント_2), _5セント枚数_1 is _お釣り // _5セント枚数, 少ない方は(_5セント,_5セント_1,_5セント_2), findmin(_枚数,( for(0,A,_25セント枚数_2), for(0,B,_10セント枚数_2), for(0,C,_5セント枚数_2), E is 25 * A + 10 * B + 5 * C, D is _お釣り - E, _枚数 is A + B + C + D), _最少枚数),!. 'レジに入ってる小銭の枚数(25セント、10セント、5セント、1セント)と、お釣りの額を入力して、釣り銭の枚数が最少となる枚数を表示する。'(_,_,_,_,_,0) :- '釣り銭切れも考慮する。支払い不能な時は0を返す'. '釣り銭切れも考慮する。支払い不能な時は0を返す'. 少ない方は(M,N,M) :- M =< N,!. 少ない方は(M,N,N) :- M > N,!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/416 # # 数当てゲーム1 乱数当て # プログラムで一つの整数乱数aを生成し、その値を当てさせる。 # 入力された値がaより小さい時は「もっと大きいよ」、aより小さい時は「もっと小さいよ」と出力し、当てるまで繰り返しをする。 # # プログラムの例 # Srand (time(NULL)); # a=rand(); # # プログラムの最初にRAND_MAXを出力したほうがわかりやすい # # -------------------------------------------------------------------------------- # # 数当てゲーム2 0〜999の当て # 先ほどのプログラムを更に改善し、0〜999までの整数乱数を生成せよ # # --------------------------------------------------------------------------------- # # 数当てゲーム3 当て回数の制限 # さらに改善し、当てる回数に制限を付ける、例えば10回など # 当てる度に残っている回数を表示する。回数に達するとプログラム終了 :- op(250,xf,より大きい). :- op(250,xf,より小さい). 履歴を持った数当てゲームサーバ :- 乱数を引き正解値を決める(_正解), 当てずっぽの数をひとつ得る(_当てずっぽの数), 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,[]). 履歴を持った数当てゲームサーバ(_正解,_正解,_) :- write('正解です\n'),!. 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :- すでにヒントの中に含まれている(_当てずっぽの数,_履歴,_既出のヒント), write_formatted('前に %tっていったでしょ!',[_既出のヒント]), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴). 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)), _当てずっぽの数 < _正解, write('もっと大きいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), 履歴を持った数当てゲームサーバ(_次の当てずっぽの数,_正解,[_当てずっぽの数 より大きい|_履歴]). 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)), _当てずっぽの数 > _正解, write('もっと小さいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), 履歴を持った数当てゲームサーバ(_次の当てずっぽの数,_正解,[_当てずっぽの数 より小さい|_履歴]). 乱数を引き正解値を決める(_正解) :- _正解 is random. 当てずっぽ数をひとつ得る(_当てずっぽ数) :- repeat, write('さあ、なににしますか? '), get_integer(_当てずっぽ数),!. すでにヒントの中に含まれている(_当てずっぽの数,[N より大きい|R],Max より大きい) :- _当てずっぽの数 < _正解, \+(_当てずっぽの数 > N), findmax(M,member(M より大きい,[N より大きい|R]),Max),!. すでにヒントの中に含まれている(_当てずっぽの数,[N より小さい|R],Min より小さい) :- _当てずっぽの数 > _正解, \+(_当てずっぽの数 < N), findmin(M,member(M より小さい,[N より小さい|R]),Min),!. すでにヒントの中に含まれている(_当てずっぽの数,[_|R],X) :- すでにヒントの中に含まれている(_当てずっぽの数,R,X). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '乱数を引き正解値(0〜999)を決める'(_正解値) :- _乱数値 is random, 乱数の範囲を0〜999に絞り込む(_乱数値,_正解値). 乱数の範囲を0〜999に絞り込む(_乱数値,_絞り込まれた乱数値) :- _絞り込まれた乱数値 is _乱数値 mod 1000. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :- op(250,xf,より大きい). :- op(250,xf,より小さい). ゲームオーバーとなる解答限界数(10). 履歴を持った回数制限付き数当てゲームサーバ :- ゲームオーバーとなる解答限界数(Max), 乱数を引き正解値(0〜999)を決める(_正解), 当てずっぽの数をひとつ得る(_当てずっぽの数), 履歴を持った数当てゲームサーバ(1,Max,_当てずっぽの数,_正解,[]). 履歴を持った回数制限付き数当てゲームサーバ :- 履歴を持った回数制限付き数当てゲームサーバ. 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_,_,_) :- M > Max, write_formatted('選択した数が%t個を越えました ゲームオーバー!!\n'),!. 履歴を持った回数制限付き数当てゲームサーバ(_,_,_正解,_正解,_) :- write('正解です\n'),!. 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_当てずっぽの数,_正解,_履歴) :- すでにヒントの中に含まれている(_当てずっぽの数,_履歴,_既出のヒント), write_formatted('前に %tっていったでしょ!',[_既出のヒント]), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), M2 is M + 1, 履歴を持った数当てゲームサーバ(M2,Max,_当てずっぽの数,_正解,_履歴). 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)), _当てずっぽの数 < _正解, write('もっと大きいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), M2 is M + 1, 履歴を持った回数制限付き数当てゲームサーバ(M2,Max,_次の当てずっぽの数,_正解,[_当てずっぽの数 より大きい|_履歴]). '履歴を持った回数制限付き数当てゲームサーバ(M,Max,_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれてる(_当てずっぽの数,_履歴)), _当てずっぽの数 > _正解, write('もっと小さいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), M2 is M + 1, 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_次の当てずっぽの数,_正解,[_当てずっぽの数 より小さい|_履歴]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 当てずっぽクライアント :- Maxint is maxint, ある範囲の乱数を得る(1,Maxint,Random), 当てずっぽクライアント(1,Maxint,Random). 当てずっぽクライアント(M,Maxint,Random) :- write('選択値 = %t\n',[Random]), get_line(Line), 当てずっぽクライアント(Line,M,Maxint,Random), 当てずっぽクライアント(Random,Maxint,Random2). 当てずっぽクライアント('もっと大きいよ',M,Maxint,Random,Maxint,Random,Random2) :- ある範囲の乱数を得る(Random,Maxint,Random2),!. 当てずっぽクライアント('もっと小さいよ',M,Maxint,M,Random,Random,Random2) :- ある範囲の乱数を得る(M,Random,Random2), ある範囲の乱数を得る(_下限,_上限,_乱数) :- J is _上限 - _下限 + 1, _乱数 is random mod J + _下限. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/509 # # 【 課題 】 # http://nojiriko.asia/jpeg/841.jpg # 図の有向グラフの最短経路を求めよ。 # 初期値がMAXでアルゴリズムを作れ。 有向グラフ(1,2,50). 有向グラフ(1,3,80). 有向グラフ(2,4,15). 有向グラフ(2,3,20). 有向グラフ(4,5,30). 有向グラフ(3,4,10). 有向グラフ(3,5,15). 有向グラフの最短経路(_頂点1,_頂点2,_最短距離,_最短経路) :-   findmin([_距離,_経路],有向グラフの距離と経路(_出発点,_終点,_距離,_経路),[_ 最短距離,_最短経路]). 有向グラフの距離と経路(_頂点,_頂点,0,[_頂点]) :- !. 有向グラフの距離と経路(_頂点1,_頂点2,_距離,[_頂点1|R]) :-   有向グラフ(_頂点1,_頂点3,_距離1),   有向グラフの距離と経路(_頂点3,_頂点2,_距離2,R),   _距離 is _距離2 + _距離1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 有向グラフ(1,2,50). 有向グラフ(1,3,80). 有向グラフ(2,4,15). 有向グラフ(2,3,20). 有向グラフ(4,5,30). 有向グラフ(3,4,10). 有向グラフ(3,5,15). 有向グラフの最短経路(_頂点1,_頂点2,_最短距離,_最短経路) :- findmin([_距離,_経路],有向グラフの距離と経路(_出発点,_終点,_距離,_経路),[_ 最短距離,_最短経路]). 有向グラフの距離と経路(_頂点,_頂点,0,[_頂点]) :- !. 有向グラフの距離と経路(_頂点1,_頂点2,_距離,[_頂点1|R]) :- 有向グラフ(_頂点1,_頂点3,_距離1), 有向グラフの距離と経路(_頂点3,_頂点2,_距離2,R), _距離 is _距離2 + _距離1. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/200 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # A組、B組、C組にそれぞれn人の生徒がいて、 # A組の生徒が一列に並んでいる。 # このとき、B組の生徒をA組の生徒の隣に並ばせたいが # なるべく隣同士で身長に差がないようにしたい。 # どうやって計算すればいいでしょう? # 加えて、C組の生徒もB組の隣に並ばせたい場合はどうすれば? # (身長の配列) double height_a[n], height_b[n], height_c[n]; なるべく隣同士で身長に差のない並び方(La,Lb,N,LbX) :- findmin([S,L],ならび候補(La,Lb,N,L,S),Min), Min = [_,LbX],!. ならび候補(La,Lb,N,L,S) :- 順列(Lb,N,L), findsum(U,(for(1,M,N),list_nth(M,La,A),list_nth(M,L,B),U is (B-A) ^ 2),S). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/509 # # 【 課題 】 # http://nojiriko.asia/jpeg/841.jpg # 図の有向グラフの最短経路を求めよ。 # 初期値がMAXでアルゴリズムを作れ。 有向グラフ(1,2,50). 有向グラフ(1,3,80). 有向グラフ(2,4,15). 有向グラフ(2,3,20). 有向グラフ(4,5,30). 有向グラフ(3,4,10). 有向グラフ(3,5,15). 有向グラフの最短経路(_頂点1,_頂点2,_最短距離,_最短経路) :-   findmin([_距離,_経路],有向グラフの距離と経路(_出発点,_終点,_距離,_経路),[_ 最短距離,_最短経路]). 有向グラフの距離と経路(_頂点,_頂点,0,[_頂点]) :- !. 有向グラフの距離と経路(_頂点1,_頂点2,_距離,[_頂点1|R]) :-   有向グラフ(_頂点1,_頂点3,_距離1),   有向グラフの距離と経路(_頂点3,_頂点2,_距離2,R),   _距離 is _距離2 + _距離1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 有向グラフ(1,2,50). 有向グラフ(1,3,80). 有向グラフ(2,4,15). 有向グラフ(2,3,20). 有向グラフ(4,5,30). 有向グラフ(3,4,10). 有向グラフ(3,5,15). 有向グラフの最短経路(_頂点1,_頂点2,_最短距離,_最短経路) :- findmin([_距離,_経路],有向グラフの距離と経路(_出発点,_終点,_距離,_経路),[_ 最短距離,_最短経路]). 有向グラフの距離と経路(_頂点,_頂点,0,[_頂点]) :- !. 有向グラフの距離と経路(_頂点1,_頂点2,_距離,[_頂点1|R]) :- 有向グラフ(_頂点1,_頂点3,_距離1), 有向グラフの距離と経路(_頂点3,_頂点2,_距離2,R), _距離 is _距離2 + _距離1. % 以下のサイトは % % ユーザインターフェイス述語は findmin/3 です。 % % findmin/3 は集約述語である。findall/3の感覚で第一引数に指定した項の最小値を第三引数に得る。 % findmin(V,P,Max) :- findall(V,P,L), min(L,Max). min([A|R],X) :- min(R,A,X) . min([],X,X) :- !. min([A|R],B,X) :- A @< B, min(R,A,X). min([_|R],A,X) :- A @>= B, min(R,A,X). % 以下はオマケ。 % *** user: findmin / 5 *** findmin([],P,V,P,V) :- !. findmin([[P,V]|R1],P1,V1,_最大項,_最大値) :- number(V), number(V1), !, V =< V1, findmin(R1,P,V,_最大項,_最大値). findmin([[P,V]|R1],P1,V1,_最大項,_最大値) :- number(V), number(V1), !, V < V1, findmin(R1,P1,V1,_最大項,_最大値). findmin([[P,V]|R1],P1,V1,_最大項,_最大値) :- V @=< V1, findmin(R1,P,V,_最大項,_最大値). findmin([[P,V]|R1],P1,V1,_最大項,_最大値) :- V @> V1, findmin(R1,P1,V1,_最大項,_最大値). % *** user: findmin / 4 *** findmin(_集約項,_項,_最大項,_最大値) :- findall([_項,_集約項],_項,_値ならび), _値ならび = [[P,V]|R], findmin(_値ならび,P,V,_最大項,_最大値).