このディレクトリの索引

% 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1197620454/699 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク): # 1.acをabbに置き換える最小のレーヴェンシュタイン距離を求めよ # 2.1をもとにdiffツールを作成せよ。なお、出力時の形式は以下のとおりとする # ac # ^ # # abb # || # レーベンシュタイン距離(_文字列1,_文字列2,_レーベンシュタイン距離) :- 編集距離(_文字列1,_文字列2,_レーベンシュタイン距離). 編集距離(S1,S2,_編集距離) :- atom_chars(S1,LX), atom_chars(S2,LY), ならびの編集距離(LX,LY,LZ), length(LZ,_編集距離),!. ならびの編集距離(LX,LY,LZ) :- 'ならびの編集距離の停止条件はLXかLYが[]'(LX,LY,LZ). ならびの編集距離(LX,LY,LZ) :- ならびの編集距離の共通部分を取り除いていく(LX,LY,LZ). ならびの編集距離(LX,LY,LZ) :- append(LX,LY,LZ). 'ならびの編集距離の停止条件はLXかLYが[]'([],LY,LY). 'ならびの編集距離の停止条件はLXかLYが[]'(LX,[],LX). ならびの編集距離の共通部分を取り除いていく(LX,LY,LZ) :- ならびの編集距離の共通部分と残りの部分に分離する(LX,LY,L0,L1,L2,L01,L21), append(L01,L21,LYR), append(L0,LZ_1,LZ), ならびの編集距離(L2,LYR,LZ_1). ならびの編集距離の共通部分と残りの部分に分離する(LX,LY,L0,L1,L2,L01,L21) :- append(L0,L1,L2,LX), \+(L1 = []), append(L01,L1,L21,LY). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは マンハッタン距離(_座標点_1,_座標点_2,_マンハッタン距離) :- _マンハッタン距離 = _2点間の距離, 'マンハッタン距離またはL1-距離は、幾何学における距離概念のひとつ。 各座標の差(の絶対値)の総和を2点間の距離とする。'(_座標点_1,_座標点_2,_2点間の距離). 'マンハッタン距離またはL1-距離は、幾何学における距離概念のひとつ。 各座標の差(の絶対値)の総和を2点間の距離とする。'(_座標点_1,_座標点_2,_2点間の距離) :- 総和(_各座標の差,( '各座標の差(の絶対値)の'(_座標点_1,_座標点_2,_各座標の差)),_2点間の距離). 総和(A,P,_総和) :- findall(A,P,L), sum_list(L,_総和). '各座標の差(の絶対値)の'(M,N,_各座標の差) :- 'M,Nが数であればその差の絶対値を取る'(M,N,_各座標の差). '各座標の差(の絶対値)の'(_座標点_1,_座標点_2,_各座標の差) :- 各座標が複合項であれば対応する座標要素の差を取る(_座標点_1,_座標点_2,_各座標の差). 各座標が複合項であれば対応する座標要素の差を取る((M,S1),(N,S2),_各座標の差) :- 'M,Nが数であればその差の絶対値を取る'(M,N,_各座標の差). 各座標が複合項であれば対応する座標要素の差を取る((_,S1),(_,S2),_各座標の差) :- '各座標の差(の絶対値)の'(S1,S2,_各座標の差). 'M,Nが数であればその差の絶対値を取る'(M,N,_各座標の差) :- number(M), number(N), _各座標の差 is abs(M - N). % 以下のサイトは 250 ToastXToast 要約  何種類かのパンがあり,種類ごとにちょうどよい焼き時間が決まっている.その焼き時間より短ければ生焼けで,長ければ焦げてしまう.またどの種類のパンかは見た目にはわからない.生焼けのパンと焦げたパンがいくつか与えられていて.それぞれのパンの焼いた時間がわかっている.また,それぞれの種類で生焼けのパンと焦げたパンが少なくとも1枚ずつある事もわかっている.パンの種類として考えられるもののうち最小値を求めよ.  生焼けのパンの数と焦げたパンの数は1以上50以下,それぞれのパンの焼いた時間は1以上1000000以下.同じ時間だけ焼いたパンは2枚以上存在しない事は保証されている. 方針 生焼けのパンを○,焦げたパンを●で表し,焼き時間を横軸で表すと,一般的な状況では ○○ー○○○○○○ーーーー○○ーー○ー○○○ーー ーー●ーーーーーー●●●●ーー●●ー●ーーー●● の用になっている.この場合, ○○ー○○○○○○ーーーー○○ーー○ー○○○ーー ーーーーーーーーーーーーーーーーーーーーーー●● と ○○ーーーーーーーーーーーーーーーーーーーーーー ーー●ーーーーーー●●●●ーー●●ー●ーーーーー とわけることができ,答えは2種類とわかる.あとはこの状況にならないのはいつかを考えればよい. コード例 #include #include #include #include #include using namespace std; class ToastXToast { public: int bake(vector under, vector over) { sort(under.begin(), under.end()); sort(over.begin(), over.end()); if(over[0] <= under[0] ) return -1; if(under[under.size()-1] >= over[over.size()-1]) return -1; if(over[0] > under[under.size()-1]) return 1; else return 2; } }; 500 KingdomXCitiesandVillage 要約  座標平面上の格子点に町がいくつかと村がいくつか配置されている.次のアルゴリズムで,すべての村をいずれかの町と道路でつなぐ. はじめ,すべての村は町につながっていない 町につながっていない村をランダムに一つ選ぶ (それを sv(selected village) とする) 町 or「既に町につながっている村」のなかで sv に(ユークリッド距離で)最も近いものを選び,その2つを道路でつなぐ.最も近いものが複数ある場合はランダムに選ぶ. sv を「既に町につながっている村」に昇格させる. これをすべての村がつながるまで繰り返す.  道路の総距離の期待値を答えよ.町と村の数はそれぞれ1以上50以下,それぞれの町,村の座標は0以上1000000以下.同じ箇所に複数の町や村はない事は保証されている. 方針  まず期待値の加法性から,各々の村から延ばす道路の距離の期待値を合計すればよいので,一つの村に注目する(以降その村をvとし,その村から最も近い町をcとする).v とつながる可能性のある村は,v との距離が vc 間より短いもののみである.まずそれだけを取り出し v との距離が短い順に v[1], v[2], ・・・, v[k] とする.v と c がつながるのは,v が v[1], v[2], ・・・v[k] のいずれよりも先に選ばれたときなので,その確率は 1/(k+1).v と v[j] がつながるのは「 v[j]が vより先に選ばれ,かつvが v[1], v[2], ・・・, v[j-1]より先に選ばれる」ときである(前者が満たされないとv[j]は村とつながっていないのでそもそも候補に入らず,また後者が満たされないとvはv[1]・・・v[j-1]のいずれかとつながってしまう).v[j+1]・・・v[k]には制限がないので考慮しなくても良い.j+1個の球を横一列に並べる事を考えると,条件を満たすのは最左にv[j], その隣に v ,残りj-1個にv[1]・・・v[j-1]を自由に並べかえるものなので,その場合の数は(j - 1)!,全事象は(j + 1)! なので,求める確率は(j-1)! / (j+1)! = 1/ ( j * (j + 1) ) . #include #include #include #include #include #include using namespace std; typedef long long ll; ll dist2(int ax, int ay, int bx, int by){ return (ll)(ax - bx) * (ax - bx) + (ll)(ay - by) * (ay - by) ; } class KingdomXCitiesandVillages { public: double determineLength(vector cx, vector cy, vector vx, vector vy) { int n = cx.size(); int m = vx.size(); double ans = 0; for(int i = 0;i kouho; for(int j = 0;j% 以下のサイトは # 駒場東大前から下北沢までの距離を求めなさい 隣接する駅間の距離(井の頭線,渋谷,神泉,500). 隣接する駅間の距離(井の頭線,神泉,駒場東大前,900). 隣接する駅間の距離(井の頭線,駒場東大前,池ノ上,1000). 隣接する駅間の距離(井の頭線,池ノ上,下北沢,600). 隣接する駅間の距離(井の頭線,下北沢,新代田,500). 井の頭線の駒場東大前から下北沢までの距離(_井の頭線の駒場東大前から下北沢までの距離) :- 二駅間の距離(井の頭線,駒場東大前,下北沢,_井の頭線の駒場東大前から下北沢までの距離). 二駅間の距離(_,_到達駅,_到達駅,0). 二駅間の距離(_路線,_駅,_到達駅,_到達駅までの距離) :- 隣接する駅間の距離(_路線,_駅,_次の駅,_次の駅までの距離), 二駅間の距離(_路線,_次の駅,_到達駅,_次の駅から到達駅までの距離), _到達駅までの距離 is _次の駅から到達駅までの距離 + _次の駅までの距離. % 以下のサイトは # 駒場東大前から下北沢までの距離を求めなさい 井の頭線の隣接する駅間の距離(渋谷,神泉,500). 井の頭線の隣接する駅間の距離(神泉,駒場東大前,900). 井の頭線の隣接する駅間の距離(駒場東大前,池ノ上,1000). 井の頭線の隣接する駅間の距離(池ノ上,下北沢,600). 井の頭線の隣接する駅間の距離(下北沢,新代田,500). 井の頭線の駒場東大前から下北沢までの距離(_井の頭線の駒場東大前から下北沢までの距離) :- 井の頭線の駅間の距離(駒場東大前,下北沢,_井の頭線の駒場東大前から下北沢までの距離). 井の頭線の駅間の距離(_到達駅,_到達駅,0). 井の頭線の駅間の距離(_駅,_到達駅,_到達駅までの距離) :- 井の頭線の隣接する駅間の距離(_駅,_次の駅,_次の駅までの距離), 井の頭線の駅間の距離(_次の駅,_到達駅,_次の駅から到達駅までの距離), _到達駅までの距離 is _次の駅から到達駅での距離 + _次の駅までの距離. % 以下のサイトは # Prolog 抽象プログラミングの例。 # 具象プログラミングでは述語名に現れていた情報が引数に移動する。 # # 駒場東大前から下北沢までの距離を求めなさい 隣接する駅間の距離(井の頭線,渋谷,神泉,500). 隣接する駅間の距離(井の頭線,神泉,駒場東大前,900). 隣接する駅間の距離(井の頭線,駒場東大前,池ノ上,1000). 隣接する駅間の距離(井の頭線,池ノ上,下北沢,600). 隣接する駅間の距離(井の頭線,下北沢,新代田,500). 井の頭線の駒場東大前から下北沢までの距離(_井の頭線の駒場東大前から下北沢までの距離) :- 二駅間の距離(井の頭線,駒場東大前,下北沢,_井の頭線の駒場東大前から下北沢までの距離). 二駅間の距離(_,_到達駅,_到達駅,0). 二駅間の距離(_路線,_駅,_到達駅,_到達駅までの距離) :- 隣接する駅間の距離(_路線,_駅,_次の駅,_次の駅までの距離), 二駅間の距離(_路線,_次の駅,_到達駅,_次の駅から到達駅までの距離), _到達駅までの距離 is _次の駅から到達駅での距離 + _次の駅までの距離. % 以下のサイトは # 駒場東大前から下北沢までの距離を求めなさい 井の頭線の隣接する駅間の距離(渋谷,神泉,500). 井の頭線の隣接する駅間の距離(神泉,駒場東大前,900). 井の頭線の隣接する駅間の距離(駒場東大前,池ノ上,1000). 井の頭線の隣接する駅間の距離(池ノ上,下北沢,600). 井の頭線の隣接する駅間の距離(下北沢,新代田,500). 井の頭線の駒場東大前から下北沢までの距離(_井の頭線の駒場東大前から下北沢までの距離) :- 井の頭線の駒場東大前から下北沢までの距離(駒場東大前,下北沢,_井の頭線の駒場東大前から下北沢までの距離). 井の頭線の駒場東大前から下北沢までの距離(_到達駅,_到達駅,0). 井の頭線の駒場東大前から下北沢までの距離(_駅,_到達駅,_到達駅までの距離) :- 井の頭線の隣接する駅間の距離(_駅,_次の駅,_次の駅までの距離), 井の頭線の駒場東大前から下北沢までの距離(_次の駅,_到達駅,_次の駅から到達駅までの距離), _到達駅までの距離 is _次の駅から到達駅での距離 + _次の駅までの距離. % 以下のサイトは # 駒場東大前から下北沢までの距離を求めなさい 井の頭線の駅間距離(渋谷,神泉,500). 井の頭線の駅間距離(神泉,駒場東大前,900). 井の頭線の駅間距離(駒場東大前,池ノ上,1000). 井の頭線の駅間距離(池ノ上,下北沢,600). 井の頭線の駅間距離(下北沢,新代田,500). 駒場東大前から下北沢までの距離(_駒場東大前から下北沢までの距離) :- 駒場東大前から下北沢までの距離(駒場東大前,_駒場東大前から下北沢までの距離). 駒場東大前から下北沢までの距離(下北沢,0). 駒場東大前から下北沢までの距離(_駅,_下北沢までの距離) :- 井の頭線の駅間距離(_駅,_次の駅,_次の駅までの距離), 駒場東大前から下北沢までの距離(_次の駅,_次の駅から下北沢までの距離), _下北沢までの距離 is _次の駅から下北沢までの距離 + _次の駅までの距離. % 以下のサイトは % 駒場東大前から下北沢までの距離を求めなさい 井の頭線(渋谷,500). 井の頭線(神泉,900). 井の頭線(駒場東大前,1000). 井の頭線(池ノ上,600). 井の頭線(下北沢,500). 井の頭線(新代田,500). 駒場東大前から下北沢までの距離(_駒場東大前から下北沢までの距離) :- 井の頭線リスト(_井の頭線リスト), 駒場東大前から下北沢の区間の距離リスト(_井の頭線リスト,_駅間距離のリスト), sum_list(_駅間距離のリスト,_駒場東大前から下北沢までの距離). 井の頭線リスト(_井の頭線リスト) :- findall((_駅,_次の駅までの距離),井の頭線(_駅,_次の駅までの距離),_井の頭線リスト). 駒場東大前から下北沢の区間の距離リスト(_井の頭線リスト,_駅間距離のリスト) :- _駒場東大前から下北沢までのリスト = [(駒場東大前,_)|_], append(_,_駒場東大前から下北沢までのリスト,[(下北沢,_)|_],_井の頭線リスト), findall(_距離,member((_,_距離),_駒場東大前から下北沢までのリスト),_駅間距離のリスト). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは yes. % 駒場東大前から下北沢までの距離を求めなさい 井の頭線(渋谷,500). 井の頭線(神泉,900). 井の頭線(駒場東大前,1000). 井の頭線(池ノ上,600). 井の頭線(下北沢,500). 井の頭線(新代田,500). 駒場東大前から下北沢までの距離(_駒場東大前から下北沢までの距離) :- findall((_駅,_次の駅までの距離),井の頭線(_駅,_次の駅までの距離),_井の頭線リスト), append(_,[(駒場東大前,_距離_1)|R],[(下北沢,_)|_],_井の頭線リスト), findall(_距離,member((_,_距離),[(駒場東大前,_距離_1)|R]),_駅間距離のリスト), sum_list(_駅間距離のリスト,_駒場東大前から下北沢までの距離). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 駒場東大前から下北沢までの距離を求めなさい 井の頭線(渋谷,神泉,500). 井の頭線(神泉,駒場東大前,900). 井の頭線(駒場東大前,池ノ上,1000). 井の頭線(池ノ上,下北沢,600). 井の頭線(下北沢,新代田,500). 駒場東大前から下北沢までの距離(_距離) :- 駒場東大前から下北沢までの距離(駒場東大前,_距離). 駒場東大前から下北沢までの距離(下北沢,0). 駒場東大前から下北沢までの距離(_駅,_距離) :- 井の頭線(_駅,_次の駅,_次の駅までの距離), 駒場東大前から下北沢までの距離(_次の駅,_次の駅から下北沢までの距離), _距離 is _次の駅から下北沢までの距離 + _次の駅までの距離. % データベースの集約問題。 % 駒場東大前から下北沢までの距離を求めなさい 井の頭線(渋谷,500). 井の頭線(神泉,900). 井の頭線(駒場東大前,1000). 井の頭線(池ノ上,600). 井の頭線(下北沢,500). 駒場東大前から下北沢までの距離(_距離) :-   findall((_駅,_次の駅までの距離),井の頭線(_駅,_次の駅までの距離),L),   駒場東大前までを読み飛ばす(L,L2),   駒場東大前から下北沢までの距離(L2,_距離). 駒場東大前までを読み飛ばす([(駒場東大前,_次の駅までの距離)|R],[(駒場東大前,_次の駅までの距離)|R]). 駒場東大前までを読み飛ばす([_|R1],R2) :-   駒場東大前までを読み飛ばす(R1,R2). 駒場東大前から下北沢までの距離([(下北沢,_)|_],0). 駒場東大前から下北沢までの距離([(_,_次の駅までの距離)|R],_下北沢までの距離) :-   駒場東大前から下北沢までの距離(R,_次の駅から下北沢までの距離),   _下北沢までの距離 is _次の駅までの距離 + _次の駅から下北沢までの距離. % 以下のサイトは # # 出典 :: 竹渕瑛一氏のtwitter 20140417より # 各駅下り(_駅) :- 下り起点駅(_下り起点駅), 下り終点駅(_下り起点駅,_下り終点駅), 各駅下り(_下り起点駅,_下り終点駅,_駅). 下り起点駅(_下り起点駅) :- 駅が隣接する(_下り起点駅,_),!. 下り終点駅(_駅,_下り終点駅) :- 駅が隣接する(_駅,_次の駅), 下り終点駅(_次の駅,_下り終点駅). 下り終点駅(_下り終点駅,_下り終点駅). 各駅上り(_駅) :- 上り終点駅(_上り終点駅), 上り起点駅(_上り終点駅,_下り起点駅), 各駅上り(_上り起点駅,_上り終点駅,_駅). 上り終点駅(_上り終点駅) :- 駅が隣接する(_上り終点駅,_),!. 上り起点駅(_駅,_上り起点駅) :- 駅が隣接する(_駅,_次の駅), 上り起点駅(_次の駅,_上り起点駅). 上り起点駅(_上り起点駅,_上り起点駅). 各駅下り(_起点駅,_終点駅,_終点駅) :- 起点駅が終点駅に到達(_起点駅,_終点駅),!. 各駅下り(_起点駅,_終点駅,_駅) :- 駅が隣接する(_起点駅,_駅_2), この先に終点駅がある(_起点駅,_終点駅), 各駅下り(_起点駅,_終点駅,_駅_2,_駅). 各駅下り(_駅,_,_駅) :- \+(駅が隣接する(_駅,_)). 各駅下り(_駅,_,_,_駅). 各駅下り(_,_終点駅,_駅_2,_駅) :- 各駅下り(_駅_2,_終点駅,_駅). この先に終点駅がある(_,_終点駅) :- var(_終点駅),!. この先に終点駅がある(_起点駅,_) :- var(_起点駅),!. この先に終点駅がある(_終点駅,_終点駅) :- !. この先に終点駅がある(_駅,_終点駅) :- 駅が隣接する(_駅,_次の駅), この先に終点駅がある(_次の駅,_終点駅). 各駅上り(_起点駅,_終点駅,_終点駅) :- 起点駅が終点駅に到達(_起点駅,_終点駅),!. 各駅上り(_起点駅,_終点駅,_駅) :- 駅が隣接する(_駅_2,_起点駅), この前に終点駅がある(_起点駅,_終点駅), 各駅上り(_起点駅,_終点駅,_駅_2,_駅). 各駅上り(_駅,_,_駅) :- \+(駅が隣接する(_,_駅)). 各駅上り(_駅,_,_,_駅). 各駅上り(_,_終点駅,_駅_2,_駅) :- 各駅上り(_駅_2,_終点駅,_駅). この前に終点駅がある(_,_終点駅) :- var(_終点駅),!. この前に終点駅がある(_起点駅,_) :- var(_起点駅),!. この前に終点駅がある(_終点駅,_終点駅) :- !. この前に終点駅がある(_駅,_終点駅) :- 駅が隣接する(_次の駅,_駅), この前に終点駅がある(_次の駅,_終点駅). 起点駅が終点駅に到達(_起点駅,_終点駅) :- var(_起点駅), var(_終点駅),!,fail. 起点駅が終点駅に到達(_起点駅,_終点駅) :- var(_起点駅),!,fail. 起点駅が終点駅に到達(_起点駅,_終点駅) :- \+(var(_起点駅)), \+(var(_終点駅)), _起点駅 = _終点駅,!. 駅(相模大野). 駅(東林間). 駅(中央林間). 駅(南林間). 駅(鶴間). 駅(大和). 駅(桜ヶ丘). 駅(高座渋谷). 駅(長後). 駅(湘南台). 駅(六会日大前). 駅(善行). 駅(藤沢本町). 駅(藤沢). 駅(本鵠沼). 駅(鵠沼海岸). 駅(片瀬江ノ島). 駅が隣接する(相模大野, 東林間). 駅が隣接する(東林間, 中央林間). 駅が隣接する(中央林間, 南林間). 駅が隣接する(南林間, 鶴間). 駅が隣接する(鶴間, 大和). 駅が隣接する(大和, 桜ヶ丘). 駅が隣接する(桜ヶ丘, 高座渋谷). 駅が隣接する(高座渋谷, 長後). 駅が隣接する(長後, 湘南台). 駅が隣接する(湘南台, 六会日大前). 駅が隣接する(六会日大前, 善行). 駅が隣接する(善行, 藤沢本町). 駅が隣接する(藤沢本町, 藤沢). 駅が隣接する(藤沢, 本鵠沼). 駅が隣接する(本鵠沼, 鵠沼海岸). 駅が隣接する(鵠沼海岸, 片瀬江ノ島). /* 各駅下り(相模大野, 東林間). 各駅下り(東林間, 中央林間). 各駅下り(中央林間, 南林間). 各駅下り(南林間, 鶴間). 各駅下り(鶴間, 大和). 各駅下り(大和, 桜ヶ丘). 各駅下り(桜ヶ丘, 高座渋谷). 各駅下り(高座渋谷, 長後). 各駅下り(長後, 湘南台). 各駅下り(湘南台, 六会日大前). 各駅下り(六会日大前, 善行). 各駅下り(善行, 藤沢本町). 各駅下り(藤沢本町, 藤沢). 各駅下り(藤沢, 本鵠沼). 各駅下り(本鵠沼, 鵠沼海岸). 各駅下り(鵠沼海岸, 片瀬江ノ島). 各駅上り(片瀬江ノ島, 鵠沼海岸). 各駅上り(鵠沼海岸, 本鵠沼). 各駅上り(本鵠沼, 藤沢). 各駅上り(藤沢, 藤沢本町). 各駅上り(藤沢本町, 善行). 各駅上り(善行, 六会日大前). 各駅上り(六会日大前, 湘南台). 各駅上り(湘南台, 長後). 各駅上り(長後, 高座渋谷). 各駅上り(高座渋谷, 桜ヶ丘). 各駅上り(桜ヶ丘, 大和). 各駅上り(大和, 鶴間). 各駅上り(鶴間, 南林間). 各駅上り(南林間, 中央林間). 各駅上り(中央林間, 東林間). 各駅上り(東林間, 相模大野). */ 急行停車駅(相模大野). 急行停車駅(藤沢). 急行停車駅(片瀬江ノ島). 急行停車駅(長後). 急行停車駅(本鵠沼). 急行停車駅(鵠沼海岸). 急行停車駅(南林間). 急行停車駅(大和). 急行停車駅(南林間). 急行停車駅(湘南台). 駅間距離(相模大野, 東林間, 1.7). 駅間距離(東林間, 中央林間, 1.3). 駅間距離(中央林間, 南林間, 1.5). 駅間距離(南林間, 鶴間, 0.6). 駅間距離(鶴間, 大和, 2.5). 駅間距離(大和, 桜ヶ丘, 2.2). 駅間距離(桜ヶ丘, 高座渋谷, 2.0). 駅間距離(高座渋谷, 長後, 2.2). 駅間距離(長後, 湘南台, 1.8). 駅間距離(湘南台, 六会日大前, 1.5). 駅間距離(六会日大前, 善行, 2.4). 駅間距離(善行, 藤沢本町, 1.6). 駅間距離(藤沢本町, 藤沢, 1.8). 駅間距離(藤沢, 本鵠沼, 1.5). 駅間距離(本鵠沼, 鵠沼海岸, 1.3). 駅間距離(鵠沼海岸, 片瀬江ノ島, 1.7). 駅のならびを得る([_起点となる駅|L]) :- 駅が隣接する(_起点となる駅,_),!, findall(_駅,駅が隣接する(_,_駅),L). 全ての急行区間(_始点駅,_終点駅,_急行区間駅ならび,_急行停車駅ならび) :- 駅のならびを得る(_駅のならび), 全ての急行区間(_駅のならび,_始点駅,_終点駅,_急行区間駅ならび,_急行停車駅ならび). 全ての急行区間(_終点駅,_始点駅,_急行区間駅ならび,_急行停車駅ならび) :- 駅のならびを得る(_駅のならび), reverse(_駅のならび,_反転した駅のならび), 全ての急行区間(_反転した駅のならび,_終点駅,_始点駅,_急行区間駅ならび,_急行停車駅ならび). 全ての急行区間(_駅のならび,_始点駅,_終点駅,_急行区間駅ならび,_急行停車駅ならび) :- append(L1,[_始点駅|R],_駅のならび), last(R,_終点駅), _急行区間駅ならび = [_始点駅|R], findall(_駅,( member(_駅,[_始点駅|R]), 急行停車駅(_駅)), _急行停車駅ならび). last([A],A) :- !. last([_|R],A) :- last(R,A). 急行を使って停車駅を最小にする(_出発点駅,_到着点駅,_駅のならび,_出発駅から急行区間までの各駅停車駅ならび,_急行区間駅ならび,_終点急行停止駅から到着駅までの各駅停車駅ならび) :- append(L1,_急行区間駅ならび,L2,_駅のならび), 全ての急行区間(_,_,_急行区間駅ならび,_), 出発駅から急行区間までの駅ならび(_出発駅,L1,_出発駅から急行区間までの各駅停車駅ならび), 終点急行停止駅から到着駅までの各駅停車駅ならび(_到着点駅,L2,_終点急行停止駅から到着駅までの各駅停車駅ならび). 出発駅から急行区間までの駅ならび(_出発駅,L1,_出発駅から急行区間までの各駅停車駅ならび) :- append(_,[_出発駅|_出発駅から急行区間までの各駅停車駅ならび],L1), \+((member(_駅,_出発駅から急行区間までの各駅停車駅ならび),急行停車駅(_駅))). 終点急行停止駅から到着駅までの各駅停車駅ならび(_到着点駅,L2,_終点急行停止駅から到着駅までの各駅停車駅ならび) :- append(_終点急行停止駅から到着駅までの駅ならび,[_到着点駅|_],L2), \+((member(_駅,_終点急行停止駅から到着駅までの駅ならび),急行停車駅(_駅))). 区間距離(_起点駅,_終点駅,_区間距離) :- 区間距離(_起点駅,_終点駅,0.0,_区間距離),!. 区間距離(_起点駅,_終点駅,_区間距離) :- 区間距離(_終点駅,_起点駅,_区間距離). 区間距離(_終点駅,_終点駅,_区間距離,_区間距離) :- !. 区間距離(_駅,_終点駅,_区間距離_1,_区間距離) :- 駅間距離(_駅,_次の駅,_駅間距離), _区間距離_2 is _区間距離_1 + _駅間距離, 区間距離(_次の駅,_終点駅,_区間距離_2,_区間距離). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 象は鼻が長い(名詞+「は」+名詞+「が」+形容詞)、を一つ登録しておけば・・・ # # 彼は目が大きい # 中国は人口が多い # 俺は成績が悪い # 新幹線は速度が速い # 我が家は金が無い # 東大は試験が難しい # ダチョウは足が長い # 熊は腕力が強い # 彼女は髪が短い # ロシアは国土が広い # ソニーは経営が悪い # 零戦は航続距離が長い # 松屋は牛飯が旨い # 原発はコストが高い # 高速道路は危険が多い # 国道一号線は渋滞が激しい # スピッツは鳴き声がうるさい # 北朝鮮は食糧事情が厳しい # # ・・・このように、同じ構造の文をいつくもいくつも抽出して、まとめて整理することはできないのだろうか。 # 文候補(彼は目が大きい). 文候補(中国は人口が多い). 文候補(俺は成績が悪い). 文候補(新幹線は速度が速い). 文候補(我が家は金が無い). 文候補(東大は試験が難しい). 文候補(ダチョウは足が長い). 文候補(熊は腕力が強い). 文候補(彼女は髪が短い). 文候補(ロシアは国土が広い). 文候補(ソニーは経営が悪い). 文候補(零戦は航続距離が長い). 文候補(松屋は牛飯が旨い). 文候補(原発はコストが高い). 文候補(高速道路は危険が多い). 文候補(国道一号線は渋滞が激しい). 文候補(スピッツは鳴き声がうるさい). 文候補(北朝鮮は食糧事情が厳しい). % sPLIT/3 '名詞+「は」+名詞+「が」+形容詞 形の定義'(_文) :- sPLIT(_文,[は,が],[_名詞1,は,_名詞2,が,_形容詞]), assertz(名詞([_名詞1|R1],名詞,_名詞1,R1)), assertz(名詞([_名詞2|R2],名詞,_名詞2,R2)), assertz(形容詞([_形容詞1|R3],形容詞,形容詞1,R3)). '文候補から 名詞+「は」+名詞+「が」+形容詞 形構文を定義する' :- 文候補(_文), '名詞+「は」+名詞+「が」+形容詞 形の定義'(_文), fail. '文候補から 名詞+「は」+名詞+「が」+形容詞 形構文を定義する'. '名詞+「は」+名詞+「が」+形容詞'(_文,[[名詞,_名詞1],[後置詞,は],[名詞,_名詞2],[後置詞,が],[形容詞,_形容詞1]],_残りの文) :- 名詞(_文,名詞,_名詞1,_残りの文_1), 後置詞(_残りの文_1,後置詞,は,_残りの文_2), 名詞(_残りの文_2,名詞,_名詞2,_残りの文_3), 後置詞(_残りの文_3,後置詞,が,_残りの文_4), 形容詞(_残りの文_4,形容詞,_形容詞1,_残りの文). 名詞句(_文,[名詞句,[[名詞,_名詞1],[後置詞,_後置詞1]]],_残りの文) :- 名詞(_文,名詞,_名詞1,_残りの文_1), 後置詞(_残りの文_1,後置詞,_後置詞1,_残りの文). 後置詞([は|R],後置詞,は,R). 後置詞([が|R],後置詞,が,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/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',[_塔])). % 以下のサイトは ハミング距離(_a,_b,_ハミング距離) :- length(_a,_n), length(_b,_n), findsum(X,( nth1(_k,_a,A), nth1(_k,_b,B), X is abs(A-B)), _ハミング距離). % 以下のサイトは ダイクストラ法による最短距離探索(_出発点,_距離,_最短経路,_確定集合) :- _確定集合_1 = [[_出発点,0,[_出発点]]], 初期の未確定集合を得る(_出発点,_未確定集合), ダイクストラ法による最短距離探索(_確定集合_1,_未確定集合,_確定集合). 初期の未確定集合を得る(_出発点,_初期未確定集合) :- setof([_出発点,9999,[]],[_点,_隣接点,_距離,_出発点] ^ ( 経路(_点,_隣接点,_距離), \+(_点 = _出発点)), _初期未確定集合). ダイクストラ法による最短距離探索(_確定集合,[],_確定集合). ダイクストラ法による最短距離探索([[_直前に確定した点,_距離,_経路]|R],_未確定集合_1,_確定集合) :- 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_距離,_経路,_未確定集合_1,_未確定集合_2), 未確定集合から最小距離点を抜き取る(_未確定集合_2,_最小距離点,_最小距離,_最小距離点の経路,_未確定集合_3), 確定集合に追加(_最小距離点,_最小距離,_最小経路点の経路,[[_直前に確定した点,_距離,_経路]|R],_確定集合_2), ダイクストラ法による最短距離探索(_確定集合_2,_未確定集合_3,_確定集合). 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_距離,_経路,_未確定集合_1,_未確定集合_2) :- findall([_隣接点,_距離], 隣接点を得る(_直前に確定した点,_未確定集合,_隣接点,_距離), LL), 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_距離,_経路,LL,_未確定集合_1,_未確定集合_2). 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,[[_隣接点,_距離]|R],_未確定集合_1,_未確定集合_2) :- 未確定集合の更新(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,_隣接点,_距離,_未確定集合_1,_未確定集合_3), 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,R,_未確定集合_3,_未確定集合_2). 隣接点を得る(_直前に確定した点,_未確定集合,_隣接点,_距離) :- 経路(_直前に確定した点,_隣接点,_距離), member([_隣接点,_,_],_未確定集合). 未確定集合の更新(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,_隣接点,_距離,_未確定集合_1,_未確定集合_2) :- _距離_2 is _直前に確定した点までの距離 + _距離, append(L1,[[_隣接点,_距離_1,_経路_1]|L2],_未確定集合_1), _距離_1 > _距離_2, append(L1,[[_隣接点,_距離_1,[_隣接点|_直前に確定した点までの経路]]|L2],_未確定集合_2),!. 未確定集合の更新(_,_,_,_,_,_未確定集合,_未確定集合). 未確定集合から最小距離点を抜き取る(_未確定集合_1,_最小距離点,_最小距離,_最小距離点の経路,_未確定集合_2) :- append(L1,[[_最小距離点,_最小距離,_最小距離の経路]|L2],_未確定集合_1), forall(member([_,_距離_1,_],L1),_距離_1 >= _最小距離), forall(member([_,_距離_2,_],L1),_距離_2 >= _最小距離), append(L1,L2,_未確定集合_2),!. 確定集合に追加(_点,_距離,_経路,_確定集合_1,[[_点,_距離,_経路]|_確定集合_1]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/705 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # [3] 環境 # 問題1メイン関数でキーボードから二つの整数n1とn2を読み込み,それらをexponent関数を呼び出して, # n1のn2乗を計算し,結果をメイン関数で表示するプログラムを書きなさい. # <実行例> # 二つの整数を入力してください. # n1 = 5 # n2 = 2 # 5の2乗は25です. # 問題2 5人の点数を読み込んでいき、その最高点を表示するプログラムを作成しなさい。 # 問題3 円の面積の一覧表を計算するプログラムを作成しなさい。 # <実行結果> # 半径 --- 面積 # 1.0 --- 3.14 # 1.1 --- 3.80 # 1.2 --- 4.52 # 1.3 --- 5.31 # 問題4 球の体積を計算するプログラムを作成しなさい。 # 実行例 # 体積 = 1766.25 # [3.1] OS: unix #  [3.2] コンパイラ名とバージョン: gcc #  [3.3] 言語: C # [4] 期限:2月19日 # [5] その他の制限: なし # よろしくお願いします。 球の体積を計算する(_球の半径,_球の体積) :- count(( between(1,100000,_), '3座標を乱数で得る'(X,Y,Z), 原点からの距離が球の半径の範囲(X,Y,Z)), _球の半径の範囲内の個数), _球の体積 is (_球の半径の範囲内の個数 / 100000) * (_球の半径 ^ 3) * 8. '3座標を乱数で得る'(X,Y,Z) :- X is random(1001) / 1000, Y is random(1001) / 1000, Z is random(1001) / 1000. 原点からの距離が球の半径の範囲(X,Y,Z) :- sqrt(X ^ 2 + Y ^ 2 + Z ^ 2) =< 1.0. count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum(L,Sum) :- sum(L,0,Sum). sum([],Sum,Sum) :- !. sum([N|R],Sum_1,Sum) :- Sum_2 is Sum_1 + N, sum(R,Sum_2,Sum). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/841 # # お願いします。 # # [1] 授業単元: 課題 # [2] 問題文 # # 1. 10*10(=100)の領域に、ランダムに30個の点を配置する # 2. ランダムに2点 A, B を選ぶ # 3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ # # '1. 10*10(=100)の領域に、ランダムに30個の点を配置する 2. ランダムに2点 A, B を選ぶ 3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ' :- '1. 10*10(=100)の領域に、ランダムに30個の点を配置する'(L), '2. ランダムに2点 A, B を選ぶ'(L,_A,_B), '3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ'(L,_A,_B). '1. 10*10(=100)の領域に、ランダムに30個の点を配置する'(L) :- fidnall((_x,_y),( between(1,30,_), _x is (random(10000) + 1) / 1000, _y is (random(10000) + 1) / 1000), L). '2. ランダムに2点 A, B を選ぶ'(L,_A,_B) :- ランダムに点を選ぶ(L,_A), ランダムに点を選ぶ(L,_B), \+(_A = _B),!. '2. ランダムに2点 A, B を選ぶ'(L,_A,_B) :- '2. ランダムに2点 A, B を選ぶ'(L,_A,_B). ランダムに点を選ぶ(L,_点) :- R is random(30), nth0(R,L,_点). '3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ'(L,(_x1,_y1),(_x2,_y2)) :- 距離10以内にある点を経由し移動可能(L,(_x,_y),(_x1,_y1),(_x2,_y2)), writef('点(%t,%t)で可能です\n',[_x,_y]). '3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ'(_,_,_) :- write('可能な点はありません\n'). 距離10以内にある点を経由し移動可能(L,(_x,_y),(_x1,_y1),(_x2,_y2)) :- 経由する点候補を得る(L,(_x,_y),(_x1,_y1),(_x2,_y2)), 距離10以内にある((_x,_y),(_x1,_y1),(_x2,_y2)). 経由する点候補を得る(L,(_x,_y),(_x1,_y1),(_x2,_y2)) :- member((_x,_y),L), \+((_x,_y)=(_x1,_y1)), \+((_x,_y)=(_X2,_y2)). 距離10以内にある((_x,_y),(_x1,_y1),(_x2,_y2)) :- sqrt((_x - _x1) * (_x - _x1) + (_y - _y1) * (_y - _y1)) + sqrt((_x - _x2) * (_x - _x2) + (_y - _y2) * (_y - _y21)) =< 10.0. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/212 # # 質問です。 # 開始地点を表すカラム start_point と終了地点を表すカラム end_point があり、その距離は # ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point))) # で計算できます。 # それで、 # ・select で距離を計算するときは round() するけど # ・order by でソートする時は round() なしで(つまりfloatのまま)ソートする # ということをしたいです。 # SQLはこんな感じになるんですけど、 # select round(ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point)))) as distance # from geo_data # order by ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point))) # これだと距離の計算が二重に行われてしまい、無駄です。 # これを、距離の計算を二重に行わずに意図した通りのSQLを発行することはできますか。 # よろしくお願いします。 # 環境:PostgreSQL 9.1 # テーブル定義(geo,1,id). テーブル定義(geo,2,start_point). テーブル定義(geo,3,end_point). '開始地点を表すカラム start_point と終了地点を表すカラム end_point があり、その距離を小さい順に取り出す(距離を四捨五入)'(_start_point,_end_point,_distance) :- テーブル述語を得る(geo,[start_point,end_point],[_start_point,_end_point],P), 四捨五入しない距離で整列(P,_start_point,_end_point,L2), member([_distance_1,_start_point,_end_point],L2), 四捨五入(_distance_1,_distance). テーブル述語を得る(_テーブル名,_カラムならび,_カラム変数ならび,_テーブル述語) :- findall(_,( テーブル定義(テーブル名,_,_)), L, カラム変数ならびを得る(_テーブル名,_カラムならび,_カラム変数ならび,L), _テーブル述語 =.. [_テーブル名|L]. カラム変数ならびを得る(_テーブル名,_カラムならび,[],L) :- !. カラム変数ならびを得る(_テーブル名,[_カラム|R1],[_カラム変数|R2],L) :- テーブル定義(_テーブル名,Nth,_カラム), nth1(Nth,L,_カラム変数), カラム変数ならびを得る(_テーブル名,R1,R2,L). 四捨五入しない距離で整列(P,_start_point,_end_point,L2) :- findall([_distance,_start_point,_end_point],( _テーブル述語, _distance is _end_point - _start_point), L1), 整列(L1,L2). 四捨五入(A,B) :- B is round(A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/899 # # 1.C言語 変数・型・条件文 # 2.問題3個 # ・キーボードから実数を1つ入力し10倍した数の整数部だけをint 型の変数に代入して表示す # るプログラムを作成せよ。 # ・キーボードから実数を1つ入力し10倍した数の一の位を表示するプログラムを作成せよ。 # ・平面上の点の座標(2つの実数) をキーボードから入力し、その点が原点を中心とする半径1の # 円の中にある場合には中、 外にある場合には外と表示するプログラムを作成せよ。 # 3.Linux gcc C言語 # 4.本日中 # よろしくお願いします。 # # '平面上の点の座標(2つの実数) をキーボードから入力し、その点が原点を中心とする半径1の円の中にある場合には中、 外にある場合には外と表示する' :- 実数を得る(実数,_x), 実数を得る(実数,_y), 'その点が原点を中心とする半径1の円の中にある場合には中、 外にある場合には外と表示する'(_x,_y). 'その点が原点を中心とする半径1の円の中にある場合には中、 外にある場合には外と表示する'(_x,_y) :- _その点の原点からの距離 is sqrt(_x * _x + _y * _y), 'その点が原点を中心とする半径1の円の中にある場合には中、 外にある場合には外と表示する'(_その点の原点からの距離). 'その点が原点を中心とする半径1の円の中にある場合には中、 外にある場合には外と表示する'(_その点の原点からの距離) :- _その点の原点からの距離 =< 1.0, writef('%t\n',[中]). 'その点が原点を中心とする半径1の円の中にある場合には中、 外にある場合には外と表示する'(_その点の原点からの距離) :- _その点の原点からの距離 < 1.0, writef('%t\n',[外]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/526 # # 【質問テンプレ】 # [1] 授業単元: プログラミング演習 # [2] 問題文 # 巡回セールスマン問題の厳密解を総当たり法で求めるプログラムを、再帰呼び出しを用いて作成せよ # (例)  1  2  3  4  5  6 #   1 0 470 550 420 300 200 #   2 470 0 800 900 770 560 #   3 550 800 0 330 650 750 #   4 420 900 330 0 450 400 #   5 300 770 650 450 0 180 #   6 200 560 750 400 180 0 # 隣接(東京,埼玉,50). 隣接(埼玉,東京,50). 隣接(埼玉,群馬,80). 隣接(群馬,埼玉,80). 隣接(群馬,栃木,60). 隣接(栃木,群馬,60). 隣接(栃木,茨木,65). 隣接(茨木,栃木,65). 隣接(茨木,千葉,65). 隣接(千葉,茨木,65). 隣接(千葉,東京,20). 隣接(東京,千葉,20). 隣接(埼玉,茨木,90). 隣接(茨木,埼玉,90). '巡回セールスマン問題の厳密解を総当たり法で求めるプログラムを、再帰呼び出しを用いて作成せよ'(_出発都市,LL) :- setof(_都市,[_都市,_隣接都市,_距離] ^ ( 隣接(_都市,_隣接都市,_距離)),_都市ならび), length(_都市ならび,_都市数), '巡回セールスマン問題の厳密解を総当たり法で求める'(_都市数,_出発都市,[],LL). '巡回セールスマン問題の厳密解を総当たり法で求める'(_都市数,_出発都市,LL,LL) :- setof(_都市_2,[_都市,_都市_2,_距離,LL] ^ ( member([_都市,_都市_2,_距離],LL)),LL2), length(LL2,_都市数). '巡回セールスマン問題の厳密解を総当たり法で求める'(_都市数,_出発都市,L1,L) :- 隣接(_出発都市,_隣接都市,_距離), \+(member([_出発都市,_隣接都市,_],L1)), \+(member([_隣接都市,_出発都市,_],L1)), '巡回セールスマン問題の厳密解を総当たり法で求める'(_都市数,_隣接都市,[[_出発都市,_隣接都市,_距離]|L1],L). % 以下のサイトは # 出典:: 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/300 # # [1] 授業単元:ランダム・ウォーク # [2] 問題文(含コード&リンク): # http://ime.nu/www.kent-web.com/pubc/book/test/uploader/uploader.cgi?mode=downld&no=5450 # # 課題1 2次元ランダムウォーク # ここでは、x座標、y座標とも変化量をN(0,1)に従う独立な正規乱数とすること # で、等方的な2次元ランダム・ウォークを考える。 # # 1.原点を出発点とする等方的な2次元ランダム・ウォークを1000ステップ実行す # るプログラムを作成せよ。各ステップごとに座標値を表示し、 1000ステップの # 軌跡を描け。 # # 2.同じく原点を出発点とする等方的な2次元ランダム・ウォークを1000ステップ # 実行するプログラムを作成せよ。ただし、今度のプログラムは 1000ステップ後 # の原点からの距離を表示するものとする。 # このプログラムを1000回実行し、原点からの距離をヒストグラムにせよ。ヒスト # グラムに描く範囲や階級幅は得られた値から適当と思えるように適 宜設定する # こと。 # # # 課題2 幾何ランダム・ウォーク # 確率変数Xiは0.9以上1.1未満の一様乱数とする。この確率変数に対し、初期値を # 1として幾何ランダム・ウォークを実行するプログラムを作成する。 # # 1.1000ステップを実行し、各ステップごとの値の返歌をグラフにかけ。 # # 2.1000ステップの幾何ランダム・ウォークを1000回実行し、それぞれにおける最 # 終的な値のヒストグラムを作成せよ。ここでも、描く範囲や階級幅は適当に設 # 定すること。 '1000ステップを実行し、各ステップごとの値の変化をグラフに描く。確率変数Xiは0.9以上1.1未満の一様乱数とする。この確率変数に対し、初期値を1として幾何ランダム・ウォークを実行する' :- length(L,1000), findall(Z,( '確率変数Xiは0.9以上1.1未満の一様乱数とする'(L,1.0,Y), Z is truncate(40.0 * Y)), L), グラフ描画(L). '確率変数Xiは0.9以上1.1未満の一様乱数とする'([],_,_) :- !,fail. '確率変数Xiは0.9以上1.1未満の一様乱数とする'(_,Y,Y). '確率変数Xiは0.9以上1.1未満の一様乱数とする'([_|Ln],Y_1,Y) :- Y_2 is Y_1 * (0.9 + 0.2 * (random(100) + 1) / 100), '確率変数Xiは0.9以上1.1未満の一様乱数とする'(Ln,Y_2,Y). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/641 # # [2] 問題 # # 1. 等加速度直線運動を考える。初速度(m/s) と等加速度(m/s2) を入力すると、100m 先の地点に到達す # るまでの時間(s)、およびその時の速度(m/s) を表示するプログラムを作成せよ。入力される数値と # して、浮動小数点数値に対応すること。 # s秒後の速度(_初速度,_等加速度,_S,_s秒後の速度) :- s秒後の速度 is _初速度 + _等加速度 * _S. s秒後の進んだ距離(_初速度,_等加速度,_S,_s秒後に進んだ距離) :- s秒後の速度(_初速度,_等加速度,_S,_s秒後の速度), _s秒後の進んだ距離 is _初速度 * _s + (_s秒後の速度 * _s) / 2. '等加速度直線運動を考える。初速度(m/s)と等加速度(m/s2)を入力すると、100m先の地点に到達するまでの時間(s)、およびその時の速度(m/s)を表示するプログラムを作成せよ。入力される数値として、浮動小数点数値に対応すること。' :- '初速度(m/s)と等加速度(m/s^2)を入力すると'(_初速度,_等加速度), '100m 先の地点に到達するまでの時間(m/s)、およびその時の速度(m/s)を'(_初速度,_等加速度,_100m先に到達する時間,_100m先に到達した時の速度), 表示する(_初速度,_等加速度,_100m先に到達する時間,_100m先に到達した時の速度). '100m 先の地点に到達するまでの時間(m/s)、およびその時の速度(m/s)を'(_初速度,_等加速度,_100m先に到達する時間,_100m先に到達した時の速度) :- '100m先に到達する時間と到達した時の速度'(_初速度,_等加速度,0.000,_100m先に到達する時間,_100m先に到達した時の速度). '100m先に到達する時間と到達した時の速度'(_初速度,_等加速度,_s,_s,_100m先に到達した時の速度) :- s秒後の進んだ距離(_初速度,_等加速度,_S,_s秒後に進んだ距離), _s秒後に進んだ距離 >= 100.0, s秒後の速度(_初速度,_等加速度,_s,_100m先に到達した時の速度),!. '100m先に到達する時間と到達した時の速度'(_初速度,_等加速度,_s,_100m先に到達する時間,_100m先に到達した時の速度) :- _s_2 is _s + 0.001, '100m先に到達する時間と到達した時の速度'(_初速度,_等加速度,_s_2,_100m先に到達する時間,_100m先に到達した時の速度). '初速度(m/s)と等加速度(m/s^2)を入力すると'(_初速度,_等加速度) :- 数を得る('初速度(m/s)',_初速度), 数を得る('等加速度(m/s^2)'_等加速度). 表示する(_初速度,_等加速度,_100m先に到達する時間,_100m先に到達した時の速度) :- writef('初速度 = %t, 等加速度 = %t の時、100m先に到達する時間は %t, 100m先に到達した時の速度は %t です。\n',[_初速度,_等加速度,_100m先に到達する時間,_100m先に到達した時の速度]). % 数を得る/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/641 # # [2] 問題 # # 1. 等加速度直線運動を考える。初速度(m/s) と等加速度(m/s2) を入力すると、100m 先の地点に到達す # るまでの時間(s)、およびその時の速度(m/s) を表示するプログラムを作成せよ。入力される数値と # して、浮動小数点数値に対応すること。 # s秒後の速度(_初速度,_等加速度,_S,_s秒後の速度) :- s秒後の速度 is _初速度 + _等加速度 * _S. s秒後の進んだ距離(_初速度,_等加速度,_S,_s秒後に進んだ距離) :- s秒後の速度(_初速度,_等加速度,_S,_s秒後の速度), _s秒後の進んだ距離 is _初速度 * _s + (_s秒後の速度 * _s) / 2. '等加速度直線運動を考える。初速度(m/s)と等加速度(m/s2)を入力すると、100m先の地点に到達するまでの時間(s)、およびその時の速度(m/s)を表示するプログラムを作成せよ。入力される数値として、浮動小数点数値に対応すること。' :- '初速度(m/s)と等加速度(m/s^2)を入力すると'(_初速度,_等加速度), '100m 先の地点に到達するまでの時間(m/s)、およびその時の速度(m/s)を'(_初速度,_等加速度,_100m先に到達する時間,_100m先に到達した時の速度), 表示する(_初速度,_等加速度,_100m先に到達する時間,_100m先に到達した時の速度). '100m 先の地点に到達するまでの時間(m/s)、およびその時の速度(m/s)を'(_初速度,_等加速度,_100m先に到達する時間,_100m先に到達した時の速度) :- '100m先に到達する時間と到達した時の速度'(_初速度,_等加速度,0.000,_100m先に到達する時間,_100m先に到達した時の速度). '100m先に到達する時間と到達した時の速度'(_初速度,_等加速度,_s,_s,_100m先に到達した時の速度) :- s秒後の進んだ距離(_初速度,_等加速度,_S,_s秒後に進んだ距離), _s秒後に進んだ距離 >= 100.0, s秒後の速度(_初速度,_等加速度,_s,_100m先に到達した時の速度),!. '100m先に到達する時間と到達した時の速度'(_初速度,_等加速度,_s,_100m先に到達する時間,_100m先に到達した時の速度) :- _s_2 is _s + 0.001, '100m先に到達する時間と到達した時の速度'(_初速度,_等加速度,_s_2,_100m先に到達する時間,_100m先に到達した時の速度). '初速度(m/s)と等加速度(m/s^2)を入力すると'(_初速度,_等加速度) :- '初速度(m/s)を入力する'(_初速度), '等加速度(m/s^2)を入力する'(_等加速度). '初速度(m/s)を入力する'(_初速度) :- write('初速度(m/s)を入力してください : '), get_line(Line), 初速度入力診断(Line,_初速度),!. '初速度(m/s) を入力する'(_初速度) :- '初速度(m/s) を入力する'(_初速度). 初速度入力診断(Line,_初速度) :- atom_to_term(Line,_初速度,_), integer(_初速度),!. 初速度入力診断(Line,_初速度) :- atom_to_term(Line,_初速度,_), float(_初速度),!. 初速度入力診断(Line,_初速度) :- writef('入力された %t からは適切な整数または浮動小数点数が得られません。再入力をお願いします。\n',[Line]), fail. '等加速度(m/s^2)を入力する'(_等加速度) :- write('等加速度(m/s^2)を入力してください : '), get_line(Line), 等加速度入力診断(Line,_等加速度),!. '等加速度(m/s)を入力する'(_等加速度) :- '等加速度(m/s) を入力する'(_等加速度). 等加速度入力診断(Line,_等加速度) :- atom_to_term(Line,_等加速度,_), integer(_等加速度),!. 等加速度入力診断(Line,_等加速度) :- atom_to_term(Line,_等加速度,_), float(_等加速度),!. 等加速度入力診断(Line,_等加速度) :- writef('入力された %t からは適切な整数または浮動小数点数が得られません。再入力をお願いします。\n',[Line]), fail. 表示する(_初速度,_等加速度,_100m先に到達する時間,_100m先に到達した時の速度) :- writef('初速度 = %t, 等加速度 = %t の時、100m先に到達する時間は %t, 100m先に到達した時の速度は %t です。\n',[_初速度,_等加速度,_100m先に到達する時間,_100m先に到達した時の速度]). % 以下のサイトは # # 目的駅までの合計距離/4 # 駅間距離/4 # 目的駅までの合計距離(_路線,_起点駅,_目的駅,_合計距離) :- 上り方向の目的駅までの合計距離(_路線,_起点駅,_目的駅,_合計距離),!. 目的駅までの合計距離(_路線,_起点駅,_目的駅,_合計距離) :- 下り方向の目的駅までの合計距離(_路線,_起点駅,_目的駅,_合計距離),!. 上り方向の目的駅までの合計距離(_路線,_目的駅,_目的駅,0) :- !. 上り方向の目的駅までの合計距離(_路線,_起点駅,_目的駅,_目的駅までの合計距離) :- 駅間距離(_路線,_次の駅,_起点駅,_駅間距離), 上り方向の目的駅までの合計距離(_路線,_次の駅,_目的駅,_次の駅から目的駅までの合計距離), _目的駅までの合計距離 is _駅間距離 + _次の駅から目的駅までの合計距離. 下り方向の目的駅までの合計距離(_路線,_目的駅,_目的駅,0) :- !. 下り方向の目的駅までの合計距離(_路線,_起点駅,_目的駅,_目的駅までの合計距離) :- 駅間距離(_路線,_起点駅,_次の駅,_駅間距離), 下り方向の目的駅までの合計距離(_路線,_次の駅,_目的駅,_次の駅から目的駅までの合計距離), _目的駅までの合計距離 is _駅間距離 + _次の駅から目的駅までの合計距離. 駅間距離(井の頭線,渋谷,神泉,500). 駅間距離(井の頭線,神泉,駒場東大前,900). 駅間距離(井の頭線,駒場東大前,池ノ上,1000). 駅間距離(井の頭線,池ノ上,下北沢,600). 駅間距離(井の頭線,下北沢,新代田,500). 駅間距離(井の頭線,新代田,東松原,500). 駅間距離(井の頭線,東松原,明大前,900). 駅間距離(井の頭線,明大前,永福町,1100). 駅間距離(井の頭線,永福町,西永福,700). 駅間距離(井の頭線,西永福,浜田山,800). 駅間距離(井の頭線,浜田山,高井戸,1200). 駅間距離(井の頭線,高井戸,富士見ヶ丘,800). 駅間距離(井の頭線,富士見ヶ丘,久我山,700). 駅間距離(井の頭線,久我山,三鷹台,1000). 駅間距離(井の頭線,三鷹台,井の頭公園,900). 駅間距離(井の頭線,井の頭公園,吉祥寺,600). 駅間距離単位(m). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/522 # # [1] 授業単元: 情報処理 # [2] 問題文 # (1) # http://ime.nu/ideone.com/F0NZo # # 上記のプログラムはオープンするファイルが abc に限られている。 # キーボードからファイル名を読み込んで、そのファイルをオープンするように変更せよ。 # # (2) 台形公式を用いて、分割数 N を増やしながら f(x) = x 3 を 0から1の範囲で積分し、 # その計算結果と解析解(1/4)の差が0.001未満になったら計算を終了するプログラムを作成せよ。 # Nの初期値を1として、Nについての for文を用いること。 # f(X,Y) :- Y is X ^ 3. '台形公式を用いて、分割数 N を増やしながら f(x) = x 3 を 0から1の範囲で積分し、その計算結果と解析解(1/4)の差が0.001未満になったら計算を終了する' :- for(1,N,maxint), '0から1の範囲で積分し'(N,_積分値), writef('N=%t: 計算結果=%t\n',[N,_積分値]), 0.001 > abs((1/4) - _積分値). '0から1の範囲で積分し'(N,_積分値) :- _区分間距離 is (1-0) / N, f(0,Y_1), '0から1の範囲で積分し'(0.0,Y_1,_区分間距離,_積分値). '0から1の範囲で積分し'(K,_,_区分間距離,0.0) :- K >= 1.0,!. '0から1の範囲で積分し'(X_1,Y_1,_区分間距離,_積分値) :- X_2 is X_1 + _区分間距離, f(X_2,Y_2), _台形面積 is (_Y_1 + _Y_2) * _区分間距離 / 2, '0から1の範囲で積分し'(X_2,Y_2,_区分間距離,_積分値_2), _積分値 is _台形面積 + _積分値_2. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/588 # # [1] プログラミング # [2] 営業キロを入力したら料金を表示するプログラムを作りなさい。なお、営業キロは小数点以下はすべて切り上げで計算されます。 #   営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。 # [3] Linux C言語 # [4] 期限:2012年1月25日 # [5] 構造体の使用は無し、運賃と距離は配列を使用する。 # # 一応途中まで作ってみましたが、dis[0]のときfare[0]の値は出ますがそれ以外が出ません。。。助けてください。 # # #include<stdio.h> # int main(void){ # int fare[100]; # int dis[100]; # int j; # float n; # # fare[0]=140; fare[1]=180; fare[2]=190; # fare[3]=230; fare[4]=320; fare[5]=400; # fare[6]=480; fare[7]=570; fare[8]=650; # fare[9]=710; fare[10]=820; fare[11]=950; # fare[12]=1110; fare[13]=1280; fare[14]=1450; # fare[15]=1620; fare[16]=1890; fare[17]=2210; # fare[18]=2520; fare[19]=2940; fare[20]=3260; # fare[21]=3570; fare[22]=3890; fare[23]=4310; # fare[24]=4620; fare[25]=4940; fare[26]=5250; # fare[27]=5460; fare[28]=5780; fare[29]=6090; # fare[30]=6300; fare[31]=6620; fare[32]=6830; # fare[33]=7140; fare[34]=7350; fare[35]=7670; # fare[36]=7980; fare[37]=8190; fare[38]=8510; # fare[39]=8720; fare[40]=9030; fare[41]=9350; # fare[42]=9560; fare[43]=9870; fare[44]=10190; # fare[45]=10500; fare[46]=10820; fare[47]=11030; # fare[48]=11340; fare[49]=11600; fare[50]=11970; # fare[51]=12290; fare[52]=12600; fare[53]=12810; # fare[54]=13130; fare[55]=13440; fare[56]=13760; # fare[57]=14070; fare[58]=14390; fare[59]=14600; # fare[60]=14910; # # dis[0]=3; dis[1]=6; dis[2]=10; # dis[3]=15; dis[4]=20; dis[5]=25; # dis[6]=30; dis[7]=35; dis[8]=40; # dis[9]=45; dis[10]=50; dis[11]=60; # dis[12]=70; dis[13]=80; dis[14]=90; # dis[15]=100; dis[16]=120; dis[17]=140; # dis[18]=160; dis[19]=180; dis[20]=200; # dis[21]=220; dis[22]=240; dis[24]=260; # dis[24]=280; dis[25]=300; dis[26]=320; # dis[27]=340; dis[28]=360; dis[29]=380; # dis[30]=400; dis[31]=420; dis[32]=440; # dis[33]=460; dis[34]=480; dis[35]=500; # dis[36]=520; dis[37]=540; dis[38]=560; # dis[39]=580; dis[40]=600; dis[41]=640; # dis[42]=680; dis[43]=720; dis[44]=760; # dis[45]=800; dis[46]=840; dis[47]=880; # dis[48]=920; dis[49]=960; dis[50]=1000; # dis[51]=1040; dis[52]=1080; dis[53]=1120; # dis[54]=1160; dis[55]=1200; dis[56]=1240; # dis[57]=1280; dis[58]=1320; dis[59]=1360; # dis[60]=1400; # 営業キロならび([3,6,10,15,20,25,30,35,40,45,50,60,70,80,90,100,120,140,160,180,200,220,240,260,280,300,320,340,360,380,400,420,440,460,480,500,520,540,560,580,600,640,680,720,760,800,840,880,920,960,1000,1040,1080,1120,1160,1200,1240,1280,1320,1360,1400]). 料金ならび([140,180,190,230,320,400,480,570,650,710,820,950,1110,1280,1450,1620,1890,2210,2520,2940,3260,3570,3890,4310,4620,4940,5250,5460,5780,6090,6300,6620,6830,7140,7350,7670,7980,8190,8510,8720,9030,9350,9560,9870,10190,10500,10820,11030,11340,11600,11970,12290,12600,12810,13130,13440,13760,14070,14390,14600]). '営業キロを入力したら料金を表示するプログラムを作りなさい。 なお、営業キロは小数点以下はすべて切り上げで計算されます。営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。' :- 営業キロならびは昇順である(_営業キロならび), 料金ならびは昇順である(_料金ならび), 営業キロはキーボードからの入力とし(_営業キロ), 料金を表示する(_営業キロ,_営業キロならび,_料金ならび). 営業キロはキーボードからの入力とし(_営業キロ) :- write('営業キロを入力して下さい : '), get_line(Line), 営業キロ入力診断(Line,_営業キロ),!. 営業キロはキーボードからの入力とし(_営業キロ) :- 営業キロはキーボードからの入力とし(_営業キロ). 営業キロ入力診断(Line,_営業キロ) :- atom_to_term(Line,_営業キロ), integer(_営業キロ), _営業キロ > 0,!. 営業キロ入力診断(Line,_営業キロ) :- writef('入力された %t から適切な営業キロが得られませんでした。再入力をお願いしす。\n',[Line]), fail. 料金を表示する(_入力営業キロ,_営業キロならび,_料金ならび) :- 料金を計算する(_入力営業キロ,_営業キロならび,_料金ならび,_料金), writef('%t 円です。\n',[_料金]). 料金を計算する(_入力営業キロ,_営業キロならび,_料金ならび,14910) :- _入力営業キロ >= 1400,!. 料金を計算する(_入力営業キロ,[_営業キロ|_],[_料金|_],_料金) :- _営業キロ > _入力営業キロ,!. 料金を計算する(_入力営業キロ,[_|R1],[_|R2],_料金) :- 料金を計算する(_入力営業キロ,R1,R2,_料金). 営業キロならびは昇順である(_営業キロならび) :- 営業キロならび(_営業キロならび_1), 営業キロならびは昇順である(_営業キロならび_1,_営業キロならび). 営業キロならびは昇順である(_営業キロならび,_営業キロならび) :- 昇順検査(_営業キロならび),!. 営業キロならびは昇順である(_営業キロならび_1,_営業キロならび) :- 整列(_営業キロならび_1,_営業キロならび). 料金ならびは昇順である(_料金ならび) :- 料金ならびは昇順である(_料金ならび_1), 料金ならびは昇順である(_料金ならび_1,_料金ならび). 料金ならびは昇順である(_料金ならび,_料金ならび) :- 昇順検査(_料金ならび),!. 料金ならびは昇順である(_料金ならび_1,_料金ならび) :- 整列(_料金ならび_1,_料金ならび),!. 昇順検査([_]) :- !. 昇順検査([A,B|R]) :- B @>= A, 昇順検査([B|R]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/588 # # [1] プログラミング # [2] 営業キロを入力したら料金を表示するプログラムを作りなさい。なお、営業キロは小数点以下はすべて切り上げで計算されます。 #   営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。 # [3] Linux C言語 # [4] 期限:2012年1月25日 # [5] 構造体の使用は無し、運賃と距離は配列を使用する。 # # 一応途中まで作ってみましたが、dis[0]のときfare[0]の値は出ますがそれ以外が出ません。。。助けてください。 # # #include<stdio.h> # int main(void){ # int fare[100]; # int dis[100]; # int j; # float n; # # fare[0]=140; fare[1]=180; fare[2]=190; # fare[3]=230; fare[4]=320; fare[5]=400; # fare[6]=480; fare[7]=570; fare[8]=650; # fare[9]=710; fare[10]=820; fare[11]=950; # fare[12]=1110; fare[13]=1280; fare[14]=1450; # fare[15]=1620; fare[16]=1890; fare[17]=2210; # fare[18]=2520; fare[19]=2940; fare[20]=3260; # fare[21]=3570; fare[22]=3890; fare[23]=4310; # fare[24]=4620; fare[25]=4940; fare[26]=5250; # fare[27]=5460; fare[28]=5780; fare[29]=6090; # fare[30]=6300; fare[31]=6620; fare[32]=6830; # fare[33]=7140; fare[34]=7350; fare[35]=7670; # fare[36]=7980; fare[37]=8190; fare[38]=8510; # fare[39]=8720; fare[40]=9030; fare[41]=9350; # fare[42]=9560; fare[43]=9870; fare[44]=10190; # fare[45]=10500; fare[46]=10820; fare[47]=11030; # fare[48]=11340; fare[49]=11600; fare[50]=11970; # fare[51]=12290; fare[52]=12600; fare[53]=12810; # fare[54]=13130; fare[55]=13440; fare[56]=13760; # fare[57]=14070; fare[58]=14390; fare[59]=14600; # fare[60]=14910; # # dis[0]=3; dis[1]=6; dis[2]=10; # dis[3]=15; dis[4]=20; dis[5]=25; # dis[6]=30; dis[7]=35; dis[8]=40; # dis[9]=45; dis[10]=50; dis[11]=60; # dis[12]=70; dis[13]=80; dis[14]=90; # dis[15]=100; dis[16]=120; dis[17]=140; # dis[18]=160; dis[19]=180; dis[20]=200; # dis[21]=220; dis[22]=240; dis[24]=260; # dis[24]=280; dis[25]=300; dis[26]=320; # dis[27]=340; dis[28]=360; dis[29]=380; # dis[30]=400; dis[31]=420; dis[32]=440; # dis[33]=460; dis[34]=480; dis[35]=500; # dis[36]=520; dis[37]=540; dis[38]=560; # dis[39]=580; dis[40]=600; dis[41]=640; # dis[42]=680; dis[43]=720; dis[44]=760; # dis[45]=800; dis[46]=840; dis[47]=880; # dis[48]=920; dis[49]=960; dis[50]=1000; # dis[51]=1040; dis[52]=1080; dis[53]=1120; # dis[54]=1160; dis[55]=1200; dis[56]=1240; # dis[57]=1280; dis[58]=1320; dis[59]=1360; # dis[60]=1400; # 料金表([[3,140],[6,180],[10,190],[15,230],[20,320],[25,400],[30,480],[35,570],[40,650],[45,710],[50,820],[60,950],[70,1110],[80,1280],[90,1450],[100,1620],[120,1890],[140,2210],[160,2520],[180,2940],[200,3260],[220,3570],[240,3890],[260,4310],[280,4620],[300,4940],[320,5250],[340,5460],[360,5780],[380,6090],[400,6300],[420,6620],[440,6830],[460,7140],[480,7350],[500,7670],[520,7980],[540,8190],[560,8510],[580,8720],[600,9030],[640,9350],[680,9560],[720,9870],[760,10190],[800,10500],[840,10820],[880,11030],[920,11340],[960,11600],[1000,11970],[1040,12290],[1080,12600],[1120,12810],[1160,13130],[1200,13440],[1240,13760],[1280,14070],[1320,14390],[1360,14600]]). '営業キロを入力したら料金を表示するプログラムを作りなさい。 なお、営業キロは小数点以下はすべて切り上げで計算されます。営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。' :- 料金表は昇順にならんでいる(_料金表), 営業キロはキーボードからの入力とし(_営業キロ), 料金を表示する'(_営業キロ,_料金表). 料金表は昇順にならんでいる(_料金表) :- 料金表(_料金表), 昇順検査(_料金表),!. 料金表は昇順にならんでいる(_料金表) :- 料金表(_料金表_1), 整列(_料金表_1,_料金表). 営業キロはキーボードからの入力とし(_営業キロ) :- write('営業キロを入力して下さい : '), get_line(Line), 営業キロ入力診断(Line,_営業キロ),!. 営業キロはキーボードからの入力とし(_営業キロ) :- '営業キロはキーボードからの入力とし'(_営業キロ). 営業キロ入力診断(Line,_営業キロ) :- atom_to_term(Line,_営業キロ), integer(_営業キロ), _営業キロ > 0,!. 営業キロ入力診断(Line,_営業キロ) :- writef('入力された %t から適切な営業キロが得られませんでした。再入力をお願いしす。\n',[Line]), fail. 料金を表示する(_営業キロ,_料金表) :- 料金を計算する(_入力営業キロ,_料金表,_料金), writef('%t 円です。\n',[_料金]). 料金を計算する(_入力営業キロ,_,14910) :- _入力営業キロ >= 1400,!. 料金を計算する(_入力営業キロ,[[_営業キロ,_料金]|_],_料金) :- _営業キロ > _入力営業キロ,!. 料金を計算する(_入力営業キロ,[_|R],_料金) :- 料金を計算する(_入力営業キロ,R,_料金). 昇順検査([_]) :- !. 昇順検査([A,B|R]) :- B @>= A, 昇順検査([B|R]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/588 # # [1] プログラミング # [2] 営業キロを入力したら料金を表示するプログラムを作りなさい。なお、営業キロは小数点以下はすべて切り上げで計算されます。 #   営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。 # [3] Linux C言語 # [4] 期限:2012年1月25日 # [5] 構造体の使用は無し、運賃と距離は配列を使用する。 # # 一応途中まで作ってみましたが、dis[0]のときfare[0]の値は出ますがそれ以外が出ません。。。助けてください。 # # #include<stdio.h> # int main(void){ # int fare[100]; # int dis[100]; # int j; # float n; # # fare[0]=140; fare[1]=180; fare[2]=190; # fare[3]=230; fare[4]=320; fare[5]=400; # fare[6]=480; fare[7]=570; fare[8]=650; # fare[9]=710; fare[10]=820; fare[11]=950; # fare[12]=1110; fare[13]=1280; fare[14]=1450; # fare[15]=1620; fare[16]=1890; fare[17]=2210; # fare[18]=2520; fare[19]=2940; fare[20]=3260; # fare[21]=3570; fare[22]=3890; fare[23]=4310; # fare[24]=4620; fare[25]=4940; fare[26]=5250; # fare[27]=5460; fare[28]=5780; fare[29]=6090; # fare[30]=6300; fare[31]=6620; fare[32]=6830; # fare[33]=7140; fare[34]=7350; fare[35]=7670; # fare[36]=7980; fare[37]=8190; fare[38]=8510; # fare[39]=8720; fare[40]=9030; fare[41]=9350; # fare[42]=9560; fare[43]=9870; fare[44]=10190; # fare[45]=10500; fare[46]=10820; fare[47]=11030; # fare[48]=11340; fare[49]=11600; fare[50]=11970; # fare[51]=12290; fare[52]=12600; fare[53]=12810; # fare[54]=13130; fare[55]=13440; fare[56]=13760; # fare[57]=14070; fare[58]=14390; fare[59]=14600; # fare[60]=14910; # # dis[0]=3; dis[1]=6; dis[2]=10; # dis[3]=15; dis[4]=20; dis[5]=25; # dis[6]=30; dis[7]=35; dis[8]=40; # dis[9]=45; dis[10]=50; dis[11]=60; # dis[12]=70; dis[13]=80; dis[14]=90; # dis[15]=100; dis[16]=120; dis[17]=140; # dis[18]=160; dis[19]=180; dis[20]=200; # dis[21]=220; dis[22]=240; dis[24]=260; # dis[24]=280; dis[25]=300; dis[26]=320; # dis[27]=340; dis[28]=360; dis[29]=380; # dis[30]=400; dis[31]=420; dis[32]=440; # dis[33]=460; dis[34]=480; dis[35]=500; # dis[36]=520; dis[37]=540; dis[38]=560; # dis[39]=580; dis[40]=600; dis[41]=640; # dis[42]=680; dis[43]=720; dis[44]=760; # dis[45]=800; dis[46]=840; dis[47]=880; # dis[48]=920; dis[49]=960; dis[50]=1000; # dis[51]=1040; dis[52]=1080; dis[53]=1120; # dis[54]=1160; dis[55]=1200; dis[56]=1240; # dis[57]=1280; dis[58]=1320; dis[59]=1360; # dis[60]=1400; # 料金(3,140). 料金(6,180). 料金(10,190). 料金(15,230). 料金(20,320). 料金(25,400). 料金(30,480). 料金(35,570). 料金(40,650). 料金(45,710). 料金(50,820). 料金(60,950). 料金(70,1110). 料金(80,1280). 料金(90,1450). 料金(100,1620). 料金(120,1890). 料金(140,2210). 料金(160,2520). 料金(180,2940). 料金(200,3260). 料金(220,3570). 料金(240,3890). 料金(260,4310). 料金(280,4620). 料金(300,4940). 料金(320,5250). 料金(340,5460). 料金(360,5780). 料金(380,6090). 料金(400,6300). 料金(420,6620). 料金(440,6830). 料金(460,7140). 料金(480,7350). 料金(500,7670). 料金(520,7980). 料金(540,8190). 料金(560,8510). 料金(580,8720). 料金(600,9030). 料金(640,9350). 料金(680,9560). 料金(720,9870). 料金(760,10190). 料金(800,10500). 料金(840,10820). 料金(880,11030). 料金(920,11340). 料金(960,11600). 料金(1000,11970). 料金(1040,12290). 料金(1080,12600). 料金(1120,12810). 料金(1160,13130). 料金(1200,13440). 料金(1240,13760). 料金(1280,14070). 料金(1320,14390). 料金(1360,14600). '営業キロを入力したら料金を表示するプログラムを作りなさい。 なお、営業キロは小数点以下はすべて切り上げで計算されます。営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。' :- '営業キロはキーボードからの入力とし'(_営業キロ), '料金を表示する'(_営業キロ,_料金). '営業キロはキーボードからの入力とし'(_営業キロ) :- write('営業キロを入力して下さい : '), get_line(Line), 営業キロ入力診断(Line,_営業キロ),!. '営業キロはキーボードからの入力とし'(_営業キロ) :- '営業キロはキーボードからの入力とし'(_営業キロ). 営業キロ入力診断(Line,_営業キロ) :- atom_to_term(Line,_営業キロ), integer(_営業キロ), _営業キロ > 0,!. 営業キロ入力診断(Line,_営業キロ) :- writef('入力された %t から適切な営業キロが得られませんでした。再入力をお願いしす。\n',[Line]), fail. 料金を表示する(_営業キロ,_料金) :- 料金を計算する(_入力営業キロ,_料金), writef('%t 円です。\n',[_料金]). 料金を計算する(_入力営業キロ,14910) :- _入力営業キロ >= 1400,!. 料金を計算する(_入力営業キロ,_料金) :- findall([_営業キロ,_金額],( 料金(_営業キロ,_料金), _入力営業キロ < _営業キロ), LL), min(LL,[_営業キロ,_料金]). % 料金/2述語の節の順序は必ずしも営業キロ数の小さい順であるとは % 言えない。それでこういうプログラムとなる。 % 小さい順だとするためには、最初にその検査が必要だろう。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/194 # # [1] 授業単元:C言語入門 # [2] 問題文: http://ime.nu/codepad.org/hsA7qgRQ # # 課題2 # # 物体が自由落下するとき初速度0とすると時刻t, そのtの瞬間の速度v, t秒間の落下距離yの関係は次のようになる. # v = gt # y = gt2/2.0 # ただしgは重力加速度で9.8m/s2とする. # 最初に目的落下距離ylimitをキーボードから入力するようにしておく.そして0.1秒おきのvとyを計算して目的落下距離を越えた時点の速度vを表示せよ.なお目的落下距離をマイナスの数としたときはerrorと表示すること. # # 実行例 # 実行開始 # 100.0 ←キーボードから100m落下させたいと入力 # 45.080000 ←100m落下したときの速度として毎秒45mを表示 # # '最初に目的落下距離ylimitをキーボードから入力するようにしておく.そして0.1秒おきのvとyを計算して目的落下距離を越えた時点の速度vを表示せよ' :- '最初に目的落下距離ylimitをキーボードから入力するようにしておく'(_目的落下距離), 'そして0.1秒おきのvとyを計算して目的落下距離を越えた時点の速度vを表示せよ'(0.0,0.0,_目的落下距離,_速度), writef('目的な落下距離を越えた時点の速度Vは %t です。\n',[_速度]). '最初に目的落下距離ylimitをキーボードから入力するようにしておく'(_目的落下距離) :- writef('目的落下距離を入力して下さい : '), get_line(Line), 目的落下距離入力診断(Line,_目的落下距離),!. '最初に目的落下距離ylimitをキーボードから入力するようにしておく'(_目的落下距離) :- '最初に目的落下距離ylimitをキーボードから入力するようにしておく'(_目的落下距離). 目的落下距離入力診断(Line,_目的落下距離) :- atom_to_term(Line,_目的落下距離,_), number(_目的落下距離), _目的落下距離 >= 0.0,!. 目的落下距離入力診断(Line,_目的落下距離) :- write('error\n'), fail. 'そして0.1秒おきのvとyを計算して目的落下距離を越えた時点の速度vを表示せよ'(_落下距離,_目的落下距離,_経過秒数,_速度) :- _落下距離 > _目的落下距離, _速度 is 9.8 * _経過秒数,!. 'そして0.1秒おきのvとyを計算して目的落下距離を越えた時点の速度vを表示せよ'(_,_目的落下距離,_経過秒数_1,_速度_1,_速度) :- _落下距離 =< _目的落下距離, _落下距離_2 is 9.8 * (_経過秒数_1 * _経過秒数_1) / 2.0, _経過秒数_2 is _経過秒数_1 + 0.1, 'そして0.1秒おきのvとyを計算して目的落下距離を越えた時点の速度vを表示せよ'(_落下距離_2,_目的落下距離,_経過秒数_2,_速度). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/824 # # [1] 授業単元: C言語とアルゴリズム # [2] 問題文(含コード&リンク): # 初速v、仰角θを入力。着弾距離、着弾するまでの時間を求める。 # <問題の意味> # vx=vcos(θ),vy=-gt+vsin(θ) # x=vtcos(θ),y=-gt^2/2+vtsin(θ)+y0 # y=0,y0=0のとすると、 # 着弾するまでの時間は gt^2/2=vtsin(θ) > t=2*vsin(θ)/g # 着弾距離はtがわかれば x=vtcos(θ)で求まる # '初速v、仰角θを入力。着弾距離、着弾するまでの時間を求める' :- 初速vの入力(_v), 仰角thetaの入力(_theta), '初速v、仰角θを入力。着弾距離、着弾するまでの時間を求める'(_v,_theta,_着弾距離,_着弾するまでの時間), writef('着弾距離は %t m\n着弾するまでの時間は %t 秒です。\n',[_着弾距離,_着弾するまでの時間]). '初速v、仰角θを入力。着弾距離、着弾するまでの時間を求める'(_v,_theta,_着弾距離,_着弾するまでの時間) :- _着弾するまでの時間 is _v * sin(_theta) / 9.80665. _着弾距離 is _v * cos(_theta) * _着弾するまでの時間. 初速vの入力(_v) :- write('初速vを入力して下さい : '), get_line(Line), 初速vの入力診断(Line,_v),!. 初速vの入力(_v) :- 初速vの入力(_v). 初速vの入力診断(Line,_v) :- atom_to_term(Line,_v,_), number(_v), _v > 0.0,!. 初速vの入力診断(Line,_v) :- writef('入力された%tは初速vとして適切でありません。再入力をお願いします。\n',[Line]), fail. 仰角thetaの入力(_theta) :- write('仰角thetaを入力して下さい : '), get_line(Line), 仰角thetaの入力診断(Line,_theta),!. 仰角thetaの入力(_theta) :- 仰角thetaの入力(_theta). 仰角thetaの入力診断(Line,_theta) :- atom_to_term(Line,_theta,_), number(_theta), _theta >= 0.0, _theta =< pi,!. 仰角thetaの入力診断(Line,_theta) :- writef('入力された%tは仰角thetaとして適切でありません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/845 # # 台形近似法を用いてf(x)=cos(x)を任意の範囲で積分するプログラムを # ユーザ関数を定義して作成しなさい. # その際の区分間距離も任意に入力できるようにすること。 # # 実行例 # 積分範囲を入力せよ # x0 = 0 # xl = 10 # 区分間距離を入力せよ # length = 1 # ans = 9.949055 # 積分範囲を入力せよ # x0 = 0 # xl = 100 # 区分間距離を入力せよ # length = 5 # ans = 49.588107 # # お願いします。 # # f(X,Y) :- Y is cos(X). '台形近似法を用いてf(x)=cos(x)を任意の範囲で積分する 区分間距離は任意に入力できるようにする' :- 積分範囲を入力する(_積分範囲下限,_積分範囲上限), 区分間距離を入力する(_区分間距離), f(_積分範囲下限,Y_1), '台形近似法を用いて積分する'(_積分範囲下限,Y_1,_積分範囲上限,_区分間距離,_積分値), writef('f(x)=cos(x) x範囲 %t-%t の積分値は %t です。\n',[_積分範囲下限,_積分範囲上限,_積分値]). 積分範囲を入力する(_積分範囲下限,_積分範囲上限) :- write('積分範囲を入力してください\n積分範囲下限(実数) : '), 実数入力(_積分範囲下限), write('積分範囲上限(実数) : '), 実数入力(_積分範囲上限), _積分範囲上限 > _積分範囲下限,!. 積分範囲を入力する(_積分範囲下限,_積分範囲上限) :- 積分範囲を入力する(_積分範囲下限,_積分範囲上限). 実数入力(_実数) :- get_line(Line), 実数入力診断(Line,_実数),!. 実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 実数入力診断(Line,_実数) :- writef('入力された %t は実数表現になっていません。再入力をお願いします。\n',[Line]), fail. 区分間距離を入力する(_区分間距離) :- write('区分間距離を入力してください : '), 実数入力(_区分間距離),!. 区分間距離を入力する(_区分間距離) :- 区分間距離を入力する(_区分間距離). '台形近似法を用いて積分する'(K,_,_積分範囲上限,_区分間距離,0.0) :- K >= _積分範囲上限,!. '台形近似法を用いて積分する'(X_1,Y_1,_積分範囲上限,_区分間距離,_積分値) :- X_2 is X_1 + _区分間距離, f(X_2,Y_2), _台形面積 is (_Y_1 + _Y_2) * _区分間距離 / 2, '台形近似法を用いて積分する'(X_2,Y_2,_積分範囲上限,_区分間距離,_積分値_2), _積分値 is _台形面積 + _積分値_2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/511 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 演習目的 # 々渋ぢ里筌櫂ぅ鵐燭鰺用して、データ構造を設計することができる。 # 構造体をreturn文で返却する関数を作ることができる。 # ポインタを扱うことができる。 # 課題: # 2つのビット列(unsigned char型の2変数)を受け取り、 # そのビット列のハミング距離を返す関数を作成しなさい。 # また、ビットの並を表示する関数を作成しなさい。 # ビット列x=(x0,x1,…,x7)とy=(y0,y1,…,y7)の # ハミング距離dは次で定義される。 # すなわち、異なるビットの個数である。 # d=[i=0,7](xi^yi), xi,yi∈{0,1} # 例えば、x=5,y=3のとき、x=(00000101),y=(00000011)であり、 # ハミング距離はd=2となる。 # 01の並びを入力し、変数に代入する関数を作ってもよい。 # ハミング距離(N1,N2,_ハミング距離) :- N3 is N1 # N2, ハミング距離_2(N3,_ハミング距離). ハミング距離_2(0,0). ハミング距離_2(N,S) :- D is N // 2, M is N mod 2, ハミング距離_2(D,S_1), S is M + S_1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/635 # # [1] 授業単元:プログラミング言語基礎 # [2] 問題文(含コード&リンク):ある物体を自由落下させたときの位置yを、0秒後から30秒後まで5秒 # きざみで表示せよ。なお、t秒後の位置はy=1/2×9.8×t2乗(←指数が出てこなかったのでこう書きました) # 'ある物体を自由落下させたときの位置yを、0秒後から30秒後まで5秒きざみで表示する' :- for(0,_t,30), 0 is _t mod 5, _落下距離 is 0.5 * 9.8 * _t ^ 2, writef('%2r秒後 %4rm\n',[_t,_落下距離]), _t = 30. % 以下のサイトは # # 井の頭線に関する情報が以下に纏められている。この述語定義について、 # 批判せよ。 # :- op(300,xf,(m)). :- op(300,xf,(mm)). 井の頭線(渋谷,神泉,500 m). 井の頭線(神泉,駒場東大前,900 m). 井の頭線(駒場東大前,池ノ上,1000 m). 井の頭線(池ノ上,下北沢,600 m). 井の頭線(下北沢,新代田,500 m). 井の頭線(新代田,東松原,500 m). 井の頭線(東松原,明大前,900 m). 井の頭線(明大前,永福町,1100 m). 井の頭線(永福町,西永福,700 m). 井の頭線(西永福,浜田山,800 m). 井の頭線(浜田山,高井戸,1200 m). 井の頭線(高井戸,富士見ヶ丘,800 m). 井の頭線(富士見ヶ丘,久我山,700 m). 井の頭線(久我山,三鷹台,1000 m). 井の頭線(三鷹台,井の頭公園,900 m). 井の頭線(井の頭公園,吉祥寺,600 m). 急行停車駅(渋谷). 急行停車駅(下北沢). 急行停車駅(明大前). 急行停車駅(永福町). 急行停車駅(久我山). 急行停車駅(吉祥寺). 乗り換え駅(吉祥寺,[中央線]). 乗り換え駅(明大前,[京王線]). 乗り換え駅(下北沢,[小田急線]). 乗り換え駅(渋谷,[山手線,埼京線,東横線,銀座線,田園都市線,半蔵門線,副都心線]). 軌間(井の頭線,1067 mm). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % 一般論として、単位節データベースの引数として複合項(構造体)を % 持つべきではない。 % m,mmといった単位情報は別に述語定義するべきである。 % 乗り換え駅の定義も % 軌間単位(mm). 駅間距離単位(m). % % を追加して上で % 井の頭線(渋谷,神泉,500). 井の頭線(神泉,駒場東大前,900). 井の頭線(駒場東大前,池ノ上,1000). 井の頭線(池ノ上,下北沢,600). 井の頭線(下北沢,新代田,500). 井の頭線(新代田,東松原,500). 井の頭線(東松原,明大前,900). 井の頭線(明大前,永福町,1100). 井の頭線(永福町,西永福,700). 井の頭線(西永福,浜田山,800). 井の頭線(浜田山,高井戸,1200). 井の頭線(高井戸,富士見ヶ丘,800). 井の頭線(富士見ヶ丘,久我山,700). 井の頭線(久我山,三鷹台,1000). 井の頭線(三鷹台,井の頭公園,900). 井の頭線(井の頭公園,吉祥寺,600). 乗り換え駅(吉祥寺,中央線). 乗り換え駅(明大前,京王線). 乗り換え駅(下北沢,小田急線). 乗り換え駅(渋谷,山手線). 乗り換え駅(渋谷,埼京線). 乗り換え駅(渋谷,東横線). 乗り換え駅(渋谷,田園都市線). 乗り換え駅(渋谷,銀座線). 乗り換え駅(渋谷,半蔵門線). 乗り換え駅(渋谷,副都心線). % とした方がよい。 % % 急行停車駅/2,乗り換え駅/3には井の頭線である情報がない。 % これを付加するべきである。 乗り換え駅(井の頭線,吉祥寺,中央線). 乗り換え駅(井の頭線,明大前,京王線). 乗り換え駅(井の頭線,下北沢,小田急線). 乗り換え駅(井の頭線,渋谷,山手線). 乗り換え駅(井の頭線,渋谷,埼京線). 乗り換え駅(井の頭線,渋谷,東横線). 乗り換え駅(井の頭線,渋谷,田園都市線). 乗り換え駅(井の頭線,渋谷,銀座線). 乗り換え駅(井の頭線,渋谷,半蔵門線). 乗り換え駅(井の頭線,渋谷,副都心線). 急行停車駅(井の頭線,渋谷). 急行停車駅(井の頭線,下北沢). 急行停車駅(井の頭線,明大前). 急行停車駅(井の頭線,永福町). 急行停車駅(井の頭線,久我山). 急行停車駅(井の頭線,吉祥寺). % % とするか、 % 井の頭線乗り換え駅(吉祥寺,中央線). 井の頭線乗り換え駅(明大前,京王線). 井の頭線乗り換え駅(下北沢,小田急線). 井の頭線乗り換え駅(渋谷,山手線). 井の頭線乗り換え駅(渋谷,埼京線). 井の頭線乗り換え駅(渋谷,東横線). 井の頭線乗り換え駅(渋谷,田園都市線). 井の頭線乗り換え駅(渋谷,銀座線). 井の頭線乗り換え駅(渋谷,半蔵門線). 井の頭線乗り換え駅(渋谷,副都心線). 井の頭線急行停車駅(渋谷). 井の頭線急行停車駅(下北沢). 井の頭線急行停車駅(明大前). 井の頭線急行停車駅(永福町). 井の頭線急行停車駅(久我山). 井の頭線急行停車駅(吉祥寺). % % とするべきである。 % % 書きなおしたもの % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/356 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 幅が15程度の1次元の領域を考える. # その領域の中央に1匹の虫を放つ. # 虫は単位時間あたり距離1だけ左に行ったり右に行ったり,あるいは止まっていたりする. # 10単位時間経過時の虫の居場所をint型1次元配列の該当位置に1を加えるという形で記録してゆく. # 以上を1試行とし,計100試行程繰り返した段階での,虫の最終位置をカウントした配列内の中身を表示する. # '虫の動きを記録して、100試行程繰り返した段階での,虫の最終位置をカウントしたならびを表示する' :- '10単位時間経過時の虫の居場所をint型1次元配列の該当位置に1を加えるという形で記録してゆく.'(15,L), グラフとして表示する(L). '10単位時間経過時の虫の居場所をint型1次元配列の該当位置に1を加えるという形で記録してゆく.'(_幅,L) :- length(L,_幅), all(L,[]), 'その領域の中央に1匹の虫を放つ.'(_幅,Nth), '10単位時間経過時の虫の居場所をint型1次元配列の該当位置に1を加えるという形で記録してゆく.'(0,_幅,Nth,L,LX). '10単位時間経過時の虫の居場所をint型1次元配列の該当位置に1を加えるという形で記録してゆく.'(100,_幅,Nth,L1,L) :- length([_|L0],Nth), append(L0,[LenL|R],L1), append(L0,[[_|LenL]|R],L),!. '10単位時間経過時の虫の居場所をint型1次元配列の該当位置に1を加えるという形で記録してゆく.'(_単位時間,_幅,Nth,L1,L) :- 0 is _単位時間 mod 10, length([_|L0],Nth), append(L0,[LenL|R],L1), append(L0,[[_|LenL]|R],L2), '虫は単位時間あたり距離1だけ左に行ったり右に行ったり,あるいは止まっていたりする.'(_幅,Nth,Nth_2), _単位時間_2 is _単位時間 + 1, '10単位時間経過時の虫の居場所をint型1次元配列の該当位置に1を加えるという形で記録してゆく.'(_単位時間_2,_幅,Nth_2,L2,L). 'その領域の中央に1匹の虫を放つ.'(_幅,Nth) :- Nth is _幅 // 2,!. '虫は単位時間あたり距離1だけ左に行ったり右に行ったり,あるいは止まっていたりする.'(_幅,_虫の位置,_1単位時間後の虫の位置) :- '単位時間後の虫の位置'(_幅,_虫の位置,_1単位時間後の虫の位置_1), '虫の位置補正'(_幅,_1単位時間後の虫の位置_1,_1単位時間後の虫の位置),!. '単位時間後の虫の位置'(_幅,Nth,_1単位時間後の虫の位置) :- _1単位時間後の虫の位置 is random(3) * -1 + 1 + Nth,!. '虫の位置補正'(_幅,Nth,1) :- Nth > _幅,!. '虫の位置補正'(_幅,0,_幅) :- !. '虫の位置補正'(_幅,Nth,Nth) :- !. グラフとして表示する(LL) :- append(L0,[L|R],LL), length([_|L0],Nth), all(L,'*'), concat_atom(L,S), writef('[%t] : %t\n',[Nth,S]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/183 # # [2]xy平面上の10 個の点(0〜9 番とする) の(x, y) 座標を入力させ # つぎのようにソートするプログラムを作れ. # 大きさ10の配列x, y を用いて,i番目の点の座標をそれぞれx[i], y[i] に入れる. # # (梅) x座標の値の昇順 # # (原点より近い点から遠い点の順) # 注意:点を入れ替える時には,x 座標だけでなく,y座標も入れ替えること. # '座標点ならびを確保して、座標点を10個入力し、原点から近い順に整列する'(_整列された座標点ならび) :- '座標点ならびを確保して'(_座標点ならび), '座標点を10個入力し'(_座標点ならび), '原点から近い順に整列する'(_座標点ならび,_整列された座標点ならび). '座標点ならびを確保して'(_座標点ならび) :- length(_座標点ならび,10). '座標点を10個入力し'(_座標点ならび) :- findall((X,Y),( append(L0,[(X,Y)|_],_座標点ならび), 座標点の入力(L0,X,Y)), _座標点ならび). 座標点の入力(L0,X,Y) :- length([_|L0],_個目), writef('[%t個目] x,y座標をカンマ区切りで入力してください : ',[_個目]), get_line(Line), 座標点入力診断(Line,X,Y),!. 座標点の入力(L0,X,Y) :- 座標点の入力(L0,X,Y). 座標点入力診断(Line,X,Y) :- split(Line,[',',' '],[X,Y]), number(X), number(Y),!. 座標点入力診断(Line,X,Y) :- writef('入力された%tからは適切な座標点が得られませんでした。再入力をお願いします。\n',[Line]), fail. '原点から近い順に整列する'(_座標点ならび,_整列された座標点ならび) :- 原点からの距離を付加する(_座標点ならび,_原点からの距離を付加された座標点ならび), 整列(_原点からの距離を付加された座標点ならび,_整列した原点からの距離を付加された座標点ならび), 距離を削除する(_整列した原点からの距離を付加された座標点ならび,_整列された座標点ならび). 原点からの距離を付加する([],[]) :- !. 原点からの距離を付加する([(X,Y)|R1],[(D,X,Y)|R2]) :- D is sqrt(X^2+Y^2), 原点からの距離を付加する(R1,R2). 整列(_原点からの距離を付加された座標点ならび,_整列した原点からの距離を付加された座標点ならび) :- sort(_原点からの距離を付加された座標点ならび,_整列した原点からの距離を付加された座標点ならび). 距離を削除する([],[]). 距離を削除する([(_,X,Y)|R1],[(X,Y)|R2]) :- 距離を削除する(R1,R2). % 以下のサイトは # [1] 授業単元: プログラミング # [2] rand()を使い、モンテカルロ法により円周率を求めるプログラムを作る。 #    具体的な手順として #     ・0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする。 #     ・乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える #     ・1:π/4 = n:r から π = 4*r/n  #      この式に従いπを計算する。 #    参考として #     ・rand()でx座標とy座標を求める #       x=(double)rand()/RAND_MAX; # y=(double)rand()/RAND_MAX; # ・その点の原点からの距離rを計算する #       r=x*x+y*y #     ・For分で点の発生を繰り返す #     ・点が円の内側か外側かを判定し、内側ならカウンタの変数を1増やす #      (演算子++を使う) #  っていうのが問題です。 試行回数(1000). モンテカルロ法により円周率を求める(_円周率) :- 試行回数(_n), '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n,_r), _円周率 is 4 * _r / _n. '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y) :- _x is random(1001) / 1000, _y is random(1001) / 1000,!. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(0,0) :- !. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n,_r) :- '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y), ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y), _n_1 is _n - 1, '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n_1,_r_1), _r is _r_1 + 1,!. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n,_r) :- _n_1 is _n - 1, '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n_1,_r). ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :- 1.0 >= _x * _x + _y * _y. % 以下のサイトは 座標の回転してから移動(_回転角度,_移動X軸距離,_移動Y軸距離,X,Y,_x,_y) :- 座標の回転(_回転角度,X,Y,_x2,_y2), _x is _x2 + _移動X軸距離, _y is _y2 + _移動Y軸距離. 座標を移動してから回転(_回転角度,_移動X軸距離,_移動Y軸距離,X,Y,_x,_y) :- X2 is X + _移動X軸距離, Y2 is Y + _移動Y軸距離, 座標の回転(_回転角度,X2,Y2,_x,_y). 座標の回転(_回転角度,X,Y,_x,_y) :- 変換正方行列(回転,_回転角度,L), m_mult([[Y,X]],L,[[_y,_x]]). 変換正方行列(回転,V,[[A,B],[C,D]]) :- \+(var(V)), R is pi * V / 180, A is cos(R), B is (-1) * sin(R), C is sin(R), D = A. 変換正方行列(回転,90,[[0,-1],[1,0]]). 変換正方行列(回転,180,[[-1,0],[0,-1]]). 変換正方行列(回転,270,[[0,1],[-1,0]]). 変換正方行列(回転,-90,[[0,1],[-1,0]]). 変換正方行列(回転,-180,[[-1,0],[0,-1]]). 変換正方行列(回転,-270,[[0,-1],[1,0]]). 行列の積(L1,L2,X) :- 行列の転置(L2,L4), 行列の積_1(L1,L4,X). 行列の積_1([],_,[]) :- !. 行列の積_1([A|R1],L,[S1|R3]) :- 行列の積_2(A,L,S1), 行列の積_1(R1,L,R3) . 行列の積_2(_,[],[]) :- !. 行列の積_2(A,[B|R2],[C|R3]) :- 行列の積_3(A,B,C), 行列の積_2(A,R2,R3). 行列の積_3([],[],0) :- !. 行列の積_3([A|R1],[B|R2],S) :- S1 is A * B, 行列の積_3(R1,R2,S2), S is S1 + S2. 行列の転置([],[],[]) :- !. 行列の転置([[A|R]|R1],[A|R2],[R|R3]) :- 行列の転置(R1,R2,R3). 行列の転置([[]|_],[]) :- !. 行列の転置(L,[B|R1]) :- 行列の転置(L,B,R2), 行列の転置(R2,R1),!. % 以下のサイトは # この問題は秋葉拓哉、岩田陽一、北川宣捻共著 「プログラミングコンテストチャレンジブック」2010年9月 株式会社毎日コミュニケーションズ刊 # のp73より出題させていただきました。 # # プライオリティキューを用いる問題 # Expedition (POJ2431) # # トラックで距離Lの道を移動します。はじめトラックにはガソリンPが # 積まれています。このトラックは距離1走るとガソリンが1消費されます。 # 途中でガソリンが0になってしまうとトラックは停止してしまい、移動に # 失敗してしまいます。途中にはN個ガソリンスタンドがあります。 # 各ガソリンスタンドiは道のスタート地点Aiの地点にあって、Biだけ # ガソリンを補給することができます。トラックの燃料タンクの容量に # 制限はなく、いくらでもガソリンを補給することができます。 # Lトラックは移動完了できるでしょうか? # またその際、最少で何回のガソリンの補給が必要でしょう? # 完了できる場合は最小の補給回数を、できない場合は-1を出力してください。 # # !! 制約 # ・ 1 =< N =< 10000 # ・ 1 =< L =< 1000000, 1 =< P =< 1000000 # ・ 1 =< Ai, 1 =< Bi =< 100 # # # 以下は@Nikoriksこと、紀信邦さんの書いたプログラム。著作権は同氏にあります。 # % On Monday 6th June 2011, @Nikoriks said: % % #lpjp 以前尾崎さんが見つけたトラックとガソリンの問題 % ftp://nojiriko.asia/prolog/POJ2431.html http://poj.org/problem?id=2431 をやってみました.(今日も空き時間に泳いだので) % いくつか例題を試してみないと合ってるかどうかわかりませんね. % q(給油回数,残り距離,燃料量,残りガススタンドのリスト) % Qは横型探索のためのq()のリスト. go:-poj2431(R),display(R),ttynl. a(4,4). a(5,2). a(11,5). a(15,10). road(25,10). init(Q):- road(L,P), setof(xl(Pos,X),a(Pos,X),X0), reverse(X0,Xl), write(Xl),nl, Q=[q(0,L,P,Xl)]. poj2431(Result):- init(Q), solve(Q,Result). poj2431(-1). solve(Q,Result):- pdeq(q(N,A,P,Xl),Q,Q1), A =< P,!, Result=N. solve(Q,Result):- pdeq(q(N,A,P,Xl),Q,Q1), write(q(N,A,P,Xl)),nl, proceed(Xl,N,A,P,Q1,Q2), solve(Q2,Result). proceed([xl(Ai,Bi)|Xl], N,A,P,Q1,Q3):- P >= A-Ai,!, Pi is P-(A-Ai)+Bi, Ni is N+1, penq(q(Ni,Ai,Pi,Xl),Q1,Q2), proceed(Xl,N,A,P,Q2,Q3). proceed(_,_,_,_, Q,Q). penq(X,[Y|L],R):- X @=< Y,!,R=[X,Y|L]. penq(X,[Y|L],[Y|R]):-!, penq(X,L,R). penq(X,[],[X]). pdeq(X,[X|L],L). reverse(L,R):- reverse(L,[],R). reverse([E|X],Y,Z):-!, reverse(X,[E|Y],Z). reverse([],Y,Y). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/337 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):次の書きこみにまとめます。 # # 地図データmap.dat に対して、出発点の交差点番号をキーボードから入力すると、 # A. 隣接する交差点名と交差点番号および出発点からの距離をディスプレイに表示 # する # B. 表示された交差点の中から次に進む交差点を選択できる # C. 選択された交差点に対して、A. の手順に戻り、順々に道案内する # プログラムを作成しなさい。手順A の距離は、出発点からの直線距離ではなく、 # 経路の累計移動距離を計算すること。また、プログラムを途中で終了させるコマ # ンドも用意すること。 # # # という問題について次のようなソースを書いたのですが、これでは経路の累計移動距離が計算されないため、不十分だと言われました。 # http://ime.nu/codepad.org/1hcQfHlM # 地図データはこちらに上げてあります # http://ime.nu/www1.axfc.net/uploader/Sc/so/202935.dat # どこをどう直せばいいのか、どなたかお願いします # # 1, 0.0, 0.0, A, 2, 2, 4 # 2, -0.6, 0.15, B, 3, 1, 3, 11 # 3, -0.83, 0.0, C, 4, 2, 4, 9, 10 # 4, -0.6, -0.38, D, 3, 1, 3, 5 # 5, -0.38, -0.68, E, 3, 4, 6, 7 # 6, 6.0, -0.3, F, 1, 5 # 7, -0.18, -1.02, G, 2, 5, 8 # 8,-0.84, -1.58, H, 3, 7, 9, 18 # 9, -0.9, -0.98, I, 2, 3, 8 # 10, -0.98, 0.15, J, 3, 3, 11, 13 # 11, -0.78, 0.3, K, 3, 2, 10, 12 # 12, -1.28, 0.68, L, 2, 11, 13 # 13, -1.32, 0.53, M, 4, 10, 12, 14, 15 # 14, -1.8, 0.98, N, 2, 13, 20 # 15, -1.43, -0.15, O, 2, 13, 16 # 16, -1.73, -0.26, P,3, 15, 17, 20 # 17, -1.8, -1.43, Q, 3, 16, 18, 19 # 18, -1.2, -1.73, R, 2, 8, 17 # 19, -2.48, -1.2, S, 2, 17, 20 # 20, -2.33, -0.51, T, 3, 14, 16, 19 交差点を進む(_出発交差点,_移動記録,_移動累積距離) :- 地図データを読み込む(_地図データ), 地図データの登録(_地図データ), 交差点を進む(_出発交差点,0.0,[],_移動記録,_移動累積距離). 交差点を進む(_交差点,_移動記録1,_移動累積距離1,_移動記録,_移動累積距離) :- 隣接交差点を表示する(_交差点), write_formatted('ここまでの移動累積距離は%tです\n',[_移動累積距離1]), write('どの交差点に進みますか ? '), get_line(_隣接交差点), 隣接交差点との距離(_交差点,_隣接交差点,_距離), _移動累積距離2 is _距離 + _移動累積距離1, 交差点を進む(_交差点,[_隣接交差点|_移動記録1],_移動累積距離2,_移動記録,_移動累積距離). 交差点を進む(_交差点,_移動記録,_移動累積距離,_移動記録,_移動累積距離) :- write_formatted('交差点%tは存在しません\nここまでの移動累積距離は%tでした\nプログラムを終了します\n',[_交差点,_累積移動距離]). 隣接交差点を表示する(_交差点) :- findall(_隣接交差点,隣接交差点(_交差点,_隣接交差点),_隣接交差点ならび), \+(_隣接交差点ならび=[]), concat_atom(_隣接交差点ならび,',',_隣接交差点表示), write_formatted('隣接交差点は %t があります\n',[_隣接交差点表示]). 隣接交差点との距離(_交差点,_隣接交差点,_距離) :- 交差点位置(_交差点,X1,Y1), 隣接交差点(_交差点,X2,Y2), _距離 is sqrt((X2 - X1) ^2 + (Y2 - Y1) ^ 2). 地図データを読み込む(_地図データ) :- get_split_lines('map.dat',[','],LL). 地図データの登録(_地図データ) :- 交差点位置の登録(_地図データ), 隣接交差点の登録(_地図データ). 交差点位置の登録(_地図データ) :- abolish(交差点位置/3), append(_,[[_,X,Y,_交差点|_]|R],_交差点データ), assertz(交差点位置(_交差点,X,Y)), R = []. 隣接交差点の登録(_地図データ) :- abolish(隣接交差点/2), append(_,[[_交差点ID,_,_,_交差点|_隣接交差点ならび]|R],_地図データ), 隣接交差点を得る(_地図データ,_隣接交差点IDならび,_隣接交差点), assertz(隣接交差点(_交差点,_隣接交差点)), R = []. 隣接交差点を得る(_地図データ,[_隣接交差点ID|R],_隣接交差点) :- list_nth(_隣接交差点ID,_地図データ,[_,_,_,_隣接交差点|_]). 隣接交差点を得る(_地図データ,[_|R],_隣接交差点) :- 隣接交差点を得る(_地図データ,R,_隣接交差点). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/271 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):バブルソート法を使って、map.datに対して交差点名(アルファベット)を # 入力すると、その交差点から直線距離が近い順に、隣接交差点名とその距離の二乗をディスプレイに表示する # プログラムを書きなさい。 # 1 0.0 0.0 H 2 2 4 0 0 # 2 -0.6 0.15 D 3 1 3 11 0 # 3 -0.83 0.0 K 4 2 4 9 10 # 4 -0.6 -0.38 O 3 1 3 5 0 # 5 -0.38 -0.68 M 3 4 6 7 0 # 6 6.0 -0.3 T 1 5 0 0 0 # 7 -0.18 -1.02 U 2 5 8 0 0 # 8 -0.84 -1.58 N 3 7 9 18 0 # 9 -0.9 -0.98 V 2 3 8 0 0 # 10 -0.98 0.51 R 3 3 11 13 0 # 11 -0.78 0.3 P 3 2 10 12 0 # 12 -1.28 0.68 E 2 11 13 0 0 # 13 -1.32 0.53 I 4 10 12 14 15 # 14 -1.8 0.98 C 2 13 20 0 0 # 15 -1.43 -0.15 J 2 13 16 0 0 # 16 -1.73 -0.26 P 3 15 17 0 0 # 17 -1.8 -1.43 W 3 16 18 19 0 # 18 -1.2 -1.73 S 2 8 17 0 0 # 19 -2.48 -1.2 Z 2 17 20 0 0 # 20 -2.33 -0.51 B 3 14 16 19 0 # 'バブルソート法を使って、map.datに対して交差点名(アルファベット)を入力すると、その交差点から直線距離が近い順に、隣接交差点名とその距離の二乗をディスプレイに表示する' :- get_split_lines('map.dat',[','],LL), 交差点名の入力(_交差点名), append(_,[[N,X,Y,_交差点名,_,_,_,_,_]|_],LL), その交差点から直線距離が近い順に隣接交差点名とその距離の二乗を(_整列した直線距離の二乗ならび・交差点名ならび), 表示する(_整列した直線距離の二乗ならび・交差点名ならび). 交差点名の入力(_交差点名) :- write('交差点名を入力してください : '), get_line(_交差点名),!. その交差点から直線距離が近い順に隣接交差点名とその距離の二乗を(LL,_整列した直線距離の二乗ならび・交差点名ならび) :- findall([_直線距離の二乗,_交差点名1],( append(_,[[N1,X1,Y1,_交差点名1,_隣接点1,_隣接点2,_隣接点3,_隣接点4,_隣接点5]|_],LL), \+(_交差点名=_交差点名), 交差点はNと隣接している(N,_隣接点1,_隣接点2,_隣接点3,_隣接点4,_隣接点5), _直線距離の二乗 is (X1-X) ^ 2 + (Y1-Y) ^ 2), _直線距離の二乗ならび・交差点名ならび), バブルソート(_直線距離の二乗ならび・交差点名ならび,_整列した直線距離の二乗ならび・交差点名ならび),!. 交差点はNと隣接している(N,N,_,_,_,_) :- !. 交差点はNと隣接している(N,_,N,_,_,_) :- !. 交差点はNと隣接している(N,_,_,N,_,_) :- !. 交差点はNと隣接している(N,_,_,_,N,_) :- !. 交差点はNと隣接している(N,_,_,_,_,N) :- !. バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一),!, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). 表示する(_整列した直線距離の二乗ならび・交差点名ならび) :- append(_,[[_直線距離の二乗,]|R],_整列した直線距離の二乗ならび・交差点名ならび), write_formatted('%t,%t\n',[_隣接交差点名,_直線距離の二乗]), R = [],!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/122 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1311028.txt.html # # Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 # 県と県の間を半角開ける # # 1.北海道 2.青森県・・・47.沖縄県を表示 # 一行につき6県 # # (例) # _1.北海道____2.鹿児島県__3. # # ↑ # 桁が上がったとき用 # # # 43.□□□___44.□□ # # # 次に47都道府県のうち出発地と目的地の入力を要求する. # # 「出発の県を入力してください」 # 「目的の県を入力してください」 # # # # # 次に結果を表示. # # ・距離と経路を出力 # # 経路 # □□□□→□□□□→・・・→□□□□ # # -10byte-- # # 経路は7県まで # # # # とする # # # # map.datの中身は↓です # # 北海道,青森県,岩手県,宮城県,秋田県,山形県,福島県,茨城県,栃木県,群馬県,埼玉県,千葉県,東京都,神奈川県,新潟県,富山県,石川県,福井県,山梨県,長野県,岐阜県,静岡県,愛知県,三重県,滋賀県,京都府,大阪府,兵庫県,奈良県,和歌山県,鳥取県,島根県,岡山県,広島県,山口県,徳島県,香川県,愛媛県,高知県,福岡県,佐賀県,長崎県,熊本県,大分県,宮崎県,鹿児島県,沖縄県 # # 北海道,0,426,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 青森県,426,0,187,-1,190,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岩手県,-1,187,0,193,108,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 宮城県,-1,-1,193,0,258,72,84,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 秋田県,-1,190,108,258,0,212,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山形県,-1,-1,-1,72,212,0,102,-1,-1,-1,-1,-1,-1,-1,169,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 福島県,-1,-1,-1,84,-1,102,0,203,172,275,-1,-1,-1,-1,189,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 茨城県,-1,-1,-1,-1,-1,-1,203,0,76,-1,-1,116,128,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 栃木県,-1,-1,-1,-1,-1,-1,172,76,0,109,100,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 群馬県,-1,-1,-1,-1,-1,275,-1,109,0,103,-1,-1,-1,220,-1,-1,-1,-1,151,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 埼玉県,-1,-1,-1,-1,-1,-1,116,100,103,0,69,24,-1,-1,-1,-1,-1,157,215,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 千葉県,-1,-1,-1,-1,-1,-1,128,-1,-1,69,0,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 東京都,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,50,0,37,-1,-1,-1,-1,133,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 神奈川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,37,0,-1,-1,-1,-1,134,-1,-1,240,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 新潟県,-1,-1,-1,-1,169,189,-1,-1,220,-1,-1,-1,-1,0,250,-1,-1,-1,208,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 富山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,250,0,61,-1,-1,196,294,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 石川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,61,0,83,-1,-1,235,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 福井県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,83,0,-1,-1,160,-1,-1,-1,176,188,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山梨県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,164,-1,126,134,-1,-1,-1,-1,0,162,-1,109,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 長野県,-1,-1,-1,-1,-1,-1,-1,-1,-1,151,220,-1,-1,-1,208,196,-1,-1,162,0,295,271,272,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岐阜県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,294,235,160,-1,295,0,-1,43,113,128,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 静岡県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,167,-1,-1,-1,-1,109,271,-1,0,181,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 愛知県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,272,43,181,0,82,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 三重県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,-1,82,0,95,107,-1,-1,91,91,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 滋賀県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,176,-1,-1,128,-1,-1,95,0,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 京都府,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,188,-1,-1,-1,-1,-1,107,14,0,49,75,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 大阪府,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,49,0,45,33,80,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 兵庫県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,75,45,0,-1,-1,180,-1,139,-1,-1,115,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 奈良県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,-1,48,33,-1,0,98,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 和歌山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,-1,-1,-1,-1,98,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 鳥取県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,180,-1,-1,0,128,167,296,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # 島根県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,80,-1,128,0,-1,212,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岡山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,139,-1,-1,167,-1,0,165,-1,-1,70,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 広島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,296,212,165,0,131,-1,-1,190,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山口県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,131,0,250,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 徳島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,-1,-1,-1,-1,-1,-1,250,0,73,191,161,-1,-1,-1,-1,-1,-1,-1,-1 # # 香川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,-1,-1,73,0,156,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 愛媛県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,190,-1,191,156,0,156,-1,-1,-1,-1,-1,-1,-1,-1 # # 高知県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,161,-1,156,0,-1,-1,-1,-1,-1,-1,-1,-1 # # 福岡県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,165,-1,-1,-1,-1,0,61,-1,117,159,-1,-1,-1 # # 佐賀県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,61,0,109,-1,-1,-1,-1,-1 # # 長崎県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,109,0,-1,-1,-1,-1,-1 # # 熊本県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,117,-1,-1,0,218,192,187,-1 # # 大分県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,159,-1,-1,218,0,181,-1,-1 # # 宮崎県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,192,181,0,158,-1 # # 鹿児島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,187,-1,158,0,733 # # 沖縄県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,733,0 # '47都道府県のうち出発地と目的地の入力して最短経路を求めて距離と順路を表示する(ただし経路は7以下とする)' :- 'Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 県と県の間を半角 開ける'(_都道府県名ならび), '47都道府県のうち出発地と目的地の入力する'(_都道府県名ならび,_出発地,_目的地), 最短経路(_出発地,_目的地,_距離,_順路), 距離と経路の表示(_出発地,_目的地,_距離,_順路). '47都道府県のうち出発地と目的地の入力する'(_都道府県名ならび,_出発地,_目的地) :- 出発地を入力する(_都道府県名ならび,_出発地), 目的地を入力する(_都道府県名ならび,_目的地). 出発地を入力する(_都道府県名ならび,_出発地) :- write('出発地の都道府県名番号を入力してください : '), get_line(Line), 出発地を入力診断(Line,_都道府県名ならび,_出発地),!. 出発地を入力する(_都道府県名ならび,_出発地) :- 出発地を入力する(_都道府県名ならび,_出発地). 出発地を入力診断(Line,_都道府県名ならび,_出発地) :- atom_to_term(Line,_出発地番号,_), integer(_出発地番号), _出発地番号 > 1, _出発地番号 =< 47, list_nth(_出発地番号,_都道府県名ならび,_出発地),!. 出発地を入力診断(Line,_都道府県名ならび,_出発地) :- write_formatted('入力された %t から適切な出発地を得ることができません。再入力をお願いします。\n',[Line]), fail. 目的地を入力する(_都道府県名ならび,_目的地) :- write('目的地の都道府県名番号を入力してください : '), get_line(Line), 目的地を入力診断(Line,_都道府県名ならび,_目的地), 目的地を入力する(_都道府県名ならび,_目的地) :- 目的地を入力する(_都道府県名ならび,_目的地). 目的地を入力診断(Line,_都道府県名ならび,_目的地) :- atom_to_term(Line,_目的地番号,_), integer(_目的地番号), _目的地番号 > 1, _目的地番号 =< 47,!. 目的地を入力診断(Line,_,_目的地) :- write_formatted('入力された %t から適切な目的地を得ることができません。再入力をお願いします。\n',[Line]), fail. 距離と経路の表示(_出発地,_目的地,_距離,_順路) :- write_formatted('距離は %t,経路は %t',[_距離,_出発地]), append(_,[[A,B]|R],_順路), write_formatted(' -> %t ',[B]), R = [], write('\n'),!. 'Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 県と県の間を半角 開ける'(_都道府県名ならび) :- get_split_lines('Map.dat',[','],LL), 第要素は都道府県名、残りは経路情報(LL,_都道府県名ならび,_経路情報ならび), append(L0,[[_県名|_隣接情報ならび]|R2],_経路情報ならび), 隣接情報の登録(_県名,_都道府県名ならび,_隣接情報ならび), length([_|L0],_都道府県番号), write('%2d.%t ',[_都道府県番号,_県名]), R2 = [], write('\n'). 第一要素は都道府県名、残りは経路情報(LL,_都道府県名ならび,_経路情報ならび) :- LL = [_都道府県名ならび|_経路情報ならび],!. 隣接情報の登録(_都道府県名,_都道府県名ならび,L1) :- abolish(隣接県距離/3), append(L0,[_距離|R],L1), \+(_距離 = (-1)), \+(_距離 = 0), length([_|L0],Nth), list_nth(Nth,_都道府県名ならび,_都道府県名2), assertz(隣接県距離(_都道府県名,_件名2,_距離)), fail. 隣接情報の登録(_,_,_). 最短経路(_出発地,_目的地,_距離,_順路) :- findall([_順路,_距離],( 到達(_出発地,_目的地,_距離,[],_順路)), _順路・距離ならび), findmin(_距離,append(_,[[_,_距離]|_],_順路・距離ならび),_最短距離), append(_,[[_順路,_最短距離]|_],_順路距離ならび). 到達(_都道府県名1,_都道府県名2,_距離,_順路1,_順路) :- 隣接県距離(_都道府県名1,_都道府県名2,_距離), append(_順路1,[[_都道府県名1,_都道府県名2]],_順路),!. 到達(_都道府県名1,_都道府県名2,_距離,_順路1,_順路) :- length(_順路1,_経路数), _経路数 < 7, 隣接県距離(_都道府県名1,_都道府県名3,_距離1), この経路は選択されたことがない(_都道府県名1,_都道府県名2), append(_順路1,[[_都道府県名1,_都道府県名3]],_順路2), 到達(_都道府県名1,_都道府県名2,_距離2,_順路2,_順路), _距離 is _距離1 + _距離2. この経路は選択されたことがない(_都道府県名1,_都道府県名2) :- \+(append(_,[[_都道府県名1,_都道府県名3]|_],_順路1)), \+(append(_,[[_都道府県名3,_都道府県名1]|_],_順路1)),!. % 以下のサイトは # C#,C#の宿題片付けます。#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/1294061094/189 # # [1] 授業単元: C言語基礎 # [2] 問題文(含コード&リンク): http://ime.nu/www.dotup.org/uploda/www.dotup.org1351836.jpg # # 二次元平面上の二点A,Bの座標を引数として点A,B間の距離を返す関数distance()を作成し, # さらにdistance()を利用して二点の座標を引数として,その二点を直径とする円の面積を計算して # 返すcircle()を作れ。 # '二次元平面上の二点A,Bの座標を引数として点A,B間の距離を返す'(A_X,A_Y,B_X,B_Y,_二点間の距離) :- _二点間の距離 is abs(sqrt((A_X - B_X) * (A_X - B_X) + (A_Y - B_Y) * (A_Y - B_Y))). '二点の座標を引数として,その二点を直径とする円の面積'(A_X,A_Y,B_X,B_Y,_円の面積) :- '二次元平面上の二点A,Bの座標を引数として点A,B間の距離を返す'(A_X,A_Y,B_X,B_Y,_二点間の距離), _円の面積 is (_二点間の距離 / 2) * (_二点間の距離 / 2) * pi. % 以下のサイトは # 出典:: 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/tech/1288531658/46 # # 1] 授業単元: プログラミング2 # [2] 問題文(含コード&リンク): # 二次元平面上のある点はx座標とy座標とで表わされる。(x、yはそれぞれ実行値とする) # また、点a(2.0,3.0)と点b(6.0,5.0)とを考える。このとき次の問題を解くプログラムを作成せよ。 # プログラムは全部まとめて1つのプログラムでよい。 # 1.二次元平面の天を表わす構造体struct pointを定義せよ。 # 2.点aと点bの中点を求めよ。 # 3・点aから点bまでの距離を求めよ。 # 4.点aと点bを結ぶ直線y=px+qのp,qを求めよ。 # point((X,Y),X,Y) :- !. point([X,Y],X,Y) :- !. '点aと点bの中点を求めよ。'(_a,_b,_中点) :- point(_a,X1,Y1), point(_b,X2,Y2), _中点 = (X3,Y3), X3 is (X1 + X2) / 2, Y3 is (Y1 + Y2) / 2. '点aから点bまでの距離を求めよ。'(_a,_b,_距離) :- point(_a,X1,Y1), point(_b,X2,Y2), _距離 is sqrt((X2-X1) ^ 2 + (Y2-Y1)^2). '点aと点bを結ぶ直線y=px+qのp,qを求めよ。'(_a,_b,_p,_q) :- point(_a,X1,Y1), point(_b,X2,Y2), _p is (Y2-Y1) / (X2-X1), _q is Y1 - _p * X1. % 以下のサイトは # 出典:: 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/tech/1286978599/277 # # [1] 授業単元: プログラム # [2] 問題文(含コード&リンク):テキストからデータを読み込んでユークリッド距離を求めるプログラムをお願いします。また、データを増やす事と最大距離と最小距離を求めてください。三次元なので、n=3とします。 # 'テキストからデータを読み込んでユークリッド距離を求めるプログラムをお願いします。また、データを増やす事と最大距離と最小距離を求めてください。三次元なので、n=3とします。'(_二点と距離ならび,_最大距離,_最小距離) :- データの読み込み(L), 組み合わせ位置番号ならびの生成(L,_位置番号ならび), findall([(x1,x2,x3),(y1,y2,y3),_距離],( 組み合わせ(_位置番号ならび,2,[Nth1,Nth2]), list_nth(Nth1,L,[X1,X2,X3]), list_nth(Nth2,L,[Y1,Y2,Y3]), _距離 is sqrt((X1-Y1)^2 + (X2-Y2)^2 + (X3-Y3)^2))), _二点と距離ならび), 最大値・最小値の取得(_二点と距離ならび,_最大値,_最小値). データの読み込み(L) :- write('データ(x1,x2,x3を)カンマ区切りで入力してください。(終了は空行で) : '), get_line(Line), データの読み込み(Line,L). データの読み込み('',[]) :- !. データの読み込み(Line,[[X1,X2,X3]|R]) :- split(Line,[',',' '],[X1,X2,X3]), get_line(Line2), データの読み込み(Line2,R). 組み合わせ位置番号ならびの生成(L,_位置番号ならび) :- length(L,Length), findall(N,for(1,N,Length),_位置番号ならび). 最大値・最小値の取得(_二点と距離ならび,_最大値,_最小値) :- 距離を分離(_二点と距離ならび,_距離ならび), max(_距離ならび,_最大距離), min(_距離ならび,_最小距離). 距離を分離([],[]) :- !. 距離を分離([[_,_,_距離]|R1],[_距離|R2]) :- 距離を分離(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/921 # # 質問にきましたお邪魔します。 # [1] Cプログラミング # [2] 問題文(含コード&リンク): 数問あるのでリンクからお願いします。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10941.txt # # 問4.平面上の点の座標(2つの実数)をキーボードから入力し、 # その点が原点を中心とする半径1の円の中にある場合には「中」、外にある場合には「外」と表示するプログラム。 # '平面上の点の座標(2つの実数)をキーボードから入力し、その点が原点を中心とする半径1の円の中にある場合には「中」、外にある場合には「外」と表示する' :- write('x座標(実数)を入力してください : '), 実数を得る(_x座標), write('y座標(実数)を入力してください : '), 実数を得る(_y座標), _原点からの距離 is sqrt(_x座標^2 + _y座標^2), その点が原点を中心とする半径1の円の中にある場合には「中」、外にある場合には「外」と表示する'(_原点からの距離,_中または外). 'その点が原点を中心とする半径1の円の中にある場合には「中」、外にある場合には「外」と表示する'(_原点からの距離,中) :- _原点からの距離 =< 1.0,!. 'その点が原点を中心とする半径1の円の中にある場合には「中」、外にある場合には「外」と表示する'(_原点からの距離,外) :- _原点からの距離 > 1.0,!. % 以下のサイトは # 出典: C/C++の宿題片付けます 136代目 #874 # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):モンテカルロ法で円周率を求めるプログラムを作れ。 # モンテカルロ法で円周率を求める(_試行数,_円周率) :- '正方形の中に適当に点を打つとき、その点が正方形の一辺を直径とする円の円内にある数'(_試行数,_円内にある数), _円周率 is (_円内にある数 * 4) / _試行数. '正方形の中に適当に点を打つとき、その点が正方形の一辺を直径とする円の円内にある数'(_試行数,_円内にある数) :- count((for(1,N,_試行数),落ちた点は円内にある),_円内にある数). 落ちた点は円内にある :- '落ちた点と原点の距離が辺の長さ(1.0)以内'. '落ちた点と原点の距離が辺の長さ(1.0)以内' :- X is ((random mod 2001) - 1000) / 1000, Y is ((random mod 2001) - 1000) / 1000, X * X + Y * Y =< 1.0,!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/48 # # 【 課題 】ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/959.zip # 【 形態 】1. Javaアプリケーション(main()で開始) or 2. Applet # 【 補足 】一つの物をつくるのですが、何回かに分けて提出です。pdfファイルを見ていただければわかると思います。 # 問題: # 一定の幅と高さをもつボードがある。図 1のようにボード上には左上隅を原点とする座標系 # (x座標、y座標)が定義されているとする。この時、つぎの条件を満たすように二辺の長 # さ(幅と高さ)と左上の位置を表す座標をもつ長方形をボード上に配置するプログラムを作 # 成せよ。座標系の単位はピクセルとする。ボードの大きさは最終版では指定したアプレットの # 大きさに依存して決定する。CUIの場合には固定値でよい。例えば 600×500。 # (1) # 配置に関する以下の操作を行うことができる。各操作の名前には下線が引かれている。 # a)幅、高さ、左上の位置(x座標、y座標)を与えて長方形を作成する。create # b)長方形 Rを指定して、Rを現在位置から指定したx方向の距離 x 0,y方向の距離 y 0だけ移動する。move # c)長方形 Rを指定して、指定した幅の倍率 mxで幅を、高さの倍率 myで高さをそれぞれ拡大または縮小する。倍率は有限小数で与えるものとする。幅・高さ・座標の値はMathクラスの roundメソッドを使用して決定する。expand/shrink # d)長方形 Rを指定して削除する。delete # e)ボード上の長方形をすべて削除する。deleteAll # f) 2つの長方形 R1と R2を指定し、R1と R2の重なり部分を抽出し、新たな長方形 R3 # として配置する。intersect # (2) # その他に次の操作を行うことができる。 # a)ボード上の長方形を表示する。displayBoard # ここで「ボード上の長方形を表示する」とはボード上にあるすべての長方形の属性(幅、 # 高さ、x 座標、y 座標)を表示する(標準出力に出力する)ということ。 # b) 配置に関する操作を終了する。 exit # (3) # ユーザはキーボード(標準入力)から(1)の操作名と必要なデータを入力し、プログラ # ムが結果のボード上のデータ(どの位置にどの長方形が配置されているか)を標準出 # 力に出力する。このプログラムは以下のように使用することができる。 # a) 起動すると、操作一覧が表示される。 # b) ユーザは操作を選択し、要求されるデータを入力する。 # c) 操作の実行が終了すると、操作一覧に戻り、exit が実行されるまで操作を選択することができる。 # (4) # 長方形に関する条件: # a)ボード上で同じ幅、高さ、位置をもつ長方形は同一の長方形とみなす。 # b)今回は点および線分は長方形とはみなさない。 # c)ボード上に配置できる長方形の数の上限は 10とする。 # (5) # 操作に関する条件: # a)ある操作によって、ボードから長方形がはみ出す場合には、その入力の値を無効と # して、操作をやり直す。 # b)操作が無効である場合は、適切なメッセージを出力する。 # (6) # クラス構成に関する条件: # RectangleEditor:mainメソッドをもつクラス # Rectangle:長方形のクラス # Board:長方形を配置するボードのクラス # Command: ユーザからの入力を受け取り、長方形に対する操作を呼び出し、ボードの状 # 態を更新するクラス 長方形番号管理([]). 長方形番号追加(N) :- repeat, N is random, retract(長方形番号管理(L)), \+(member(N,L)), assertz(長方形番号管理([N|L])),!. 長方形番号削除(N) :- retract(長方形番号管理(L)), ならびから削除(N,L,L1), assertz(長方形番号管理(L1)),!. '幅、高さ、左上の位置(x座標、y座標)を与えて長方形を作成する'(_幅,_高さ,_左上のx座標,_左上のy座標,_長方形) :- 長方形番号追加(_長方形), assertz(長方形(_長方形,_幅,_高さ,_左上のx座標,_左上のy座標)). '長方形 Rを指定して、Rを現在位置から指定したx方向の距離 x 0,y方向の距離 y 0だけ移動する'(R,X0,Y0,R2) :- 長方形(R,_幅,_高さ,_左上のx座標,_左上のy座標), _左上のx座標2 is _左上のx座標 + X0, _左上のy座標2 is _左上のy座標 + Y0, '幅、高さ、左上の位置(x座標、y座標)を与えて長方形を作成する'(_幅,_高さ,_左上のx座標2,_左上のy座標2,R2). '長方形 Rを指定して、指定した幅の倍率 mxで幅を、高さの倍率 myで高さをそれぞれ拡大または縮小する。倍率は有限小数で与えるものとする。幅・高さ・座標の値はMathクラスの roundメソッドを使用して決定する'(R,_mx,_my,R2) :- 長方形(R,_幅,_高さ,_左上のx座標,_左上のy座標), _幅2 is round(_幅 * _mx), _高さ2 is round(_高さ * _my), '幅、高さ、左上の位置(x座標、y座標)を与えて長方形を作成する'(_幅2,_高さ2,_左上のx座標,_左上のy座標,R2). '長方形 Rを指定して削除する'(R) :- 長方形番号削除(R). 'ボード上の長方形をすべて削除する' :- abolish(長方形番号/1),assertz(長方形番号([])). '2つの長方形 R1と R2を指定し、R1と R2の重なり部分を抽出し、新たな長方形 R3として配置する'(R1,R2,R3) :- 長方形(R1,_幅1,_高さ1,_左上のx座標1,_左上のy座標1), 長方形(R2,_幅2,_高さ2,_左上のx座標2,_左上のy座標2), _右上のx座標1 is _左上のx座標1 + _幅1, _右下のy座標1 is _左上のy座標1 + _高さ1, _右上のx座標2 is _左上のx座標2 + _幅2, _右下のy座標2 is _左上のy座標2 + _高さ2, 重なる部分(_左上のx座標1,_右上のx座標1,_左上のx座標2,_右上のx座標2,X31,X32), 重なる部分(_左上のy座標1,_右上のy座標1,_左上のy座標2,_右上のy座標2,Y31,Y32), _幅3 is X32 - X31, _高さ3 is Y32 - Y31, '幅、高さ、左上の位置(x座標、y座標)を与えて長方形を作成する'(_幅3,_高さ3,X31,Y31,R3),!. ボード上の長方形を表示する :- 長方形(_長方形,_幅,_高さ,_左上のx座標,_左上のy座標), write_formatted('長方形=%t,幅=%t,高さ=%t,左上のx座標=%t,左上のy座標=%t\n',[_長方形,_幅,_高さ,_左上のx座標,_左上のy座標]), fail. ボード上の長方形を表示する. 重なる部分(X1,X2,X3,X4,X3,X2) :- X1 =< X3,X2 =< X4,!. 重なる部分(X1,X2,X3,X4,X3,X4) :- X1 =< X3,X2 >= X4,!. 重なる部分(X1,X2,X3,X4,X1,X4) :- X1 >= X3,X2 >= X4,!. 重なる部分(X1,X2,X3,X4,X1,X2) :- X1 >= X3,X2 =< X4,!. % 以下のサイトは # 出典:: 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/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/1260532772/6 # # # 問題4 # 平面上の2点(x1,y1)、(x2,y2)を入力し、それら2点間の距離を算出するプログラムを作成せよ。Aの平方根はsqrt(A)という数学関数で算出される(Aは引数でdouble型)。 # 数学関数を使用する場合、というファイルから情報を得なければならないので、#includeの # 下の行に#includeという命令文を付け加えなければならない(2つのinclude文)。実行結果の例を以下に示す。 # ------------------------------------------------ # x1:0 # y1:0 # x2:1 # y2:1 # この2点間の距離は1.414214です。 '平面上の2点(x1,y1)、(x2,y2)を入力し、それら2点間の距離を算出する' :- '2点の座標を得る'([x1,y1,x2,y2],[X1,Y1,X2,Y2]), 平面上の2点間の距離(X1,Y1,X2,Y2,_2点間の距離), write_formatted('この2点間の距離は%tです。\n',[_2点間の距離]). '2点の座標を得る'([],[]) :- !. '2点の座標を得る'([A|R1],[V|R2]) :- concat_atom([A,' :'],S), write(S), get_line(Line), atom_to_term(Line,V,_), '2点の座標を得る'(R1,R2). 平面上の2点間の距離(X1,Y1,X2,Y2,_2点間の距離) :- _2点間の距離 is sqrt((X2-X1)^2 + (Y2-Y1)^2). % 以下のサイトは % http://pc12.2ch.net/test/read.cgi/tech/1232627790/588 % 【 課題 】車、新幹線、飛行機の3つの交通手段を考える。 % 距離と、所要時間の最大限度(許容最長時間)を指定したとき、許容最長時間内に % 目的地に到着可能で、かつ、費用が一番安い交通手段を調べて表示しなさい。 % ただし、距離(km)と許容最長時間(h) は浮動小数点数としてキーボードから与える。 % 許容最長時間内に到着できる手段がない場合は、「不可能です」と表示する。 % それぞれの時速、料金、利用規定は % 車 : 60km/h、20 円/km、 % 新幹線 : 200km/h、50 円/km、距離が50km以上のときに利用可能 % 飛行機 : 1000km/h、35 円/km、距離が400km以上のときに利用可能 待機・乗降の合計 % で1 時間にかかるとする。 % '車、新幹線、飛行機の3つの交通手段を考える。 距離と、所要時間の最大限度(許容最長時間)を指定したとき、許容最長時間内に 目的地に到着可能で、かつ、費用が一番安い交通手段を調べて表示しなさい。 ただし、距離(km)と許容最長時間(h) は浮動小数点数としてキーボードから与える。 許容最長時間内に到着できる手段がない場合は、「不可能です」と表示する。 それぞれの時速、料金、利用規定は 車 : 60km/h、20 円/km、 新幹線 : 200km/h、50 円/km、距離が50km以上のときに利用可能 飛行機 : 1000km/h、35 円/km、距離が400km以上のときに利用可能 待機・乗降の合計 で1 時間にかかるとする。'(_距離,_許容最長時間,_交通手段) :- '許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段'(_距離,_許容最長時間,_交通手段). '許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段'(_距離,_許容最長時間,_交通手段) :- findall([_費用,_交通手段],( 許容時間内に到達可能な交通手段の費用(_交通手段,_費用)), _候補リスト), min(_候補リスト,[_費用,_交通手段]),!. '許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段'(_,_,'不可能です'). 許容時間内に到達可能な交通手段の費用(_交通手段,_費用) :- 交通手段(_交通手段), 許容時間内に到達可能(_交通手段,_距離,_許容最長時間), 料金(_交通手段,_料金), _費用 is _料金 * _距離. 許容時間内に到達可能(_交通手段,_距離,_許容最長時間) :- 利用規定(_交通手段,_距離), 時速(_交通手段,_時速), 付加的な所要時間(_交通手段,_,_付加的な所要時間), _到達時間 is (_距離 / _時速) + _付加的な所要時間, _到達時間 =< _許容最長時間. 交通手段(車). 交通手段(新幹線). 交通手段(飛行機). 時速(車,60). 時速(新幹線,200). 時速(飛行機,1000). 料金(車,20). 料金(新幹線,50). 料金(飛行機,35). 利用規定(新幹線,_距離) :- _距離 >= 50. 利用規定(飛行機,_距離) :- _距離 >= 400. 利用規定(車,_距離) :- _距離 >= 0. 付加的な所要時間(飛行機,'待機・乗降の合計',1). 付加的な所要時間(車,なし,0). 付加的な所要時間(新幹線,なし,0). % 以下のサイトは % http://pc12.2ch.net/test/read.cgi/tech/1232627790/588 % 【 課題 】車、新幹線、飛行機の3つの交通手段を考える。 % 距離と、所要時間の最大限度(許容最長時間)を指定したとき、許容最長時間内に % 目的地に到着可能で、かつ、費用が一番安い交通手段を調べて表示しなさい。 % ただし、距離(km)と許容最長時間(h) は浮動小数点数としてキーボードから与える。 % 許容最長時間内に到着できる手段がない場合は、「不可能です」と表示する。 % それぞれの時速、料金、利用規定は % 車 : 60km/h、20 円/km、 % 新幹線 : 200km/h、50 円/km、距離が50km以上のときに利用可能 % 飛行機 : 1000km/h、35 円/km、距離が400km以上のときに利用可能 待機・乗降の合計 % で1 時間にかかるとする。 % '車、新幹線、飛行機の3つの交通手段を考える。 距離と、所要時間の最大限度(許容最長時間)を指定したとき、許容最長時間内に 目的地に到着可能で、かつ、費用が一番安い交通手段を調べて表示しなさい。 ただし、距離(km)と許容最長時間(h) は浮動小数点数としてキーボードから与える。 許容最長時間内に到着できる手段がない場合は、「不可能です」と表示する。 それぞれの時速、料金、利用規定は 車 : 60km/h、20 円/km、 新幹線 : 200km/h、50 円/km、距離が50km以上のときに利用可能 飛行機 : 1000km/h、35 円/km、距離が400km以上のときに利用可能 待機・乗降の合計 で1 時間にかかるとする。'(_距離,_許容最長時間,_交通手段) :- '許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段'(_距離,_許容最長時間,_交通手段). '許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段'(_距離,_許容最長時間,_交通手段) :- findall([_費用,_交通手段],( 許容時間内に到達可能な交通手段の費用(_交通手段,_費用)),_候補リスト), min(_候補リスト,[_費用,_交通手段]),!. '許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段'(_,_,'不可能です'). 許容時間内に到達可能な交通手段の費用(_交通手段,_費用) :- 交通手段(_交通手段), 許容時間内に到達可能(_交通手段,_距離,_許容最長時間), 料金(_交通手段,_料金), _費用 is _料金 * _距離. 許容時間内に到達可能(_交通手段,_距離,_許容最長時間) :- 利用規定(_交通手段,_距離), 時速(_交通手段,_時速), 付加的な所要時間(_交通手段,_,_付加的な所要時間), _到達時間 is (_距離 / _時速) + _付加的な所要時間, _到達時間 =< _許容最長時間. 交通手段(車). 交通手段(新幹線). 交通手段(飛行機). 時速(車,60). 時速(新幹線,200). 時速(飛行機,1000). 料金(車,20). 料金(新幹線,50). 料金(飛行機,35). 利用規定(新幹線,_距離) :- _距離 >= 50. 利用規定(飛行機,_距離) :- _距離 >= 400. 利用規定(車,_距離) :- _距離 >= 0. 付加的な所要時間(飛行機,'待機・乗降の合計',1). 付加的な所要時間(車,なし,0). 付加的な所要時間(新幹線,なし,0). % 以下のサイトは % http://pc12.2ch.net/test/read.cgi/tech/1232627790/588 % 【 課題 】車、新幹線、飛行機の3つの交通手段を考える。 % 距離と、所要時間の最大限度(許容最長時間)を指定したとき、許容最長時間内に % 目的地に到着可能で、かつ、費用が一番安い交通手段を調べて表示しなさい。 % ただし、距離(km)と許容最長時間(h) は浮動小数点数としてキーボードから与える。 % 許容最長時間内に到着できる手段がない場合は、「不可能です」と表示する。 % それぞれの時速、料金、利用規定は % 車 : 60km/h、20 円/km、 % 新幹線 : 200km/h、50 円/km、距離が50km以上のときに利用可能 % 飛行機 : 1000km/h、35 円/km、距離が400km以上のときに利用可能 待機・乗降の合計 % で1 時間にかかるとする。 % :- op(250,xf,km). :- op(250,xf,h). :- op(250,xf,円). 交通手段(車). 交通手段(新幹線). 交通手段(飛行機). 時速(車,60 km / h). 時速(新幹線,200 km / h). 時速(飛行機,1000 km / h). 料金(車,20 円 / km). 料金(新幹線,50 円 / km). 料金(飛行機,35 円 / km). 利用規定(新幹線,_距離 km) :- _距離 >= 50. 利用規定(飛行機,_距離 km) :- _距離 >= 400. 利用規定(車,_距離 km) :- _距離 >= 0. 付加的な所要時間(飛行機,'待機・乗降の合計',1 h). 付加的な所要時間(車,なし,0 h). 付加的な所要時間(新幹線,なし,0 h). '許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段'(_距離 km,_許容最長時間 h,_交通手段) :- '許容最長時間内に目的地に到達可能で、'(_距離 km,_許容最長時間 h,_費用_交通手段ならび), 'かつ、費用が一番安い交通手段'(_費用_交通手段ならび,_交通手段),!. '許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段'(_,_,'不可能です'). '許容最長時間内に目的地に到達可能で、'(_距離 km,_許容最長時間 h,_費用_交通手段ならび) :- findall([_費用,_交通手段],( 許容時間内に到達可能な交通手段の費用(_距離 km,_許容最長時間 h,_交通手段,_費用)),_費用_交通手段ならび). 'かつ、費用が一番安い交通手段'(_費用_交通手段ならび,_交通手段) :- 一番安い(_費用_交通手段ならび,_費用,_交通手段),!. 許容時間内に到達可能な交通手段の費用(_距離 km,_許容最長時間 h,_交通手段,_費用) :- 許容時間内に到達可能な交通手段の(_距離 km,_許容最長時間 h,_交通手段), 費用(_交通手段,_距離 km,_費用). 許容時間内に到達可能な交通手段の(_距離 km,_許容最長時間 h,_交通手段) :- 交通手段(_交通手段), 許容時間内に到達可能(_交通手段,_距離 km,_許容最長時間 h). 費用(_交通手段,_距離 km,_費用) :- 料金(_交通手段,_料金 円 / km), _費用 is _料金 * _距離. 許容時間内に到達可能(_交通手段,_距離 km,_許容最長時間 h) :- 利用規定に適合する交通手段を使っての(_交通手段,_距離 km), 到達時間が(_交通手段,_距離 km,_到達時間 h), 許容最長時間内にある(_到達時間 h,_許容最長時間 h). 利用規定に適合する交通手段を使っての(_交通手段,_距離 km) :- 利用規定(_交通手段,_距離 km). 到達時間が(_交通手段,_距離 km,_到達時間 h) :- 時速(_交通手段,_時速 km / h), 付加的な所要時間(_交通手段,_,_付加的な所要時間 h), _到達時間 is (_距離 / _時速) + _付加的な所要時間. 許容最長時間内にある(_到達時間 h,_許容最長時間 h) :- _到達時間 =< _許容最長時間. 一番安い(_価格_交通手段ならび,_一番安い価格,_交通手段) :- select([_一番安い価格,_交通手段],_価格_交通手段ならび,_残り価格_交通手段ならび), forall(member([_価格,_],_残り価格_交通手段ならび),_価格 @>= _一番安い価格).