このディレクトリの索引

% 以下のサイトは % ユーティリティ述語 sub_atom/10 sub_atom/4 sub_atom_list/4 の提案 % % A .. 文字列 (atom) % S .. 検索文字列開始変位 (integer) % L .. 検索文字列の長さ (integer) % R .. 残り長さ (integer) % H .. 検索文字列より前側の文字列 (atom) % X .. 検索文字列 (atom) % T .. 検索文字列より後の残り文字列 (atom) % HL .. 検索文字列より前側の文字ならび (chars) % XL .. 検索文字列文字ならび (chars) % TL .. 検索文字列より後の残り文字ならび (chars) % A がvarである時はH-HL,X-XL,T-TLの3組の中にvar-varの組があってはなりません。 %%% sub_atom/10 %%% sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- atom(A), sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), N is S + L, sub_atom(A,N,R,_,T), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- var(A), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL), length(HL,S), length(XL,L), length(TL,R), concat_atom([H,X,T],A), sub_atom(A,S,L,R,H,X,T,HL,XL,TL). %%% sub_atom/4 %%% sub_atom(A,H,X,T) :- atom(A), sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), N is S + L, sub_atom(A,N,R,_,T), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,H,X,T) :- var(A), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL), length(HL,S), length(XL,L), length(TL,R), concat_atom([H,X,T],A), sub_atom(A,S,L,R,H,X,T,HL,XL,TL). %%% sub_atom_list/4 %%% sub_atom_list(A,HL,XL,TL) :- atom(A), sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), N is S + L, sub_atom(A,N,R,_,T), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom_list(A,HL,XL,TL) :- var(A), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL), length(HL,S), length(XL,L), length(TL,R), concat_atom([H,X,T],A), sub_atom(A,S,L,R,H,X,T,HL,XL,TL). % 以下のサイトは % [1] 授業単元:C言語演習課題 % http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9422.txt % 問題 % 年と月を「YYYY/MM」と入力し、入力された月のカレンダーを表示しなさい。 % % 1752年10月以前、及び10000年1月以降はエラーを返す。 % % 出力形式は以下のとおり % ・1行目は該当月の1日が月曜日でなければ、前月の最終月曜日から表示。 % ・該当月の最終日が日曜日でなければ、翌月の第1日曜日まで表示。 % ・6行目の表示が必要ない場合は表示しない。 % % うるう年判定は以下のとおり % ・年が4で割り切れる年はうるう年。 % ・年が100で割り切れる年はうるう年でない。 % ・年が400で割り切れる年はうるう年である。 % % [出力例] % 年月日を入力:2009/07 % % 月 火 水 木 金 土 日 % 29 30 01 02 03 04 05 % 06 07 08 09 10 11 12 % 13 14 15 16 17 18 19 % 20 21 22 23 24 25 26 % 27 28 29 30 31 01 02 課題のカレンダー(_年/_月) :- not((_年/_月 >= 1752/10,_年/_月 =< 10000/1)), write('エラー: 入力された年月は範囲を逸脱しています\n'),!. 課題のカレンダー(_年/_月) :- _年/_月 @=< 2009/6,!, 曜日検索(_日付,_曜日,2009/6/13,土曜), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー(_年/_月) :- _年/_月 @>= 2009/6,!, 曜日検索(2009/6/13,土曜,_日付,_曜日), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー表示(_年/_月/_日,月曜) :- 日付候補を得る(_年/_月/_日,_年/_月/_日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 課題のカレンダー表示(_年/_月/_日,_曜日) :- not(_曜日=月曜), 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日), 日付候補を得る(_年/_月/_日,_前週の月曜日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日) :- 曜日検索(_前週の月曜日,_前週の曜日,_年/_月/_日,_曜日), _前週の曜日 = 月曜,!. 日付候補を得る(_年/_月/_日,_起点日付,_曜日,_日付整数ならび) :- findall(_日付,( 曜日(_起点日付,_曜日,_日付2,_),(_日付2=_年2/_月2/7,_年2/_月2 @> _年/_月,!,fail;true)),_日付整数ならび). 課題のカレンダー週表示(_日付整数ならび) :- n個組(7,_日付整数ならび,_7個組), 月曜から日曜までヘッドゼロサプライで表示(_7個組). 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t\n',[_日文字列]),!. 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日|R]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t ',[_日付文字列]), 月曜から日曜までヘッドゼロサプライで表示(R). 課題のカレンダー見出し表示 :- write_formatted('月 火 水 木 金 土 日\n'). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_日付,_曜日,_今日,_今日の曜日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_前日,_前日の曜日,_今日,_今日の曜日), 曜日検索(_日付,_曜日,_前日,_前日の曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_日付,_曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), 曜日検索(_翌日,_翌日の曜日,_日付,_曜日). '曜日'(_日付,_曜日,_日付,_曜日) :- ! . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @> _日付2, '前日・今日'(_日付3,_曜日3,_日付1,_曜日1), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @< _日付2, '前日・今日'(_日付1,_曜日1,_日付3,_曜日3), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1245853701/607 # 簡単なデータベース機能を持つプログラムを作成しなさい.対象となるデータは自分で 考えてください. #   (住所録,商品の在庫,図書,ワールドカップの勝敗....) #  以下の要件を示します. # # 1. ファイルからデータを読み込む機能をつけること. # 2. データは4つ以上の項目を保持させること. #  (住所録では、「名前」「住所」「郵便番号」「電話番号」等で4項目以上) # 3. 並び替えの機能をつけること.また並び替える項目が指定できること. # 4. 各項目についてデータの検索を行う機能をつけること.また,検索条件を組み合わ せることができること. #  (住所録なら,「郵便番号」が 399 で始まって,かつ,「電話番号」が 026 で始ま る 等) # 5. データは半角英数字(英語やローマ字)で扱ってよい # 6. データの追加ができること. # 7. データの削除ができること.削除は上記の検索と組み合わせることで,ある条件に 合致したデータを削除できること. # 8. 追加・削除した結果をファイルに保存できること. 鍵項目位置(書籍名,prolog関連書籍(_書籍名,_,_,_,_,_,_,_),_書籍名). 鍵項目位置(副書籍名,prolog関連書籍(_,_副書籍名,_,_,_,_,_,_),_副書籍名). 鍵項目位置(著者名,prolog関連書籍(_,_,_著者名,_,_,_,_,_),_著者名). 鍵項目位置(翻訳者名,prolog関連書籍(_,_,_,_翻訳者名,_,_,_,_),_翻訳者名). 鍵項目位置(発行年月日,prolog関連書籍(_,_,_,_,_発行年月日,_,_,_),_発行年月日). 鍵項目位置(出版社名,prolog関連書籍(_,_,_,_,_,_出版社名,_),_出版社名), 鍵項目位置(書籍コード,prolog関連書籍(_,_,_,_,_,_,_書籍コード),_書籍コード). 項目名を指定しての参照(_述語名/_引数の数,_項目名ならび,_値ならび) :- length(L,_引数の数), P =.. [_述語名|L], findall(_項目値,( call(P), member(_項目名,_項目名ならび), 鍵項目位置(_項目名,P,_項目値)),_値ならび). 項目名を指定して節構造ならびの参照(_項目名ならび,_節構造ならび,_値ならび) :- member([_頭部,_本体],_節構造ならび), findall(_項目値,( call(_本体), /* このアサーションを実行するかが大問題 */ member(_項目名,_項目名ならび), 鍵項目位置(_項目名,_頭部,_項目値)),_値ならび). データベースへの登録(_ファイル) :- reconsult(_ファイル). データベースへの追加(_項) :- assertz(_項). データベースからの削除(_項) :- retract(_項). データベースの保存(_述語名/_引数の数,_保存ファイル名) :- tell(_保存ファイル名), listing(_述語名/_引数の数), told. 節定義の並べ替え(_述語名/_引数の数,_鍵項目,上昇順) :- 上昇順節構造(_述語名/_引数の数,_鍵項目,_上昇順に整列された節構造ならび), abolish(_述語名/引数の数), ( member([H,B],_上昇順に整列された節構造ならび), assertz((H :- B)), fail; true ). 節定義の並べ替え(_述語名/_引数の数,_鍵項目,下降順) :- 下降順節構造(_述語名/_引数の数,_鍵項目,_上昇順に整列された節構造ならび), abolish(_述語名/引数の数), ( member([H,B],_上昇順に整列された節構造ならび), assertz((H :- B)), fail; true ). 上昇順節構造(_述語名/_引数の数, _鍵項目, _上昇順に整列された節構造ならび) :- 節構造ならびの取得(_述語名/_引数の数,_節構造ならび), ならびの先頭に鍵項目を付加(_鍵項目ならび, _節構造ならび, _鍵付加き節構造ならび), 上昇順整列(_鍵付加き節構造ならび, _上昇順に整列された鍵付き節構造ならび), ならびの先頭の鍵項目を除去(_上昇順に整列された鍵付き節構造ならび, _上昇順に整列された節構造ならび),!. 下降順節構造(_述語名/_引数の数,_鍵項目,_下降順に整列された節構造ならび) :- 節構造ならびの取得(_述語名/_引数の数,_節構造ならび), ならびの先頭に鍵項目を付加(_鍵項目ならび, _節構造ならび, _鍵付加き節構造ならび), 下降順整列(_鍵付加き節構造ならび, _下降順に整列された鍵付き節構造ならび), ならびの先頭の鍵項目を除去(_下降順に整列された鍵付き節構造ならび, _下降順に整列された節構造ならび),!. 節構造ならびの取得(_述語名/_引数の数,_節構造ならび) :- length(L,_引数の数), H =.. [_述語名|L], findall([H,B],clause(H,B),_節構造ならび),!. ならびの先頭に鍵項目を付加(_,[],[]) :- !. ならびの先頭に鍵項目を付加(_鍵項目ならび, [[_頭部,_本体]|R1], [_鍵付き節構造|R2]) :- findall(_値,(member(_鍵,_鍵項目ならび),鍵項目位置(_鍵,_頭部,_値)),L), append(L,[_頭部,_本体],_鍵付き節構造), ならびの先頭の鍵項目を除去(_鍵項目ならび,_鍵付き節構造ならび,_節構造ならび) :- length(_鍵項目ならび,_除去する項数), ならびの先頭N個の鍵項目を除去(N,_鍵付き節構造ならび,_節構造ならび). ならびの先頭N個の鍵項目を除去(N,[L1|R1],[L2|R2]) :- append(L0,L2,L1), length(L0,N), ならびの先頭N個の鍵項目を除去(N,R1,R2). 上昇順に整列(L1,L2) :- 整列(上昇,L1,L2). 下降順に整列(L1,L2) :- 整列(下降,L1,L2). 整列(_,[],[]) :- !. 整列(_上昇または下降,[X|Xs],Ys) :- 配分(_上昇または下降,Xs,X,Littles,Gigs), 整列(_上昇または下降,Littles,Ls), 整列(_上昇または下降,Bigs,Bs), append(Ls,[X|Bs],Ys). 配分(_,[],Y,[],[]) :- !. 配分(上昇,[X|Xs],Y,[X|Ls],Bs) :- X @=< Y,!,配分(上昇,Xs,Y,Ls,Bs). 配分(上昇,[X|Xs],Y,Ls,[X|Bs]) :- X @> Y,!,配分(上昇,Xs,Y,Ls,Bs). 配分(下降,[X|Xs],Y,[X|Ls],Bs) :- X @>= Y,!,配分(下降,Xs,Y,Ls,Bs). 配分(下降,[X|Xs],Y,Ls,[X|Bs]) :- X @< Y,!,配分(下降,Xs,Y,Ls,Bs). 鍵項目位置定義(述語名,_項目名ならび) :- length(_項目名ならび,Len), for(1,N,Len), list_nth(N,_項目名ならび,_項目名), 変数文字列の生成(Len,N,項目名,_項目変数文字列,_変数文字列), concat_atom(['鍵項目位置(',_項目名,述語名,'(',_変数文字列,')', _項目変数文字列,')'],S), parse_atom(S,1,P,V), assertz_with_names(P,V), N = Len,!. 変数文字列の生成(N,Len,項目名,_項目変数文字列,_変数文字列) :- M is N - 1, length(L1,M), all(L1,'_'), M2 is Len - N, length(L2,M2), all(L2,'_'), atom_concat('_',項目名,_項目変数文字列), append(L1,[_項目変数文字列|L2],L), concat_atom(L,',',_変数文字列). all([],_). all([A|R],V) :- all(R,V). % 以下のサイトは % *** user: http_ステータスコード / 2 *** http_ステータスコード(100,'Continue'). http_ステータスコード(101,'Switching Protocols'). http_ステータスコード(200,'OK'). http_ステータスコード(201,'Created'). http_ステータスコード(202,'Accepted'). http_ステータスコード(203,'Non-Authoritative Infomation'). http_ステータスコード(204,'No Content'). http_ステータスコード(205,'Reset Content'). http_ステータスコード(206,'Partial Content'). http_ステータスコード(300,'Multiple Choices'). http_ステータスコード(301,'Moved Permanently'). http_ステータスコード(302,'Moved Temporarily'). http_ステータスコード(303,'See Other'). http_ステータスコード(304,'Not Modified'). http_ステータスコード(305,'Use Proxy'). http_ステータスコード(400,'Bad Request'). http_ステータスコード(401,'Unauthorized'). http_ステータスコード(402,'Payment Required'). http_ステータスコード(403,'Forbidden'). http_ステータスコード(404,'Not Found'). http_ステータスコード(405,'Method Not Allowed'). http_ステータスコード(406,'Not Acceptable'). http_ステータスコード(407,'Proxy Authentication Required'). http_ステータスコード(408,'Request Timeout'). http_ステータスコード(409,'Conflict'). http_ステータスコード(410,'Gone'). http_ステータスコード(411,'Length Required'). http_ステータスコード(412,'Precondition Failed'). http_ステータスコード(413,'Request Entity Too Large'). http_ステータスコード(414,'Request-URI Too Long'). http_ステータスコード(415,'Unsupported Media Type'). http_ステータスコード(500,'Internal Server Error'). http_ステータスコード(501,'Not Implemented'). http_ステータスコード(502,'Bad Gateway'). http_ステータスコード(503,'Server Unavailable'). http_ステータスコード(504,'Gateway Timeout'). http_ステータスコード(505,'HTTP Version Not Supported'). % *** user: http_ステータスコード / 3 *** http_レスポンスメッセージ(100,'Continue','この応答はクライアントへの仮の応答です。多くの場合、プロキシーやサーバーは、最終的な応答を返すまでにはまだ時間がかかる場合にこのコードを使います。' ). http_レスポンスメッセージ(101,'Switching Protocols','HTTP/1.1では現在は使われていませんが、準拠しているアプリケーションがUpgradeヘッダーに示される、より有利なプロトコルや効果的なプロトコルに切り替えようとしていることを示します。'). http_レスポンスメッセージ(200,'OK','全般的に成功したことを示します。'). http_レスポンスメッセージ(201,'Created','このコードは、PUTリクエストへのレスポンスで用いることができるコードで、新しいリソースが作成されて利用可能であることを示します'). http_レスポンスメッセージ(202,'Accepted','サーバーはリクエストを受け付けたけれども、その処理を延期することを示します。このレスポンスは、リクエストが最終的に処理されることを保証するものではありません。'). http_レスポンスメッセージ(203,'Non-Authoritative Infomation','エンティティヘッダーの情報はオリジンサーバーが設定したものではないことを示しています。'). http_レスポンスメッセージ(204,'No Content','リクエストは成功したけれども新しいエンティテイボディは返されていないことを示します。クライアントは現在の表示を維持するべきです。'). http_レスポンスメッセージ(205,'Reset Content', 'このコードは、HTTPによってデータ入力を繰り返し行えるようにする場合に使われます。このコードを受け取ったクライアントは、サーバーが最初に指定したデフォルトの状態に表示をリセットするべきです。'). http_レスポンスメッセージ(206,'Partial Content','レンジ検索が成功したことを示すコードです。'). http_レスポンスメッセージ(300,'Multiple Choices','要求されたリソースが複数の形で表現できることを、クライアントが最良の表示を選択できるような情報とともに示します。'). http_レスポンスメッセージ(301,'Moved Permanently','要求されたリソースが複数の形で表現できることを、クライアントは返された新しいURIを使うべきです。'). http_レスポンスメッセージ(302,'Moved Temporarily','リソースが一時的に移動したことを示します。以後クライアントは現在のURIを継続して使うべきです。'). http_レスポンスメッセージ(303,'See Other','ユーザーエージェントは返されたURIに対するGETリクエストを行って目的のレスポンスを検索するべきであることを示しています。これによって、POSTリクエストを他のリソースにリダイレクトすることができます。'). http_レスポンスメッセージ(304,'Not Modified','条件付きGETの対象であるリソースが変更されていないことを示します。'). http_レスポンスメッセージ(305,'Use Proxy','ユーザーエイジェントはプロキシーを経由してリクエストを行わなければならないことを示します。'). http_レスポンスメッセージ(400,'Bad Request','リクエストにシンタックスの誤りがあることを示します。'). http_レスポンスメッセージ(401,'Unauthorized','リソースにアクセスするには認証が必要です。'). http_レスポンスメッセージ(402,'Payment Required','将来のために予約されています。'). http_レスポンスメッセージ(403,'Forbidden','サーバーはリクエストを理解しましたが、処理は行いません。\n'). http_レスポンスメッセージ(404,'Not Found','指定されたリソースがサーバー上にないことを示します\n'). http_レスポンスメッセージ(405,'Method Not Allowed','クライアントが使ったメソッドは、そのリソースに対して許可されていません。'). http_レスポンスメッセージ(406,'Not Acceptable','サーバーが返すレスポンスは、Accept-*ヘッダーで指定されたクライアントの希望を満たしていません。'). http_レスポンスメッセージ(407,'Proxy Authentication Required','ユーザーは、プロキシーエージェントに対して自分自身を認証する必要があります。'). http_レスポンスメッセージ(408,'Request Timeout','クライアントがリクエストの発行を完了しなかったために、サーバー側でタイムアウトが発生しました。'). http_レスポンスメッセージ(409,'Conflict','リソースの現在の状態に矛盾が生じているために、リクエストを処理することができませんでした。'). http_レスポンスメッセージ(410,'Gone','リソースが現在も、そして将来的にも利用不能であることを示します。'). http_レスポンスメッセージ(411,'Length Required','クライアントは、有効なContent-lengthを指定しなければなりません。'). http_レスポンスメッセージ(412,'Precondition Failed','条件付きヘッダーの一つが偽であることを示します。'). http_レスポンスメッセージ(413,'Request Entity Too Large','リクエストのエンティティが大きすぎて、サーバーでは受け付けらません。'). http_レスポンスメッセージ(414,'Request-URI Too Long','リクエストのURIが長すぎて、サーバーでは受け付けらません。'). http_レスポンスメッセージ(415,'Unsupported Media Type','エンティティのメディアタイプはサーバーが受付ることができない形式です。'). http_レスポンスメッセージ(500,'Internal Server Error','何らかのサーバーエラーが発生しました。'). http_レスポンスメッセージ(501,'Not Implemented','要求されたメソッドはサーバーではサポートされていません。'). http_レスポンスメッセージ(502,'Bad Gateway','クライアントのリクエストを処理しようとした際に、上位側から無効なレスペンスを受信しました。'). http_レスポンスメッセージ(503,'Server Unavailable','現時点ではサーバーはリクエストを処理できません。サーバーが過負荷な状態であるか、またはメンテナンス中であるといった一時的な状態を示します。'). http_レスポンスメッセージ(504,'Gateway Timeout','サーバーがプロキシーとして機能している時に、レスポンスを受け取れずにタイムアウトが発生したことを示します。'). http_レスポンスメッセージ(505,'HTTP Version Not Supported','サーバーが、リクエストに使われたHTTPバージョンをサポートしていないか、またはサポートするつもりがないことを示します。'). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1248012902/53 # 【 課題 】 # 以下のURLから正規表現を用いてキーワードの部分のみ抽出する # プログラムを作成せよ。 # # http://www.google.co.jp/search?q=キーワード&lr=lang_ja&ie=utf-8&oe=utf-8&aq=trls=org.mozilla:ja:official&client=firefox-a % Prolog は正規表現をサポートしないのでここでは汎用検索述語sub_atom/10を % 使ってみる。 t571(URL,_キーワード) :- sub_atom(URL,_,_,_,_,'?q=',G,_,_,_), sub_atom(G,_,_,_,_キーワード,'&',_,_,_,_),!. % ユーティリティ述語 sub_atom/10 の提案 % % A .. 文字列 (atom) % S .. 検索文字列開始変位 (integer) % L .. 検索文字列の長さ (integer) % R .. 残り長さ (integer) % H .. 検索文字列より前側の文字列 (atom) % X .. 検索文字列 (atom) % T .. 検索文字列より後の残り文字列 (atom) % HL .. 検索文字列より前側の文字ならび (chars) % XL .. 検索文字列文字ならび (chars) % TL .. 検索文字列より後の残り文字ならび (chars) % A がvarである時はH-HL,X-XL,T-TLの3組の中にvar-varの組があってはなりません。 sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- atom(A), !, sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), N is S + L, sub_atom(A,N,R,_,T), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- var(A), !, atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL), length(HL,S), length(XL,L), length(TL,R), concat_atom([H,X,T],A), sub_atom(A,S,L,R,H,X,T,HL,XL,TL). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1247438792/704 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9863.txt # リストを用いた成績処理 # リストを用いて個人データを格納する表を作成 # 処理番号を入力して処理の切り替えを行う # 1.成績一覧表示, 2.個人成績表示, # 3.個人平均点表示,4.科目平均点表示, # 0.終了 # リストに新たにデータを追加する時は学生番号順に並ぶように追加する. # リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする. # # 入力する成績データ(この順番で入れる) # 学番名前英語数学化学物理 # 106 tada 65 80 90 100 # 101 kouda 50 85 70 65 # 103 hanako 70 75 65 80 # 104 akane 60 95 80 75 # 102 tarou 90 80 85 65 # 105 nara 80 70 50 95 t590 :- 初期データの入力(L), t590実行(L,_機能), _機能 = 終了(_,_). t590実行(L,_機能) :- 処理番号を入力して処理の切り替えを行う(L,_機能), call(_機能). t590実行(L,_機能) :- t590実行(L,_機能). 処理番号を入力して処理の切り替えを行う :- 処理番号選択を催促する, get_line(Line), atom_to_term(Line,_処理番号,_), 処理番号による機能選択(_処理番号,_機能). 処理番号選択を催促する :- write('1. 一覧表示\n2. 個人成績表示\n3. 個人平均点表示\n4. 科目平均点表示\n0. 終了\n'). 処理番号による機能選択(1,一覧表示). 処理番号による機能選択(2,個人成績表示). 処理番号による機能選択(3,個人平均点表示). 処理番号による機能選択(4,科目平均点表示). 処理番号による機能選択(0,終了). 終了(_,_). 一覧表示(L,_) :- member([A,B,C,D,E,F],L), write_formatted('%t,%t,%t,%t,%t,%t\n',[A,B,C,D,E,F]), fail. 一覧表示(_,_). 個人成績表示(L,[A,B,C,D,E,F]) :- write('検索したい学番を入れてください :'), get_line(Line), atom_to_term(Line,A,_), member([A,B,C,D,E,F],L), write_formatted('%t,%t,%t,%t,%t,%t\n',[A,B,C,D,E,F]),!. 個人平均点表示(L,[Avg]) :- findavg(U,(member([_,_,C,D,E,F],L),U is C+D+E+F),Avg), write_formatted('個人平均点は %tです\n',[Avg]). 科目別平均点表示(L,[AvgC,AvgD,AvgE,AvgF]) :- findavg(C,member([_,_,C,_,_,_],L),AvgC), findavg(D,member([_,_,_,D,_,_],L),AvgD), findavg(E,member([_,_,_,_,E,_],L),AvgE), findavg(F,member([_,_,_,_,_,F],L),AvgF), write_formatted('英語平均点=%t,数学=%t,化学=%t,物理=%t\n',[AvgC,AvgD,AvgE,AvgF]),!. 初期データの入力(Ls) :- write('初期データを入力してください\n'), get_line(Line), 初期データの入力(Line,[],Ls),!. 初期データの入力(end_of_file,Ls,Ls) :- !. 初期データの入力(Line,Ls1,Ls2) :- split(Line,[' '],L), insert_Ls(L,Ls1,Ls3), get_line(Line2), 初期データの入力(Line2,Ls3,Ls2). insert_Ls(L,[],[L]) :- !. insert_Ls([A|R1],[[B|R2]|R3],[[A|R1],[B|R2]|R3]]) :- A @=< B,!. insert_Ls([A|R1],[[B|R2]|R3],[[B|R2]|R3]]) :- A @> B, insert_Ls([A|R1],R3,R4). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1153585095/918 # 所謂覆面算で # 英字一文字が一桁の数字(0-9)で表されるとき # one # + nine # + twenty # + fifty # = eighty # となる組み合わせを検索してください # 各行の先頭の文字は0以外です # % 'one + nine + twenty + fifty = eighty' 覆面算(S,LX) :- 覆面算(S,_文字数,_先頭文字ならび,_左項式,_右項式), 順列([0,1,2,3,4,5,6,7,8,9],_文字数,LX2), 変数を対応させる(_先頭文字ならび,LX2,LX), A is _右項式, B is _左項式, A = B. 覆面算(S,_文字数,_先頭文字ならび,_左項式,_右項式) :- split(S,['+',' '],L), 各項の先頭文字(L,_先頭文字ならび), append(L1,LX,L), concat_atom(L,S1), atom_chars(S1,L2), 各文字に変数を割り当てる(L2,[],LV), length(LV,_文字数), 式を構成する(L1,LV,_左項式), 式を構成する(L2,LV,_右項式). 各文字に変数を割り当てる([],X,X). 各文字に変数を割り当てる([A|R1],Y,X) :- member(A,[A=_,Y]), 各文字に変数を割り当てる(R1,Y,X). 各文字に変数を割り当てる([A|R1],Y,X) :- not(member([A=_,Y])), 各文字に変数を割り当てる(R1,[A=_|Y],X). 式を構成する([],_,0). 式を構成する([A|R1],LV,_式 + Y) :- atom_chars(A,Chars), length(Chars,Len), 覆面数値式(Len,LV,Chars,_式), 式を構成する(R1,LV,Y). 覆面数値式(0,_,_,0) :- !. 覆面数値式(N,LV,[A|R1],B + C) :- member(A=V,LV), B = ((10 ^ (N-1)) * V), N2 is N - 1, 覆面数値式(N2,LV,R1,C). 変数を対応させる(_,[],[]) :- !. 変数を対応させる(_先頭文字ならび,[A|R1],[B=A|R2]) :- member(B,_先頭文字ならび),!, not(A=0), 変数を対応させる(_先頭文字ならび,R1,R2). 変数を対応させる(_先頭文字ならび,[A|R1],[B=A|R2]) :- not(member(B,_先頭文字ならび)), 変数を対応させる(_先頭文字ならび,R1,R2). 各項の先頭文字(L,_先頭文字ならび) :- findall(C,(member(A,L),sub_atom(A,0,1,_,C)),_先頭文字ならび). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1247438792/794 # 【質問テンプレ】 # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文(含コード&リンク):ハッシュ(チェイン法)を使ってkeyを検索し、 # 該当するものがあればそのdataを表示する。 # (実際には検索してkeyとdataを返すまでです) # 詳しくはこちらで http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9879.txt # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9881.txt % 他の言語でハッシュと呼ばれるものに対応するような仕様はPrologにはない。 % 述語がそれにあたるのだろう。ユニフィケーションを基礎に持つ述語呼び出しは % ハッシュに較べて遥に強力である。 t613(Key,Data) :- 'KeyAndData'(Key,Data). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1250204272/483 # [1] 授業単元:C++ STLの使い方 # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9954.txt # STLのvectorとlistを使い、以下の文章操作を行いなさい。 # (Hint:list, vector >の様に使用する) # # a) 文章中の一行の文字をlistに挿入し、そしてそのlistはvectorの各インデック  #   スに挿入されるものとする。 # b) listとvectorのそれぞれの中にあるデータを出力できる。 # c) 2つの行番号を入力し、その行を繋げる関数を作成しなさい。 # (line:1, line:2, result: 1と2の連結、line2は空となりresultはline1になる)# d) 行番号を入力すると、その行の逆順序のものが出力される関数を作成しなさい。 # e) 文字列を与えると、その文字列の含まれるすべての行番号を出力する関数を #   作成しなさい。 t705_a(File) :- get_liens(File,Lines), 述語vectorの定義(1,Lines). 述語vectorの定義(_,[]). 述語vectorの定義(N,[A|R]) :- atom_chars(A,L), assertz(vector(N,L)), N2 is N + 1, 述語vectorの定義(N2,R). t705_b(vector) :- listing(vector). t705_b(list,_行番号) :- vector(_行番号,L), atom_chars(_行,L), write_formatted('%t\n',[_行]). t705_c(_行番号1,_行番号2) :- vector(_行番号1,L1), vector(_行番号2,L2), retract(vector(_行番号1,L1)), retract(vector(_行番号2,L2)), append(L1,L2,L3), assertz(vector(_行番号1,L3)), assertz(vector(_行番号2,[])),!. t705_d(_行番号,_行の逆順) :- vector(_行番号,L1), reverse(L1,L2), concat_atom(L2,_行の逆順). t705_e(_検索文字列,_行番号ならび) :- atom_chars(_検索文字列,L1), findall(_行番号,(vector(_行番号,L),append(_,L1,_,L)),_行番号ならび). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1248012902/361 # 【 課題 】http://ime.nu/www.dotup.org/uploda/www.dotup.org265866.txt.html # コンビニの店員の名前とIDを管理するプログラムを作成する。 # ・データの追加と削除 # ・IDの検索 # ・IDの判断 # ・全データの表示 # ・IDのみ全表示 # ・全データの削除 # ・データが空かどうかの確認 データの追加(_名前,ID) :- \+(名前とID(_名前,ID)),assertz(名前とID(_名前,ID)). データの追加(_名前,ID) :- 名前とID(_名前,ID),assertz(保留情報(データの追加と削除(_名前,ID))). データの削除(_名前,ID) :- retract(名前とID(_名前,ID)),!. データの削除(_名前,ID) :- assertz(保留情報(データの削除(_名前,ID))). 'IDの検索'(ID,_名前) :- 名前とID(_名前,ID). 'IDの判断'(ID,正常) :- atom(ID),atom_to_term(ID,N),integer(N),N>=10000,N=<99999,!. 'IDの判断'(ID,エラー). 全データの表示 :- listing(名前とID). 全データの削除 :- abolish(名前とID/2). データが空かどうかの確認 :- \+(clause(名前とID(_,_),_)). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1248012902/380 # 【 課題 】 # 1・コマンドライン引数で2つの文字列を入力し、1番目に指定された文字列の中に2番目に指定された文字列が存在する場合は # 「この文字列はあります。(○文字目)」と表示し、存在しない場合は「この文字列は存在しません」と表示しなさい。 入力文字数は、1番目の文字列は10文字以上とし、2番目の文字列は2文字以上4文字以内とする。 # また、文字列は先頭から検索し、最初に見つかった文字のインデックスを表示することとする。。 # # 2・任意の文字列を内部で指定し、コマンドライン引数で2つの文字列を入力する。 # もし内部で指定した文字列に、1番目に指定した文字列が存在する場合は、その文字列を # 2番目に指定した文字列と置き換えてから表示し、存在しない場合は「置き換えなし」と表示しなさい。 # 入力文字数は、1番目、2番目ともに4文字以内とする。また最初に内部指定文字列を表示し、 # 1番目の文字列が複数する場合は、すべて置き換わっていること。 # # 3・コマンドライン引数で入力された文字列が # 3文字以下なら、その文字列を20個文字列連結して表示 # 4文字以上なら”たくさん” を表示しなさい。 # 文字列連結の際はStringBufferクラスを使用しなさい # for文を使用しなさい # % 一問目 program :- user_parameters([Atom1,Atom2]), t802検査(Atom1,Atom2,_診断), write_formatted('%t\n',[_診断]). t802検査(Atom1,Atom2,_診断) :- sub_atom(Atom1,S,_,_,Atom2), S2 is S + 1, concat_atom([この文字列はあります。,S2,文字目],_診断),!. t802検査(_,_,'この文字列は存在しません。'). % 二問目 program :- user_parameters([Atom1,Atom2]), 内部で指定した置換対象文字列(_置換対象文字列), t802文字列置換(_置換対象文字列,Atom1,Atom2,X), write_formatted('%t\n',[X]). t802文字列置換(_置換対象文字列,Atom1,Atom2,置き換えなし) :- t802文字列置換の二(_置換対象文字列,Atom1,Atom2,_置換対象文字列). t802文字列置換(_置換対象文字列,Atom1,Atom2,_置換された文字列) :- t802文字列置換の二(_置換対象文字列,Atom1,Atom2,_置換された文字列). t802文字列置換の二(_置換対象文字列,Atom1,Atom2,_置換対象文字列) :- \+(sub_atom(_置換対象文字列,S,Len,R,Atom1)). t802文字列置換の二(_置換対象文字列,Atom1,Atom2,X) :- sub_atom(_置換対象文字列,S,Len,R,Atom1), sub_atom(_置換対象文字列,0,S,_,Atom0), sub_atom(_置換対象文字列,S+Len,R,_,_置換対象文字列の二), t802文字列置換の二(_置換対象文字列の二,Atom1,Atom2,Y), concat_atom([Atom0,Atom2,Y],X). 内部で指定した置換対象文字列(日暮るればうたふ乙女が声すみてとほき田面に早苗とるなり). %三問目 program :- user_parameters([Atom1]), sub_atom(Atom1,0,Len,0,Atom1), t802文字連結(Atom1,Len,X), write_formatted('%t\n',[X]). t802文字列連結(Atom,Len,たくさん) :- Len >= 4. t802文字列置換(Atom,Len,X) :- Len < 4, findall(atom,for(1,N,20),L), concat_atom(L,X). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1248012902/402 # 【 補足 】3問です。本日1日悩みましたが、わかりませんでした。 # いかなる場合でも予期しない例外が出ないこと。 # 1: コマンドライン引数に入力された日付から現在日まで何日かを計算し、「今日まで●日」と表示しなさい。 # 現在日より入力された日付が小さい場合は「-(マイナス)」をつけて表示すること。(日付その他のチェックも行う事) # 2: コマンドライン引数に入力された年と月から、その月が何日まであるかを表示しなさい。(日付その他のチェックも行う事) # 3: コマンドライン引数に入力された日付が、入力された日付の年の何番目の週かを # 「●年の●週目」と表示しなさい。(●年の"●"は入力された日付の年)(日付その他のチェックも行う事) http://pc12.2ch.net/test/read.cgi/tech/1248012902/402 # 【 形態 】1. Javaアプリケーション(main()で開始) # 1 t815_1 :-   user_parameters([_年月日]), 日付整数(今日,_今日の年整数,_今日の月整数,_今日の日整数), atom_to_term(_年月日,_年月日整数,_), 日付整数を年、月、日に分割(_年月日整数,_年整数,_月整数,_日整数), 何日前後から調べる(_今日の年整数/_今日の月整数/_今日の日整数, _年整数/_月整数/_日整数,N日後), write_formatted('入力された日付から今日まで%t日です\n',[N日後]). 日付整数を年、月、日に分割(_日付整数,_年整数,_月整数,_日整数) :- _年整数 is _日付整数 // 10000, Mod1 is _年整数 mod 10000, _月整数 is Mod1 // 100, _日整数 is Mod1 mod 100. 何日前後から調べる(_日付,_日付,0) :- !. 何日前後から調べる(_日付1,_日付2,N日後) :- _日付1 @> _日付2, 何日前後から調べる(_日付2,_日付1,N日後の一), N日後 is (-1) * _N日後の一,!. 何日前後から調べる(_日付1,_日付2,N日後) :- _日付1 @=< _日付2, 前日・今日(_日付1,_日付3), 何日前後から調べる(_日付3,_日付2,M日後), N日後 is M日後 + 1,!. # 2 コマンドライン引数に入力された年と月から、その月が何日まであるかを表示しなさい。(日付その他のチェックも行う事) t815_2 :-   user_parameters([_年,_月]),   月末日は何日(_年,_月,_月末日),   write_formatted('%t年%月の月末日は%t日です\n',[_年,_月,_月末日]). 月末日は何日(_年,'2','29') :-   atom_to_term(_年,_年整数,_),   うるう年(_年整数),!. 月末日は何日(_年,'2','28'). 月末日は何日(_年,_月,'30') :-   member(_月,['4','6','9','11']). 月末日は何日(_年,_月,'31') :-   member(_月,['1','3','5','7','8','10','12']). t815_3 :-   user_parameters([_年月日]), atom_to_term(_年月日,_年月日整数,_), 日付整数を年、月、日に分割(_年月日整数,_年整数,_月整数,_日整数), findall(X,(曜日検索(_年整数/1/1,A,X,Y),Y=A,(X @> _年整数/_月整数/_日整数,!,fail;true)),L), length(L,N週目), write_formatted('この日は1月1日から数えて第%t週目です\n',[N週目]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 日付整数(今日,_年整数,_月整数,_日整数) :- A is time, localtime(A,_年整数,_月整数,_日整数,_,_,_,_,_). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_前日の年/12/31,_年/1/1) :- 一つ違い(_前日の年,_年). 前日・今日(_年/2/29,_年/3/1) :- うるう年(_年). 前日・今日(_年/2/28,_年/3/1) :- not(うるう年(_年)). 前日・今日(_年/_前月/30,_年/_月/1) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]). 前日・今日(_年/_前月/31,_年/_月/1) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]). 前日・今日(_年/_月/_前日,_年/_月/_日) :- 一つ違い(_前日,_日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_日付,_曜日,_今日,_今日の曜日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_前日,_前日の曜日,_今日,_今日の曜日), 曜日検索(_日付,_曜日,_前日,_前日の曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_日付,_曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), 曜日検索(_翌日,_翌日の曜日,_日付,_曜日). 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1248012902/487 # 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/834.txt # [4] 探索問題のアルゴリズムについて,以下の問いに答えよ # (1) 大きな者から順にデータが並んでいる配列を対象とする,2 分探索のプ # ログラムコードを示せ. プログラムインタフェース(API) は # bsearch(int key)とする. # # (2) 配列を対象とする番兵法を用いない線形探索のプログラムを書け.プロ # グラムインタフェース(API)はlsearch(int key)とする. # # (3) 配列を対象とする番兵法を用いる線形探索のプログラムを書け.ただし, # データが満杯になることはないと仮定して良い.プログラムインタフェ # ース(API)はssearch(int key)とする. # # [5] キューを配列で表現したとき,データをキューに挿入するinsert(int i) # とデータをキューから取り除くremove()のプログラムコードを示せ.ただし # キューが満杯になることは考えなくても良い.つまりリングキューにする必要 # はない. # # [6] 連結リストでスタックを表現したとき,データをスタックに挿入する # push(int i)とデータをスタックから取り除くpop()のプログラムコードを示 # せ.ただしスタックが空の時にpop が呼ばれたときには,エラーメッセージを # 出すようにすること.(連結リストを使うと,原理的にはスタックが満杯になる # ことはないので,push におけるエラーメッセージは不要) % [4] Prologでは言語の構成要素として配列がない。リストがこれに代わって % 利用されるが、相対位置指定によって、高速にアクセスする方法がない。 % [4]は逐次検索では遅くて役に立たない場合に使うロジックを要求しているの % であり、リストの先頭から逐次的に手繰っていくリスト処理では答えにならない。 % Prolog向きの問題ではないといえる。 % % ここではロジックとしてPrologで定義してみるが、これはマスデータの検索の % 役に立つものではない。くれぐれも。 二分検索(_検索キー,降順,L) :- length(L,Len), M is Len // 2, list_nth_r(M,L,L1,A,L2), 二分検索(_検索キー,降順,L1,A,L2). 二分検索(_検索キー,降順,L1,A,L2) :- _検索キー @> A, 二分検索(_検索キー,降順,L1). 二分検索(_検索キー,降順,L1,A,L2) :- _検索キー @< A, 二分検索(_検索キー,降順,L2). 二分検索(_検索キー,降順,L1,A,L2) :- _検索キー = A. list_nth_r(0,[A|R],[],A,R) :- !. list_nth_r(N,[A|R1],[A|R2],X,R) :- N1 is N - 1, list_nth_r(N1,R1,R2,X,R). % [5] insert(E,X-[E|Y],X-Y). remove(E,[E|X]-Y,X-Y). new(X-X). empty(X-Y) :- X == Y. % remove/3は組込述語として存在する。ここでは別にユーザが登録可能とする。 % 組込述語のremove/3はリストから部分リストを切り取るもの。 % ?- remove([c,d],[a,b,c,d,e],X). % X = [a,b,e] % [6] push(I,Stack,[I|Stack]). pop(I,[I|Stack],Stack). pop(I,[],[]) :- write('Error:stack empty!\n'). % 以下のサイトは http://pc11.2ch.net/test/read.cgi/db/1252492296/314 # ユーザーが複数の資格を持っているというありがちなテーブル構成があるのですが、 # 「資格1または資格2を持っているユーザー」の検索はできるのですが、 # 「資格1と資格2」を両方持っているユーザー」の検索ができません。 # # データベースはpostgresです。 # # テーブル構成はこんな感じです。 # # ユーザーテーブル # [ユーザーID、名前] # 001,山田 # 002,鈴木 # # 資格テーブル # [ユーザーID、資格] # 001,資格1 # 001,資格2 # 002,資格1 # % Prolog これは関係の割り算ではないが、[資格1,資格2]で割っていると考えることができる ユーザーID('001',山田). ユーザーID('002',鈴木). 資格('001',資格1). 資格('001',資格2). 資格('002',資格1). '「資格1と資格2」を両方持っているユーザー'(X) :- setof(_名前,(資格(_ユーザーID,資格1),資格(_ユーザーID,資格2),ユーザーID(_ユーザーID,_名前)),X). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1263824755/299 # [1] 授業単元:コンピュータリテラシー # [2] 問題文(含コード&リンク): # あるファイルの名簿を呼びだし、名前もしくは名字で検索しその結果を新しいファイルに保存する。あるファイルの名簿は特に決められていない。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10456.txt # '名簿を呼びだし、名前で検索しその結果を新しいファイルに保存する'(_名簿ファイル,_出力ファイル,_検索する名前) :- 名簿を呼び出し(_名簿ファイル,L), 名前で検索しその結果を新しいファイルに保存する(_出力ファイル,L,_名前),!. 名簿を呼び出し(_名簿ファイル,L) :- get_split_lines(_名簿ファイル,[' ',','],L),!. 名前で検索しその結果を新しいファイルに保存する(_出力ファイル,L,_名前) :- 新しいファイルに(_出力ファイル), 名前で検索しその結果を保存する(L,_名前). 新しいファイルに(_出力ファイル) :- var(_出力ファイル), tmpnam(_出力ファイル), tell(_出力ファイル),!. 新しいファイルに(_出力ファイル) :- \+(var(_出力ファイル)), exists_file(_出力ファイル), tmpnam(Tmpnam), writef('ファイル %t は既に存在します。\nこのファイルへの保存を中止し、仮ファイル %t へ保存します\n\n',[Tmpnam]), tell(Tmpnam),!. 新しいファイルに(_出力ファイル) :- tell(_出力ファイル),!. 名前で検索しその結果を保存する([],_) :- told. 名前で検索しその結果を保存する([[_名字,_名前,_住所,_電話番号]|R],_名前) :- write_formatted('%t,%t,%t,%t\n',[_名字,_名前,_住所,_電話番号]), 名前で検索しその結果を保存する(R,_名前),!. 名前で検索しその結果を保存する([_|R],_名前) :- 名前で検索しその結果を保存する(R,_名前),!. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1263824755/299 # [1] 授業単元:コンピュータリテラシー # [2] 問題文(含コード&リンク): # あるファイルの名簿を呼びだし、名前もしくは名字で検索しその結果を新しいファイルに保存する。あるファイルの名簿は特に決められていない。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10456.txt # 名簿を呼びだし、名字で検索しその結果を新しいファイルに保存する(_名簿ファイル,_出力ファイル,_検索する名字) :- 名簿を呼び出し(_名簿ファイル,L), 名字で検索しその結果を新しいファイルに保存する(_出力ファイル,L,_名字),!. 名簿を呼び出し(_名簿ファイル,L) :- get_split_lines(_名簿ファイル,[' ',','],L),!. 名字で検索しその結果を新しいファイルに保存する(_出力ファイル,L,_名字) :- tell(_出力ファイル), 名字で検索しその結果を新しいファイルに保存する(L,_名字), told. 名字で検索しその結果を新しいファイルに保存する([],_) :- !. 名字で検索しその結果を新しいファイルに保存する([[_名字,_名前,_住所,_電話番号]|R],_名字) :- write_formatted('%t,%t,%t,%t\n',[_名字,_名前,_住所,_電話番号]), 名字で検索しその結果を新しいファイルに保存する(R,_名字),!. 名字で検索しその結果を新しいファイルに保存する([_|R],_名字) :- 名字で検索しその結果を新しいファイルに保存する(R,_名字),!. % 以下のサイトは http://pc11.2ch.net/test/read.cgi/db/1252492296/631 # MYSQL使ってます。 # id キーワード # 1 りんご # 2 みかん # 3 りんご # のようにDBに登録されてるキーワードが多い順に例えばヒット件数トップ10のキーワードを # 抜き出したいのですがどのように書いたらいいでしょうか? # 件数少ないうちは今までにないキーワードがでたら全検索で数えるって繰り替えそうと思ったんですけど、 # 件数多くなったら効率的に書かないとまずいかなと思いまして。 キーワード数の上位10位までを表示 :- findall([M,N],カウンタカウンタ(M,N),L1), sort(L1,L2), reverse(L2,L3), 上位10位まで(L3,L), キーワード数の上位10位までを表示(L). キーワード数の上位10位までを表示([]) :- !. キーワード数の上位10位までを表示([M|R]) :- キーワードカウンタ(_キーワード,M), キーワード表示(_キーワード), fail. キーワード数の上位10位までを表示(R). キーワード表示(_キーワード) :- キーワード(ID,_キーワード), write_formatted('%t,%t\n',[ID,_キーワード]). 上位10位まで([],_,[]) :- !. 上位10位まで(_,Count,[]) :- Count >= 10,!. 上位10位まで([[M,N]|R1],Count1,[M|R2]) :- Count2 is Count1 + N, 上位10位まで(R1,Count2,R2). キーワードカウンタを準備する :- abolish(キーワードカウンタ/2), キーワード(Id,_キーワード), キーワードカウンタ((+),_キーワード), fail. キーワードカウンタを準備する. キーワードカウンタ((+),_キーワード) :- retract(キーワードカウンタ(_キーワード,_現在のカウント)), _加算されたカウント is _現在のカウント + 1, カウンタカウンタの更新((-),_現在のカウント) カウンタカウンタの更新((+),_加算されたカウント), asserta(キーワードカウンタ(_キーワード,_加算されたカウント)),!. キーワードカウンタ((+),キーワード) :- asserta(キーワードカウンタ(_キーワード,1)), カウンタカウンタの更新((+),1),!. カウンタカウンタの更新((+),M) :- retract(カウンタカウンタ(M,N)), N2 is N + 1, asserta(カウンタカウンタ(M,N2)),!. カウンタカウンタの更新((+),M) :- asserta(カウンタカウンタ(M,1)). カウンタカウンタの更新((-),M) :- retract(カウンタカウンタ(M,N)), N1 is N - 1, asserta(カウンタカウンタ(M,N1)),!. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1269438098/543 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # コンソール上でキーボードから次のような標準入力を与えるとする。 # 10+2 # すると、演算結果が出力するようなプログラムを記述せよ。 # 四則演算( +, -, *, / )に対応させること # # 言語に備わった解析・計算機能を利用するのではなく、 # 文字列を解析して式を生成する部分もプログラムとして書くこと。 # C言語の以下の関数に相当する関数等は使用して構わない。 # 文字列をコピーする関数( strcpy, strncpy ) # 文字列を連結する関数( strcat, strncat ) # 文字列の比較を行う関数( strcmp, strncmp ) # 文字列の長さを調べる関数( strlen ) # 文字を検索する関数( strchr ) # 文字列を整数値に変換する関数( atoi ) コンソール上でキーボードから標準入力として得られた文字列を解析して式を生成して評価する(_式,_値) :- コンソール上でキーボードから次のような標準入力を得る(_行), atom_chars(_行,Chars), 式(Chars,_式), _値 is _式. コンソール上でキーボードから次のような標準入力を得る(_行) :- get_line(_行). 式(Chars,_項) :- append(L0,[_演算子|R],Chars), append(_,[_演算子|_],['+','-']), _項=..[_演算子,_項1,_項2], 式(L0,_項1), 式(R,_項2),!. 式(Chars,_項) :- append(L0,[_演算子|R],Chars), append(_,[_演算子|_],['*','/']), _項=..[_演算子,_項1,_項2], 式(L0,_項1), 式(R,_項2),!. 式(Chars,_項) :- concat_atom(Chars,_項). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1274827528/258 # [1] 授業単元:プログラム演習 # [2] 問題文(含コード&リンク): # 任意の文字列を二つ入力し、一つ目の文字列から二つ目の文字列を「全て」検索するプログラムを実装しなさい。 # 検索結果は、一つ目の文字列を0文字目から数えて、何文字目にあるかを答えるようにしなさい。以下に実行例を示す。 # # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10648.txt # # # 文字列を入力してください。 # helloeveryone # 検索文字列を入力してください。 # eve # 文字列「eve」は5文字目から7文字目に存在します。 # # 文字列を入力してください。 # helloeveryone # 検索文字列を入力してください。 # two # 文字列「two」は存在しません # 任意の文字列を二つ入力し、一つ目の文字列から二つ目の文字列を「全て」検索する :- 任意の文字列を二つ入力し、(_一つ目の文字列,_二つ目の文字列), 一つ目の文字列から二つ目の文字列を「全て」検索する(_一つ目の文字列,_二つ目の文字列). 任意の文字列を二つ入力し、(_一つ目の文字列,_二つ目の文字列) :- write('文字列を入力してください。 \n'), get_line(_一つ目の文字列), write('検索文字列を入力してください。\n'), get_line(_二つ目の文字列). 一つ目の文字列から二つ目の文字列を「全て」検索する(_一つ目の文字列,_二つ目の文字列) :- 少なくとも一つは存在する(_一つ目の文字列,_二つ目の文字列), 「全て」検索する(_残り文字列,_二つ目の文字列,_開始位置,_長さ,_残り長さ),!. 一つ目の文字列から二つ目の文字列を「全て」検索する(_,_二つ目の文字列) :- write_formatted('文字列「%t」は存在しません。\n',[_二つ目の文字列]). 少なくとも一つは存在する(_一つ目の文字列,_二つ目の文字列) :- sub_atom(_一つ目の文字列,_,_,_,_二つ目の文字列). 「全て」検索する(_一つ目の文字列,_二つ目の文字列,_開始位置,_長さ) :- sub_atom(_一つ目の文字列,_開始位置,_長さ,_,_二つ目の文字列), _終了位置 is _開始位置 + _長さ - 1, write_formatted('文字列「%t」は%t文字から%t文字目に存在します。\n',[_二つ目の文字列,_開始位置,_終了位置]), fail. 「全て」検索する(_,_,_,_) :- !. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1274827528/634 # [1] 授業単元:プログラム演習 # [2] 問題文(含コード&リンク): # 任意の要素数のint型の配列を作成し、その配列の中にキーボードから数値を入力する関数 make_ary、総和を求める関数 sum_ary、配列からある要素を探す関数 search_ary、配列を表示する関数 printf_ary を実装しなさい。 # その際、要素数もキーボードから入力するように設計し、配列はちょうどその要素分だけを作成するようにしなさい。 # 各関数では添字演算子([])を用いずに、ポインタ操作で実装しなさい。 # 返り値と引数をどのようにしたら良いか考えて実装すること。 # 以下のmain関数を参考にする。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10672.txt # また、実行例は以下のようにすること。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10670.txt # % Prolog に配列は存在しないから、この種の問題は解けない。ここでは配列をできる % リストに置き換えて、できる限り仕様に近く作ってみよう。 % 配列として与えられた課題をリストに置き換える時の参考にしてください。 '任意の要素数のint型の配列を作成し、その配列の中にキーボードから数値を入力する関数 make_ary'(_ならび) :- make_ary(_ならび). make_ary(L) :- 催促付き整数入力('要素数を決めてください:',N), length(L,N), for(1,M,N), M1 is M - 1, write_formatted('ary[%t]を入力してください :',[M1]), get_integer(J), list_nth(M,L,J), M = N. '配列の総和を求める関数 sum_ary'(L) :- sum_ary(L,_総和), write_formatted('配列の総和は %t です。\n',[_総和]). sum_ary([],0) :- !. sum_ary([N|R],X) :- sum_ary(R,Y),X is N + Y. 'キーボードから数値を入力して配列からある要素を探す関数 search_ary'(L) :- search_ary(L,M), write_formatted('%t は配列の%t番目にあります。\n',[N,M]). search_ary(L,M) :- 催促付き整数入力('検索する数値を入力してください:',N), list_nth(M,L,N). 配列の表示(L) :- print_ary(L). print_ary(L) :- print_ary(0,L). print_ary(_,[]) :- !. print_ary(M,[N|R]) :- write_formatted('ary[%t]:%t\n',[M,N]), M2 is M + 1, print_ary(M2,R). 配列処理操作 :- '任意の要素数のint型の配列を作成し、その配列の中にキーボードから数値を入力する関数 make_ary'(_ならび), 配列操作(_ならび),!. 配列処理操作(L) :- write('**** 配列処理操作一覧 ****\n 1:総和計算\n 2:検索\n 3:配列の表示\n\n 9:End\n'), 催促付き整数入力('Select a number ? ',N), 機能選択(N,L),!. 配列処理操作(L) :- 配列処理操作(L). 機能選択(1,L) :- '配列の総和を求める関数 sum_ary'(L), fail. 機能選択(2,L) :- 'キーボードから数値を入力して配列からある要素を探す関数 search_ary'(L), fail. 機能選択(3,L) :- 配列の表示(L),fail. 機能選択(9,L) :- !. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1274121477/320 # 日本語文章中の複数の単語を置換したいです。 # ファイルは一つのディレクトリに複数あります。 # >http://ime.nu/www.machu.jp/diary/20070224.html#p01 # ファイル検索はcygwin かlinux上なので上記を参考にしています。 # trではうまくいきませんでした。 # # お題 # # 拡張子が .rb の全てのファイルに対して、 # # #!/usr/bin/env ruby # # を # # #!/usr/local/bin/ruby # # に置換する。ついでに、「ruby」という文字を「perl」に置き換える '拡張子が .rb の全てのファイルに対して、#!/usr/bin/env ruby を #!/usr/local/bin/ruby に置換する。ついでに、「ruby」という文字を「perl」に置き換える' :- shs('ls -N *.cs',Files), append(_,[File|R],Files), get_lines(File,Lines), 指定された内容に文字列を置換する(Lines,Lines2), put_lines(File,Lines2), R = []. 指定された内容に文字列を置換する([],[]) :- !. 指定された内容に文字列を置換する([Line|R1],[Line2|R2]) :- sub_atom(Line,_,_,_,A1,'#!/usr/bin/env ruby',A3,L1,L2,L3), concat_atom([A1,'#!/usr/local/bin/ruby',A3],Line1), rubyをperlに置換する(Line1,Line2), 指定された内容に文字列を置換する(R1,R2),!. 指定された内容に文字列を置換する([Line|R1],[Line2|R2]) :- rubyをperlに置換する(Line,Line2), 指定された内容に文字列を置換する(R1,R2). rubyをperlに置換する(Line,Line2) :- replace_all(Line,ruby,perl,Line2). % replace_all/3は http://nojiriko.asia/prolog/replace_atom.html 参照 % 以下のサイトは http://pc11.2ch.net/test/read.cgi/db/1274791771/231 # tbl1にnum1,num2,id1,id2,id3 # tbl2にid,name,ssというフィールドがあるとして # SELECT name, num1, num2, id1, id2, id3, time FROM tbl1, tbl2 # WHERE num1 = 1 # AND id1 = ( SELECT id FROM tbl2 WHERE ss = "monga") # 上記のようなSQLを # 特定のフィールドが他の行と重複してたら抜かすというのはどうやればいいでしょうか? # 単にdistinctつけるだけだとどれかひとつでも重複していなかったら抽出されますよね。 # id1,id2,id3が他のレコードのid1,id2,id3と重複してたら # 検索結果に入れないみたいな感じにしたいのですが。 # MYSQLです。 'id1,id2,id3が他のレコードのid1,id2,id3と重複してたら検索結果に入れない'([_name,_num1,_num2,_id1,_id2,_id3]) :- findall([_name,_num1,_num2,_id1,_id2,_id3],( tbl1(num1,_num2,_id1,_id2,_id3), num1 = 1, tbl2(id1,_name,monga)), L1), findsetof([_id1,_id2,_id3],member([_,_,_,_id1,_id2,_id3],L1),L2), findall([_id1,_id2,_id3],( count((member([_id1,_id2,_id3],L2),1)), L2), member([_name,_num1,_num2,_id1,_id2,_id3],L1), member([_id1,_id2,_id3],L2). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1276810079/504 # [1]授業単元:プログラミング演習 # [2]問題文;離散探索木(26進)と外部ハッシュ法の比較(探索関数) #  キー:   文字列 #  使用ファイル: wordE100KR.dat #  上記ファイルを読み込み、通常の配列に格納する。 #  この配列から要素を読み込み、分離連鎖法および離散探索木(26進)を生成する。 #  格納された要素と同一の要素集合すなわち、配列に格納された用語集合に対して、1万語毎に探索を行い、照合回数、および探索時間を測定する。 #  結果として、照合回数について20個のデータ(2×10)、同様に探索時間について20個のデータ(2×10)が得られる。 #  これらのデータをExcelに格納し、表、グラフを作成し、分析せよ。 # [3]環境 # [3.1]OS;windowsXP # [3.2]コンパイラ名とバージョン:gcc # [3.3] 言語:C/C++どちらでも可 # [4]期限;7月8日 # # 使用ファイルはhttp://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/main.htmにあります。 # 丸投げで申し訳ありません。よろしくお願いします。 # 分離連鎖の初期化(_ハッシュ表の長さ) :- abolish(分離連鎖/2), abolish(ハッシュ表の長さ/1), assertz(ハッシュ表の長さ(_ハッシュ表の長さ)), M is _ハッシュ表の長さ - 1, for(0,N,M), assertz(分離連鎖(N,[])), N = M,!. 分離連鎖法による文字列の検索(_文字列,_付加情報) :- atom_codes(_文字列,Codes), 加算(Codes,Y), ハッシュ表の長さ(_ハッシュ表の長さ), _ハッシュ値 is truncate(Y) mod _ハッシュ表の長さ, 分離連鎖(_ハッシュ値,L), append(_,[[_文字列|_付加情報]|_],L). 分離連鎖法による文字列の追加(_文字列,_付加情報) :- atom_codes(_文字列,Codes), 加算(Codes,Y), ハッシュ表の長さ(_ハッシュ表の長さ), _ハッシュ値 is truncate(Y) mod _ハッシュ表の長さ, retract(分離連鎖(_ハッシュ値,L)), asserta(分離連鎖(_ハッシュ値,[[_文字列|_付加情報]|L])). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1276810079/956 # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10845.txt # # 問1.2のどちらも break goto の使用は禁止です。 # # # # 問1)検索する文字列を入力し、その位置を返す ユーザ関数 を使ってプログラムを作成しなさい。 # # 条件 プロトタイプ宣言 : char *MojiSearch(char *m, char *s) # 引数 1 : 検索対象文字列 # 引数 2 : 検索文字列 # 戻り値 : あった場合 (一致した文字列の先頭アドレス) # なかった場合 (NULL) #       標準関数 : MojiSearch()内で strlen(),strncmp() のみ使用可能 # #       char moji[] = "ABCDEFGHJABFGHSKL"; /*検索対象文字列*/ # # 実行画面例 # #  1) 検索文字列 ==> HS #  検索位置 : HSKL # #  2) 検索文字列 ==> JN #    検索位置 : 検索したい文字はありませんでした # # # # 問2) 配列データの平均を求める ユーザ関数 を使ってプログラムを作成しなさい。 #     #    条件 プロトタイプ宣言 : double Average(int *p) # 引数 : 数値が格納された配列の先頭アドレス # 戻り値 : 平均 # #    実行画面例 #     #     1) 整数[0] ==> 100 # 整数[1] ==> 80 # 整数[2] ==> 60 # 整数[3] ==> 75 # 整数[4] ==> 89 # 整数[5] ==> 62 # 整数[6] ==> 71 # 整数[7] ==> 50 # 整数[8] ==> 49 # 整数[9] ==> 90 # # 平均 : 72.6 #        #     2) 整数[0] ==> 100 # 整数[1] ==> 80 # 整数[2] ==> 60 # 整数[3] ==> 75 # 整数[4] ==> 89 # 整数[5] ==> 64 # 整数[6] ==> -1 # # 平均 : 78.0 検索する文字列を入力し、その位置を返す(_検索対象文字列,_検索文字列,_位置,_検索副文字列) :- sub_atom(_検索対象文字列,A,B,C,_検索文字列), _位置 is A + 1, _残り長さ is B + C, sub_atom(_検索対象文字列,A,_残り長さ,_,_検索副文字列),!. 検索する文字列を入力し、その位置を返す(_,_,_,_) :- write('検索したい文字はありませんでした\n'), !,fail. 入力されたデータの平均を求める :- findavg(M,( for(0,N,maxint), write_formatted('整数[%t] ==> ',[N]), get_integer(M), ( M = -1,!,fail;true)), _平均), write_formatted('平均 = %t\n',[_平均]). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1276873238/295 # 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10839.txt # コピーさせていただきました # ホームページ上からデータを追加、検索したりする問題です。 # OS:Linux # # [1]学籍番号(stnum char(14))、名前(name char(30))、国語(kokugo int)、数学(math int)、理科(science int) # からなるテーブルseisekiをデータベース上に作る。 # # [2]ホームページからデータを追加、検索できるようにする。 # 表示結果には、学籍番号、名前、国語、数学、理科、合計を表示させる # # 学籍番号による検索(_学籍番号) :- seiseki(_学籍番号,_名前,_国語,_数学,_理科), write_formatted('%t,%t,%t,%t,%t\n',[_学籍番号,_名前,_国語,_数学,_理科]). 名前による検索(_名前) :- seiseki(_学籍番号,_名前,_国語,_数学,_理科), write_formatted('%t,%t,%t,%t,%t\n',[_学籍番号,_名前,_国語,_数学,_理科]). 国語の成績による検索(_国語,_国語成績) :- seiseki(_学籍番号,_名前,_国語,_数学,_理科), _国語成績. 数学の成績による検索(_数学,_数学成績) :- seiseki(_学籍番号,_名前,_数学,_数学,_理科), _数学成績. 理科の成績による検索(_理科,_理科成績) :- seiseki(_学籍番号,_名前,_理科,_数学,_理科), _理科成績. 成績の追加(_学籍番号,_名前,_国語,_数学,_理科) :- 学籍番号(_学籍番号), 名前(_名前), 国語(_国語), 数学(_数学), 理科(_理科), assertz(seiseki(_学籍番号,_名前,_国語,_数学,_理科)). 成績の変更(_学籍番号,_名前,_国語,_数学,_理科) :- 学籍番号(_学籍番号), 名前(_名前), 国語(_国語), 数学(_数学), 理科(_理科), retract(seiseki(_学籍番号,_,_,_,_)), assertz(seiseki(_学籍番号,_名前,_国語,_数学,_理科)). 成績の削除(_学籍番号) :- retract(seiseki(_学籍番号,_,_,_,_)). 学籍番号(_学籍番号) :- atom_length(_学籍番号,Len), Len =< 14, atom_chars(_学籍番号,Chars), すべてが数字(Chars),!. すべてが数字([]) :- !. すべてが数字([A|R]) :- member(A,['0','1','2','3','4','5','6','7','8','9']), すべてが数字(R). 名前(_名前) :- atom(_名前), atom_length(_名前,Len), Len =< 30,!. 国語(_国語) :- integer(_国語). 数学(_数学) :- integer(_数学). 理科(_理科) :- integer(_理科). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1280653311/72 # C言語の問題なのですが # # 4ケタの番号,名前,名前(フリガナ),都道府県,住所,電話番号 # # といった300人分の名簿データみたいなcsvファイルがあり # それをで4ケタの番号どうりに単純ソートで昇順に表示して # 番号を入力すると2分探索で探索を開始し # 正しい番号を入力すると電話番号を、不正な番号を入力すると # エラー表示が出るプログラムを作成したいのですがわからず困ってます # どなたかよろしくお願いします # (malloc関数は使わずにとの事です) # # '4ケタの番号,名前,名前(フリガナ),都道府県,住所,電話番号といった300人分のcsvファイルがあり、番号を入力すると2分探索で探索を開始し正しい番号を入力すると電話番号を不正な番号を入力するとエラー表示する'(_csvファイル) :- write('検索する4ケタの番号を入力してください : '), get_integer(N), get_split_lines(_csvファイル,[','],L1), '4ケタの番号どうりに単純ソートで昇順にならべる'(L1,L2), lenth(L2,Len), M is Len // 2, list_nth(M,L2,L), 2分探索で探索(1,M,Len,L2,N,L,X), write_formatted('%t,%t,%t,%t,%t,%t\n',X). '4ケタの番号,名前,名前(フリガナ),都道府県,住所,電話番号といった300人分のcsvファイルがあり、それを4ケタの番号どうりに単純ソートで昇順に表示'(_csvファイル) :- get_split_lines(_csvファイル,L1), '4ケタの番号どうりに単純ソートで昇順にならべる'(L1,L2), '4ケタの番号どうりに表示'(L2). '4ケタの番号どうりに単純ソートで昇順にならべる'(L1,L2) :- sort(L1,L2),!. '4ケタの番号どうりに表示'([]) :- !. '4ケタの番号どうりに表示'([L|R]) :- concat_atom(L,',',A), write_formatted('%t\n',[A]), '4ケタの番号どうりに表示'(R). 2分探索で探索(_,_,_,_,N,[N|R],[N|R]) :- !. 2分探索で探索(S,M,E,L2,N,[N1|R1],X) :- N1 < N, M2 is (S+M) // 2, list_nth(M2,L2,L1), 2分探索で探索(S,M2,M,L2,N,L1,X),!. 2分探索で探索(S,M,E,L2,N,[N1|R1],X) :- N1 > N, M2 is (M+E) // 2, list_nth(M2,L2,L1), 2分探索で探索(M,M2,E,L2,N,L1,X),!. % 以下のサイトは ?- 'a##'. http://pc12.2ch.net/test/read.cgi/tech/1260532772/827 # 770で一度投稿しましたが問題文に不足が多かったため再度投稿します。 # [1] 授業単元:プログラミング # [2] 問題文:http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10362.txt[3] 環境 # 下記の機能を備えた極めて単純なデータベースシステムであるカード型データベースシステムの構築を考える。 # 課題7-1 # 下記のような方針でプログラムを作成せよ。 # # 新しい科目を登録する機能 # すでに登録されている科目を修正(更新)する機能 # 登録科目のソート(並び替え)を行う機能 # 登録科目の一部分のみを検索して取り出し、表示する機能 # 登録科目から、卒業までに必要な単位を計算し、表示する機能 # データベースファイルの仕様 # データベースファイルについては、本格的なデータベースになると、アクセス性や # 安定性など様々な要求を満たす必要があるが、ここでは最も単純なテキストファイルとする。 # さらに、書き込みをfprintfで、読み込みをfscanfで行えるように、 1行中に、 # それぞれの項目(フィールド)がスペースで区切られているようなファイルとする。 # なお、この場合、それぞれの項目はスペースを含んでいけないこととなる。 # 履修科目データベースシステムの例においては、例えば、 # 単位の種類(必修、選択必修など)、単位数、年次、前期か後期か、再履修かどうか、成績の6項目を含むこととする。 # ここで、いくつかの選択肢から選択するものについては、数字で置き換えることとする。 # このような仕様に基づいたファイルの例は以下のようなものになる。ここでは、ファイル名は、"ユーザ名_kamokudb.txt"とする。 # typedef struct _KAMOKU { # char name[MAX_KAMOKU_NAME]; /* 科目名 */ # int tanni_type; /* 必修、選択必修、選択、自由のいずれか */ # int tanni; /* 何単位か */ # int nenji; /* 何年次か */ # int kouki_flag; /* 前期なら0、後期なら1 */ # int sairi_flag; /* 再履修なら1、そうでないなら0 */ # int seiseki; /* 59点以下は不可、-1は未履修であることを示す */ # } KAMOKU; # # KAMOKU kamoku_list[200]; 履修科目データベースシステムを実装し、実行した例を以下に示す。なお、これは一例であって、課題は以下の通りに動作する必要はない。 ****** 単位データベースシステム ****** ユーザー名を入力して下さい:yamada ユーザー yamada は存在しません。データベースを新規に作成しますか? [1] Yes [2] No 番号を選択してください:1 **** 機能選択 **** [1] 科目登録 [2] 科目修正・削除 [3] データベース表示 [4] 必要単位数の表示 [5] 検索 [6] 並び替え [99] プログラム終了 機能を選択してください:1 **** 科目登録 **** 登録する科目を入力します。スペースを含まないローマ字で入力して下さい。 エンターキーのみを入力すると、科目の登録が終了します。 科目名:programming_ennsyuu_2 programming_ennsyuu_2 の情報を入力して下さい。 [1] 必修 [2] 選択必修 [3] 選択 [4] 自由 単位の種類:1 単位数:1 年次:2 [1] 前期 [2] 後期 前期・後期:2 [1] 非再履修 [2] 再履修 再履修:1 成績(-1:未履修):70 programming_ennsyuu_2 の情報を次のように登録します:必修, 1単位, 2年次, 後期, 非再履修, 70点 [1] 登録 [2] 再入力 番号を選択してください:1 programming_ennsyuu_2 の情報を登録しました。 科目名:denki_kairo_ennsyuu : 科目名: 科目登録を終了します。 **** 機能選択 **** : 機能を選択してください:2 **** 科目修正・削除 **** [1] programming_ennsyuu_2 [2] denki_kairo_ennsyuu [3] denki_kairo_kiso [4] digital_shingou_syori : 修正・削除する科目を選択して下さい:2 denki_kairo_ennsyuu の情報を修正して下さい。 最初の単位の種類で、[0] 削除 を選択すると、削除されます。 また、エンターキーを押すと、大括弧内の値が選択されます。 [0] 削除 [1] 必修 [2] 選択必修 [3] 選択 [4] 自由 単位の種類[3]: 単位数[1]: 年次[2]: [1] 前期 [2] 後期 前期・後期[1]: [1] 非再履修 [2] 再履修 再履修[1]: 成績(-1:未履修)[75]:85 denki_kairo_ennsyuu の情報を次のように修正します:選択, 1単位, 2年次, 前期, 非再履修, 85点 [1] 登録 [2] 再入力 番号を選択してください:1 denki_kairo_ennsyuu の情報を修正しました。 : 機能を選択してください:5 **** 検索 **** [1] 科目名 [2] 年次 [3] 前期・後期 [4] 不可の科目 検索したい項目を選択して下さい:2 年次を検索します。 検索対象:2 年次が 2 であるのは以下のものです: denki_kairo_kiso: 選択必修, 2単位, 2年次, 前期, 非再履修, 65点 denki_kairo_ennsyuu: 選択, 1単位, 2年次, 前期, 非再履修, 85点 programming_ennsyuu_1: 必修, 1単位, 2年次, 前期, 非再履修, 75点 programming_ennsyuu_2: 必修, 1単位, 2年次, 後期, 非再履修, 70点 digital_shingou_syori: 必修, 2単位, 2年次, 後期, 非再履修, 30点 : : 機能を選択してください:6 **** 並び替え **** [1] 科目名 [2] 年次 [3] 点数 どの項目で並べ替えるか選択して下さい:3 点数を昇順で並べ替えます。 digital_shingou_syori: 必修, 2単位, 2年次, 前期, 非再履修, 30点 denki_kairo_kiso: 選択必修, 1単位, 2年次, 前期, 非再履修, 65点 programming_ennsyuu_2: 必修, 1単位, 2年次, 後期, 非再履修, 70点 programming_ennsyuu_1: 必修, 1単位, 2年次, 前期, 非再履修, 75点 denki_kairo_ennsyuu: 選択, 1単位, 2年次, 前期, 非再履修, 85点 : : 機能を選択してください:4 **** 必要単位数の表示 **** 卒業に必要な単位数は、合計 62単位 総合基礎部門 計0単位 選択必修科目 0単位 選択科目 0単位 専門教育部門 計62単位 必修科目 12単位 選択必修科目 16単位 選択科目 34単位 : 機能を選択してください:99 プログラムを終了します。 データベースファイル yamada_kamokudb.txt を更新しました。 拡張 上記のプログラムの拡張を考える。例えば、以下のようなものが考えられる。 修得済み単位数や、不可となった科目を表示するなど、上記以外の機能を提供する。 検索において、完全一致のものだけでなく、条件に見合ったものを出力するようにする。 並び替えにおいて、年次だけでなく、年次と前期・後期を考慮した並べ替えをするなど、 他の並び替え方法を提供する。 データベースファイルとして、コンマ区切りのテキストファイルを用いる。 上記では、データファイルにスペース区切りのテキストファイルを用いたが、コンマ区切りのテキストファイル(CSVファイル)が用いられることも多い。この場合、フィールドにスペースが含まれていても問題なく動作する(ただし、コンマが含まれる場合には何らかの対策が必要になる)。 CSVファイルの読み込みのためには、いくつかの方法があるが、fgetsで読み込み、文字','を探す方法などが考えられる。また、strchrという関数が、文字列から特定の文字を含む箇所を取り出すものであるため、 fgetsとこれを組み合わせる方法もある。 構造体の配列を用いるのではなく、構造体へのポインタに対しmallocでメモリ確保する方法を用いる。 この場合、状況に応じてサイズを変えることが可能となる。ただし、確保したメモリは、使わなくなった場合には解放する必要がある。 KAMOKU *kamoku_list = NULL; : int num_list = 200; : kamoku_list = malloc(sizeof(struct _KAMOKU) * num_list); /* これ以降は、200の要素を持つ構造体の配列と同様に使用できる */ : printf("成績:%d\n", kamoku_list[0].seiseki); : free(kamoku_list); その他、既存のデータベースシステム等を参考にして機能を追加する。 履修科目データベースの検索(_検索項目,_検索鍵,_検索データ) :- get_split_lines('ユーザ名_kamokudb.txt',[' '],LL), member(_検索データ,LL), 鍵情報(_検索項目名,_検索データ,_検索鍵). 鍵情報(科目名,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_科目名). 鍵情報(単位の種類,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_単位の種類). 鍵情報(単位数,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_単位数). 鍵情報(年次,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_年次). 鍵情報(後期,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_後期). 鍵情報(前期,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_前期). 鍵情報(再履修,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_再履修). 鍵情報(成績,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_成績). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 鍵情報ソースプログラムの生成(_項目名ならび) :- append(_,[_項目名|R],_項目名ならび), findall(B,(member(A,_項目名ならび),concat_atom(['_',A],B)),L2), concat_atom(L2,',',_項目名ならび文字列), write_formatted('鍵情報(%t,[%t],_%t).\n',[_項目名,_項目名ならび文字列,_項目名]), R = []. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1280653311/566 # [1] 授業単元:応用C言語 # [2] 問題文(含コード&リンク): # テキストファイルを読み込み、指定された文字列を検索し、指定文字列が含まれている行を抽出して出力するプログラムを作成せよ。 # プログラムの実行および引数は以下の通りである。 # 実行ファイル名 入力ファイル名 検索文字列 出力ファイル名 # # *1行50文字×1000行以上扱えること # program :- user_parameters([_入力ファイル名,_検索文字列,_出力ファイル名]), テキスト検索(_入力ファイル名,_検索文字列,_出力ファイル名). テキスト検索(_入力ファイル名,_検索文字列,_出力ファイル名) :- get_lines(_入力ファイル名,L), findall(_行,( append(_,[_行|R],L), 行検索(_行,_検索文字列)), _検索した行ならび), put_lines(_出力ファイル名,_検索した行ならび). 行検索(_行,_検索文字列) :- sub_atom(_行,_,_,_,_検索文字列),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1280653311/570 # [1] 授業単元:応用C言語 # [2] 問題文(含コード&リンク): # 標準入力を読み込み、指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換 # して標準出力するプログラムを作成せよ。 # ただし最後の引数の文字列が現れた場合は最初に指定された文字列に # 置換するものとする。 # また複数の指定文字列に一致する箇所の場合、もっとも長い文字列が # 現れたものと解釈する。 # # *入力文字に非ASCII文字が含まれないとして良い # '標準入力を読み込み、指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して標準出力する。ただし最後の引数の文字列が現れた場合は最初に最初に指定された文字列に置換するものとする。また複数の指定文字列に一致する箇所の場合、もっとも長い文字列が現れたものと解釈する。' :- user_parameters(_指定文字列ならび), _指定文字列ならび = [A|R1], append(_指定文字列ならび,[A],_指定文字列ならびの二), 置換述語の生成(_指定文字列ならびの二), '標準入力を読み込み'(Chars), '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(Chars,Chars2), put_chars(Chars2). 置換述語の生成([_]) :- !. 置換述語の生成([_文字列1,_文字列2|R]) :- atom_chars(_文字列1,Chars1), atom_chars(_文字列2,Chars2), atom_length(_文字列1,Len), append(_文字列1,R1,L1), append(_文字列2,R2,L2), assertz((置換述語(L1,R1,Len,L2,R2))), 置換述語の生成([_文字列2|R]). 標準入力を読み込み(Chars) :- get_chars(Chars). '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(Chars1,Chars2x) :- findmax([Len,R1,Char2,R2],置換述語(Chars1,R1,Len,Char2,R2),[Lenx,R1x,Char2x,R2x]), '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(R1x,R2x). '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'([A|R1],[A|R2]) :- '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(R1,R2). 標準出力する(Chars) :- concat_atom(Chars,Atom), write(Atom). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1272006124/113 # リストのある要素を検索して、そのn要素後の値を取り出しなさい。 # リストのある要素を検索して、そのn要素後の値を取り出す(_対象リスト,_検索要素,_n要素後,_値) :-     append(_,[_検索要素|R],_対象リスト),     list_nth(_n要素後,R,_値). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1272006124/113 # リストのある要素を検索して、そのm要素前の値を取り出しなさい。 # リストのある要素を検索して、そのm要素前の値を取り出す(_対象リスト,_検索要素,_m要素前,_値) :-     append(L0,[_検索要素|_],_対象リスト), length(L2,_m要素前), L2 = [_値|_], append(_,L2,L0). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% リストのある要素を検索して、そのm要素前の値を取り出す(_対象リスト,_検索要素,_m要素前,_値) :-     append(L0,[_検索要素|_],_対象リスト),     last_nth(_m要素前,L0,_値). % *** user: last_nth / 3 *** last_nth(Nth,L,X) :- last_n(Nth,L,L2), L2 = [X|_],!. % *** user: last_n / 3 *** last_n(N,L,LX) :- integer(N), length(LX,N), append(L0,LX,L). last_n(N,L,LX) :- var(N), append(L0,LX,L), length(LX,N). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1284632294/649 # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # ダイエットファイルに # # 20100930,curry and rice # 20101003,kitsune soba # 20101003,rice ball # # のような形で日付とその日食べた昼食が保存されているとする. # コマンド行引数にダイエットファイル名と日付(yyyymmdd 形式) を指定して実行すると, # ファイルの中から指定した日付を含む行を検索し,その日の昼食を出力するプログラムを作成せよ. # また,引数としてファイルと文字列を指定しなかった場合に,使い方を出力して終了するようにせよ. # 日付の検索には,標準関数char *strstr(const char *str1, const char *str2); を使用するのが簡単である. # # 【実行例】 # % ./q3-3 diet.txt 20100929 # date 20100929 was not found in file diet.txt # % ./q3-3 diet.txt 20101003 # 20101003,kitsune soba # 20101003,rice ball # % ./q3-3 # Usage: ./q3-3 filename date(yyyymmdd) # % # # program :- パラメータを得る(_ファイル,_日付), get_split_lines(_ファイル,[','],LL), 日付をキーに検索する(_日付,LL,LL2), 検索した行を表示する(_日付,LL2). halt. パラメータを得る(_ファイル,_日付) :- user_paramaters(L), 診断(L,_ファイル,_日付),!. 診断([_ファイル,_日付],_ファイル,_日付) :- !. 診断(_,_,_) :- write('Usage: ./prolog filename date(yyyymmdd)\n'), halt. 日付をキーに検索する(_,[],[]) :- !. 日付をキーに検索する(_日付,[[_日付,_その日食べた昼食]|R1],[[_日付,_その日食べた昼食]|R2]) :- 日付をキーに検索する(_日付,R1,R2),!. 日付をキーに検索する(_日付,[_|R1],R2) :- 日付をキーに検索する(_日付,R1,R2),!. 検索した行を表示する([]) :- !. 検索した行を表示する([[_,_日付,_その日食べた昼食]|R]) :- write('%t,%t\n',[_日付,_その日食べた昼食]), 検索した行を表示する(R). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/db/1274791771/502 # 元データの日付(スケジュールとかログの日付)を全件検索するとします。 # その時、「その時刻より後の18時」を取得(生成)するうまい方法はあるでしょうか。 # 言い換えると、日付の繰り上がりに対して小技があったら教えてください。 # # ターゲットデータベースはH2Databaseですが、「Oracleならこんな方法が(ry」とかでも # 勉強になりますのでお願いします。 # # 元データ # ------------------- # 2010-10-01 01:00:00 # 2010-10-03 17:00:00 # 2010-10-04 20:00:00 # ------------------- # # 欲しいデータ # ------------------- # 2010-10-01 01:00:00 2010-10-01 18:00:00 # 2010-10-03 17:00:00 2010-10-03 18:00:00 # 2010-10-04 20:00:00 2010-10-05 18:00:00 # ------------------- # '元データの日付(スケジュールとかログの日付)を全件検索するとします。その時、「その時刻より後の18時」を取得(生成)する'(_欲しいデータ) :- データベース(_元のデータ), 次の18時の時刻文字列表現(_元のデータ,_次の18時の時刻文字列表現), concat_atom([_元のデータ,' ',_次の18時の時刻文字列表現],_欲しいデータ). 次の18時の時刻文字列表現(_時刻文字列表現,_次の18時の時刻文字列表現) :- 時刻文字列表現から年、月、日、時、分、秒を得る(_時刻文字列,_年,_月,_日,_時,_分,_秒), _時 < 18, write_formatted_atom(_次の18時の時刻文字列表現,'%4d-%02d-%02d 18:00:00',[_年,_月,_日]),!. 次の18時の時刻文字列表現(_時刻文字列表現,_次の18時の時刻文字列表現) :- 翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日), write_formatted_atom(_次の18時の時刻文字列表現,'%4d-%02d-%02d 18:00:00',[_翌日の年,_翌日の月,_翌日の日]),!. 時刻文字列表現から年、月、日、時、分、秒を得る(_時刻文字列,_年,_月,_日,_時,_分,_秒) :- split(_時刻文字列,[' ','-',':'],[_年,_月,_日,_時,_分,_秒]), _時 < 18. 翌日(_翌日の年整数,1,31,_翌日の年整数,2,1) :- !. 翌日(_翌日の年整数,3,31,_翌日の年整数,4,1) :- !. 翌日(_翌日の年整数,4,30,_翌日の年整数,5,1) :- !. 翌日(_翌日の年整数,5,31,_翌日の年整数,6,1) :- !. 翌日(_翌日の年整数,6,30,_翌日の年整数,7,1) :- !. 翌日(_翌日の年整数,7,31,_翌日の年整数,8,1) :- !. 翌日(_翌日の年整数,8,31,_翌日の年整数,9,1) :- !. 翌日(_翌日の年整数,9,30,_翌日の年整数,10,1) :- !. 翌日(_翌日の年整数,10,31,_翌日の年整数,11,1) :- !. 翌日(_翌日の年整数,11,30,_翌日の年整数,12,1) :- !. 翌日(_翌日の年整数,2,28,_翌日の年整数,3,1) :- \+(うるう年(_翌日の年整数)),!. 翌日(_翌日の年整数,2,29,_翌日の年整数,3,1) :- うるう年(_翌日の年整数),!. 翌日(_年整数,12,31,_翌日の年整数,1,1) :- _翌日の年整数 is _年整数 + 1,!. 翌日(_翌日の年整数,_翌日の月整数,_日整数,_翌日の年整数,_翌日の月整数,_翌日の日整数) :- _翌日の日整数 is _日整数 + 1,!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1282537545/201 # [[1,2],[3,4],[5,6]] # となっているリストから # 例えば、3で検索した場合に3と同じリストになっている4を出力するにはどうしたらいいでしょうか? # # '[[1,2],[3,4],[5,6]]となっているリストから例えば、3で検索した場合に3と同じリストになっている4を出力するにはどうしたらいいか'(_検索鍵,_検索対象ならび,_対の値) :- append(_,[[_検索鍵,_対の値]|R],_検索対象ならび). '[[1,2],[3,4],[5,6]]となっているリストから例えば、3で検索した場合に3と同じリストになっている4を出力するにはどうしたらいいか'(_検索鍵,_検索対象ならび,_対の値) :- append(_,[[_対の値,_検索鍵]|R],_検索対象ならび). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/572 # ●正規表現の使用環境 # php5 # # ●検索か置換か? # 置換 # # ●説明 # tableタグ内の改行(<br />)を全て削除したい # # ●対象データ # <table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx"><br /> # <tbody><br /> # <tr><br /> # <td><br /> # </td><br /> # </tr><br /> # </tbody><br /> # </table> # # ●希望する結果 # <table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx"> # <tbody> # <tr> # <td> # </td> # </tr> # </tbody> # </table> # # 'tableタグ内の改行タグを全て削除したい'(_ファイル) :- get_chars(_ファイル,Chars), 'tableタグ内の改行タグを全て削除したい'(Chars,L), put_chars(_ファイル,L). 'tableタグ内の改行タグを全て削除したい'([],[]) :- !. 'tableタグ内の改行タグを全て削除したい'(L1,L2) :- append(L0,[<,t,a,b,l,e,>|R],L1), append(L2,[<,/,t,a,b,l,e,>|R2],R), '改行タグの削除'(L2,L3), 'tableタグ内の改行タグを全て削除したい'(R2,L4), append(L0,[<,t,a,b,l,e,>|L3],L4,L2),!. 'tableタグ内の改行タグを全て削除したい'(L,L). '改行タグの削除'([],[<,/,t,a,b,l,e,>]) :- !. '改行タグの削除'([<,b,r,' ',/,>|R1],R2) :- '改行タグの削除'(R1,R2),!. '改行タグの削除'([A|R1],[A|R2]) :- '改行タグの削除'(R1,R2),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/529 # A3AACD9ABD377E716127E010FEAC9EBE のような半角英数字32文字の取得はどう書けばいいんでしょうか? 'A3AACD9ABD377E716127E010FEAC9EBE のような半角英数字32文字の取得'(_文字列,_前文字列,_検索文字列,_後文字列) :- atom_chars(_文字列,Chars), 半角英数N文字の連続を検索(Chars,32,L0,[],L0,L,R), atom_chars(_前文字列,L0), atom_chars(_検索文字列,L), atom_chars(_後文字列,R). 半角英数N文字の連続を検索([],N,[],L1,[],L) :- length(L1,N), reverse(L1,L),!. 半角英数N文字の連続を検索(R,N,L1,[],L,R) :- length(L1,N), reverse(L1,L),!. 半角英数N文字の連続を検索([A|R1],N,L1,[A|R0],L,R) :- \+(半角英数字(A)), 半角英数N文字の連続を検索(R1,N,[],R0,L,R),!. 半角英数N文字の連続を検索([A|R1],N,L1,[A|R0],L,R) :- 半角英数N文字の連続を検索(R1,N,[A|L1],R0,L,R). 半角英数字(C) :- member([U1,U2],[['A','Z'],[a,z],['0','9']]), C @>= U1, C @=< U2,!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/522 # ●正規表現の使用環境 # PHP5.29 # # ●検索か置換か? # 検索 # # ●説明 # :より前の記号部分を取得したい。 # # ●対象データ # 5789:石鹸 # w555-2:タオル # Zxcvb:ハンガー # # ●希望する結果 # 5789 # w555-2 # Zxcvb # ':より前の記号部分を取得したい。 '(_行ならび,_置換された行ならび) :- findall(_コロンより前の記号部分,( append(_,[_行|_],_行ならび), コロンより前の記号部分(_行,_コロンより前の記号部分)), _置換された行ならび). コロンより前の記号部分(_行,_コロンより前の記号部分) :- sub_atom(_行,_コロンの位置,1,_,':'), sub_atom(_行,0,_コロンの位置,_,_コロンより前の記号部分),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1274998754/650 # すみません、プログラミング初心者で行き詰まってしまい質問をさせて頂きます。 # # 4×4の行列を考え、int y[i][j]とそれに対応する文字Xijを考えます。(例えばy[2][3]にはx23という文字が対応) # 今、y[i][j]には0または1の数字が割り当てられています。(つまり0、1の4×4行列が予め与えられている状況) # このうち、1の数字が割り当てられているyに対応するxの和だけを表示するようなプログラミングを作成したいのです。 # 例)y[1][3]=1,y[1][4]=1,y[2][4]=1,y[3][1]=0,y[3][2]=0の場合、 # x13+x14+x24 # # 手元の参考書やネット検索など、いろいろ試みたのですが、どうしても解決できず、質問させていただきました。 # 分かりにくい説明、長文失礼致しました。何卒よろしくお願いします。 # '1の数字が割り当てられているyに対応するxの和だけを表示する'(_行列,_1の数字の割り当てられているxの和) :- length(_行列,Len1), _行列=[L0|_], length(L0,Len2), findsum(X,( for(1,M,Len1), for(1,N,Len2), list_nth(M,_行列,L), list_nth(N,L,1), X is 16 * M + N), _1の数字の割り当てられているxの和). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/unix/1127388574/941 # プログラムで質問があります。 # /hoge/test/ # の中に # 1filename1.gif # 1filename2.gif # 2filename1.gif # 2filename2.gif # があるとします。 # # # sh /hoge/test/*filename* # という感じにコマンドを入力すると # それらの複数のファイルが # # command /hoge/test/1filename1.gif -option /aaa/bbb/1filename1.jpg # command /hoge/test/1filename2.gif -option /aaa/bbb/1filename2.jpg # command /hoge/test/2filename1.gif -option /aaa/bbb/2filename1.jpg # command /hoge/test/2filename2.gif -option /aaa/bbb/2filename2.jpg # # って感じにファイルが無くなるまで全て、コマンドを実行したいのですが # どうすればいいのでしょうか?? # # ファイルを選択してコマンド実行(_コマンド,_ディレクトリ1,_ディレクトリ2,_ファイル検索鍵,_サフィックス1,_サフィックス2) :- concat_atom(['sh -d ',_ディレクトリ,'/','*',_ファイル検索鍵,'*'],S1), atom_length(_ディレクトリ,_ディレクトリの長さ1), _ディレクトリの長さ2 is _ディレクトリの長さ1 + 1, shs(S2,L), append(_,[_ファイル名1|R],L), sub_atom(_ファイル名1,S,_,0,_サフィックス1), Len3 is S - _ディレクトリの長さ2, sub_atom(_ファイル名1,_ディレクトリの長さ2,Len3,_,_ファイル名2), concat_atom([_コマンド,' ',_ファイル名1,' ','-option ',_ディレクトリ2,'/',_ファイル名2,_サフィックス2],S2), shs(S2,_), R = [],!. ファイルを選択してコマンド実行(_,_,_,_,_). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1287755129/11 # 3003,aaa # 3004,bbb # 3005,ccc # ・ # ・ # こんなレコードが何百万行っていうCSVがあって、 # 1カラム目の値をキーとして、2カラム目の値を取得したいんです。 # このリクエストは1分当たりに何度も発生します。 # 当然、1カラム目の値はユニークです。 # # で、リクエストが発生するたびに、 # 単純に先頭から検索していったんじゃ、時間がかかるんで、 # このCSVをハッシュに持っておいて、 # レスポンスを返すようなデーモンを作れば、速くなるかな〜 # と考えてるんですが、方向性は合ってますかね? # #DBは使えない環境です。。。 # # ここで聞くことか迷ったんですが、 # 組むならperlで組むんで、こちらで聞いてみました。 # # よろしくお願いします。 # # 要約関数(_述語幹部,_鍵整数値,_述語名) :- _法 = 1000, _剰余 is _鍵整数値 mod _法, concat_atom([_述語名幹部,'_',_剰余],_述語名),!. '第一項をユニークな整数鍵とするCSVファイルを要約関数述語として登録'(CSVファイル,_述語名幹部) :- get_lines(CSVファイル,Lines), append(_,[Line|R],Lines), split(Line,[','],[_鍵整数値|_値ならび]), 要約関数述語の節として追加(_述語名幹部,_鍵整数値,_値ならび), R = [],!. 要約関数述語の節として追加(_述語名幹部,_鍵整数値,_値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), P =.. [_述語名幹部,_鍵値|_値ならび], asserta(P). 要約関数述語の節を削除(_述語名幹部,_鍵整数値,_値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), P =.. [_述語名,_鍵値|_値ならび], retract(P). 要約関数述語の検索(_述語名幹部,_鍵整数値,_値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), P =.. [_述語名,_鍵値|_値ならび], call(P). 要約関数述語の節置換(_述語名幹部,_鍵整数値,_更新する値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), length(_更新する値ならび,Len), length(L,Len), P1 =.. [_述語名,_鍵値|L], retract(P1), P2 =.. [_述語名,_鍵値|_更新する値ならび], asserta(P2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/db/1274791771/562 # 検索したい文字列より検索キーワードが多いけどだいたいあってるからHITさせたいみたいなことは可能ですか? # 例えば「にしむらひろゆき」という文字列にたいしてLIKEで'%ひろゆき%'はHITしますが、 # 「2ちゃんねる元管理人にしむらひろゆきさん」というキーワードで # この「にしむらひろゆき」にSQLだけでHITさせることは可能でしょうか? # # % % 対象文字列の長さが検索文字列と同じであるか、あるいは短い場合。 検索したい文字列より検索キーワードが多いけどだいたいあってるからHITさせる(_検索キーワード,_対象文字列,_検索された文字列より前の文字列,_検索された文字列,_検索された文字列より後の文字列) :- sub_atom(_検索キーワード,_開始点,副文字列長,_残り文字列長,_対象文字列), sub_atom(_対象文字列,0,_開始点,_,_検索された文字列より前の文字列), _残り文字列の開始点 is _開始点 + _副文字列長, sub_atom(_対象文字列,_残り文字列の開始点,_残り文字列長,_,_検索された文字列より後の文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 対象文字列と検索文字列のそれぞれの一部が一致すればよいとする場合。 検索したい文字列より検索キーワードが多いけどだいたいあってるからHITさせる(_検索キーワード,_対象文字列,_検索された文字列より前の文字列,_検索された文字列,_検索された文字列より後の文字列) :- 最長一致副文字列(_検索キーワード,_対象文字列,_開始点,_副文字列長,_残り文字列長,_副文字列), sub_atom(_対象文字列,0,_開始点,_,_検索された文字列より前の文字列), _残り文字列の開始点 is _開始点 + _副文字列長, sub_atom(_対象文字列,_残り文字列の開始点,_残り文字列長,_,_検索された文字列より後の文字列). 最長一致副文字列(_検索キーワード,_対象文字列,_開始点,_副文字列長,_残り文字列長,_副文字列) :- findall([_副文字列長,_残り文字列長,_開始点,_副文字列長,_副文字列],( sub_atom(_対象文字列,_開始点,_副文字列長,_残り文字列長,_副文字列), sub_atom(_検索キーワード,_,_副文字列長,_,_副文字列)), L), sort(L1,L2), reverse(L2,L3), append(_,[[_副文字列長,_残り文字列長,_開始点,_副文字列長,_副文字列]|R],L3). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/db/1274791771/582 # すいません、全フィールドに(2語の検索語でANDもしくはORで)検索をかけたい場合 # どうかくのでしょうか?mysql でPHP で書いています。 # (2語をANDで検索したい場合) # SELECT * FROM table WHERE name LIKE '%$word1%' AND name LIKE '%$word2%' # SELECT * FROM table WHERE address LIKE '%$word1%' AND address LIKE '%$word2%' # SELECT * FROM table WHERE tel LIKE '%$word1%' AND tel LIKE '%$word2%' #            ・ #            ・ # # みたいに全フィールド分並べるとダブりがあるし # SELECT * FROM table WHERE * LIKE '%$word1%' AND * LIKE '%$word2%' # とやったら怒られました # '全フィールドに(2文字列の検索文字列でANDもしくはORで)検索をかけたい場合どうかくのでしょうか?'(_検索文字列_1,_検索文字列_2,L) :- findall(_,テーブル定義(table,_id,_フィールド名),L), P =.. [_テーブル名|L], call(P), 全フィールドに対して検索する(_検索文字列_1,_検索文字列_2,_ANDかOR,L). 全フィールドに対して検索する(_検索文字列_1,_検索文字列_2,_,[]) :- !. 全フィールドに対して検索する(_検索文字列_1,_検索文字列_2,'AND',[_値|R]) :- sub_atom(_値,_,_,_,_検索文字列_1), sub_atom(_値,_,_,_,_検索文字列_2), 全フィールドに対して検索する(_検索文字列_1,_検索文字列_2,'AND',R). 全フィールドに対して検索する(_検索文字列_1,_検索文字列_2,'OR',[_値|R]) :- ( sub_atom(_値,_,_,_,_検索文字列_1); sub_atom(_値,_,_,_,_検索文字列_2)), 全フィールドに対して検索する(_検索文字列_1,_検索文字列_2,'AND',R). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/db/1274791771/590 # 似たような質問なんですが # すべてのカラムに対してそれぞれではなく、複数まとめて検索したい場合は # どうするのでしょうか? # # イメージ的には複数のフィールドを取り出してくっつけて1文にして # それにXXX and YYY で検索する感じです # # 実はすごく簡単なような気もするんですが # 全部取り出してくっつけたものを、この検索のためのフィールドに入れておく # くらいしか思いつきません # # name address   tel   ・・・・ # ------------------------------ # itouYYY XXXZZZ 0123-4567 # itouZZZ YYYYFF 1234-0123 # hanaXXX LLLZZZ XXXX-XXXX # # で、(itouYYY XXXZZZ 0123-4567 …)が欲しい # # # :- op(750,xfx,and). 'すべてのカラムに対してそれぞれではなく、複数まとめて検索したい場合は'(_テーブル名,_検索文字列1 and _検索文字列2,L) :- findall(_,テーブル定義(_テーブル名,_id,_属性名),L), P =.. [_テーブル名|L], call(P), concat_atom(L,S), sub_atom(S,_,_,_,_検索文字列1), sub_atom(S,_,_,_,_検索文字列2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/db/1274791771/592 # ええと、たとえば名前の苗字と住所の一部が分かってるときとかに検索したい時に # 神奈川在住の千葉さんだとして # # 名前から「千葉」、住所から「神奈川」とやらなくても # 複数のフィールドに「千葉、神奈川」がある人を見つけたいんです # 全文検索みたいな感じでしょうか # この例だと、千葉と神奈川をひっくり返して試せばいいだけですが # 本当は項目がもっと多いので # 複数のフィールドに一つのキーワード検索が可能である組(_テーブル名,_検索語,_組) :- findall(_,テーブル定義(_テーブル名,_,_),_組), P =.. [_テーブル名|_組]), call(P), concat_atom(_組,S), count(sub_atom(S,_,_,_,_検索語),Count), Count > 1. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1288531658/728 # [1] 授業単元:中級プログラミング # [2] 問題文(含コード&リンク):0から99までの範囲で整数の乱数を1000個、配列mとして生成させた後、ターゲットとなる整数を1つ定めて検索する。ターゲット数はコマンド引数 (プログラム開始時に与える引数 argv)として与える。 # 何番目の数字でターゲット整数が見つかるか、番兵を使わない関数 NonSentinel と、番兵を使う関数 Sentinel の 2つで求めるプログラムを完成させなさい。 # # #include # #include # #define LENGTH 1001 // 以降のLENGTH はすべて1001 に置き換えられる # #define MAX 100 // 以降のMAX はすべて100 に置き換えられる # /*---------------------------------------------- # prototypes # -----------------------------------------------*/ # void GenerateNumbers(int* m, int n); # int Sentinel(int target, int* m, int n); # int NoSentinel(int , int* , int ); # /*---------------------------------------------- # search target number from an array # with and without sentinel # -----------------------------------------------*/ # int main(int argc, char** argv) # { # int m[LENGTH]; // 番兵のために一つ余分に配列をとる # int target; # target = strtol(argv[1], NULL, 0); //2nd input to be the target # GenerateNumbers(m, LENGTH-1); # printf("no-banpei %d, banpei %d\n", NoSentinel(target, m, LENGTH-1), Sentinel(target, return 0; # }/ # *---------------------------------------------- # Search without Sentinel # input # int targe; # int m[]; # int n; number of elements # output # return ii; position of the value # -1; no position for the letter # -----------------------------------------------*/ # int NoSentinel(int target, int* m, int n) # { # // ここを作る # }/ # *---------------------------------------------- # Search with Sentinel # input # int targe; # int m[]; # int n; number of elements # output # return ii; position of the value # n; no position for the letter # -----------------------------------------------*/ # int Sentinel(int target, int* m, int n) # { # // ここを作る # }/ # *---------------------------------------------- # ** # Random number generator # * Generate n random numbers ranging from 0 to 100 # * and stored in m[]. # * input/output int m[]; # * input int n; # *-----------------------------------------------*/ # 40 # void GenerateNumbers(int* m, int n) # { # int ii; # for (ii=0; ii% 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1288531658/780 # よろしくお願いいたします。 # [1] 授業単元:C++言語入門 # [2] 問題文(含コード&リンク): # # ネットワークのルートアドレスとネットマスク、そしてチェックしたいIPアドレスを # 渡して、チェックしたいIPアドレスがそのネットワークに含まれているかどうかを # チェックする関数int checkIPAddress(unsigned int root,unsigned int mask,unsigned # int address)を以下のように書いた。空欄をうめよ。 # ただし、あるIPアドレスがネットワークに含まれているかどうかチェックするには、 # ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)の # ネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると # 判定します。IPアドレス中のネットワーク部は、ネットマスクのビットパターンが1である部分と # 考えます。IPアドレスからネットワークIPを取り出すには、IPアドレスをネットマスクの # ビットごとのANDを取り出します。詳細はインターネットの検索エンジンで「ネットマスク」 # をキーワードに調べてください。 # # int checkIPAddress(unsigned int root,unsigned int mask,unsigned int address) # { # return(root 空欄 ゞ欄)==(root 空欄 空欄) # } # # 'ネットワークのルートアドレスとネットマスク、そしてチェックしたいIPアドレスを渡して、チェックしたいIPアドレスがそのネットワークに含まれているかどうかをチェックする。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークID,_そのネットワークに含まれているか否か) :- 'あるIPアドレスがネットワークに含まれているかどうかチェックするには、ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)のネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると判定します。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークIP,_診断). 'あるIPアドレスがネットワークに含まれているかどうかチェックするには、ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)のネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると判定します。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークIP,そのネットワークに含まれる) :- 'IPアドレスからネットワークIPを取り出すには、IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレス,_ネットマスク,_ネットワークIP), _ネットワークのルートアドレス = _ネットワークIP,!. 'あるIPアドレスがネットワークに含まれているかどうかチェックするには、ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)のネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると判定します。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークID,そのネットワークに含まれない) :- !. 'IPアドレスからネットワークIPを取り出すには、IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレス,_ネットマスク,_ネットワークIP) :- 'IPアドレスのビット'(_IPアドレス,_IPアドレスのビットならび), ネットマスクのビット(_ネットマスク,_ネットマスクのビットならび), 'IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレスのビットならび,_ネットのビットならび,_ネットワークIP). 'IPアドレスのビット'(_IPアドレス,_IPアドレスのビットならび) :- split(_IPアドレス,['.'],[N1,N2,N3,N4]), 二進ビットならびに変換(N1,N2,N3,N4,_IPアドレスのビットならび). ネットマスクのビット(_ネットマスク,_ネットマスクのビットならび) :- split(_IPアドレス,['.'],[N1,N2,N3,N4]), 二進ビットならびに変換(N1,N2,N3,N4,_ネットマスクのビットならび). 'IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレスのビットならび,_ネットのビットならび,_ネットワークIP) :- _ネットワークIPのビットならび is _IPアドレスのビットならび /\ _ネットのビットならび, ビットならびからネットワークIPを復元(L,_ネットワークIP_4byte_ならび), concat_atom(_ネットワークIP_4byte_ならび,'.',_ネットワークIP),!. ビットならびからネットワークIPを復元([],[]) :- !. ビットならびからネットワークIPを復元([_b1,_b2,_b3,_b4,_b5,_b6,_b7,_b8|R1],[V|R2]) :- V is _b1 * 128 + _b2 * 64 + _b3 * 32 + _b4 * 16 + _b5 * 8 + _b6 * 4 + _b7 * 2 + _b8, ビットならびからネットワークIPを復元(R1,R2). 二進ビットならびに変換([],[]) :- !. 二進ビットならびに変換([N|R],_二進ビットならび) :- '1byteビットならび'(N,_1byteビットならび), 二進ビットならびに変換(R,_二進ビットならび_1), append(_1bytpeビットならび,_二進ビットならび_1,_二進ビットならび). '1byteビットならび'(N,_1byteビットならび) :- '1byteビットならび_1'(N,L), reverse(L,_1byteビットならび). '1byteビットならびの一'(0,[]) :- !. '1byteビットならびの一'(N,[_b|R]) :- N2 is N // 2, _b is N mod 2, '1byteビットならびの一'(N2,R). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1289913298/525 # [1] 授業単元:情報検索処理 # [2] 問題文(含コード&リンク):以下の仕様を満たすプログラムを作成してください。 # ・文章の書かれたテキストファイルを読み込み、文字列を入力して検索する。 # ・検索した文字列がある箇所全てに対して、その文字列と前後10文字を、検索結果として別のテキストファイルに書き込む。 # '文章の書かれたテキストファイルを読み込み、文字列を入力して検索する。検索した文字列がある箇所全てに対して、その文字列と前後10文字を、検索結果として別のテキストファイルに書き込む。' :- '文章の書かれたテキストファイルを読み込み'(_テキストファイル,Chars), '文字列を入力して'(_検索文字列), atom_chars(_検索文字列,_検索文字ならび), '検索する。検索した文字列がある箇所全てに対して、その文字列と前後10文字を、検索結果として'(Chars,_検索文字ならび,_検索結果ならび), '別のテキストファイルに書き込む'(_出力ファイル,_検索結果ならび). '文章の書かれたテキストファイルを読み込み'(_テキストファイル,Chars) :- get_chars(_テキストファイル,Chars). '文字列を入力して'(_検索文字列) :- write('検索文字列を入力してください : '), get_line(_検索文字列). '検索する。検索した文字列がある箇所全てに対して、その文字列と前後10文字を、検索結果として'(Chars,_検索文字列,_検索した前10文字・後ろ10文字ならび) :- atom_chars(_検索文字列,_検索文字ならび), findall([_位置,_検索文字列,_前10文字,_後10文字],( 検索する(Chars,_検索文字ならび,L0,L1), 検索位置は(L0,_位置), 前10文字(L0,_前10文字), 後10文字(L1,_後10文字)), _検索した前10文字・後ろ10文字ならび). 検索する(Chars,_検索文字ならび,L0,L1) :- append(L0,_検索文字ならび,L1,Chars). 検索位置は(L0,_位置) :- length(L0,Len), _位置 is Len + 1,!. 前10文字(L0,_前10文字) :- length(_前10文字ならび,10), append(_,_前10文字ならび,L0), atom_chars(_前10文字,_前10文字ならび). 後10文字(L0,_後10文字) :- length(_後10文字ならび,10), append(_後10文字ならび,L1). atom_chars(_後10文字,_後10文字ならび),!. '別のテキストファイルに書き込む'(_出力ファイル,_検索結果ならび) :- open(_出力ファイル,write,Outstream), append(_,[[_位置,_検索文字列,_前10文字,_後10文字]|R],_検索結果ならび), write_formatted(Outstream,'%t:%t,%t,%t\n',[_位置,_検索文字列,_前10文字,_後10文字]), R = [], close(Outstream),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/694 # Flexible Renamerというソフトで音楽ファイル名の検索&一括置換したいのですが、 # # 対象: aaa_bbb_01ccc.mp3 # ↓ # 結果: aaa_bbb_01_ccc.mp3 # # "_"区切りの三番目の2桁数字部分が区切られていないヤツを(選び)全て結果のように区切りたい、ということです。 # # よろしくおねがいします。 # % sub_atom/10 は http://nojiriko.asai/prolog/t264_u.html を参照 '対象:aaa_bbb_01ccc.mp3 -> 結果:aaa_bbb_01_ccc.mp3 "_"区切りの三番目の2桁数字部分が区切られていないヤツを(選び)全て結果のように区切りたい'(_名前,_区切り直された名前) :- split(_名前,['_'],[_項1,_項2,_項3]), sub_atom(_項3,_検索位置,1,_残り文字数,H,A,T,_,_,_), \+((A@>='0',A@=<'9')), concat_atom([_項1,'_',_項2,'_',H,'_',A,T],_区切り直された名前),!. '対象:aaa_bbb_01ccc.mp3 -> 結果:aaa_bbb_01_ccc.mp3 "_"区切りの三番目の2桁数字部分が区切られていないヤツを(選び)全て結果のように区切りたい'(_名前,_名前). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/678 # ●正規表現の使用環境 # Devas(ディレクトリ内の再帰検索及び置換ソフトでGrep互換) # # ●検索か置換か? # 検索と置換 # # ●説明 # HTMLのaタグにonclick属性を追加,または追記したい # # ●対象データ # 数百のSmartyテンプレート # (HTMLやフレームワークのコードを含む文字列) # 単純に<a hrefで始まるものばかりではなく,<a class等で始まるものもある # # ●希望する結果 # htmlのaタグから # href="xxxxx-regist"を含んでおり, # かつonclick="xxx"含んでいる または 含んでいないものを検索,置換し # onclickにアクションを追加または追記 # # <a href="xxx-regist" onclick="追加または追記したい"> # # # # 対象ページが数百もあり,とても手作業で修正できないため正規表現の力を借りたいです # aタグはすぐにhrefで始まるものばかりではないため,以下のような正規表現を考えたのですが, # なぜか複数行に渡ってしまう結果が抽出されたりとうまくいきません # # href=".+\-regist".+?(onclick="(.+)")?.+?\n # # # ご教授いただけないでしょうか・・ # # 数百のSmartyテンプレートのonclickタグを追加または変更する(_ファイル名ならび) :- append(_,[_ファイル|R],_ファイル名ならび), 'htmlのaタグからhref="xxxxx-regist"を含んでおり,かつonclick="xxx"含んでいる。または含んでいないものを検索,置換しonclickにアクションを追加または追記'(_ファイル), R = [],!. 'htmlのaタグからhref="xxxxx-regist"を含んでおり,かつonclick="xxx"含んでいる。または含んでいないものを検索,置換しonclickにアクションを追加または追記'(_ファイル) :- get_chars(_ファイル,Chars), 'onclickにアクションを追加または追記'(Chars),!. 'onclickにアクションを追加または追記'(Chars) :- 'aタグを選別'(Chars,L0,R1,R2,_Atag), 'onclick要素候補'(_Atag,_onclick要素候補), 'onclick句の生成'(_onclick要素候補,_onclick句), put_chars(L0), '現在のonclick句の削除'(R1,R11), append(R11,_onclick句,R12), put_chars(['<',a,' '|R12]), put_chars(['<','/',a,'>']), 'onclickにアクションを追加または追記'(R2). 'aタグを選別'(Chars,L0,R1,R2,_Atag) :- append(L0,['<',a,' '|R1],['<','/',a,'>'|R2],Chars), \+(append(_,['<','a',' '|_],R1)), \+(append(_,['<','/',a,'>'|_],R1)), _Atag = ['<',a',' '|R1]. 'onclick要素候補'(_Atag,_onclick要素候補) :- append(L0,[h,r,e,f,'=','"'|_onclick要素候補],['-',r,e,g,i,s,t,'"'|R2],_Atag),!. 'onclick句の生成'(_onclick要素候補,_onclick句) :- append([' ',o,n,c,l,i,c,k,'=','"'|_onclick要素候補],['"',' '],_onclick句). '現在のonclick句の削除'([],[]) :- !. '現在のonclick句の削除'([' ',o,n,c,l,i,c,k,'=','"'|R1],[' '|R2]) :- append(_,['"',' '|R2],R1),!. '現在のonclick句の削除'([A|R1],[A|R2]) :- '現在のonclick句の削除'(R1,R2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/703 # 撮影した写真に付けた名前を一括変更しようと思い、 # 正規表現を扱えるFlexible Renamerを用いて色々と試しているのですが、いまいち行いたいことが出来ません。 # ファイルに付いている一定の法則でついている共通したタグを、ファイル名の末尾に"移動"させたいのです。 # 例: [2010-12-13] [IN] AABBCC.nef -> [IN] AABBCC [2010-12-13].nef # 検索では \[20..-..-..] と打つことで指定することができたのですが、移動の仕方が検索しても見つかりません… # # 正規表現では"移動"を行うことは出来ないのでしょうか? # どうかご教示お願いします! # 'ファイル名に付いている一定の法則でついている共通したタグを、ファイル名の末尾に"移動"させたい'(_ファイル名,_タグを末尾に移動したファイル名) :- sPLIT(_ファイル名,['[',']','.','-'],L), append(L0,['[',A,-,B,-,C,']'|R],L), sub_atom(A,0,2,_,'20'), append(R0,['.'|R1],R), append(L0,['[',A,-,B,-,C,']'|R0],[.|R1],L), concat_atom(L,_タグを末尾に移動したファイル名),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1291471791/712 # [1] 授業単元:プログラミングとアルゴリズム # [2] 問題文(含コード&リンク):以下の課題をBinary search 関数の再帰呼び出しで実現しなさい。 # 0 から100 までの範囲で整数の乱数を1000 個発生させ、Bubble sort 関数で整列させた後、ターゲット整数を再帰で検索するBinary search 関数を作って下のプログラム(rbinsearch.c) を完成させなさい。 # '0 から100 までの範囲で整数の乱数を1000 個発生させ、Bubble sort 関数で整列させた後、ターゲット整数を再帰で検索する'(_ターゲット整数) :- '0 から100 までの範囲で整数の乱数を1000 個発生させ'(L), 'Binary Search'(_ターゲット整数,L). '0 から100 までの範囲で整数の乱数を1000 個発生させ'(L1) :- findall(N,( for(1,_,1000), N is random mod 1000), L1), バブルソート(L1,L2), 'Binary Search'(_ターゲット整数,L2). 'Binary Search'(_ターゲット整数,L) :- length(L,N), N_1 is N // 2, length(L1,N_1), append(L1,[A|R],L), 'Binary Search'(_ターゲット整数,L1,A,R) :- 'Binary Search'(_ターゲット整数,L1,_ターゲット整数,R) :- !. 'Binary Search'(_ターゲット整数,L1,A,R) :- _ターゲット整数 @< A, 'Binary Search'(_ターゲット整数,L1). 'Binary Search'(_ターゲット整数,L1,A,R) :- _ターゲット整数 @>= A, 'Binary Search'(_ターゲット整数,R). バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一),!, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A,R1],[A|R2]) :- 交換(R1,R2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1086272325/686 # 範囲を扱うのに適したデータ構造ってありますか # こんな感じ # # 和集合 #  [1-4]と[2-5]を混ぜると[1-5] #  [1-2,5-6,8-10]と[3-4,11-13]を混ぜると[1-6,8-10,11-13] # 差集合 #  [1-10]から[3-4]を削除して[1-2,5-10] # 検索 #  [1-10,20-30]から15を探す # # わりと利用価値はあると思うんですが # こういうのってないですかね? # 範囲検索([[_開始点,_終了点]],_検索点) :- _検索点 @>= _開始点, _検索点 @=< _終了点. 和範囲([[_開始点_1,_終了点_1]],[[_開始点_2,_終了点_2]],[[_開始点_1,_終了点_1]]) :- _開始点_2 @>= _開始点_1, _終了点_2 @=< _終了点_1. 和範囲([[_開始点_1,_終了点_1]],[[_開始点_2,_終了点_2]],[[_開始点_2,_終了点_2]]) :- _開始点_2 @=< _開始点_1, _終了点_2 @>= _終了点_1. 和範囲([[_開始点_1,_終了点_1]],[[_開始点_2,_終了点_2]],[[_開始点_1,_終了点_2]]) :- _開始点_2 @>= _開始点_1, _終了点_2 @>= _終了点_1. 和範囲([[_開始点_1,_終了点_1]],[[_開始点_2,_終了点_2]],[[_開始点_2,_終了点_1]]) :- _開始点_2 @=< _開始点_1, _終了点_2 @=< _終了点_1. 補範囲(_範囲_1,_範囲_2,_補範囲) :- 和範囲([[_開始点_1,_終了点_1]],[[_開始点_2,_終了点_2]],_和範囲), 差範囲(_和範囲,[[_開始点_2,_終了点_2]],_補範囲). 差範囲([[_開始点_1,_終了点_1]],[[_開始点_2,_終了点_2]],[[_開始点_1,_開始点_2],[_終了点_2,_終了点_1]]) :- _開始点_2 @>= _開始点_1, _終了点_2 @=< _終了点_1. 差範囲([[_開始点_1,_終了点_1]],[[_開始点_2,_終了点_2]],[[_開始点_2,_開始点_1],[_終了点_1,_終了点_2]]) :- _開始点_2 @=< _開始点_1, _終了点_2 @>= _終了点_1. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/724 # 2回以上続く改行だけ検索したいのですが、どうやっても1回のみの改行も検索してしまいます。 # \r\nを2回ってだけではだめなようで、解決策はありますか? # # '2回以上続く改行だけ検索したい'(_文字列,_検索語より前の文字列,_検索語,_検索語より後の文字列) :- atom_chars(_文字列,Chars), append(L0,['\n'|R],Chars), append(L1,R1,R), \+(R1=['\n'|_]), all(L1,'\n'), concat_atom(L0,_検索語より前の文字列), concat_atom(L1,_検索語), concat_atom(R1,_検索語より後の文字列). '2回以上続く改行だけ検索したい'(_文字列,_検索語より前の文字列,_検索語,_検索語より後の文字列) :- atom_chars(_文字列,Chars), append(L0,['\n'|R],Chars), append(L1,R1,R), \+(R1=['\n'|_]), all(L1,'\n'), concat_atom(L0,_), concat_atom(L1,_), concat_atom(R1,_検索語より後の文字列_1), '2回以上続く改行だけ検索したい'(_検索語より後の文字列_1,_検索語より前の文字列,_検索語,_検索語より後の文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2回以上続く改行だけ検索したい'(Lines,L0,[A|L1],R) :- append(L00,L1,R,Lines), all(L1,''), \+(R=[''|_]), append(L0,[A],L00). '2回以上続く改行だけ検索したい'(Lines,L0,L1,L2) :- append(L00_1,L1_1,R_1,Lines), all(L1_1,''), \+(R_1=[''|_]), append(L0_1,[Line],L00_1), '2回以上続く改行だけ検索したい'(R,L0,L1,L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2回以上続く改行だけ検索したい'(Chars,L0,['\n','\n'],R) :- append(L0,L1,L2,Chars), \+(last(L0,'\n')), \+(list_nth(1,L2,'\n')). '2回以上続く改行だけ検索したい'(Chars,L0,L1,L2) :- append(L00,L11,L22,Chars), all(L11,'\n'), \+(last(L00,'\n')), \+(list_nth(1,L22,'\n')), '2回以上続く改行だけ検索したい'(L22,L0,L1,L2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/316 # ●正規表現の使用環境 # PHP5 # # ●検索か置換か? # 検索 # # ●説明 # [[ と ]] に囲まれた文字列を配列で取得したい # # ●対象データ # [[hare]][[ame]][[kumori]][[yuki]][[]][[kaminari]][[taifuu]] # # ●希望する結果 # matches[0] = hare # matches[1] = ame # matches[2] = kumori # matches[3] = yuki # matches[4] = # matches[5] = kaminari # matches[6] = taifuu # # よろしくお願いします。 # '[[ と ]] に囲まれた文字列をならびとして取得したい'(_文字列,L) :- atom_chars(_文字列,Chars), '文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(Chars,L). '文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(Chars,[_文字列1|R]) :- append(L0,['[','['|R1],[']',']'|R2],Chars), concat_atom(R1,_文字列1), '文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(R2,R),!. '文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(_,[]) :- !. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/385 # ●正規表現の使用環境 # .net Framework 2.0 - 3.5 (C#) # # ●検索か置換か? # 検索 # # ●説明 # artist, titleの各グループの文字列を取得したい # # ●対象データ # Artist - Title # # ●希望する結果 # artist = Artist # title = Title # # よろしくおねがいします。 # 'artist, titleの各グループの文字列を取得したい'(_対象データ,_希望する結果) :- split(_対象データ,[' '],L), 'artist, titleの切り出し'(L,Artist,Title), write_formatted_atom(_希望する結果,'artist = %t\ntitle = %t',[Artist,Title]). 'artist, titleの切り出し'([Artist,Title],Artist,Title) :- !. 'artist, titleの切り出し'([Artist,_,Title|_],Artist,Title) :- !. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/417 # ●正規表現の使用環境 # 秀丸 8.0.2 b5 # # ●検索か置換か? # 検索 # # ●説明 # 条件にマッチする行を指定数だけ抽出する # # ●対象データ # a hogehoge1 # b hogehoge2 # c hogehoge3 # a hogehoge4 # a hogehoge5 # c hogehoge6 # a hogehoge7 # b hogehoge8 # # ●希望する結果 # "a " で始まる行を 3 つだけ表示させる # a hogehoge1 # a hogehoge4 # a hogehoge5 # # 宜しくお願いします。 # % % 3つだけと言う場合、3つ未満だった時どうするか。failにするなら2引数の方の第一節を削除する。 % '"a " で始まる行を 3 つだけ表示させる'(Lines) :- '"a " で始まる行を 3 つだけ表示させる'([_,_,_],Lines). '"a " で始まる行を 3 つだけ表示させる'(_,[]) :- !. '"a " で始まる行を 3 つだけ表示させる'([],_) :- !. '"a " で始まる行を 3 つだけ表示させる'([_|Ln],[Line|R]) :- sub_atom(Line,0,_,_,'a '), write_fromatted('%t\n',[Line]), '"a " で始まる行を 3 つだけ表示させる'(Ln,R),!. '"a " で始まる行を 3 つだけ表示させる'(Ln,[_|R]) :- '"a " で始まる行を 3 つだけ表示させる'(Ln,R). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/467 # ●正規表現の使用環境 # .net(C#3.0) # # ●検索か置換か? # 検索 # # ●説明 # 空白をデリミタとして、最初の文字列を取得したい # 空白は半角全角両方あり、複数連続することもあり得る # ただし、()や[]で囲まれる文字列はスルー(空白として処理する) # 正規表現一発で抜き出したいです # # 下記例の各行は全て「山田太郎」だけ抽出されるようにしたいです # # 山田太郎 39才 #  山田太郎 39才 # (A社) 山田太郎 39才 # (A社)山田太郎  39才 # (A社 B課)山田太郎 39才 # 山田太郎(A社)39才 '空白をデリミタとして、最初の文字列を取得したい。空白は半角全角両方あり、複数連続することもあり得るただし、()や[]で囲まれる文字列はスルー(空白として処理する)'(_文字列,_最初の文字列) :- split(_文字列,[' ',' ','(',')','[',']'],L1), '空白をデリミタとして、最初の文字列を取得したい。'(L1,_最初の文字列). '空白をデリミタとして、最初の文字列を取得したい。'(L1,Atom) :- '()や[]で囲まれる文字列はスルー(空白として処理する)'(L1,L2), '空白をデリミタとして、最初の文字列を取得したい。'(L2,Atom),!. '空白をデリミタとして、最初の文字列を取得したい。'(L1,Atom) :- 空白は半角全角両方あり、複数連続することもあり得る(L1,L2), '空白をデリミタとして、最初の文字列を取得したい。'(L2,Atom),!. '空白をデリミタとして、最初の文字列を取得したい。'([A|_],Atom). '()や[]で囲まれる文字列はスルー(空白として処理する)'(L1,L2) :- append(L0,['('|R1],[')'|R2],L1), append(L0,[' '|R2],L2),!. '()や[]で囲まれる文字列はスルー(空白として処理する)'(L1,L2) :- append(L0,['['|R1],[']'|R2],L1), append(L0,[' '|R2],L2),!. 空白は半角全角両方あり、複数連続することもあり得る([],[]) :- !. 空白は半角全角両方あり、複数連続することもあり得る([' '|R1],R2) :- 空白は半角全角両方あり、複数連続することもあり得る(R1,R2),!. 空白は半角全角両方あり、複数連続することもあり得る([' '|R1],R2) :- 空白は半角全角両方あり、複数連続することもあり得る(R1,R2),!. % 以下のサイトは # ABCと続く場合を除くABという文字列をCDに置換したい場合は # どのように書いたらよいでしょうか・・・ 'ABCと続く場合を除くABという文字列をCDに置換'(_文字列,_置換された文字列) :- sub_atom(_文字列,S,2,R,'AB'), \+(sub_atom(_文字列,S+2,1,_,'C')), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,S+2,R,0,_後文字列), concat_atom([_前文字列,'CD',_後文字列],_置換された文字列). 'ABCと続く場合を除くABという文字列をCDに置換'(_文字列,_置換された文字列) :- sub_atom(_文字列,S,2,R,'AB'), \+(sub_atom(_文字列,S+2,1,_,'C')), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,S+2,R,0,_後文字列), 'ABCと続く場合を除くABという文字列をCDに置換'(_後文字列,_置換された後文字列), concat_atom([_前文字列,'CD',_置換された後文字列],_置換された文字列). 'ABCと続く場合を除くABという文字列をCDに置換'(_文字列,_文字列). %%%% 参考 検索の例 http://nojiriko.asia/prolog/seikihyogendoujou_30.html %%%% 'ABCと続く場合を除くABという文字列'(_文字列,_前文字列,'AB',_後文字列) :- sub_atom(_文字列,S,2,R,'AB'), \+(sub_atom(_文字列,S+2,1,_,'C')), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,S+2,R,0,_後文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/php/1168450843/94 # すみませんが、価格にマッチする正規表現を教えていただけないでしょうか。 # # 例 # \1,000,000,000 # \12,345 # \1,230 # \200 # \10 # # # 数字3つごとに、カンマが入り、先頭に円マーク(\)のくるものです。 # # 判らないためググッたのですが、正規表現に関する本ばかり検索結果として出てきまして…。 # # '価格にマッチする'(_文字列,_前文字列,_価格表現文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_価格表現文字列,_後文字列,L1,['\\'|R2],L3), \+((L3=[A|_],append(_,[A|_],[',','0','1','2','3','4','5','6','7','8','9']))), カンマ付き数値ならび(R2). カンマ付き数値ならび([]) :- !. カンマ付き数値ならび(L) :- length(L,Len), Len =< 3, すべて数字(L),!. カンマ付き数値ならび([A,B,C,','|R]) :- すべて数字([A,B,C]), カンマ付き数値ならび(R). カンマ付き数値ならび([A,B,','|R]) :- すべて数字([A,B]), カンマ付き数値ならび(R). カンマ付き数値ならび([A,','|R]) :- すべて数字([A]), カンマ付き数値ならび(R). すべて数字([]) :- !. すべて数字([A|R]) :- append(_[A|_],['0','1','2','3','4','5','6','7','8','9']), すべて数字(R). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/php/1168450843/328 # 質問させて下さい。 # PHP5を使っています。 # PHPの正規表現関数を使ってデータを取得しようと思っているのですが上手くいきません # <INPUT maxLength=20 name=id value=""> # このような文字列を対象に、文字列「type」が含まれていない場合、後方の「maxLength=20 name=id value=""」 # を取得したいのです。 # 全文に対して繰り返し取得したいのでpreg_match_allを使っています。 # # preg_match_all( "/<input (^type)[^<](.*?)>/is", $data, $matchs ) # このように書いたのですがヒットしてくれません。 # ドキュメントを見ると、特定文字に関しては[^a-z]のような書き方で対応できるのですが # 文字列に関してはどのようにすればよいのでしょうか? # アドバイス頂ければ幸いです。 # 宜しくお願い致します。 # # '<INPUT maxLength=20 name=id value="">このような文字列を対象に、文字列「type」が含まれていない場合、後方の「maxLength=20 name=id value=""」を取得したい'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['<','I','N','P','U','T',' '|R2],L3), append(L,['>'],R2), \+(append(_,['>'|_],L)), \+(検索(S2,type)), concat_atom(L,_適合文字列), concat_atom([S1,'% 以下のサイトは http://hibari.2ch.net/test/read.cgi/php/1168450843/425 # Jeditで # 【あいう】を【6あいう】 # 【かき】を【4かき】 # のように【 】でははさまれた文字列の頭に文字数×2の数値を追加したいのですが # どのように検索してどのように置換すればよいでしょうか? # 【 】ではさまれた文字数はまちまちです。 # よろしくお願いします。 # '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加したいのですがどのように検索してどのように置換すればよいか'(_文字列,_置換された文字列) :- atom_chars(_文字列,Chars), '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(Chars,L), concat_atom(L,_置換された文字列). '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(Chars,[S|R]) :- append(L0,['['|R1],[']'|R2],Chars), \+(append(_,['['|_],R1)), \+(append(_,[']'|_],R1)), length(R0,Len), Len2 is Len * 2, append(L0,['[',Len2|R0],[']'],L3), concat_atom(L3,S), '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(R2,R). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/php/1168450843/431 # 失礼します # 使用言語はperl5です # # 配列に、前からマッチしたところまでの文字列を繰り返し入れようとしています # ($str = 'hogehugahage'; # という文字列があって、hでマッチさせたら # @data = ['h', 'hogeh', 'hogehugah'] # という配列になることを想定しています) # # @data = $str =~ m/h/g; # のときは予想どおり # @data = ['h', 'h', 'h'] # となったのですが、 # @data = $str =~ m/^.*h/g # の場合は # @data = ['hogehugah'] # となって1回最大マッチするだけのようです # # どうすれば予想通りの結果になるでしょうか? # '配列に、前からマッチしたところまでの文字列を繰り返し入れようとしています($str = ''hogehugahage'';という文字列があって、hでマッチさせたら@data = [''h'', ''hogeh'', ''hogehugah'']という配列になる'(_検索文字列,_文字列,_先頭から検索文字列までの文字列ならび) :- findall(_先頭から適合文字列まで文字列, '前からマッチしたところまでの文字列ならび'(_検索文字列,_文字列,_先頭か適合文字列までの文字列), _先頭から適合文字列までの文字列ならび). '前からマッチしたところまでの文字列ならび'(_検索文字列,_文字列,_適合文字列) :- sub_atom(_文字列,_,_,_,S1,_検索文字列,S3,L1,L2,L3), concat_atom([S1,_検索文字列],_適合文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/php/1168450843/519 # 質問させて下さい。 # # ABC # …LMNO……… # ……LMNO…… # ………LMNO… # XYZ # # というような文章があったとします。 # 「LMNO」の前後(「…」)には文字(日本語や英数字)があります。 # # Perl5互換の正規表現が使えるテキストエディタや、BREGEXP.DLLが使える置換えソフトを使用し、 # 「ABC」から「XYZ」までにある「LMNO」を「OOOO」に置換えすることは可能でしょうか? # 特定の範囲内の文字だけを置換えする正規表現がわからず、検索文字列と置換え文字列の指定で困っています。 # どのようにすれば良いのか教えて頂けると助かります。よろしくお願いします。 # # '特定の範囲内の文字だけを置換えする正規表現がわからず、検索文字列と置換え文字列の指定'(Lines,_置換されたLines) :- append(L0,['ABC'|R1],['XYZ'|R2],Lines), findall(Line2,( append(_,[Line|_],R1), 'LineのLENOをOOOOに置換する'(Line,Line2)), Lines2), append(L0,Lines2,R2,_置換されたLines). 'LineのLENOをOOOOに置換する'(Line,Line2) :- sub_atom(Line,_,_,_,S1,'LENO',S3,L1,L2,L3), concat_atom([S1,'OOOO',S3],_置換されたLine),!. 'LineのLENOをOOOOに置換する'(Line,Line). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/php/1168450843/525 # Perlの正規表現で質問させて下さい。 # yyyy/mm/entry-basename/index.php # ↑はどのように記述すればいいのか、お手数ですがご教授願います<(_ _)> # 'yyyy/mm/entry-basename/index.php を検索する'(_文字列,_前文字列,_適合文字列,_後文字列) :- atom_chars('/entry-basename/index.php',Chars1), sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[Y1,Y2,Y3,Y4,/,M1,M2|Chars1],L3), すべて数字([Y1,Y2,Y3,Y4,M1,M2]), append(_,[M1|_],['0','1']), \+((last(L1,A),数字(A))). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/php/1168450843/591 # まだ正規表現が素人なので教えてください。 # たとえば以下のように四行の文章があって # それら文章の最初(一番目)の空白文字だけを検索するには # どうすればいいのですか? # # The environment of contents industries is so drastically changing, # though Japan has not fully. # taken advantage of the changes to develop. # its presence in the global market. # # The とenvironmentの間の空白文字 、though と Japanの間 # taken とadvantage の間の空白文などなどです # # 'それら文章の最初(一番目)の空白文字だけを検索するには'(Lines,_前文字列,_適合文字,_後文字列) :- append(_,[Line|R],Lines), 最初の空白文字(Line,_前文字列,_適合文字,_後文字列), R = []. 最初の空白文字(_文字列,_前文字列,_適合文字,_後文字列) :- sub_atom(_文字列,_,1,_,_前文字列,' ',_後文字列,L1,L2,L3),!. 最初の空白文字(_文字列,_文字列,'',''). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1292333005/641 # Cでバイナリファイル内の置き換えについて質問です # # 74 65 73 74 (test) を検索して別の値に変換するつもりですが # どのように処理したらいいでしょうか? # 74 がでてくるまで1バイトずつ読み込んでいくのか # ファイルを全部メモリに読み込んでから検索するのか # バイナリ操作が初めてなのでどうのようにするのがいいのでしょうか # 'バイナリファイル内の置き換え'(_ファイル,_別の値ならび) :- get_bytes(_ファイル,Bytes), '74 65 73 74 (test) を検索して別の値に変換する'(Bytes,_別の値ならび,Bytes2), put_bytes(_ファイル,Bytes2). '74 65 73 74 (test) を検索して別の値に変換する'(Bytes1,_別の値ならび,Bytes1) :- \+(append(L0,[74,65,73,74|R],Bytes1)),!. '74 65 73 74 (test) を検索して別の値に変換する'(Bytes1,_別の値ならび,Bytes2) :- append(L0,[74,65,73,74|R],Bytes1), '74 65 73 74 (test) を検索して別の値に変換する'(R,_別の値ならび,Bytes3), append(L0,_別の値ならび,Bytes3,Bytes2). get_bytes(_ファイル,Bytes) :- open(_ファイル,read,Instream,[type(binary)]), findall(Byte,( repeat,( at_end_of_stream(Instream), !, fail; get_byte(Instream,Byte))), Bytes), close(Instream),!. put_bytes(_ファイル,Bytes) :- open(_ファイル,write,Outstream,[type(binary)]), append(_,[Byte|R],Bytes), put_byte(Outstream,Byte), R = [], close(Outstream),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/755 # すいません。行頭のスペースが消えておかしくなりましたので書き込み直します。 # # ●正規表現の使用環境 # Java1.6 # # ●検索か置換か? # 検索(Stringクラス String[] split(String regex)メソッドによる文字列分割) # # ●説明 # CSVファイル中の一行を対象文字列とし、 # その文字列中初出の\s*,\s*をデータ区切り子として見なしマッチさせる。 # (その前後で文字列を2つに分割) # # ●対象データ # aaa,bbb,ccc # aaa, bbb, ccc # aaa , bbb , ccc # # ●希望する結果 # "aaa"と"bbb,ccc"に分割 # "aaa"と"bbb, ccc"に分割 # "aaa"と"bbb , ccc"に分割 # # ●希望しない結果 # "aaa"と"bbb"と"ccc"に分割 # etc... # # 自分で考えた(?<^[^,]*)\s*,\s*では # java.util.regex.PatternSyntaxException: Unknown look-behind group near index 8 # というような例外が出てしまいました。 # # よろしくお願いします。 # # 'CSVファイル中の一行を対象文字列とし、その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(_csvファイル,_行,_前文字列,_後文字列) :- get_lines(_ファイル,Lines), append(L0,[Line|R],Lines), _行 is L0 + 1, 'その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(Line,_前文字列,_後文字列), fail. 'その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(Line,_前文字列,_後文字列) :- sub_atom(Line,_,_,_,_前文字列,_区切り文字列,_後文字列,L1,L2,L3), append(L0,[','|R],L2), all(L0,' '), \+((append(L01,[A|_],R),\+(A=' '))),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/php/1168450843/632 # 質問させてください。 # # <table> # <tr> # <th>名称1</th> # <td> # 値1 # </td> # </tr> # <tr> # <th>名称2</th> # <td> # 値2 # </td> # </tr> # </table> # のようなHTMLがあります。 # 実際には全ての改行とインデントはトリムされてます。 # この値1の部分をとるにはどのような正規表現を使えば良いでしょうか? # # <th>名称1</th><td>([^<]*)</td> # のように考えてましたが値1には<img>タグが入る場合があります。 # <table>や<td>が入ることはありません。 # '最初のtdタグの値を検索する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,_後文字列,L1,['<',t,d,'>'|R2],['<',/,t,d,'>'|R3]), \+(append(_,['<',t,d,'>'],_,R2)), concat_atom([S1,''],_前文字列), concat_atom(R2,_適合文字列),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/760 # ●正規表現の使用環境 # C# # # ●検索か置換か? # 検索 # # ●説明 # =の連続がある行で挟まれた部分を抽出したい # # ●対象データ # ゲスト======================== # ほげほげ # ほげほげほげ # プロフィール=================== # はげ # はげはげ # ============================= # # ●希望する結果 # "ほげほげ\nほげほげほげ" # "はげ\nはげはげ" # # 結果に=の行が含まれていても構いません # =は2つ以上連続している行が対象です # # ^.*={2,}$(?'block'.+?)^.*={2,}$ とやってみましたがマッチしませんでした # MultiLineオプションは指定しています # それと対象文字列から\rは事前に除去しています # # よろしくお願いします # # '=の連続がある行を区切りとして検索する'([],[]) :- !. '=の連続がある行を区切りとして検索する'([Line|R1],[S|R2]) :- sub_atom(Line,_,2,_,'=='), '=の連続がある行が来るまで検索する'(R1,L1,R11), concat_atom(L1,'\n',S), '=の連続がある行を区切りとして検索する'(R11,R2). '=の連続がある行を区切りとして検索する'([_|R1],R2) :- '=の連続がある行を区切りとして検索する'(R1,R2). '=の連続がある行が来るまで検索する'([Line|R1],[],[Line|R1]) :- sub_atom(Line,_,2,_,'=='),!. '=の連続がある行が来るまで検索する'([Line|R1],[Line|R2],R3) :- '=の連続がある行が来るまで検索する'(R1,R2,R3). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1267796762/839 # http://ime.nu/www.dotup.org/uploda/www.dotup.org1379819.java.html # Fruitクラス # 条件 果物クラスの検索()メソッドは、商品が存在するかどうかを検索する # メソッドで、商品が存在した場合は単価を戻す。 # 商品が見つからなかった場合には-1を戻す。 # 果物クラスの表示()メソッドは、商品名、単価、個数から合計金額を # 計算して表示するメソッドである。 #   商品が登録されていない場合はメッセージを表示する。 商品が存在するか存在したら単価を戻す(_果物・単価ならび,_商品,_単価) :- 商品が存在するか(_果物・単価ならび,_商品), 存在したら単価を戻す(_果物・単価ならび,_商品,_単価),!. 商品が存在するか存在したら単価を戻す(_果物・単価ならび,_商品,-1). 商品が存在するか(_果物・単価ならび,_商品) :- append(_,[[_商品|_]|_],_果物・単価ならび). 存在したら単価を戻す(_果物・単価ならび,_商品,_単価) :- append(_,[[_商品,_単価]|_],_果物・単価ならび). 表示(_果物・単価ならび,_商品名,_単価,_個数) :- 商品が存在するか存在したら単価を戻す(_果物・単価ならび,_商品名,_単価), \+(_単価 = (-1)), _合計金額 is _単価 * _個数, write_formatted('商品合計 = %t\n',[_合計金額]),!. 表示(_果物・単価ならび,_商品名,_単価,_個数) :- write_formatted('商品 %t は登録されていません\n',[_商品名]),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1267796762/871 # 【 課題 】 # 商品リストに登録されている商品名と個数を入力すると、商品名、単価、個数、合計金額を表示するプログラムを作成します。添付のソースファイルにコードを追加して、以下の実行結果になるようなプログラムを作成してください。 # ☆商品名と個数を入力すると、商品名、単価、個数、合計金額を表示する (個数が入力されない場合は1個とみなす) # C:\kadai>java Shopping Orange # 商品:Orange # 単価:100円 個数:1個 合計:100円 # # C:\kadai> java Shopping Orange 3 # 商品:Orange # 単価:100円 個数:3個 合計:300円 # # ☆ 商品が見つからなかった場合には、エラーメッセージを表示する # C:\kadai>java Shopping Melon 3 # Melonは商品ではありません。 # # ☆ 引数の数が0または3つ以上の場合は、エラーメッセージを表示する # C:\kadai>java Shopping Orange Apple Peach # 引数には商品名と個数を入力してください。 # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】4. 制限なし # 【 Ver  】1.6.0_05 # 【 補足 】 Shoppingクラスはmain()メソッドを持つ。 # 実行時の引数には商品名と個数を入力する。 # 個数が入力されなかった場合は1とみなす。 # Fruitクラスのsearch()メソッドは、商品が存在するかどうかを検索する # メソッドで、商品が存在した場合は単価を戻す。商品が見つからなかった場合には-1を戻す。 # Fruitクラスのdisplay()メソッドは、商品名、単価、個数から合計金額を計算して表示するメソッドである。商品が登録されていない場合はメッセージを表示する # ソース # shopping http://ime.nu/www.dotup.org/uploda/www.dotup.org1383033.java.html # fruit http://ime.nu/www.dotup.org/uploda/www.dotup.org1383034.java.html # ../test/read.cgi/tech/1267796762/870さん その通りです。完全に丸投げになりますがよろしくお願い致します。 # # '商品リストに登録されている商品名と個数を入力すると、商品名、単価、個数、合計金額を表示する' :- 商品名と個数を入力すると(_商品名,_個数), 商品名、単価、個数、合計金額を(_商品名,_単価,_個数,_合計金額), 表示する(_商品名,_単価,_個数,_合計金額),!. '商品リストに登録されている商品名と個数を入力すると、商品名、単価、個数、合計金額を表示する'. 商品名と個数を入力すると(_商品名,_個数) :- user_parameters([_商品名,_個数文字列]), atom_to_term(_個数文字列,_個数,_),!. 商品名、単価、個数、合計金額を(_商品名,_単価,_個数,_合計金額) :- 商品名リスト(_商品名,_単価), _合計金額 is truncate(_単価 * _個数 + 0.5),!. 商品名、単価、個数、合計金額を(_商品名,_,_,_) :- '商品が見つからなかった場合には、エラーメッセージを表示する'(_商品名), fail. 表示する(_商品名,_単価,_個数,_合計金額) :- write_formatted('商品:%t\n',[_商品名]), write_formatted('単価:%t円 個数:%t個 合計:%t円\n',[_単価,_個数,_合計金額]),!. '商品が見つからなかった場合には、エラーメッセージを表示する'(_商品名) :- write_formatted('%tは商品ではありません。\n',[_商品名]). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/db/1274791771/830 # MySQL 5.1を使っているのですが、 # リストにabc,def,ghiのように単語が登録されているとき、 # "hogehogeabchogehogehogeghihogejklhogehoge"という文から、 # abc,ghiという単語がこの文に含まれているというような検索をしたいのですが、書き方がわかりません。 # それ以前に、データベースでこのような検索は可能ですか? # # 'リストにabc,def,ghiのように単語が登録されているとき、abc,ghiという単語がこの文に含まれているというような検索'(_単語ならび,_文字列,_すべての単語が文字列中に現れる単語の組み合わせならび) :- length(_単語ならび,Len), findall(L,( for(Len,N,1), 組み合わせ(_単語ならび,N,L), すべての要素が文字列中に現れる(L,_文字列)), _すべての単語が文字列中に現れる単語の組み合わせならび). すべての要素が文字列中に現れる([],_) :- !. すべての要素が文字列中に現れる([A|R],_文字列) :- sub_atom(_文字列,_,_,_,A), すべての要素が文字列中に現れる(R,_文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1296387672/11 # [1] 授業単元:C言語の基礎 # [2] 問題文 #  「複数の異なるデータ型を持つ情報に対して、情報の回覧と追加ができ、 #  ファイルの読込とができるプログラムを作成しなさい。 #  たとえば名簿のような物で、氏名、電話番号、住所、整理番号などを #  読込、書込、保存をする。可能なら、検索もできるようにすると良い。 #  複数のデータを扱うために、構造体を持つ配列を使うこと。 #  また、メンバ数は6個以上の情報を扱うこと。 #  ファイル形式は、CSV形式で、1つの情報の関連データ(メンバ)はカンマで区切り、 #  別の情報データ(行)は改行で区別しなさい。ファイル名の拡張子はcsv。 #  データファイルはプログラム起動時にコマンドラインから入力できること。 #  また、そうではないことにも対応すること。」 # リーディング情報の読み込み(_データファイル,LL) :- get_split_lines(_データファイル,[','],LL), append(_,[L|R],LL), P =.. [リーディング情報|L], assertz(P), R = [],!. リーデング情報の保存(_データファイル) :- open(_データファイル,write,Outstream), リーデング情報の書き込み(Outstream), close(Outstream). リーデング情報の書き込み(Outstream) :- リーデング情報(_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数), concat_atom([_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数],',',S), write_formatted(Output,'%t\n',[S]), fail. リーデング情報の書き込み(Outstream). 情報の回覧(LL) :- write('順位,種牡馬名,毛色,産地,出走頭数,勝馬頭数,出走回数,勝利回数,賞金,1出走賞金,1頭平均賞金,勝馬率,アーニング・インデックス\n'), リーデング情報(_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数), _1出走賞金 is truncate(_賞金 / _出走回数), _1頭平均賞金 is truncate(_賞金 / _出走頭数) _勝馬率 is _勝馬頭数 / _出走頭数, アーニング・インデックスの算出(_種牡馬名,_アーニング・インデックス), write_formatted('%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t\n',[_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_1出走賞金,1頭,_平均賞金,_勝馬率,_アーニング・インデックス]), fail. 情報の回覧(LL). リーディング情報の追加 :- write('指示に従い各項目を入力してください\n'), リーディング情報項目(_項目,_項目のタイプ), リーディング情報項目の入力(_項目,_項目のタイプ,_項目値ならび), P =.. [リーデング情報|_項目値ならび], assertz(P),!. リーディング情報項目の入力(_項目,_項目のタイプ,_項目値ならび) :- findall(_項目値,( リーディング情報項目(_項目,_項目のタイプ), 項目の入力(_項目,_項目のタイプ,_項目値)), _項目値ならび). 項目の入力(_項目,文字列,_項目値) :- write_formatted('%t (文字列) を入力してください : ',[_項目]), get_line(_項目値),!. 項目の入力(_項目,整数,_項目値) :- write_formatted('%t (整数)を入力してください : ',[_項目]), get_line(Line), 項目の入力診断(_項目,整数,Line,_項目値),!. 項目の入力(_項目,整数,_項目値) :- 項目の入力(_項目,整数,_項目値). 項目の入力診断(_項目,整数,Line,_項目値) :- atom_to_term(Line,_項目値,_), integer(_項目値),!. 項目の入力診断(_項目,整数,Line,_項目値) :- write_formatted('入力された%tからは%tにふさわしい整数を得られませんでした。再入力をお願いします。\n',[Line,_項目]), fail. % 産駒の総収得賞金/2,産駒の出走頭数/2,全出走馬収得賞金/1,総出走頭数/1 は未定義である。 % これらの述語をデータベースと定義した上で、アーニング・インデックスを算出する。 アーニング・インデックスの算出(_種牡馬名,_アーニングインデックス) :- 産駒の総収得賞金(_種牡馬名,_産駒の総収得賞金), 産駒の出走頭数(_種牡馬名,産駒の出走頭数), 全出走馬収得賞金(_全出走馬収得賞金), 総出走頭数(_総出走頭数), _アーニング・インデックス is ( _産駒の総収得賞金 / _産駒の出走頭数 ) / ( _全出走馬収得賞金 / _総出走頭数),!. リーディング情報項目(順位,整数). リーディング情報項目(種牡馬名,文字列). リーディング情報項目(毛色,文字列). リーディング情報項目(産地,文字列). リーディング情報項目(出走頭数,整数). リーディング情報項目(勝馬頭数,整数). リーディング情報項目(出走回数,整数). リーディング情報項目(勝利回数,整数). リーディング情報項目(賞金,整数). /* リーディング情報項目(1出走賞金,整数). リーディング情報項目(1頭平均賞金,整数). リーディング情報項目(勝馬率,浮動小数点数).). リーディング情報項目(アーニング・インデックス,浮動小数点数). */ % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1296387672/277 # [1] 授業単元:プログラミング C言語 # [2] 問題文(含コード&リンク): 次の投稿に # # ../test/read.cgi/tech/1296387672/277   住所録を以下の条件で作成 #  ―蚕袁燭涼羶箸六疚勝⇒絞愴峭罅⊇蚕蝓電話番号のみ。以下の構造体を使用。 # typedef struct jusyoroku { #     char name[32];     #     char yubin[32];  #     char add[32];  # char tel[32];       # } # ◆―蚕袁燭魯謄ストファイルに保存。氏名、郵便番号、住所、電話番号が1行ずつ記載され、 # 1件ごとに「-----」区切られ、最後は「*****」となる。 # 例: # 氏名 # 郵便番号 # 住所 # 電話番号 # ----- # : # : # : # ----- # 氏名 # 郵便番号 # 住所 # 電話番号 # ***** # E佻新鐃瑤100件まで # い海離愁侫箸六慊蠅靴織侫.ぅ襪ら住所録を読み込め、また、保存もできる。 # イ海離愁侫箸禄蚕袁燭ら氏名、または電話番号で一致する人物を検索、情報をすべて表示できる。 # 新しい住所録の追加、既存の住所録の変更・削除が可能。 # それぞれの機能はわかりやすく関数に分割すること。 # # よろしくお願いします。 # # 住所録を読み取る(_テキストファイル,_住所録) :- open(_テキストファイル,read,Instream), get_line(Instream,Line), 住所録を読み取る(Instream,Line,_住所録), 住所録を登録(_住所録), close(Instream),!. 住所録を読み取る(Instream,Line,[]) :- sub_atom(Line,0,1,'*'),!. 住所録を読み取る(Instream,Line,_住所録) :- sub_atom(Line,0,1,'-'), get_line(Instream,Line2), 住所録を読み取る(Instream,Line,_住所録). 住所録を読み取る(Instream,Line,[[_氏名,_郵便番号,_住所,_電話番号]|R]) :- \+(sub_atom(Line,0,1,'-')), \+(sub_atom(Line,0,1,'*')), Line = _氏名, 郵便番号を読み取る(Instream,_郵便番号), 住所を読み取る(Instream,_住所), 電話番号を読み取る(Instream,_電話番号), get_line(Line2), 住所録を読み取る(Instream,Line2,R). 氏名を読み取る(Instream,_氏名) :- get_line(Instream,_氏名),!. 郵便番号を読み取る(Instream,_郵便番号) :- get_line(Instream,_郵便番号),!. 住所を読み取る(Instream,_住所) :- get_line(Instream,_住所),!. 電話番号を読み取る(Instream,_電話番号) :- get_line(Instream,_電話番号),!. 住所録を登録(_住所録) :- abolish(住所録/4), append(_,[[_氏名,_郵便番号,_住所,_電話番号]|R],_住所録), assertz(住所録(_氏名,_郵便番号,_住所,_電話番号)), R = []. テキスト名を指定して住所録の保存(_保存テキスト名) :- open(_保存テキスト名,write,Outstream), 住所録の保存(Outstream), close(Outstream). 住所録の保存(Outstream) :- 住所録(_氏名,_郵便番号,_住所,_電話番号), write_formatted(Outstream,'-----\n%32s\n%32s\n%32s\n%32s\n',[_氏名,_郵便番号,_住所,_電話番号]), fail. 住所録の保存(Outstream) :- write(Outstream,'*****\n'),!. 住所録から氏名、または電話番号で一致する人物を検索して情報を表示する :- write('検索語を入力してください : '), get_line(_検索語), 氏名を鍵に住所録を検索する(_検索語), 電話番号を鍵に住所録を検索する(_検索語). 氏名を鍵に住所録を検索する(_氏名) :- 住所録(_氏名,_郵便番号,_住所,_電話番号), write_formatted('%t,%t,%t,%t\n',[_氏名,_郵便番号,_住所,_電話番号]), fail. 氏名を鍵に住所録を検索する(_). 電話番号を鍵に住所録を検索する(_住所) :- 住所録(_氏名,_郵便番号,_住所,_電話番号), write_formatted('%t,%t,%t,%t\n',[_氏名,_郵便番号,_住所,_電話番号]), fail. 電話番号を鍵に住所録を検索する(_). 新しい住所録の追加 :- write('氏名を入力してください : '), get_line(_氏名), write('郵便番号を入力してください : '), get_line(_郵便番号), write('住所を入力してください : '), get_line(_住所), write('電話番号を入力してください : '), get_line(_電話番号), assertz((住所録(_氏名,_郵便番号,_住所,_電話番号)), 住所録述語の保存. 既存の住所録を定義順の変更なしに変更 :- write('氏名を入力してください : '), get_line(_氏名), write('変更項目を選択してください : '), get_line(_変更項目), 既存の住所録の変更(_氏名,_変更項目,_変更された住所録), 住所録を登録(_変更された住所録), 住所録述語の保存. 既存の住所録を定義順の変更なしに変更(_氏名,郵便番号,_住所録) :- write('郵便番号を入力してください : '), get_line(_郵便番号), findall([_氏名,_郵便番号,_住所,_電話番号],( clause(住所録(_氏名,_郵便番号,_住所,_電話番号),_)), L1), 郵便番号を置換(_氏名,L1,_住所録). 既存の住所録を定義順の変更なしに変更(_氏名,住所,_住所録) :- write('住所を入力してください : '), get_line(_住所), findall([_氏名,_住所,_住所,_電話番号],( clause(住所録(_氏名,_住所,_住所,_電話番号),_)), L1), 住所を置換(_氏名,L1,_住所録). 既存の住所録を定義順の変更なしに変更(_氏名,電話番号,_住所録) :- write('電話番号を入力してください : '), get_line(_電話番号), findall([_氏名,_電話番号,_住所,_電話番号],( clause(住所録(_氏名,_電話番号,_住所,_電話番号),_)), L1), 電話番号を置換(_氏名,L1,_住所録). 郵便番号を置換(_氏名,_郵便番号,[],[]) :- !. 郵便番号を置換(_氏名,_郵便番号,[[_氏名,_,_住所,_電話番号]|R1],[[_氏名,_郵便番号,_住所,_電話番号]|R2]) :- 郵便番号を置換(_氏名,_郵便番号,R1,R2). 郵便番号を置換(_氏名,_郵便番号,[L|R1],[L|R2]) :- 郵便番号を置換(_氏名,_郵便番号,R1,R2). 住所を置換(_氏名,_住所,[],[]) :- !. 住所を置換(_氏名,_住所,[[_氏名,_,_住所,_電話番号]|R1],[[_氏名,_住所,_住所,_電話番号]|R2]) :- 住所を置換(_氏名,_住所,R1,R2). 住所を置換(_氏名,_住所,[L|R1],[L|R2]) :- 住所を置換(_氏名,_住所,R1,R2). 電話番号を置換(_氏名,_電話番号,[],[]) :- !. 電話番号を置換(_氏名,_電話番号,[[_氏名,_,_住所,_電話番号]|R1],[[_氏名,_電話番号,_住所,_電話番号]|R2]) :- 電話番号を置換(_氏名,_電話番号,R1,R2). 電話番号を置換(_氏名,_電話番号,[L|R1],[L|R2]) :- 電話番号を置換(_氏名,_電話番号,R1,R2). 住所録述語の保存 :- tell('住所録#4.pro'), listing(住所録), told. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/828 # 質問です # <html><body>abcdefg</body></html>のように間に挟まれたabcdefgだけを取り出すには # やはり # <html><body>(?<label>(\\w+))</body></html> # のようにグループ化を行って後から # Groups["label"].Valueで取り出すのがスマートな方法ですか? # # C#です # # 実際はもっと長い文字列から抽出します # 何かもっといいアイディアがありましたらご教授願います # # 'ある文字パターンに挟まれた副文字列'(_文字列,_直前にある副文字列,_直後にある文字列,_前文字列,_検索語,_後文字列) :- atom_chars(_直前にある副文字列,Chars1), atom_chars(_直後にある副文字列,Chars2), sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(Chars1,L11,Chars2,L1), concat_atom(L11,_検索語), concat_atom([S1,_直前にある副文字列],_前文字列), concat_atom([_直後にある副文字列,S3],_後文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1267796762/934 # 【 課題 】プログラムはテキストファイル(WordData.dat)を読み込む。 # ファイル中の文を解析して単語を取り出し、プログラム中で定義されている検索文字を含む単語を表示する。 # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】2月8日まで # 【 参照 】http://ime.nu/www1.axfc.net/uploader/Sc/so/201786 パスは0968 # 検索文字 : IP 解析時のデリミタ : "," # # # -----出力結果----- # # 検索文字 : IP    //←キーボードから入力 # VoIP # IPv4 # IPアドレス # VoIPゲートウエイ # TCP/IP # # ------------------ # ファイル中の文を解析して単語を取り出し、プログラム中で定義されている検索文字列を含む単語を表示する :- 形態素解析(ファイル,'WordDate.dat',_単語ならび), append(_,[_単語|R],_単語ならび), 検索文字列を得る(_検索文字列), 検索文字列を含む単語を表示する(_検索文字列,_単語), R = []. 検索文字列を含む単語を表示する(_検索文字列,_単語) :- sub_atom(_単語,_,_,_,_検索文字列), write_formatted('%t\n',[_単語]),!. 検索文字列を含む単語を表示する(_,_). 検索文字列を得る(_検索文字列) :- write('検索文字列 : '), get_line(_検索文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 形態素解析サーバー(mecab). 形態素解析(ファイル,F,L) :- 形態素解析サーバー(_形態素解析サーバー), slush_op(F,F_1), concat([cat ,F_1, | ,_形態素解析サーバー],S), sh(S,L1), 形態素解析(L1,L2), 形態素解析_3(L2,L). 形態素解析(文,S,L) :- tmpnam(F_1), tell(F_1), wr(%t,[S]), told, 形態素解析(ファイル,F_1,L). 形態素解析([],[]) :- !. 形態素解析([['EOS'|_]|_],[]) :- !. 形態素解析([[A|_],[@,B|_]|R],[R1_1|R3]) :- 形態素解析_2(R,R1,R2), 形態素解析_2_重複削除([A,B|R1],[],R1_1), 形態素解析(R2,R3),!. 形態素解析([[A|_]|R],[B|R2]) :- 形態素解析サーバー(mecab), make_list(A,[\t],AL), AL = [B|_], 形態素解析(R,R2),!. 形態素解析([[A|_]|R],[A|R2]) :- 形態素解析サーバー(juman), 形態素解析(R,R2),!. 形態素解析_2([],[],[]) :- !. 形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :- \+(A = (@)),!. 形態素解析_2([[@,A|_]|R],[A|R2],R3) :- 形態素解析_2(R,R2,R3),!. 形態素解析_2_重複削除([],L1,L) :- reverse(L1,L),!. 形態素解析_2_重複削除([A|R],Y,X) :- member(A,Y), 形態素解析_2_重複削除(R,Y,X),!. 形態素解析_2_重複削除([A|R],Y,X) :- \+(member(A,Y)), 形態素解析_2_重複削除(R,[A|Y],X). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 形態素品詞解析([],[]) :- !. 形態素品詞解析([['EOS'|_]|R1],R2) :- 形態素品詞解析(R1,R2). /* 形態素品詞解析([[A|_],[@,B|_]|R],[R1_1|R3]) :- 形態素解析_2(R,R1,R2), 形態素解析_2_重複削除([A,B|R1],[],R1_1), 形態素品詞解析(R2,R3),!. */ 形態素品詞解析([[_文|_]|R],[(_語彙,_品詞)|R2]) :- 形態素解析サーバー(mecab), make_list(_文,[\t],AL), AL = [_語彙,_品詞|_], 形態素品詞解析(R,R2),!. 形態素品詞解析([_|R],[(_語彙,_品詞)|R2]) :- 形態素解析サーバー(mecab), 形態素品詞解析(R,R2),!. 形態素品詞解析([[A|_]|R],[A|R2]) :- 形態素解析サーバー(juman), 形態素品詞解析(R,R2),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/833 # ●正規表現の使用環境 # C # # ●説明 # Apacheのログから一部分を抜き出して検索したい # # ●対象データ # host.ne.jp - - [11/May/2011:12:22:15 +0900] "GET /~akasata/index.xml?gat=tPFnlVCP8aUYq8jjPqA=&BSdebug=AV/w3.3r1.1/ HTTP/1.1" # 200 6703 "https://server.ne.jp/" "Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14" # (以上1行) # ●希望する結果 # 1件目 # host.ne.jp # 2件目 # /~akasata/index.xml # # 以上のような検索を実装しようとして、 # regerror(regcomp(&preg, "(.+) - [^[] \\[.+\\] \"[^\" ]+ ((/~akasata/[^\"]+)\\?g.+)*([^\"]+) [^\" ]+\".+", REG_EXTENDED|REG_NEWLINE), &preg, errbuf, sizeof(errbuf)); # 以下のような正規表現を用いた(Cのエスケープが混じっているため見辛ければすいません)のですが、 # 後ほど検索対象を調べて一部不要な部分があったため # regerror(regcomp(&preg, "(.+) - [^[] \\[.+\\] \"[^\" ]+ ((/~akasata/[^\"]+)\\?g.+) [^\" ]+\".+", REG_EXTENDED|REG_NEWLINE), &preg, errbuf, sizeof(errbuf)); # 以下のように正規表現を変更したところ、同じ結果を返すのにもかかわらず # 実行速度が4倍以上もかかるようになってしまいました。原因かわかる方教えていただけないでしょうか? # # 'Apacheのログから一部分を抜き出して検索したい'(ApacheLog,X) :- get_split_lines(ApacheLog,[' ','"','?'],LL), append(_,[L|R],LL), 選択(L,X). 選択(L,X) :- append(_,['GET',X|_],L). 選択(L,X) :- append(_,[X|_],L), sub_atom(X,0,4,_,http). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1296387672/564 # http://ime.nu/codepad.org/jP4CQKdZ # リストの生成、検索、削除が出来るようにしてもらえないでしょうか? # # リストの生成(end,[]) :- !. リストの生成(gen,L) :- write('name,tel : '), get_line(Line), リストの生成(Line,L),!. リストの生成(Line,[[_name,_tel]|R]) :- split(Line,[','],[_name,_tel]), get_line(Line), リストの生成(Line2,R). リストから削除(L1,L2) :- write('削除キー : '), get_line(_削除キー), write('削除キー値 : '), get_line(_削除キー値), リスト構造(_削除キー,_削除値,_削除要素), リストから削除(_削除要素,L1,L2). リストから削除(_,[],[]) :- !. リストから削除(_削除要素,[_削除要素|R1],L2) :- リストから削除(_削除要素,R1,L2),!. リストから削除(_削除要素,[A|R1],[A|R2]) :- リストから削除(_削除要素,R1,R2). リスト構造(name,_name,[_name,_]). リスト構造(tel,_tel,[_,_tel]). リスト表示(L) :- findall('%t',リスト構造(_,_),L1), concat_atom(L1,',',_パターン), リスト表示(_パターン,L). リスト表示(_パターン,[L|R]) :- write_formatted('%t\n',L), リスト表示(_パターン,R). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1296387672/578 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 名前と年齢を入力し、SLISTで構造体で保持する。 # 名前は入力される度にリストを検索し、まだ入力されていなければ年齢を入力しリストに格納する。 # 名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する。 # 名前に"END"と入力した場合は、リストをすべて表示して終了する。 # # ttp://caspar.hazymoon.jp/OpenBSD/sys/queue/slist.html # '名前と年齢を入力し、SLISTで構造体で保持する。名前は入力される度にリストを検索し、まだ入力されていなければ年齢を入力しリストに格納する。名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する。名前に"END"と入力した場合は、リストをすべて表示して終了する。'(List1,List2) :- 名前と年齢を入力し(_名前,_年齢), 'SLISTで構造体で保持する'(_名前,_年齢,List1,List3), '名前と年齢を入力し、SLISTで構造体で保持する。名前は入力される度にリストを検索し、まだ入力されていなければ年齢を入力しリストに格納する。名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する。名前に"END"と入力した場合は、リストをすべて表示して終了する。'(List3,List2). '名前と年齢を入力し、SLISTで構造体で保持する。名前は入力される度にリストを検索し、まだ入力されていなければ年齢を入力しリストに格納する。名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する。名前に"END"と入力した場合は、リストをすべて表示して終了する。'(List,List) :- リストをすべて表示して終了する(List). 名前と年齢を入力し(_名前,_年齢) :- write('名前を入力してください : '), get_line(_名前), \+(_名前='END'), write('年齢を入力してください : '), get_integer(_年齢). 'SLISTで構造体で保持する'(_名前,_年齢,List1,List2) :- '名前は入力される度にリストを検索しまだ入力されていなければ年齢を入力しリストに格納する。名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する'(_名前,_年齢,List1,List2). '名前は入力される度にリストを検索しまだ入力されていなければ年齢を入力しリストに格納する。名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する'(_名前,_年齢,List1,List2) :- 'まだ入力されていなければ年齢を入力しリストに格納する'(_名前,_年齢,List1,List2),!. '名前は入力される度にリストを検索しまだ入力されていなければ年齢を入力しリストに格納する。名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する'(_名前,_年齢,List1,List2) :- '名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する'(_名前,_年齢,List1,List2),!. 'まだ入力されていなければ年齢を入力しリストに格納する'(_名前,_年齢,List1,[[_名前,_年齢]|List1]) :- \+(append(L0,[[_名前,_]|R],List1)),!. '名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する'(_名前,_年齢,List1,List2) :- append(L0,[[_名前,_]|R],List1)), append(L0,[[_名前,_年齢]|R],List2). リストをすべて表示して終了する(List) :- write('名前 | 年齢\n'), append(_,[[_名前,_年齢]|R],List), write_formatted('%8s | %t\n',[_名前,_年齢]), R = []. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1296387672/578 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 名前と年齢を入力し、SLISTで構造体で保持する。 # 名前は入力される度にリストを検索し、まだ入力されていなければ年齢を入力しリストに格納する。 # 名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する。 # 名前に"END"と入力した場合は、リストをすべて表示して終了する。 # # ttp://caspar.hazymoon.jp/OpenBSD/sys/queue/slist.html # '名前と年齢を入力し、SLISTで構造体で保持する。名前は入力される度にリストを検索し、まだ入力されていなければ年齢を入力しリストに格納する。名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する。名前に"END"と入力した場合は、リストをすべて表示して終了する。'(List1,List2) :- 名前を入力する(_名前), 'SLISTで構造体で保持する'(_名前,List1,List2). 名前と年齢を入力し(_名前) :- write('名前を入力してください : '), get_line(_名前),!. 年齢を入力する(_年齢) :- write('年齢を入力してください : '), get_integer(_年齢),!. 'SLISTで構造体で保持する'('End',List1,List1) :- リストをすべて表示して終了する(List1),!. 'SLISTで構造体で保持する'(_名前,List1,List2) :- 年齢を入力する(_年齢), '名前は入力される度にリストを検索しまだ入力されていなければ年齢を入力しリストに格納する。名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する'(_名前,_年齢,List1,List3), 名前を入力し(_名前2), 'SLISTで構造体で保持する'(_名前2,List3,List2). '名前は入力される度にリストを検索しまだ入力されていなければ年齢を入力しリストに格納する。名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する'(_名前,_年齢,List1,List2) :- 'まだ入力されていなければ年齢を入力しリストに格納する'(_名前,_年齢,List1,List2),!. '名前は入力される度にリストを検索しまだ入力されていなければ年齢を入力しリストに格納する。名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する'(_名前,_年齢,List1,List2) :- '名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する'(_名前,_年齢,List1,List2),!. 'まだ入力されていなければ年齢を入力しリストに格納する'(_名前,_年齢,List1,[[_名前,_年齢]|List1]) :- \+(append(L0,[[_名前,_]|R],List1)),!. '名前が既に入力されていた(リストに同じ名前があった)場合は、新たに入力された年齢に更新する'(_名前,_年齢,List1,List2) :- append(L0,[[_名前,_]|R],List1)), append(L0,[[_名前,_年齢]|R],List2). リストをすべて表示して終了する(List) :- write('名前 | 年齢\n'), append(_,[[_名前,_年齢]|R],List), write_formatted('%8s | %t\n',[_名前,_年齢]), R = []. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/905 # ●実装しようとしている正規表現 # ^[1-9]\d{3}$ # # PHPのpreg_matchでいえば # preg_match (/^[1-9]\d{3}$/, $subject) # # ●正規表現の使用環境 # PHP 5.2 # ●検索か置換か? # 検索 # ●説明 # 4桁の西で0000のみを除外したい。 # 西暦1万年(10000)以上は考慮しない # # 0000 × # 1000〜9999 ○ # # ●対象データ # 説明の項を参照 # ●希望する結果 # 説明の項を参照 # # # '4桁の西暦で0000のみを除外したい'(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_検索文字列,後文字列,L1,[A,B,C,D],L3), digit(A), digit(B), digit(C), digit(D), \+((A='0',B='0',C='0',D='0')), \+((last(L1,Z),digit(Z))), \+((L3=[H|_],digit(H))). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/906 # ●実装しようとしている正規表現 # ^[0][1-9]$|^[1-9]\d$ # # PHPのpreg_matchでいえば # preg_match (/^[0][1-9]$|^[1-9]\d$/, $subject) # # ●正規表現の使用環境 # PHP 5.2 # ●検索か置換か? # 検索 # ●説明 # 2桁の月で00のみを除外したい。 # # 00   × # 01〜12 OK(13〜99は他の方法で除外しています) # # ●対象データ # 説明の項を参照 # ●希望する結果 # 説明の項を参照 # # # '2桁の月で00のみを除外したい'(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_検索文字列,後文字列,L1,[A,B],L3), digit(A), digit(B), \+((A='0',B='0')), \+((last(L1,Z),digit(Z))), \+((L3=[H|_],digit(H))). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/908 # ●実装しようとしている正規表現 # ^(\d{1,6})(\.\d+)?$ # # PHPのpreg_matchでいえば # preg_match (/^(\d{1,6})(\.\d+)?$/, $subject) # # ●正規表現の使用環境 # PHP 5.2 # ●検索か置換か? # 検索 # ●説明 # 整数部が6桁までの数値を許可。 # 小数点を含む入力を許可。 # 小数点以下は特に制限しない(DB側の丸め処理に依存) # # 1234567  × # 123456.  × # 123456.1 _OK # 1.1    OK # 0.12・・89 _OK # # ●対象データ # 説明の項を参照 # ●希望する結果 # 説明の項を参照 # '整数部が6桁までの数値を許可。小数点を含む入力を許可。小数点以下は特に制限しない(DB側の丸め処理に依存)'(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_検索文字列,後文字列,L1,L2,L3), 許可される文字だけで構成(L2), 最初と最後は数字でなくてはならない(L2), 検索文字列の前後は数字ではない(L1,L3), 整数部が6桁まで(L2). 許可される文字だけで構成(L2) :- append(_,[A|_],L2), \+(検索文字列で許可される文字(A)),!,fail. 許可される文字だけで構成(_). 検索文字列で許可される文字(A) :- digit(A),!. 検索文字列で許可される文字('.'). 最初と最後は数字でなくてはならない(L2) :- L2 = [H|_], digit(H), last(L2,LZ), digit(LZ). 検索文字列の前後は数字ではない(L1,L3) :- \+((last(L1,Z),digit(Z))), \+((L3=[H|_],digit(H))). 整数部が6桁まで(L) :- append(L0,['.'|R],L), ピリオドは一個まで(L0,R), '6桁以下'(L0). 整数部が6桁まで(L) :- '6桁以下'(L). ピリオドは一個まで(L0,R) :- \+(append(_,['.'|_],L0)), \+(append(_,['.'|_],R)). '6桁以下'(L0) :- length(L0,Len), Len =< 6,!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/932 # お知恵をお貸しください…!どうかお詳しい方よろしくお願いいたしますm(__)m # # ●正規表現の使用環境 # VBScript # # ●検索か置換か? # 検索 # # ●説明 # メールアドレスをチェックしたい # 1.メールは1つか、複数 # 2.複数メールはカンマで区切られる # 3.カンマの直後にスペースが入るかも # 4.メールの@以降は固定(間違って変な宛先に送らないため) # 5.@より前はてきとう # # つづく # # # メールアドレス検索(_文字列,_メールアドレス) :- split(_文字列,[',',' ','\n'],L), append(_,[_メールアドレス|R],L), sub_atom(_メールアドレス,_,_,_,S1,S2,S3,L1,['@'|R2],L3), R = []. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/968 # ●正規表現の使用環境 # Perl # # ●検索か置換か? # 置換 # # ●説明 # 重複する文字列と区切り文字を削除したい # # ●対象データ # aaa;bbb;ccc;bbb;あああ;aaa;あああ;いいい # # ●希望する結果 # aaa;bbb;ccc;あああ;いいい # # よろしくお願いします # # 区切り文字を除く重複する文字列と区切り文字を削除したい(_文字列,_区切り文字,_重複する文字列と区切り文字を削除した文字列) :- split(_文字列,[_区切り文字],_区切られた要素ならび), 出現順序を崩さず重複を取り除く(_区切られた要素ならび,[],_重複を取り除いた区切られた要素ならび), concat_atom(_重複を取り除いた区切られた要素ならび,_区切り文字,_重複する文字列と区切り文字を削除した文字列). 出現順序を崩さず重複を取り除く([],L,L) :- !. 出現順序を崩さず重複を取り除く([A|R1],L1,L) :- append(_,[A|_],L1), 出現順序を崩さず重複を取り除く(R1,L1,L),!. 出現順序を崩さず重複を取り除く([A|R1],L1,L) :- append(L1,[A],L2), 出現順序を崩さず重複を取り除く(R1,L2,L),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/968 # ●正規表現の使用環境 # Perl # # ●検索か置換か? # 置換 # # ●説明 # 重複する文字列と区切り文字を削除したい # # ●対象データ # aaa;bbb;ccc;bbb;あああ;aaa;あああ;いいい # # ●希望する結果 # aaabbbcccあああいいい # # よろしくお願いします # # 重複する文字列と区切り文字を削除したい(_文字列,_重複する文字列と区切り文字を削除した文字列) :- split(_文字列,[' ',',','/',':',';'],_区切られた要素ならび), 出現順序を崩さず重複を取り除く(_区切られた要素ならび,[],_重複を取り除いた区切られた要素ならび), concat_atom(_重複を取り除いた区切られた要素ならび,_重複する文字列と区切り文字を削除した文字列). 出現順序を崩さず重複を取り除く([],L,L) :- !. 出現順序を崩さず重複を取り除く([A|R1],L1,L) :- append(_,[A|_],L1), 出現順序を崩さず重複を取り除く(R1,L1,L),!. 出現順序を崩さず重複を取り除く([A|R1],L1,L) :- append(L1,[A],L2), 出現順序を崩さず重複を取り除く(R1,L2,L),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1268979408/974 # ●正規表現の使用環境 # linux コマンドラインの grep # # ●検索か置換か? # 検索 # # ●説明 # 末尾が一致していて途中が違う文字列のうち、特定のパターンを除去した集合を取得したい # # ●対象データ # aaabbbcccあああいいい # aaabbbcccううういいい # aaabbbcccえええいいい # # ●希望する結果 # aaabbbcccううういいい # aaabbbcccえええいいい # # 「説明」がうまく書けないのですが。 # よろしくお願いします # # 末尾が一致していて途中が違う文字列のうち、特定のパターンを除去した集合を取得したい(_文字列ならび,_対象文字列,_特定のパターン,_末尾部分,_特定パターンを除去した文字列ならび) :- findall(_文字列,( sub_atom(_文字列,S,_,0,_末尾部分), sub_atom(_文字列,0,S,_,_対象文字列), \+(call(_特定パターン))), _特定パターンを除去した文字列ならび). % % _特定パターン述語の引数に必ず_対象文字列を持つこと % 例えば、 削除パターン(_対象文字列) :- sub_atom(_対象文字列,_,_,_,あああ). ?- _対象データ = [aaabbbcccあああいいい,aaabbbcccううういいい,aaabbbcccえええいいい], 末尾が一致していて途中が違う文字列のうち、特定のパターンを除去した集合を取得したい(_対象データ,_対象文字列,削除パターン(_対象文字列),いいい,_特定パターンを除去した文字列ならび). _特定パターンを除去した文字列ならび = [aaabbbcccううういいい,aaabbbcccえええいいい]. % 以下のサイトは 'N1からN2までの数字に一致させる'(_N1,_N2,_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,Len,_,S1,S2,S3,L1,L2,L3), Len =< 3, \+((last(L1,A),数字(A)), \+((L3=[B|_],数字(B)), atom_to_term(S2,N,_), integer(N), N >= _N1, N =< _N2. % 以下のサイトは '-N1からN2までの数字に一致させる'(_N1,_N2,_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,Len,_,S1,S2,S3,L1,L2,L3), \+((last(L1,A),数字または符号(A)), Len =< 4, \+((L3=[B|_],数字(B)), atom_to_term(S2,N,_), integer(N), N >= _N1, N =< _N2. 数字または符号(A) :- append(_,[A|_],['0','1','2','3','4','5','6','7','8','9','+','-']). % 以下のサイトは 英数文字を含まない日本語の文を抽出する(_文字列,_前文字列,_抽出文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_抽出文字列,_後文字列,L1,L2,L3), \+((last(L1,A),多バイト文字(A))), \+((L3=[B|_],他バイト文字(B))), すべて多バイト文字(L2). すべて多バイト文字([]) :- !. すべて多バイト文字([A|R]) :- char_code(A,Code), Code >= 256, すべて多バイト文字(R). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/9 # どなたかご教授ください・・・ # ●正規表現の使用環境 # EmEditor # # ●検索か置換か? # 置換 # # ●説明 # 鍵カッコ内の文字列と前方の文字列を入れ替えたい。 # # ●対象データ # AAA「BBB」/CCC「DDD」/EEE「FFF」…YYY「ZZZ」 # # ●希望する結果 # BBB「AAA」/DDD「CCC」/FFF「EEE」…ZZZ「YYY」 # # 鍵カッコ内の文字列と前方の文字列を入れ替えたい。(_文字列,_置換された文字列) :- 置換部分の確定(_文字列,S1,S2,S3,R1,R2,R3,_前文字列,_後文字列), 鍵カッコ内の文字列と前方の文字列を入れ替えたい。(_後文字列,_置換された文字列の二), concat_atom([_前文字列,_置換された文字列の二],_置換された文字列),!. 鍵カッコ内の文字列と前方の文字列を入れ替えたい。(_文字列,_文字列) :- !. 置換部分の確定(_文字列,S1,S2,S3,R1,R2,R3,_前文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,[/|R1],[「|R2],[」|R3]), \+(append(_,[」|_],R1), append([/|R2],[「|R1],[」],L0), atom_chars(_前文字列,L0), atom_chars(_後文字列,R3),!. 置換部分の確定(_文字列,S1,S2,S3,R1,R2,R3,_前文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[「|R2],[」|R3]), \+(append(_,[」|_],R1), append(R2,[「|L1],[」],L0), atom_chars(_前文字列,L0), atom_chars(_後文字列,R3),!. % 以下のサイトは # http://hibari.2ch.net/test/read.cgi/tech/1301067486/12 # ●正規表現の使用環境 # 秀丸(複数行置換) # ●検索か置換か? # 置換 # ●説明 # 上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ # 変更したいです。 # # ●対象データ # name=Relative # color=#000000 # style=0 # # ●希望する結果 # name=Relative # color=#000000 # style=2 # # ******************************************** # 下のようにnameとcolorは値が変わるので.*としているのですが、 # 置換文の置換時に変更しないという書き方が分かりません。 # 分かる方おりましたら教えて下さいませ。 # # [検索条件] # name=.* # color=.* # style=0 # # [置換文] # name= # color= # style=2 # # '上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したい'(_文字列,_変更文字列) :- \+(list(_文字列)), split(_文字列,['\n'],Liens), '上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したい'(Lines1,Lines2), concat_atom(Lines2,'\n',_変更文字列). '上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したい'(Lines1,Lines2) :- list(Lines1), append(L0,[Line1,Line2,'style=0'|R],Lines), sub_atom(Line1,0,5,_,'name='), sub_atom(Line2,0,6,_,'color='), append(L0,[Line1,Line2,'style=2'|R],Lines2), '上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したい'(R,Lines3), append(Lines2,Lines3,Lines),!. '上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したい'(_文字列,_文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/15 # Excelの置換で、 # マッチした文字列を、マッチした文字列の最初の一文字で置換したいです。 # # たとえば、 # # りんご # ごりら # ぼーる # # だと、 # # り # ご # ぼ # # に置換したいです。 # 置換前の正規表現と、置換後の正規表現はどのようにすればよいのでしょうか? # # マッチした文字列を、マッチした文字列の最初の一文字で置換する(_文字列,_マッチした文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,_マッチした文字列_1,S3,L1,L2,L3), 検索条件(_マッチした文字列_1), sub_atom(_マッチした文字列_1,0,1,_,_最初の一文字), concat_atom([S1,_最初の一文字,S3],_置換された文字列_1), マッチした文字列を、マッチした文字列の最初の一文字で置換する(_文字列,S1,_最初の一文字,S3,_マッチした文字列_1,_マッチした文字列,_置換された文字列_1,_置換された文字列). マッチした文字列を、マッチした文字列の最初の一文字で置換する(_文字列,_,_,_,_マッチした文字列,_マッチした文字列,_置換された文字列,_置換された文字列). マッチした文字列を、マッチした文字列の最初の一文字で置換する(_文字列,S1,_最初の一文字,S3,_,_マッチした文字列,_,_置換された文字列) :- マッチした文字列を、マッチした文字列の最初の一文字で置換する(S3,_マッチした文字列,_置換された文字列_2), concat_atom([S1,_最初の一文字,_置換された文字列_2],_置換された文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/19 # 繰り返しの処理は分かるので正規表現の書き方を教えて頂きたいです。 # よろしくお願いします。 # # ●正規表現の使用環境 # VB.NET2003 # # ●検索か置換か? # 検索 # # ●説明 # 果物の名前を検索したい # # ●対象データ # 箱の色・箱A/緑、箱B/橙、箱C/黄、箱D/赤 # 箱の中身・箱A/メロン、箱B/みかん、箱C/バナナ、箱D/りんご # 箱の大きさ・箱A/100cm、箱B/120cm、箱C/140cm、箱D/160cm # # ●希望する結果 # メロン # みかん # バナナ # りんご # 対象データ('箱の色・箱A/緑、箱B/橙、箱C/黄、箱D/赤\n箱の中身・箱A/メロン、箱B/みかん、箱C/バナナ、箱D/りんご\n箱の大きさ・箱A/100cm、箱B/120cm、箱C/140cm、箱D/160cm\n'). 果物の名前を検索したい(_希望する結果) :- 対象データ(_対象データ), split(_対象データ,['\n'],Lines), append(_,[Line|R],Lines), sub_atom(Line,0,4,_,箱の中身), sPLIT(Line,['・','、','/'],L2), append(_,['/',_希望する結果|_],L2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/24 # ●正規表現の使用環境 # C#.Net # # # ●検索か置換か? # 検索 # # # ●対象データ # data # (data # data) # (data) # Xdata # dataY # # ●希望する結果 # data # # # dataが()XY以外と隣接している場合は検索を一致させたくないのですが、 # それが中々できません。 # よろしくお願いします。 # # 'dataが()XY以外と隣接している場合は検索を一致させたくない'(_文字列,_前文字列,data,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,data,_後文字列,L1,L2,[A|R3]), \+(append(_,[A|_],['(',')','X','Y'])), \+((last(L1,B),append(_,[B|_],['(',')','X','Y']))). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/60 # よろしくお願いします。 # # ●正規表現の使用環境 # PHP 5.2.9 (XAMPP 1.7.1) # # ●検索か置換か? # 検索 # # ●説明 # 入力文字が+、-、数字以外ならエラーを返す # # ●コード # preg_match("/^[+|-]*\d+$/g", $string) # (1行ごとに処理するので、/mは不要です) # # ●希望する結果 # +100→○ # -488→○ # 1024→○ # *300→× # /200→× # Aaaa→× # ああ→× # '入力文字が+、-、数字以外ならエラーを返す'(_入力文字列,エラー) :- atom_chars(_入力文字列,Chars), append(_,[_文字|_],Chars), '入力文字が+、-、数字以外'(_文字),!. '入力文字が+、-、数字以外ならエラーを返す'(_入力文字列,正常終了). '+、-、数字以外'('+') :- !,fail. '+、-、数字以外'('-') :- !,fail. '+、-、数字以外'(_入力文字) :- 数字(_入力文字),!,fail. '+、-、数字以外'(_). 数字('0'). 数字('1'). 数字('2'). 数字('3'). 数字('4'). 数字('5'). 数字('6'). 数字('7'). 数字('8'). 数字('9'). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1305867431/124 # [1] 授業単元:プログラミング # [2] 問題文: # ファイルから指定した文字列を検索し、行番号と検索文字列該当部分に***の1行 # 検索文字列を含んだ行すべてを表記した1行を画面に出力する # ただし、ファイルについてはタブを半角スペースに変換させ、エラー文についても適宜出力させる # 表記例(検索文字:aaa) # 行番号 ***     *** #     aaa bbb ccc aaa 111 # 'ファイルから指定した文字列を検索し、行番号と検索文字列該当部分に***の1行検索文字列を含んだ行すべてを表記した1行を画面に出力するただし、ファイルについてはタブを半角スペースに変換させ、エラー文についても適宜出力させる'(_ファイル,_検索文字列) :- 'ファイルから指定した文字列を検索し、行番号と検索文字列該当部分に***の1行検索文字列を含んだ行すべて'(_ファイル,_適合行情報), 表示(_検索文字列,_適合行情報). 'ファイルから指定した文字列を検索し、行番号と検索文字列該当部分に***の1行検索文字列を含んだ行すべて'(_ファイル,L2) :- 'ファイルから'(_ファイル,Lines), findall([_行番号,_変換された行,L],( append(L0,[_行|_],Lines), タブを半角スペースに変換する(_行,_変換された行), _行番号 is L0 + 1, findall(S2,( sub_atom(Line,S,_,_,_検索文字列), S2 is S + 1)), L), \+(L = [])), _適合行情報ならび). ファイルから(_ファイル,Lines) :- get_lines(_ファイル,Lines). タブを半角スペースに変換する(_行,_変換された行) :- findall(_変換された文字,( sub_atom(_行,_,1,_,_文字), タブならば半角スペースに変換する(_文字,_変換された文字)), L), concat_atom(L,_変換された行). タブならば半角スペースに変換する('\t',' '). タブならば半角スペースに変換する(_文字,_文字) :- \+(_文字 = '\t'). 表示(_検索文字列,_行ならび) :- 星文字列(_検索文字列,_星の長さ,_星文字列), append(_,[[_行番号,_行,_位置ならび]|R],_行ならび), 行表示(_行番号,_行,_星の長さ,_星表示,_位置ならび). 星文字列(_検索文字列,_星の長さ,_星文字列) :- sub_atom(_検索文字列,_,_星の長さ,_,_検索文字列), length(_星ならび,_星の長さ), all(_星ならび,'*'), concat_atom(_星ならび,_星表示),!. 行表示(_行番号,_行,_星の長さ,_星表示,_位置ならび) :- write('行番号 '), 星表示(1,_星の長さ,_星表示,_位置ならび), writef(' %t\n',[_行]). 星表示(_,_,_,[]) :- nl,!. 星表示(N,_星の長さ,_星文字列,[N|R]) :- write(_星文字列), N2 is N + _星の長さ, 星表示(N2,_星の長さ,_星文字列,R). 星表示(N,_星の長さ,_星文字列,[M|R]) :- \+(M = N), write(' '), N2 is N + 1, 星表示(N2,_星の長さ,_星文字列,R). % 以下のサイトは # 正規表現だと、「当てはまる一部分を交換」ってのはやれるけど、 # 「当てはまる部分を含む一行を丸ごと交換」だと難しい。\ # っつーか思いつかんかった。やり方を。 当てはまる部分を含む一行を丸ごと交換(_文字列,_検索部分文字列,_置換行,_置換された文字列) :- atom_chars(_文字列,Chars), atom_chars(_検索部分文字列,_検索部分文字ならび), atom_chars(_置換行,_置換文字ならび), 当てはまる行を丸ごと交換(Chars,_検索部分文字ならび,_置換文字ならび,Chars2), concat_atom(Chars2,_置換された文字列),!. 当てはまる行を丸ごと交換([],[],_検索部分文字ならび,_置換文字ならび,[]) :- !. 当てはまる行を丸ごと交換([],L1,_検索部分文字ならび,_置換文字ならび,L1) :- \+(append(_,_検索部分文字ならび,_,L1)),!. 当てはまる行を丸ごと交換([],L1,_検索部分文字ならび,_置換文字ならび,_置換文字ならび) :- append(_,_検索部分文字ならび,_,L1),!. 当てはまる行を丸ごと交換(['\n'|R1],[],_検索部分文字ならび,_置換文字ならび,['\n'|R2]) :- 当てはまる行を丸ごと交換(R1,[],_検索部分文字ならび,_置換文字ならび,R2). 当てはまる行を丸ごと交換(['\n'|R1],L1,_検索部分文字ならび,_置換文字ならび,Chars2) :- append(_,_検索部分文字ならび,_,L1), 当てはまる行を丸ごと交換(R1,[],_検索部分文字ならび,_置換文字ならび,R2), append(_置換文字ならび,['\n'|R2],Chars2),!. 当てはまる行を丸ごと交換(['\n'|R1],L1,_検索部分文字ならび,_置換文字ならび,Chars2) :- \+(append(_,_検索部分文字ならび,_,L1)), 当てはまる行を丸ごと交換(R1,[],_検索部分文字ならび,_置換文字ならび,R2), append(L1,['\n'|R2],Chars2),!. 当てはまる行を丸ごと交換([A|R1],L1,_検索部分文字ならび,_置換文字ならび,Chars2) :- \+(A='\n'), append(L1,[A],L2), 当てはまる行を丸ごと交換(R1,L2,_検索部分文字ならび,_置換文字ならび,Chars2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/121 # ●正規表現の使用環境 # Apache RewriteRule # # ●検索か置換か? # 検索 # # ●説明 # 1〜5つのカンマ区切りの単語を一致させたい # 連結数は不定 # # ●対象データ # apple # apple,orange,pineapple,grape,melon # orange,pineapple,melon # # ●希望する結果 # ○apple # ○orange,pineapple,melon # × ,apple # # 不定数連結されたパターンに悩んでいます # '1〜5つのカンマ区切りの単語を一致させたい'(_文字列,_前文字列,_適合文字列,_後文字列) :- 'カンマを0-4個含むアルファベット文字列'(_文字列,_前文字列,_適合文字列,_後文字列), カンマは独立して4個以内で先頭と末尾はカンマではない(_適合文字列). 'カンマを0-4個含むアルファベット文字列'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), アルファベットならび(L1,L2,L3). アルファベットならび([],L2,[]) :- 全ての要素がアルファベット(L2),!. アルファベットならび([],L2,[A|_]) :- 全ての要素がアルファベット(L2), \+(アルファベット(A)),!. アルファベットならび(L1,L2,L3) :- last(L1,A), L3 = [B|_], \+(アルファベット(A)), \+(アルファベット(B)), 全ての要素がアルファベット(L2),!. 全ての要素がアルファベット(L2) :- \+((append(_,[A|_],L2),アルファベット(A))). アルファベット(A) :- char_code(A,Code), Code > 32. カンマは独立して4個以内で先頭と末尾はカンマではない(_適合文字列) :- sPLIT(_適合文字列,[','],L), count(append(_,[','|_],L),N), N =< 4, カンマは独立して(L), 先頭はカンマでない(L), 末尾はカンマでない(L). カンマは独立して(L) :- \+(append(_,[',',','|_],L)),!. 先頭はカンマでない(L) :- \+([','|_]=L). 末尾はカンマでない(L) :- \+(append(_,[','],L)). % 以下のサイトは # 出題場所 http://hibari.2ch.net/test/read.cgi/tech/1301067486/144 # (本文が長すぎるというメッセージが出るので2つに分けています) # # ●正規表現の使用環境 # ActionScript 3.0 # # ●検索か置換か? # 検索 # # ●説明 # 文字列の先頭が「プラス符号かマイナス符号か数字か」と # 末尾が「数字か」でBoolean判定を行いたい。 # # ●対象データ # 1.2345  +123.45  -3.1245  青3.1245  3.1245赤 # # ●希望する結果 # 1.2345→true  +123.45→true  -3.1245 → true  青3.1245→false  3.1245赤→false # # # 試したコードは下記です。 # var patt0 = new RegExp("^(\d|[-]|[+])");//先頭部分の判定 # var patt1 = new RegExp("\d$");//末尾 # if (patt0.test(str0) == true && patt1.test(str0) == true) { # //trueと出力 # } else { # //falseと出力 # } # # 最初と最後の文字のみに注目しているのでフラグ("g"など)は無しにして # いますが、上の記述だと 1.2345 でもfalseが出力されます。 # # どう変えれば良いでしょうか? # 因みに、ActionScriptはJavaScriptと同じECMAスクリプトを起源にしています。 # (正規表現も共通点が多いようです) # 数値文字(['0','1','2','3','4','5','6','7','8','9']). 文字列の先頭が「プラス符号かマイナス符号か数字か」と末尾が「数字か」でBoolean判定を行う(_文字列) :- 数値文字(L), sub_atom(_文字列,0,1,_,_先頭), sub_atom(_文字列,_,1,0,_末尾), append(_,[_先頭|_],['+','-'|L]), append(_,[_末尾|_],L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 数値文字(['0','1','2','3','4','5','6','7','8','9']). 文字列の先頭が「プラス符号かマイナス符号か数字か」と末尾が「数字か」でBoolean判定を行う(_文字列) :- atom_chars(_文字列,Chars), append([_先頭|_],[_末尾],Chars), 数値文字(L), append(_,[_先頭|_],['+','-'|L]), append(_,[_末尾|_],L). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1307166756/342 # ごめんなさい。よろしくお願いします。 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という # 名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理と、 # 続いてそのファイルを開いてデータを読み込み、指定した番号の人のデータを # 以下のように表示する処理をするプログラムを作りなさい。 # (実行後meibo.txt の中身は # # 1 # 168.000000 # 55.000000 # 2 # 170.000000 # 66.000000 # 3 # 158.000000 # 45.000000 # # と書かれている) # # 実行例です # http://ime.nu/uproda.2ch-library.com/387866eaw/lib387866.jpg # # '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理と、続いてそのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する' :- '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理', 続いて, 'そのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する'. '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理' :- '学籍番号(整数)、身長(実数)、体重(実数)を入力すると'(_学籍番号・身長・体重ならび), 'meibo.txt という名前のファイルを作り'(Outstream), 'その中に学籍番号、身長、体重を記録する'(Outstream,_学籍番号・身長・体重ならび),!. そのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する :- そのファイルを開いてデータを読み込み(_データ), 指定した番号の人のデータを以下のように表示する(_データ). '学籍番号(整数)、身長(実数)、体重(実数)を入力すると'(_学籍番号・身長・体重ならび) :- 登録人数を得る(_登録人数), 学籍番号・身長・体重ならびを形作る(_学籍番号・身長・体重ならび,_登録人数), 学籍番号・身長・体重ならびを得る(_学籍番号・身長・体重ならび). 学籍番号・身長・体重ならびを形作る(_学籍番号・身長・体重ならび,_登録人数) :- length(_学籍番号・身長・体重ならび,_登録人数). 学籍番号・身長・体重ならびを得る([]). 学籍番号・身長・体重ならびを得る([[_学籍番号・身長・体重ならび]|R]) :- 学籍番号を得る(_学籍番号), 身長を得る(_身長), 体重を得る(_体重), 学籍番号・身長・体重ならびを得る(R). 'meibo.txt という名前のファイルを作り'(Outstream) :- open('meibo.txt',write,Outstream),!. 'その中に学籍番号、身長、体重を記録する'(Outstream,_学籍番号・身長・体重ならび) :- append(_,[[_学籍番号,_身長,_体重]|R],_学籍番号・身長・体重ならび), writef(Outstream,'%t\n%t\n%t\n',[_学籍番号,_身長,_体重]), R = [], close(Outstream),!. そのファイルを開いてデータを読み込み(_データ) :- get_lines('meibo.txt',_データ). 指定した番号の人のデータを以下のように表示する(_データ) :- 指定した番号の人(_学籍番号), 指定した番号の人のデータを以下のように表示する(_学籍番号,_データ),!. 指定した番号の人のデータを以下のように表示する('',_) :- !. 指定した番号の人のデータを以下のように表示する(end_of_file,_) :- !. 指定した番号の人のデータを以下のように表示する(_学籍番号,_データ) :- append(_,[[_学籍番号,_身長,_体重]|_],_データ), writef('%t %t %t\n',[_学籍番号,_身長,_体重]), 指定した番号の人(_学籍番号2), 指定した番号の人のデータを以下のように表示する(_学籍番号2,_データ),!. 指定した番号の人(_学籍番号) :- write('検索する学籍番号を入れてください : '), get_integer(_学籍番号),!. 登録人数を得る(_登録人数) :- write('最初に登録人数を決めてください : '), get_line(Line), 登録人数入力診断(Line,_登録人数),!. 登録人数入力診断(Line,_登録人数) :- atom_to_term(Line,_登録人数,_), integer(_登録人数), _登録人数 >= 1, _登録人数 =< 10,!. 登録人数入力診断(Line,_登録人数) :- 再入力指示(Line,[登録人数]). 学籍番号を得る(_学籍番号) :- repeat, write('学籍番号(整数) : '), get_line(Line), 学籍番号入力検査(Line,_学籍番号),!. 学籍番号入力検査(Line,_学籍番号) :- 再入力指示(Line,学籍番号), fail. 身長を得る(_身長) :- repeat, write('身長(実数) : '), get_line(Line), 学籍番号入力検査(Line,_身長),!. 体重を得る(_体重) :- repeat, write('体重(実数) : '), get_line(Line), 学籍番号入力検査(Line,_体重),!. 学籍番号入力検査(Line,_学籍番号) :- atom_to_term(Line,_学籍番号,_), integer(_学籍番号),!. 学籍番号入力検査(Line,_学籍番号) :- 再入力指示(Line,学籍番号), fail. 身長入力検査(Line,_身長) :- atom_to_term(Line,_身長,_), float(_身長),!. 身長入力検査(Line,_身長) :- 再入力指示(Line,身長), fail. 体重入力検査(Line,_体重) :- atom_to_term(Line,_体重,_), float(_体重),!. 体重入力検査(Line,_体重) :- 再入力指示(Line,体重), fail. 再入力指示(Line,_項目名) :- writef('入力された %t からは%tが得られません。再入力をお願いします。\n',[Line,_項目名]). 続いて :- true. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/156 # ●正規表現の使用環境 # PHP 5.1 # # ●検索か置換か? # 検索 # # ●説明 # 角括弧が対応する始点から終点までをすべて抽出したいです。 # # ●対象データ # ほげ[[hoge:f1=piyo,f2=fuga]ふが[[hogera:]]ぴよ]ほげら[[foo:]ぴよぴよ][[qux:a=xyzzy]] # # ●希望する結果 # ほげ[[hoge:f1=piyo,f2=fuga]ふが[[hogera:]]ぴよ]ほげら[[foo:]ぴよぴよ][[qux:a=xyzzy]] #   1^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   2^^^^^^^^^^^^^^^3^^^^^^^^^^^^^^ # # ご教授よろしくお願いします。 # 角括弧が対応する始点から終点までをすべて抽出したい(_文字列,_抽出文字列ならび) :- atom_chars(_文字列,Chars), 文字ならびから角括弧抽出(Chars,_抽出文字列ならび). 文字ならびから角括弧抽出([],[]) :- !. 文字ならびから角括弧抽出(['['|R1],[_副文字列|R2]) :- 対応する閉じ括弧まで抽出(R1,L1,R), atom_chars(_副文字列,['['|L1]), 文字ならびから角括弧抽出(R,R2). 文字ならびから角括弧抽出([_|R1],L) :- 文字ならびから角括弧抽出(R1,L). 対応する閉じ括弧まで抽出([],[],[]) :- !. 対応する閉じ括弧まで抽出([']'|R1],[']'],R1) :- !. 対応する閉じ括弧まで抽出(['['|R1],L,R) :- 対応する閉じ括弧まで抽出(R1,L2,R2), 対応する閉じ括弧まで抽出(R2,L3,R), append(['['|L2],L3,L),!. 対応する閉じ括弧まで抽出([A|R1],[A|R2],R) :- 対応する閉じ括弧まで抽出(R1,R2,R). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1307166756/384 # # [1] 授業単元:2次元配列の利用 # [2] 問題文(含コード&リンク): # 新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示するプログラムを作成しなさい。 # なお、駅番号は、東京が1、新横浜が2、名古屋が3、京都が4、新大阪が5とする。 # 但し、料金を表示してから後で、1を入力すると上記の処理を繰り返し、0を入力するとプログラムを終了するものとする。 #     新大阪 京都  名古屋 新横浜 # 東京  14920 14390 11540  3180 # 新横浜 14600 13660 10910 # 名古屋 6840 6100 # 京都  3240 # :- のぞみ料金表の生成('のぞみ料金表.txt'). 出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する :- 出発駅を得る(_出発駅), 到着駅を得る(_到着駅), のぞみ料金(_出発駅,_到着駅,_料金), 料金を表示する(_出発駅,_到着駅,_料金), write('0..終了 1..別の料金を検索する : '), get_line('0'),!. 出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する :- 出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する. 出発駅を得る(_出発駅) :- 駅番号駅名表示(_駅番号駅名表示), writef('出発駅を番号で選択してください。%t : ',[_駅番号駅名表示]), 駅番号で入力する(_駅番号), 駅番号(_駅番号,_出発駅),!. 出発駅を得る(_出発駅) :- 出発駅を得る(_出発駅). 到着駅を得る(_到着駅) :- 駅番号駅名表示(_駅番号駅名表示), writef('到着駅を番号で選択してください。%t : ',[_駅番号駅名表示]), 駅番号で入力する(_駅番号), 駅番号(_駅番号,_到着駅),!. 到着駅を得る(_到着駅) :- 到着駅を得る(_到着駅). 駅番号駅名表示(_駅番号駅名表示) :- findall(S,( 駅番号(_駅番号,_駅名), concat_atom([_駅番号,'..',_駅名],S)), L), concat_atom(L,' ',_駅番号駅名表示),!. 駅番号で入力する(_駅番号) :- get_line(Line), 駅番号入力診断(Line,_駅番号),!. 駅番号入力診断(Line,_駅番号) :- atom_to_term(Line,_駅番号,_), integer(_駅番号), _駅番号 >= 1, _駅番号 =< 5,!. 駅番号入力診断(Line,_駅番号) :- writef('入力された %t から適切な駅番号が得られません。再入力をお願いします\n',[Line]), fail. 料金を表示する(_出発駅,_到着駅,_料金) :- writef('%t から %t までの料金は %t 円です。\n',[_出発駅,_到着駅,_料金]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% のぞみ料金表の作成(File) :- get_split_lines(File,[' '],Lines), Lines = [_駅名横ならび|R1], findall(_駅名,( append(LL0,[[_駅名|_]|R],R1)), _駅名縦ならび), 駅番号の登録(_駅名縦ならび), findall(_料金ならび,( append(LL0,[[_|_料金ならび]|_],R1)), _料金表), のぞみ料金表の作成(_駅名縦ならび,_駅名横ならび,_料金表). 駅番号の登録(_駅名縦ならび) :- append(_駅名縦ならび,[新大阪],_駅名縦ならびのニ), append(L0,[_駅名|R],_駅名縦ならびのニ), length([_|L0],Len), assertz((駅番号(Len,_駅名) :- !)), R = []. のぞみ料金表の作成([],_,_) :- !. のぞみ料金表の作成([_駅名|R1],_駅名横ならび,[L3|R3]) :- 駅単位料金表(_駅名,_駅名横ならび,L3), のぞみ料金表の作成(R1,_駅名横ならび,R3). 起点駅単位料金登録(_,_,[]) :- !. 起点駅単位料金登録(_駅名,[_駅名2|R2],[_料金|R3]) :- assertz(のぞみ料金(_駅名,_駅名2,_料金)), assertz(のぞみ料金(_駅名2,_駅名,_料金)), 起点駅単位料金表(_駅名,R2,R3). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/db/1299305530/390 # Mysql 5.1.49です。 # Datatank.Datas # Id,Owner,Data,Flag # ------------------ # 1,3,'foobar',TRUE # 2,3,'hoge',FALSE # 3,2,'moko',TRUE # # Datatank.Owners # Id,Name,Mail # -------------------- # 1,'Negi','negi@negi.com' # 2,'Yod','gimel@example.com' # 3,'vav','vvvv@mokkosu.jp' # # のようなテーブル二種を想定します。 # DatasテーブルのFlagが真の場合(ex.Id=1)、 # そのレコードのOwner(3)をOwnerテーブルから検索してMail(vvvv@...)をリストするにはどうしたら良いでしょうか。 # 'Datatank.Datas'(1,3,'foobar','TRUE'). 'Datatank.Datas'(2,3,'hoge','FALSE'). 'Datatank.Datas'(3,2,'moko','TRUE'). 'Datatank.Owners'(1,'Negi','negi@negi.com'). 'Datatank.Owners'(2,'Yod','gimel@example.com'). 'Datatank.Owners'(3,'vav','vvvv@mokkosu.jp'). 'DatasテーブルのFlagが真の場合(ex.Id=1)、そのレコードのOwner(3)をOwnerテーブルから検索してMail(vvvv@...)をリストするにはどうしたら良いでしょうか'(_メール付きならび) :- findall([_ID,_owner,_Name,_Data,_Mail],( 'Datatank.Datas'(_Id,_Owner,_Data,'TRUE'), 'Datatank.Owners'(_Id,_Name,_Mail)), _メール付きならび). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/168 # よろしくお願いします # # ●正規表現の使用環境 # PHP # # ●検索か置換か? # 置換 # # ●説明 # いくつか連続した\nを、すべて<br />に置換 # # ●対象データ # \n # \n\n\n # (連続数は1〜n) # # ●希望する結果 # <br /> # <br /><br /><br /> # # # 'いくつか連続した改行を、すべてhtmlの改行指定に変換'(_文字列,_変換された文字列) :- atom_codes(_文字列,Code1), コードならびの改行をすべてhtmlの改行指定に変換(Code1,Code2), atom_codes(_変換された文字列,Code2). コードならびの改行をすべてhtmlの改行指定に変換([],[]). コードならびの改行をすべてhtmlの改行指定に変換([10|R1],[60,47,98,114,62|R2]) :- コードならびの改行をすべてhtmlの改行指定に変換(R1,R2),!. コードならびの改行をすべてhtmlの改行指定に変換([Code|R1],[Code|R2]) :- コードならびの改行をすべてhtmlの改行指定に変換(R1,R2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/200 # ●正規表現の使用環境 # VBScript # # ●検索か置換か? # 検索 # # ●説明 # http://ime.nu/upload.jpn.ph/500/bin/とんこつ.zip # だけを変数に入れて、後で変数を利用したい # # ●対象データ # </style> # # <META HTTP-EQUIV="Refresh" CONTENT="1;URL=http://ime.nu/upload.jpn.ph/500/bin/とんこつ.zip"> # </HEAD> # # ●希望する結果 # 適当な変数=http://ime.nu/upload.jpn.ph/500/bin/とんこつ.zip # 例:もし変数 var5 とかにとんこつ.zipを代入できるなら # WScript.Echo var5 # としたときにhttp://ime.nu/upload.jpn.ph/500/bin/とんこつ.zip # と出力できるようにしたいです。 # # もし上手く説明できてなかったらごめんなさい。 # よろしくお願いします。 # # 'URLを検索する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[h,t,t,p,:,/,/|R2],[' '|R3]), \+(sub_atom(S2,_,1,_,' ')), \+(append(_,[h,t,t,p,:,/,/|_],R2)). % 以下のサイトは # ・以下の実行結果になるようプログラムを作成せよ。 # # 実行結果 # 人数 > 5 # 0人目: # 名前 > Taro # 電話番号 > 090-111-1111 # 1人目: # 名前 > Hanako # 電話番号 > 090-222-2222 # 2人目: # 名前 > Ichiro # 電話番号 > 090-333-3333 # 3人目: # 名前 > Jiro # 電話番号 > 090-444-4444 # 4人目: # 名前 > Hanayo # 電話番号 > 090-555-5555 # # 電話帳: # Taro, 090-111-1111 # Hanako, 090-222-2222 # Ichiro, 090-333-3333 # Jiro, 090-444-4444 # Hanayo, 090-555-5555 # # 名前 > Hanayo # Hanayo, 090-555-5555 # # 実行結果 # 人数 > 2 # 0人目: # 名前 > Taro # 電話番号 > 090-111-1111 # 1人目: # 名前 > Taro # 電話番号 > 090-222-2222 # # 電話帳: # Taro, 090-111-1111 # Taro, 090-222-2222 # # 名前 > Taro # Taro, 090-111-1111 # Taro, 090-222-2222 # # 実行結果 # 人数 > 0 # # 電話帳: # # 名前 > Taro # 該当者なし '電話番号を登録し、それを表示し、さらに検索する' :- 電話番号登録, 電話番号表示, 電話番号検索. 電話番号登録 :- abolish(電話帳/2), 処理人数を入力する(_人数), length(Ln,_人数), append(L0,[_|R],Ln), length(L0,_人目), writef('%t人目:\n',[_人目]), 名前を入力する(_名前), 電話番号を入力する(_電話番号), assertz(電話帳(_名前,_電話番号)), R = [],!. 電話番号登録. 処理人数を入力する(_人数) :- write('\n人数 > '), get_line(Line), 処理人数入力診断(Line,_人数),!. 処理人数を入力する(_人数) :- 処理人数を入力する(_人数). 処理人数入力診断(Line,_人数) :- atom_to_term(line,_人数,_), integer(_人数), _人数 > 0,!. 処理人数入力診断(Line,_人数) :- writef('入力された %t から適切な人数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 名前を入力する(_名前) :- write('名前 > '), get_line(_名前). 電話番号を入力する(_電話番号) :- write('電話番号 > '), get_line(Line), 電話番号入力診断(Line,_電話番号),!. 電話番号を入力(_電話番号) :- 電話番号を入力する(_電話番号). 電話番号入力診断(Line,Line) :- split(Line,['(',')','-',' '],L), concat_atom(L,S), atom_chars(S,Chars), 全てが数字(Chars),!. 電話番号入力診断(Line,_電話番号) :- writef('入力された%tは電話番号として不適切です。再入力をお願いします。\n',[Line]), fail. 電話番号表示 :- writef('\n電話帳 >\n'), 電話帳(_名前,_電話番号), writef('%t, %t\n',[_名前,_電話番号]), fail. 電話番号表示. 電話番号検索 :- 名前を鍵に電話番号を得る. 名前を鍵に電話番号を得る :- 名前を入力(_名前), 電話番号の検索と出力(_名前),!. 電話番号の検索と出力(_名前,_電話番号) :- 電話帳(_名前,_電話番号), 名前と電話番号を出力する(_名前,_電話番号), fail. 電話番号の検索と出力(_名前,_電話番号) :- \+(電話帳(_名前,_電話番号)), write('該当者なし\n'),!. 電話番号の検索と出力(_,_). 名前と電話番号を出力する(_名前,_電話番号) :- writef('%t, %t\n',[_名前,_電話番号]). 全てが数字([]) :- !. 全てが数字([A|R]) :- member(A,['0','1','2','3','5','5','6','7','8','9']), 全てが数字(R). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/220 # ●正規表現の使用環境 # grepとかegrepとか # # ●検索か置換か? # 検索 # # ●説明 # a,nの2文字のみが含まれる行を検索したい # # ●対象データ # aaa # ann # nana # anana # sin # anans # # ●希望する結果 # 上4つのみ出力 # 下二つは引っかからない # # 'a,nの2文字のみが含まれる行を検索したい'(_行ならび,_行) :- append(_,[_行|_],_行ならび), findsetof(_文字,sub_atom(_行,_,1,_,_文字),[a,n]). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1308749241/107 # [1] 授業単元: 課題 # [2] 問題文(含コード&リンク):名前を読み込み,telbook を検索して, # その名前に該当する人の電話番号を出力するプログラムを以下に示す # C言語のプログラムを仕様の一部と考えて作成せよ. # # #include # #include # #define MAX 100 # struct person { # char name[MAX]; # char telno[MAX]; # }; # int search(struct person telbook[], int n, char *name) # { # /* ... */ # } # int main(void) # { # char name[MAX]; # struct person telbook[] = # { {"Taro", "090-111-1111"}, # {"Hanako", "090-222-2222"}, # {"Ichiro", "090-333-3333"}, # {"Jiro", "090-444-4444"}, # {"Hanayo", "090-555-5555"} }; # int n = 5; /* 電話帳に登録された人数 */ # int idx; # # printf("名前 > "); scanf("%s", name); # idx = search(telbook, n, name); # if (idx < 0) { # printf("該当者なし\n"); # } else { # printf("%s\n", telbook[idx].telno); # } # return 0; # } % 実際にはこの問題はテキストから述語telbook/2をどうやって自動定義するかが % 問われるのだろう。 telbook('Taro', '090-111-1111'). telbook('Hanako', '090-222-2222'). telbook('Ichiro', '090-333-3333'). telbook('Jiro', '090-444-4444'). telbook('Hanayo', '090-555-5555'). '名前を読み込み,telbook を検索して,その名前に該当する人の電話番号を出力する' :- 名前を読み込み(_名前), その名前に該当する人の電話番号を出力する(_名前). 名前を読み込み(_名前) :- write('名前を入力してください : '), get_line(_名前). その名前に該当する人の電話番号を出力する(_名前) :- telbook(_名前,_電話番号), writef('%tの電話番号は %t です。\n',[_名前,_電話番号]),!. その名前に該当する人の電話番号を出力する(_名前) :- \+(telbook(_名前,_電話番号)), writef('入力された名前 %t はtelbookに登録がありません。\n',[_名前]). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/db/1269585561/919 # ../test/read.cgi/db/1269585561/915-916、918 # 私はMySQLを想定しているので、MySQLを使用したOSSを参考にしています。 # (例えば、EC CUBEとかOpenPNE) # # それで、現状は以下のようなテーブル構成です。 # (主な部分のみ記載します) # # ■管理者用 # ID、アカウント名、パスワード、メールアドレス、権限 # ■一般会員用 # ID、メールアドレス、パスワード、ニックネーム、年齢、性別...etc # ■ビジネス会員用 # ID、メールアドレス、パスワード、会社名・担当者名...etc # # 管理IDはアカウント名+パスワードでログインさせ、 # 一般・ビジネスはメールアドレス+パスワードでログインさせるパターンです。 # # 共通項を考えるなら # # ■ユーザ # ID、アカウント名、パスワード、権限 # ■一般会員 # ユーザID、ニックネーム、年齢、性別...etc # # みたいな形になるかと思いますが、上記の通り、 # 会員によってログイン方法を変えたいので、 # 共通部分もダブって1テーブルに記載しています。 # 管理者用の検索(_ID,_アカウント名,_パスワード,_アドレス,_権限) :- 'ID'(_ID,管理者用) アカウント名(_ID,_アカウント名), パスワード(_ID,_パスワード), メール(_ID,_アドレス), 権限(_ID,_権限). 一般会員用の検索(_ID,_メールアドレス,_パスワード,_ニックネーム,_年齢,_性別) :- 'ID'(_ID,一般会員用), メールアドレス(_ID,_メールアドレス), パスワード(_ID,_パスワード), ニックネーム(_ID,_ニックネーム), 年齢(_ID,_年齢), 性別(_ID,_性別). ビジネス会員用の検索(_ID,_メールアドレス,_パスワード,_会社名_担当者名) :- 'ID'(_ID,ビジネス会員用), メールアドレス(_ID,_メールアドレス), パスワード(_ID,_パスワード), '会社名・担当者名'(_ID,_会社名_担当者名). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/236 # 英数字プラスセミコロンはとれるのですが英数字の桁数が{3}をつけてもうまくいかず悩んでいます。 # # # ●正規表現の使用環境 # VBA # # ●検索か置換か? # 検索 # # ●説明 # 対象データのフォーマットチェックをしたいです # # A01;B02;C03;… # 英数字3桁がセミコロンで区切られたデータに対して様式通りならtrueを返します # 一番最後にはセミコロンはつきません # # ●対象データと希望する結果 # A01;B02;C03 →true # A01;B02;C03; →false # A01;B092;C03 →false # '英数字3桁がセミコロンで区切られたデータに対して様式通りならtrueを返します。一番最後にはセミコロンはつきません'(_文字列,true) :- R2 = [A,B,C,';'], \+(member(';',L1)), \+(member(';',L3)), すべてが英数字([A,B,C]),!. '英数字3桁がセミコロンで区切られたデータに対して様式通りならtrueを返します。一番最後にはセミコロンはつきません'(_文字列,false). すべてが英数字([]) :- !. すべてが英数字([A|R]) :- A @>= 0, A @=< 9, すべてが英数字(R). すべてが英数字([A|R]) :- A @>= 'A', A @=< 'Z', すべてが英数字(R). すべてが英数字([A|R]) :- A @>= 'a', A @=< 'z', すべてが英数字(R). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/244 # よろしくお願いします。 # # ●正規表現の使用環境 # JavaScript # # ●検索か置換か? # 検索 # # ●説明 # xという文字から、xという文字までの取得 # ただしyxというパターンが含まれている場合は飛ばして、次のxを探す # x((?!yx).)*xを試しましたが、途中で検索が打ち切られて思うようになりません # # ●対象データ # "ab\"c",'def' # # ●希望する結果 # "ab\"c" # # 'xという文字から、xという文字までの取得。ただしyxというパターンが含まれている場合は飛ばして、次のxを探す'(_x,_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[_x|R1],L3), append(L0,[_x],R1), 許容(_x,L0). 'xという文字から、xという文字までの取得。ただしyxというパターンが含まれている場合は飛ばして、次のxを探す'(_x,_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_,_,_後文字列_2,L1,[_x|R1],L3), append(L0,[_x],R1), 許容(_x,L0), 'xという文字から、xという文字までの取得。ただしyxというパターンが含まれている場合は飛ばして、次のxを探す'(_x,_後文字列_2,_前文字列,_適合文字列,_後文字列). 許容(_,[]) :- !. 許容(A,[A|_]) :- !,fail. 許容(A,['\\',A|R]) :- 許容(R). 許容(A,[_|R]) :- 許容(A,R). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/256 # よろしくお願いします。 # ●正規表現の使用環境 # Ruby # ●検索か置換か? # 検索 # ●説明 # 株価のみを抜出し、DBに入れていく予定でいます。 # ●対象データ # http://ime.nu/stocks.finance.yahoo.co.jp/stocks/history/?code=9984.T # のソースから # # ●希望する結果 # 2011年6月30日 # 3,010 # 3,050 # 2,986 # 3,030 # 8,376,600 # 3,030 # . # . # . # 日付、始値、高値、安値、終値、出来高、調整後終値 # です。 # http://ime.nu/stocks.finance.yahoo.co.jp/stocks/history/?code=9984.T # . # . # . # <td>2011年6月30日</td> # <td>3,010</td> # <td>3,050</td> # <td>2,986</td> # <td>3,030</td> # <td>8,376,600</td> # <td>3,030</td> # . # . # このページのソースから正規表現で、下記のように日付と株価の部分だけ抜き出すにはどうしたらよいでしょうか? # 2011年6月30日 # 3,010 # 3,050 # 2,986 # 3,030 # 8,376,600 # 3,030 # . # . # . # . # # 言語はRubyで、([^<>]+)などで色々やってみましたが、どうにもうまく抜き出せません。 # また、webのHTMLから、正規表現である程度特定して文字列を抜き出し、 # その特定して抜き出した文字列に再度正規表現で、文字列を特定していくという # 方法は可能でしょうか? # よろしくお願いします。 # 'ページのソースから正規表現で、下記のように日付と株価の部分だけ抜き出す'(WebURL,_日付か株価) :- get_lines(WebURL,Lines), 日付と株価行を絞り込む(Lines,Lines2), 絞り込んだ日付と株価行からデータ部分を切り取る(Lines2,_日付か株価). 日付と株価行を絞り込む(Lines,Lines2) :- 日付と株価tableタグを捜す(Lines,R1), 日付と株価行のみ選別(R1,Lines2). 日付と株価tableタグを捜す(Lines,R1) :- append(_,[Line1|R1],Lines), sub_atom(Lines,0,7,_,'

'),!,fail;true)), Lines2),!. 絞り込んだ日付と株価行からデータ部分を切り取る(Lines2,_日付か株価) :- append(_,[Line2|_],Lines2), sub_atom(Line2,0,4,_,'
'), sub_atom(Line2,4,_,5,_日付か株価). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1308749241/586 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/3dkRTmjJ # # 生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。 # このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人の # BMI値および肥満か否かを列挙するプログラムkadai13-1.cを書きなさい。 # ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分から # ないものとする。 # # ヒント: # ○何をしなければならないかを大まかに書き下してみよう。 #  1. ファイルのオープン(これに先立ってファイル名を取得する必要がある) #  2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう) #  3.データの読み込み #  4.BMIの算出 #  5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい) #  6. 画面表示 # # ○BMIとは? # BMIは次のようにして計算されるものとする。 # BMI値=体重(キログラム)÷(身長(メートル))^2 # '^2'は二乗を意味する。 # このBMI値が25を越えると、肥満とみなされる。 # # ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。 # rewind(FILE *stream); # # ○wh-list.dat の中身は以下の通りで、氏名 身長(cm) 体重(kg)が列挙されている。 # yamada 157 62.5 # tanaka 180 45.1 # yoneda 190 50.5 # yamashita 210 80.5 # toyama 140 80 # .... # # ○例えば画面表示は # toyama BMI=40.816326 himan # nagashima BMI=29.551020 himan # yamashita BMI=27.777779 himan # takenaka BMI=27.716263 himan # . # 中略 # . # nakano BMI=23.179012 # yamashita BMI=18.253969 # . # . # # 等と表示されるものとする。 # '生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する' :- user_parameters([_ファイル名]), 'ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_ファイル名,Instream), データの読み込み(Instream,Lines), 'BMIの算出と判定'(Lines,_BMIと判定ならび), 'BMIの大きい者順に並べ替える'(_BMIと判定ならび,_降順に整列したBMIと判定ならび), 画面表示(_降順に整列したBMIならび),!. 'ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_ファイル名,Instream) :- open(_ファイル名,read,Instream),!. データの読み込み(Instream,Lines) :- get_lines(Instream,Lines),!. 'BMIの算出と判定'([],[]) :- !. 'BMIの算出と判定'([Line|R1],[[_BMI,_名前,_判定]|R2]) :- split(Line,[' '],[_名前,_身長単位センチメートル,_体重]), _身長単位メートル is _身長単位センチメートル / 100, 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長単位メートル,_BMI値), 'BMI値が25を越えると、肥満とみなされる'(_BMI値,_判定), 'BMIの算出と判定'(R1,R2). 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長,_BMI値) :- _BMI値 is _体重 * _身長 ^ 2. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,肥満) :- _BMI値 > 25,!. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,''). 'BMIの大きい者順に並べ替える'(_BMIならび,_降順に整列したBMIならび) :- バブルソート(_BMIならび,_昇順に整列したBMIならび), reverse(_昇順に整列したBMIならび,_降順に整列したBMIならび). バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一), !, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). 画面表示(_降順に整列したBMIならび) :- append(_,[[_BMI,_名前,_判定]|R],_降順に整列したBMIならび), writef('%t %t %t\n',[_名前,_BMI,_判定]), R = []. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/266 # ●正規表現の使用環境 # PHP 5.2.5 # # ●検索か置換か? # 置換 # # ●説明 # <a>でリンクされていないURLだけをリンクしたい # # ●対象データ # <a href='http://ime.nu/aaaaaa/aaa'>http://aaaaaa/aaa</a> # <a href='http://ime.nu/aaaaaa/aaa'>bbb</a> # http://ime.nu/aaaaaa/aaa # http://ime.nu/aaaaaa/aaa # # (httpの前に改行は無いです) # # ●希望する結果 # # <a href="http://ime.nu/aaaaaa/aaa">http://ime.nu/aaaaaa/aaa</a> # <a href="http://ime.nu/aaaaaa/aaa">bbb</a> # <a href="http://ime.nu/aaaaaa/aaa">http://ime.nu/aaaaaa/aaa</a> # <a href="http://ime.nu/aaaaaa/aaa">http://ime.nu/aaaaaa/aaa</a> # # # ↓これではダメでした。。 # /((?![\"\'>])(https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)(?![\"\'<]))/ # 'AタグでリンクされていないURLだけをリンクしたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L1 = [<,a,>|R1], append(R0,[<,/,a,>],R1), \+(append(_,[<,a,>|_],R0)), \+(append(_,[<,/,a,>|_],R0)), 'AタグでリンクされていないURLだけをリンクしたい'(S3,_置換された文字列のニ), concat_atom([S1,S2,_置換された文字列のニ],_置換された文字列),!. 'AタグでリンクされていないURLだけをリンクしたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L1 = [h,t,t,p,:,/,/|R1], member(C,R1), \+(member(C,[' ',',','\n'])), concat_atom([S1,'',S2,'\n'],S4), concat_atom([S4,_置換された文字列のニ],_置換された文字列),!. 'AタグでリンクされていないURLだけをリンクしたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L1 = [h,t,t,p,:,/,/|R1], last(R1,C), member(C,[' ',',','\n']), concat_atom([S1,'',S2,'\n'],S4), 'AタグでリンクされていないURLだけをリンクしたい'(S3,_置換された文字列のニ), concat_atom([S4,_置換された文字列のニ],_置換された文字列),!. 'AタグでリンクされていないURLだけをリンクしたい'(_文字列,_文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1311089619/470 # [1] 授業単元:C++プログラム # [2] 問題文 # Nr(i)は身長とし、Na(i)氏名のデータとする # どちらも10個の要素を持つ配列であり、それぞれは10人の身長と氏名のデータとして持つ。 #  キーボードから身長Xを入力し、二分検索処理を用いてXの氏名をもとめ、結果をディスプレイへ表示するプログラムを作成せよ。 # よろしくお願いたします # 二分検索がいまいち理解できないので軽く解説も書いていただければ幸いです # 'Nr(i)は身長とし、Na(i)氏名のデータとするどちらも10個の要素を持つ配列であり、それぞれは10人の身長と氏名のデータとして持つ。キーボードから身長Xを入力し、二分検索処理を用いてXの氏名をもとめ、結果をディスプレイへ表示する'(_Nr,_Na) :- 'Nr,Naを身長をキーに整列しておく', 'キーボードから身長Xを入力し'(_身長), 二分検索で身長をキーに氏名を得る(_身長,_氏名ならび), 結果をディスプレイに表示する(_身長,_氏名ならび). 'Nr,Naを身長をキーに整列しておく' :- retract('Nr'(_Nr)), retract('Na'(_Na)), '身長をキーに_Nr,_Naを整列する'(_Nr,_Na,_Nr2,_Na2), assertz('Nr'(_Nr2)), assertz('Na'(_Na2)). '身長をキーに_Nr,_Naを整列する'(_Nr,_Na,_Nr2,_Na2) :- findall([_身長,_氏名],( for(1,N,10), nth1(N,_Nr,_身長), nth1(N,_Na,_氏名)), L1), sort(L1,L2), findall(_身長,( append(_,[[_身長,_]|_],L2)), _Nr2), findall(_氏名,( append(_,[[_,_氏名]|_],L2)), _Nr2),!. 'キーボードから身長Xを入力し'(_身長) :- write('検索する身長を入力してください : '), readln([_身長]), integer(_身長),!. 'キーボードから身長Xを入力し'(_身長) :- 'キーボードから身長Xを入力し'(_身長). 二分検索で身長をキーに氏名を得る(_身長,_氏名ならび) :- 'Nr'(_身長ならび), 'Na'(_氏名ならび), length(_身長ならび,Len), findall(_氏名,( 二分検索で身長をキーに氏名を得る(1,Len,_身長ならび,_氏名ならび,_身長,_氏名),_氏名ならび), \+(_氏名ならび=[]),!. 二分検索で身長をキーに氏名を得る(_身長,'求める氏名は得られませんでした。\n'). 二分検索で身長をキーに氏名を得る(Nth1,Nth2,_身長ならび,_氏名ならび,_身長,_氏名) :- Nth3 is (Nth1 + Nth2) // 1, nth1(Nth3,_身長ならび,_身長1), 二分検索で身長をキーに氏名を得る(_身長,_身長1,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名). 二分検索で身長をキーに氏名を得る(_身長,_身長1,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名) :- _身長 > _身長1, 二分検索で身長をキーに氏名を得る(Nth1,Nth3,_身長ならび,_氏名ならび,_身長,_氏名). 二分検索で身長をキーに氏名を得る(_身長,_身長1,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名) :- _身長 < _身長1, 二分検索で身長をキーに氏名を得る(Nth3,Nth2,_身長ならび,_氏名ならび,_身長,_氏名). 二分検索で身長をキーに氏名を得る(_身長,_身長,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名) :- nth1(Nth3,_氏名ならび,_氏名). 二分検索で身長をキーに氏名を得る(_身長,_身長,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび) :- 要素位置によるならびからの削除(Nth3,_身長ならび,_身長ならび2), 要素位置によるならびからの削除(Nth3,_氏名ならび,_氏名ならび2), Nth2_1 is Nth2 - 1, 二分検索で身長をキーに氏名を得る(Nth1,Nth2_1,_身長ならび2,_氏名ならび2,_身長,_氏名). 結果をディスプレイに表示する(_身長,_氏名ならび) :- list(_氏名ならび), append(_,[_氏名|R],_氏名ならび), writef('身長%tの氏名は%tです\n',[_身長,_氏名]), R = [],!. 結果をディスプレイに表示する(_身長,_診断) :- atom(_診断), write(_診断),!. 要素位置によるならびからの削除(Nth,L1,L2) :- length([_|L0],Nth), append(L0,[_|R],L1), append(L0,R,L2),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1311089619/570 # [2] 問題文(含コード&リンク): 以下の性能を持つ名簿プログラムを作成せよ # 氏名、年齢、住所、電話番号、メールアドレス、郵便番号を持つ構造体を使用する # 一覧を表示可能である # 作成したデータはファイルとして保存、読み込みができる # 構造体の追加、削除が可能である # 任意の項目を修正可能である # 任意の項目をキーとして検索、ソート(昇順・降順)が可能である # # % % 目標として名簿述語を呼び出す場合は、failでバックトラックさせる。この場合、 % 最終的に第一節は偽となるので、真で終了させたい場合は第二節が必要。 '名簿一覧表示' 見出し表示, 名簿(氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)), writef('%t,%t,%t,%t,%t,%t\n',[_氏名,_年齢,_住所,_電話番号,_メールアドレス,_郵便番号]), fail. '名簿一覧表示. 見出し表示 :- write('氏名,年齢,住所,電話番号,メールアドレス,郵便番号\n'). '作成したデータをファイルとして保存する'(_ファイル) :- listing(_ファイル),!. 'データをファイルから読みだして定義する'(_ファイル) :- consult(_ファイル). 構造体の追加(_氏名,_年齢,_住所,_電話番号,_メールアドレス,_郵便番号) :- assertz(名簿(氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)),!. 構造体の削除(_氏名,_年齢,_住所,_電話番号,_メールアドレス,_郵便番号) :- retract(名簿(氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)),!. '任意の項目を修正可能である'(_氏名,_年齢,_住所,_電話番号,_メールアドレス,_郵便番号,_修正項目名_修正値ならび) :- retract(名簿(氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)), 任意の項目の修正([氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)],_修正項目ならび,L), P =.. [名簿|L], asserta(P). 任意の項目の修正([],_,[]) :- !. 任意の項目の修正([_項|R1],_修正項目ならび,[_項2|R2]) :- _項 =.. [_関数名,_値1], member(_項2,_修正項目ならび), _項2 =.. [_関数名,_値2], 任意の項目の修正(R1,_修正項目ならび,R2),!. 任意の項目の修正([_項|R1],_修正項目ならび,[_項|R2]) :- 任意の項目の修正(R1,_修正項目ならび,R2),!. '任意の項目をキーとして検索、昇順ソート'(_項目名) :- 述語定義では整列できないからキーを付加しながらならびに変換(_項目名,L1), 昇順整列(L1,L2), 整列したならびを述語として定義し直す(L2). '任意の項目をキーとして検索、降順ソート'(_項目名) :- 述語定義では整列できないからキーを付加しながらならびに変換(_項目名,L1), 降順整列(L1,L2), 整列したならびを述語として定義し直す(L2). 整列したならびを述語として定義し直す(L2) :- abolish(名簿/6), append(_,[[_,氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)]|R],L2), assertz(名簿(氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)), R = [],!. 述語定義では整列できないからキーを付加しながらならびに変換(_項目名,L1) :- findall([_任意項目|L],( 名簿(氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)), _項 =.. [_項目名,_値], member(_項,[氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)])), L1),!. 昇順整列([],[]) :- !. 昇順整列(L1,L2) :- L1 = [A|R], 昇順整列(A,R,L2). 昇順整列(A,L1,L2) :- 昇順分割(A,L1,_より小さいならび,_より大きいならび), 昇順整列(_より小さいならび,L3), 昇順整列(_より大きいならび,L4), append(L3,[A|L4],L2). 昇順分割(_,[],[],[]) :- !. 昇順分割(A,[B|R1],[B|R2],R3) :- B @=< A, 昇順分割(A,R1,R2,R3). 昇順分割(A,[B|R1],R2,[B|R3]) :- B @> A, 昇順分割(A,R1,R2,R3). 降順整列([],[]) :- !. 降順整列(L1,L2) :- L1 = [A|R], 降順整列(A,R,L2). 降順整列(A,L1,L2) :- 降順分割(A,L1,_より大きいならび,_より小さいならび), 降順整列(_より大きいならび,L3), 降順整列(_より小さいならび,L4), append(L3,[A|L4],L2). 降順分割(_,[],[],[]) :- !. 降順分割(A,[B|R1],[B|R2],R3) :- B @> A, 降順分割(A,R1,R2,R3). 降順分割(A,[B|R1],R2,[B|R3]) :- B @=< A, 降順分割(A,R1,R2,R3). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/279 # ●正規表現の使用環境 # C# 4.0 # # ●検索か置換か? # 置換です # # ●説明 # HTMLファイルのソースコードの # <script type="text/javascript">〜省略〜</script> # scriptタグ開始を含めてscriptタグ終了タグまでを消去したいんです # # ●対象データ # <script type="text/javascript"> # <!-- # // 〜コメント〜 # 内容 # // --> # </script> # # <script type="text/javascript" src="script.js"></script> # # 上記のどちらも以下のものでやったのですが、どうもヒットしません # <script\s[a-zA-Z0-9<>()-\.!_~*,;/:@&=+$,%#'""]+>[a-zA-Z0-9<>()-\.!_~*,;/:@&=+$,%#]+\</script> # # 解答よろしくお願いします # # 'scriptタグ開始を含めてscriptタグ終了タグまでを消去'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [<,s,c,r,i,p,t,' '|R2], append(R20,[/,s,c,r,i,p,t,>],R2), \+(append(_,[<,s,c,r,i,p,t,' '|_],R20)), \+(append(_,[/,s,c,r,i,p,t,>|_],R20)), 'scriptタグ開始を含めてscriptタグ終了タグまでを消去'(S3,_置換された文字列2), concat_atom([S1,_置換された文字列2],_置換された文字列),!. 'scriptタグ開始を含めてscriptタグ終了タグまでを消去'(_文字列,_文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/282 # ○ds # ○nds # ○gameds # ○gamends # ×legends # 検索したときに、○だけヒットさせるにはどうすればいいか教えてください # # dsで終わる文字列でleからはじまらないもの(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), append(L0,[d,s],L2), \+(append(_,[d,s|_],L2)), \+(append([l,e],_,L0)). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/290 # ●正規表現の使用環境 # Emacs Lisp # # ●検索か置換か? # 検索 # # ●説明 # C++などでよく使われる構文にマッチさせたい。 # 具体的にはクラスインスタンスへのアクセスアローやドットにマッチさせたい。 # # ●対象データ # # class A; # A a; # A* a_ref = &a; # # a.m_hoge; # a->m_hoge; # # ●希望する結果 # これにマッチさせる場合 # "\\(?:\\.\\|->\\)\\(\\(?:[a-zA-Z0-9][_a-zA-Z0-9]*\\)?\\)\\=" # が正解らしいですが # なぜ正解かわからない部分があるので教えてください。 # まず"?"演算子の使い方ですが・・・直前の文字列(空文字込み)にマッチさせるために置いてあるとして # 直後の ":"が理解不能です。 # 後半でも、":"が出てきますがこれも不可解。名前空間の"::"などにマッチさせたいのであれば # ::や:?:とかならわかるのですが・・ # 'クラスインスタンスへのアクセスアローやドットにマッチさせる'(_クラス,_文字列,_前文字列,_適合文字列,_後文字列) :- atom_chars(_クラス,CharsL), sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), \+((last(L1,C),アルファベット(C))), last(L2,';'), アローやドットにマッチさせる(ClassL,R2,L2). 'クラスインスタンスへのアクセスアローやドットにマッチさせる'(_クラス,_文字列,_前文字列,_適合文字列,_後文字列) :- atom_chars(_クラス,CharsL), sub_atom(_文字列,_,_,_,_,_,_後文字列2,L1,L2,L3), \+((last(L1,C),アルファベット(C))), last(L2,';'), アローやドットにマッチさせる(ClassL,R2,L2), 'クラスインスタンスへのアクセスアローやドットにマッチさせる'(_クラス,_後文字列2,_前文字列,_適合文字列,_後文字列). アローやドットにマッチさせる(ClassL,R2,L2) :- append(ClassL,[-,>|R2],L2), 全てアルファベット(R2). アローやドットにマッチさせる(ClassL,R2,L2) :- append(ClassL,['.'|R2],L2), 全てアルファベット(R2). アルファベット(C) :- C @>= a, C @=< z,!. アルファベット(C) :- C @>= 'A', C @=< 'Z',!. アルファベット(C) :- C @>= '0', C @=< '9',!. 全てアルファベット([]). 全てアルファベット([C|R]) :- アルファベット(C), 全てアルファベット(R). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/293 # ●正規表現の使用環境 # LINUX grepコマンド # # ●検索か置換か? # 検索 # # ●説明 # ドットで行に一文字追加されたもののみ検索したい # # ●対象データ # ABC # ABCD # ABCDE # # ●希望する結果 # ABCD # # grep ABC. sample.txtとしても # 結果 2文字追加されているABCDEまで出てきてしまいます。。。 # ドットは一文字と習ったのですが、 # なぜなのかわかりません・・。 # # ドットで行に一文字追加されたもののみ検索したい(_検索文字,_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,L2,['\n'|_]), atom_chars(_検索文字,L), append(L,[_],L2), \+(member('\n',L)). ドットで行に一文字追加されたもののみ検索したい(_検索文字,_文字列,_前文字列,_適合文字列,_後文字列). sub_atom(_文字列,_,_,_,_,_,_後文字列のニ,_,L2,['\n'|_]), atom_chars(_検索文字,L), append(L,[_],L2), \+(member('\n',L)), ドットで行に一文字追加されたもののみ検索したい(_検索文字,_後文字列のニ,_前文字列,_適合文字列,_後文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/297 # お願いします # # ●正規表現の使用環境 # Hex Editor Neo # # ●検索か置換か? # 検索 # # ●説明 # 1文字目と3文字目が同じで、2文字と目と4文字目が同じの4文字の文字 # # ●対象データ # ABAB # PAPA # 0101 # # # '1文字目と3文字目が同じで、2文字と目と4文字目が同じの4文字の文字'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,[A,B,A,B],_), \+(A=B). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/db/1294641578/506 # 日本語が下手なので、質問し直し。 # # データベースには、書名、出版社、著者、ISBN番号はいずれもデータが入っている。 # # 検索ページはWEBページ上に作る。TEXT入力欄を4箇所配置する。 # 検索者は、上記4項のうち、書名もしくは出版社等、分かっているものしか入力できないので、どの項目に検索単語が入力されているかは、検索毎に変わる。 # # 入力のある・なしの組み合わせは2の4乗になる。 # # このような場合に、SELECT文は、どう書き下すように作るのでしょうか。 # # 全項目が埋まっていれば、アンドを使って簡単に書けるのですが。。。 # # 'SQLのwhere句の生成'(_入力データならび,_where句) :- findall(_属性名=_値_1,( append(_,[[_属性名,_値]|_],_入力データならび), concat_atom(['\'',_値,'\''],_値_1)), L), concat_atom(L,' and ',_where句). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/381 # ●正規表現の使用環境 # C# 4.0 # # ●検索か置換か? # 置き換え # # ●説明 # html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換えたい # ためしに<dd>とだけやってみましたが、<dd>タグは置き換えされませんでした # # ●対象データ # <dd>文章1</dd> # <dd>文章2</dd> # # ●希望する結果 # 文章1 # 文章2 # 'html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換える'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[<,d,d,>|R1],L3), append(_[/,<,d,d,>|_],L1), append(L11,[/,<,d,d,>],R1), \+(append(L11,[/,<,d,d,>],L11)), atom_chars(_ddタグを削除された文字列,L11), concat_atom([L1,L11,L2],_置換された文字列). 'html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換える'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[<,d,d,>|R1],L3), append(_[/,<,d,d,>|_],L1), append(L11,[/,<,d,d,>],R1), \+(append(L11,[/,<,d,d,>],L11)), 'html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換える'(L3,_置換された文字列のニ), concat_atom([L1,L11,_置換された文字列のニ],_置換された文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/403 # ●正規表現の使用環境 # Excel VBA # # ●検索か置換か? # 置換 # # ●説明 # <>で囲まれた文字列を空白に置換したい。 # # ●対象データ # あいうえお<ほげほげ>かきくけこ # みかん<りんご<すいか>ぶどう>メロン # # ●希望する結果 # あいうえおかきくけこ # みかんメロン # # --- # 検索:<*> # 置換: # --- # というふうにすると、 # 一番目の例に対してはうまくいくのですが、入れ子になっている場合にうまくいきません。 # ↓のような結果になってしまいます。 # みかんぶどう>メロン # # # お願いします。 # # '<>で囲まれた文字列を空白に置換したい。'(_文字列,_置換された文字列) :- atom_chars(_文字列,Chars), 'ならびの<>で囲まれた部分を空白に置換したい。'(Chars,_置換された文字ならび), atom_chars(_置換された文字列,_置換された文字ならび). 'ならびの<>で囲まれた部分を空白に置換したい。'([],[]). 'ならびの<>で囲まれた部分を空白に置換したい。'([<|R1],L) :- '<>に囲まれた部分を置換する'(R1,L1,R2), 'ならびの<>で囲まれた部分を空白に置換したい。'(R2,L2), append(L1,L2,L),!. 'ならびの<>で囲まれた部分を空白に置換したい。'([A|R1],[A|R2]) :- 'ならびの<>で囲まれた部分を空白に置換したい。'(R1,R2). '<>に囲まれた部分を置換する'([>|R],[],R) :- !. '<>に囲まれた部分を置換する'([<|R1],L,R) :- '<>に囲まれた部分を置換する'(R,L1,R1), '<>に囲まれた部分を置換する'(R1,L2,R), append(L1,L2,L),!. '<>に囲まれた部分を置換する'([A|R1],[A|R2],R) :- '<>に囲まれた部分を置換する'(R1,R2,R),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/444 # よろしくお願いします # # ●正規表現の使用環境 # 秀丸 # # ●検索か置換か? # 置換 # # ●説明 # ダブルクォーテーションの中の文字を空白扱いにしたい # # ●対象データ # test="daikon" # test="daikon ninjin" # test="daikon ninjin tamanegi" # # ●希望する結果 # test="" # test="" # test="" # # 'ダブルクォーテーションの中の文字を空白扱いにしたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_置換対象文字列,_,L1,['"'|R2],['"'|R3]), \+(member('"',R2)), atom_chars(_残り文字列,R3), concat_atom([_前文字列,'""',_残り文字列],_置換された文字列). 'ダブルクォーテーションの中の文字を空白扱いにしたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_置換対象文字列,_,L1,['"'|R2],['"'|R3]), \+(member('"',R2)), atom_chars(_残り文字列,R3), 'ダブルクォーテーションの中の文字を空白扱いにしたい'(_残り文字列,_置換された文字列のニ), concat_atom([_前文字列,'""',_置換された文字列のニ],_置換された文字列). 'ダブルクォーテーションの中の文字を空白扱いにしたい'(_文字列,_文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/455 # ●正規表現の使用環境 # C# # # ●検索か置換か? # 置換 # # ●説明 # <b></b>で挟まれた文章を抜き出す # # ●対象データ # <table width="100%" border="1" cellspacing="0" cellpadding="10"> # <tr><td><b>ERROR!!<br><br>多重書き込みです。 あと 17秒お待ちください。</b></td></tr> # </table> # # ●希望する結果 # ERROR!!<br><br>多重書き込みです。 あと 17秒お待ちください。 # # ==== # これを実行するのに、 # responseStr = System.Text.RegularExpressions.Regex.Replace( # responseStr, # @"(.|\n)*<b>(?<sentence>.*?)</b>(.|\n)*", # "${sentence}"); # # とやっているのですが、 # 「任意の一文字(改行文字も含む)」 # という表現は(.|\n)が最適なのでしょうか。 # もっとベターなやりかたがあったら教えて下さい。 # # 'で挟まれた文章を抜き出す'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append([<,b,>|R1],[<,/,b,>],R1), \+(append(_,[<,b,>|_],R1)), \+(append(_,[<,/,b,>|_],R1)), atom_chars(_適合文字列,R1), concat_atom([S1,''],_前文字列), concat_atom(['',S3],_後文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/477 # どなたかご教授ください・・・ # ●正規表現の使用環境 # EmEditor # # ●検索か置換か? # 検索 # # ●検索対照データ # (abcdefg:;[]あいうえお)) # # ●希望する結果 # (で始まり、途中にいろいろあっても、))で終わる対象データを検索したいです。 # すみませんが、よろしくお願いします。 # # '(で始まり、途中にいろいろあっても、))で終わる対象データを検索する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), append(['('],L22,[')',')'],L2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/482 # どなたかご教授ください・・・ # ●正規表現の使用環境 # EmEditor # # ●検索か置換か? # 置換 # # ●対照データ # ;AA[aa][ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[aa][zy]AC[ab] # ;AA[aa][ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[df]AC[aa][fb] # ;AA[aa][ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[bc][fh]AC[ge][eg] # # ●希望する結果 # ;AA[ac][ad]・・・・・[zw][zx][zz];AB[aa][zy]AC[ab]     ←;AAの後ろから[aa][zy][ab]を削除 # ;AA[ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[df]AC[aa][fb]     ←;AAの後ろから[df][aa][fb]を削除 # ;AA[aa][ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[bc][fh]AC[ge][eg]    ←;AAの後ろから、[bc][fh][ge][eg]を削除 # # すみませんが、よろしくお願いします。 # # ';AAの後ろから削除文字列を削除'(_対象文字列,_削除文字列,_削除された文字列) :- sub_atom(_対象文字列,_,_,_,S1,S2,S3,L1,[';','A','A'|R2],L3), \+(member(';',R2)), concat_atom(R2,_削除文字列), concat_atom([S1,';AA',S3],削除された文字列). ';AAの後ろから削除文字列を削除'(_対象文字列,_削除文字列,_削除された文字列) :- sub_atom(_対象文字列,_,_,_,S1,S2,S3,L1,[';','A','A'|R2],L3), \+(member(';',R2)), concat_atom(R2,_削除文字列), ';AAの後ろから削除文字列を削除'(S3,_削除文字列,_削除された文字列のニ), concat_atom([S1,';AA',_削除された文字列のニ],_削除された文字列). ';AAの後ろから削除文字列を削除'(_対象文字列,_,_対象文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/492 # ●正規表現の使用環境 # vxeditor # # ●検索か置換か? # 置換 # # ●説明 # 「a」という文字を正規表現で検索し、「C:\test\test2」に置換するために、 # # 検索語:[a-z] もしくは \w # 置換語:C:\test\test2 # # と置換したのですが結果は「C:        est        est2」となってしまいます。 # 置換語を「C:\\test\\test2」としてみたら今度は「\test2」となりました。 # # ●対象データ # a # # ●希望する結果 # C:\test\test2 # # お願いします # # 'aという文字をC:\\test\\test2に置換する'(_文字列,_置換文字列) :- sub_atom(_文字列,_,_,_,S1,a,S3,L1,L2,L3), concat_atom([S1,'C:\\test\\test2',S3],_置換文字列). 'aという文字をC:\\test\\test2に置換する'(_文字列,_置換文字列) :- sub_atom(_文字列,_,_,_,S1,a,S3,L1,L2,L3), concat_atom([S1,'C:\\test\\test2'],_置換文字列の一), 'aという文字をC:\\test\\test2に置換する'(S3,_置換文字列のニ), concat_atom([_置換文字列の一,_置換文字列のニ],_置換文字列). 'aという文字をC:\\test\\test2に置換する'(_文字列,_文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/503 # ●正規表現の使用環境 # oracle(regexp_replace) # ●検索か置換か? # 置換 # ●説明 # ::でタグ名が記載されたデータを<>タグに変換したい # ●対象データ # :dog:I like dog # :cat:I like cat # ●希望する結果 # <dog>I like dog</dog> # <cat>I like cat</cat> # '::でタグ名が記載されたデータを<>タグに変換したい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [:|R2], last(R2,:), atom_chars(S21,R2), concat_atom([S1,<,S21,>],S22), '最初に現れたS21の後にを付加する'(S3,S21,S31,_), concat_atom([S22,S31],_置換された文字列). '::でタグ名が記載されたデータを<>タグに変換したい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [:|R2], last(R2,:), atom_chars(S21,R2), concat_atom([S1,<,S21,>],S22), '最初に現れたS21の後にを付加する'(S3,S21,S31,_残り文字列), concat_atom([S22,S31],_置換された文字列の一), '::でタグ名が記載されたデータを<>タグに変換したい'(_残り文字列,_置換された文字列のニ), concat_atom([_置換された文字列の一,_置換された文字列のニ],_置換された文字列). '::でタグ名が記載されたデータを<>タグに変換したい'(_文字列,_文字列). '最初に現れたS21の後にを付加する'(_文字列,S21,S31,S3) :- sub_atom(_文字列,_,_,_,S1,S21,S3,L1,L2,L3), concat_atom([S1,S21,'<',S21,'>'],S31),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/477 # [1] アルゴリズム論 # [2] Unixコマンドのgrepを実装したmygrepの作成 #   コマンドライン引数で検索文字列とファイル名をもらい、ファイル内に検索文字列が含まれる行があればその行を出力する #   正規表現に対応させる必要はない # [3] # [3.1]windows xp  # [3.2]gcc  # [3.3]c言語 # [4] 無期限 # [5] strstrは使用禁止 # # よろしくおねがいします # program :- user_paramaters([_検索文字列,_ファイル名]), open(_ファイル名,read,Instream), grep_line(Instream,_検索文字列), close(Instream), halt. grep_line(Instream,_検索文字列) :- at_end_of_stream(Instream),!. grep_line(Instream,_検索文字列) :- get_line(Stream,Line), sub_atom(Line,_,_,_,_検索文字列), writef('%t\n',[Line]), fail. grep_line(Instream,_検索文字列) :- grep_line(Instream,_検索文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/538 # ●正規表現の使用環境 Flexible Renamer # ●検索か置換か? 置換 # ●説明 # 日付の前の文字を入れ替える # ●対象データ # ABC11-12-31 \d{2}-[A-Z]{3}-\d{2} # ABC11-DEC-31 \d{2}-\d{2}-\d{2} # ABC2011-12-31 \d{4}-[A-Z]{3}-\d{2} # ABC2011-DEC-31 \d{4}-\d{2}-\d{2} # ●希望する結果 # XYZ11-12-31 # XYZ11-DEC-31 # XYZ2011-12-31 # XYZ2011-DEC-31 # ●コメント:こんな感じか書いて投稿してみた # 日付の前の文字を入れ替える(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(['A','B','C'|R21],[-|R22],[-|R23],L2), 年の文字ならび(R21), 月の文字ならび(R22), 日の文字ならび(R23), append(['X','Y','Z'|R1],[-|R22],[-|R23],L22), atom_chars(S22,L22), concat_atom([S1,S22,S3],_置換された文字列). 日付の前の文字を入れ替える(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(['A','B','C'|R21],[-|R22],[-|R23],L2), 年の文字ならび(R21), 月の文字ならび(R22), 日の文字ならび(R23), append(['X','Y','Z'|R1],[-|R22],[-|R23],L22), atom_chars(S22,L22), 日付の前の文字を入れ替える(S3,_置換された文字列のニ), concat_atom([S1,S22],_置換された文字列の一), concat_atom([_置換された文字列の一,_置換された文字列のニ],_置換された文字列). 日付の前の文字を入れ替える(_文字列,_文字列). 年の文字ならび(R21) :- length(R21,4), すべて数字(R21),!. 年の文字ならび(R21) :- length(R21,2), すべて数字(R21),!. 月の文字ならび(R22) :- length(R22,1), すべて数字(R22),!. 月の文字ならび(R22) :- member(A,['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC']), atom_chars(A,R22),!. 日の文字ならび(R21) :- length(R21,2), すべて数字(R21),!. 日の文字ならび(R21) :- length(R21,1), すべて数字(R21),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/541 # ●正規表現の使用環境 # 一般社会 # # ●検索か置換か? # 検索 # # ●説明 # すぐにやれる女を見つけたいです # # ●対象データ # OL # 女子大生 # 女子高生 # キャバ嬢 # ヘルス嬢 # 近所のおばさん # 母親 # # ●希望する結果 # させこ # やりまん # 公衆便所 # すぐにやれる女(させこ). すぐにやれる女(やりまん). すぐにやれる女(公衆便所). 'すぐにやれる女を見つけたいです'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,_,_), すぐにやれる女(_適合文字列). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/546 # ●正規表現の使用環境 # Microsoft .NET Framework # # ●検索か置換か? # 検索 # # ●説明 # 下記条件(AND条件)のURLを検索したいです。 # ・特定のドメイン(yahoo.co.jp)がhttp://ime.nu/直後に含まれない。 # ・特定の拡張子(jpg,gif)で終わらない。 # # ●対象データ # 1.http://ime.nu/yahoo.co.jp/?=abc # 2.http://ime.nu/yahoo.co.jp/abc.jpg # 3.http://2ch.net/?=abc # 4.http://2ch.net/abc.jpg # ・・・など複数URL # # ●希望する結果 # 3のみを検索したいです。 # # よろしくお願いします。 # # '下記条件(AND条件)のURLを検索したいです。・特定のドメイン(yahoo.co.jp)がhttp://ime.nu/直後に含まれない。・特定の拡張子(jpg,gif)で終わらない。'(_対象文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_対象文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), sub_atom(適合文字列,0,7,_,'http://'), 'URLの終止条件'(L3), \+(排除条件(L2)). 'URLの文字種検査'([]) :- !. 'URLの文字種検査'([A|R]) :- アルファベット(A), 'URLの文字種検査'(R). 'URLの文字種検査'([A|R]) :- 数字(A), 'URLの文字種検査'(R). 'URLの文字種検査'([A|R]) :- 'URLに許される特定の英記号'(A), 'URLの文字種検査'(R). アルファベット(A) :- A @>= 'A', A @=< 'Z',!. アルファベット(A) :- A @>= 'a', A @=< 'z',!. 数字(A) :- A @>= '0', A @=< '9',!. 'URLに許される特定の英記号'(A) :- member(A,['%','&','=','_','-','.','/','~','#']),!. 'URLの終止条件'(['\n'|R3]) :- !. 'URLの終止条件'([' '|_]) :- !. 'URLの終止条件'(['\t'|_]) :- !. 排除条件([h,t,t,p,:,/,/,i,m,e,'.',n,u,/,y,a,h,o,o,'.',c,o,'.',j,p|_]) :- !. 排除条件([h,t,t,p,:,/,/|R]) :- append(_,[g,i,f],R),!. 排除条件([h,t,t,p,:,/,/|R]) :- append(_,[j,p,g],R),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/563 # ●正規表現の使用環境 # Perl5 or Javascript # # ●検索か置換か? # 検索 # # ●説明 # ダブルクオートに囲まれた文字列を取得したい # ただ、「\」の次の文字はエスケープされた文字として扱う # # ●対象データ # "hogefuga" # "hoge\"fuga" # "hoge\\"fuga" # # ●希望する結果 # hogefuga # hoge"fuga # hoge\ # # # 上記のようなありきたりな命題にトライしていたのですが、以下の正規表現のうち1ではうまくいくのに2ではうまくいきませんでした # 1. /"((?:(?:\\.)|[^"])*)"/ # 2. /"((?:[^"]|(?:\\.))*)"/ # # # ただ、僕にはこれが両方同じ意味に見えるのです # # なぜこの場合、2ではうまくいかないのでしょうか # 気になって眠れません # 詳しい方解説お願いします # # 'ダブルクオートに囲まれた文字列を取得したい。ただ、「\\」の次の文字はエスケープされた文字として扱う'(_対象文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_対象文字列,_,_,_,_前文字列,_,_後文字列,L1,L2,L3), sub_atom(_後文字列,0,1,_,'"'), sub_atom(_前文字列,_,1,0,'"'), '「\\」の次の文字はエスケープされた文字として扱う'(L2,Chars), atom_chars(_適合文字列,Chars). '「\\」の次の文字はエスケープされた文字として扱う'([],[]) :- !. '「\\」の次の文字はエスケープされた文字として扱う'(['"'|_],_) :- !,fail. '「\\」の次の文字はエスケープされた文字として扱う'(['\\',A|R1],[A|R2]) :- '「\\」の次の文字はエスケープされた文字として扱う'(R1,R2),!. '「\\」の次の文字はエスケープされた文字として扱う'([A|R1],[A|R2]) :- '「\\」の次の文字はエスケープされた文字として扱う'(R1,R2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/594 # 正規表現は、既出かどうかってのがわかりにくいね。 # # ●正規表現の使用環境 # Java1.6 # # ●検索か置換か? # 検索 # # ●説明 # 変数文字列とその添字の取得 # # ●対象データ # $AAA.BBB+$CCC.DDD.EEE(1234)-#FFF*#GGG.HHH(567) # # ●希望する結果 # 検索1回目 # group1 : $AAA.BBB # # 検索2回目 # group1 : $CCC.DDD.EEE # group2 : 1234 # # 検索3回目 # group1 : #FFF # # 検索4回目 # group1 : #GGG.HHH # group2 : 567 # # # ($.*)\\(([0-9]*)\\) # これで、$CCC.DDD.EEE(1234)をみつけれるのは出来たけど、添え字が無い場合を引っ掛けるのができない。 # # '変数文字列とその添字の取得'(_文字列,_前文字列,_適合文字列,_後文字列,Group1,Group2) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,['$'|R2],L3), \+((member(A,R),member(A,['+','-','*','/']))), '[]であるか先頭に+,-,*,/,が来る'(L3), group検査(R2,Group1,Group2). '[]であるか先頭に+,-,*,/,が来る'([]) :- !. '[]であるか先頭に+,-,*,/,が来る'([A|_]) :- member(A,[+,-,*,/]),!. group検査(R2,Group1,'') :- \+(append(_,['('|_],R2)), atom_chars(Group1,R2),!. group検査(R2,Group1,Group2) :- atom_chars(Group1,R2), append(_,['('|R3],R2), append(L0,[')'|_],R3), atom_chars(Group2,L0),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/659 # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # 以下を参考に再帰的二分探索を作成せよ。 # http://ime.nu/codepad.org/BHEasb4b # お手数ですが、詳細はURLでお願いします。 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # 以下を参考に再帰的二分探索を作成せよ。 # # int binsearch (int x, int v[], int n) # { # int p, q, m; # p = 0; # q = n ? 1; # while (p <= q) { # m = (p + q)/2; # if (x < v[m]) # q = m ? 1; # else if (x > v[m]) # p = m + 1; # else # return m; # } # return ?1; # # ?入力:int x, int v[], int n (binsearchに同じ) # ?出力:配列vにxが存在すれば、その場所(添字)。存在しなければ,‐1 # ? プログラムの構造 # ? ループを使用せず,関数の再帰呼び出しを使うこと # ? 外部変数で値の受け渡しをしないこと # # [3] 環境 #  [3.1] OS:windows 7 #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語:c言語 # [4] 期限:2011/10/15 23:00 # [5] その他の制限:配列は整数で昇順にソートされている前提でした。授業では配列、ポインタは習っています。よろしくお願いします。 # 整列ならびの二分検索(_検索要素,_ならび,_前半ならび,_残りならび) :- ならびを二つ折りにする(_ならび,_前半ならび_1,_後半ならび_1), 整列ならびの二分検索(_検索要素,_前半ならび_1,_後半ならび_1,_前半ならび,_残りならび). 整列ならびの二分検索(_検索要素,_前半ならび,[_検索要素|_残りならび],_前半ならび,_残りならび) :- !. 整列ならびの二分検索(_検索要素,_前半ならび_1,[_要素|_残りならび_1],_前半ならび,_残りならび) :- _検索要素 @< _要素, 整列ならびの二分検索(_検索要素,_前半ならび_1,_前半ならび,_残りならび_2), append(_残りならび_2,_残りならび_1,_残りならび). 整列ならびの二分検索(_検索要素,_前半ならび_1,[_要素|_残りならび_1],_前半ならび,_残りならび) :- _検索要素 @> _要素, 整列ならびの二分検索(_検索要素,_残りならび_1,_前半ならび_2,_残りならび), append(_前半ならび_1,_前半ならび_2,_前半ならび). ならびを二つ折りにする(_ならび,_前半ならび,_後半ならび) :- length(_ならび,M), ならびを二つ折りにする(M,_ならび,_前半ならび,_後半ならび). ならびを二つ折りにする(M,_ならび,_前半ならび,_後半ならび) :- 0 is M mod 2, M1 is M // 2, length(_前半ならび,M1), length(_後半ならび,M1), append(_前半ならび,_後半ならび,_ならび). ならびを二つ折りにする(M,_ならび,_前半ならび,_後半ならび) :- 1 is M mod 2, M1 is M // 2, M2 is M1 + 1, length(_前半ならび,M1), length(_後半ならび,M2), append(_前半ならび,_後半ならび,_ならび). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/620 # ●正規表現の使用環境 # Windowsコマンドプロンプト、filestr # # ●検索か置換か? # 検索 # # ●説明 # 全角英の大文字または小文字または全角数字が含まれているか検索したい # # ●対象データ # 以下batで失礼します # set a="Ape" # set b="Bape" # set c="222" # ●希望する結果 # %a%、%b%、%c%から検索して、"Ape"、"Bape"、"222"、という結果を表示できるようする正規表現または、それを含めたコマンド # ●試したコマンド # echo %a%|findstr /r "[A-Z]" # echo %b%|findstr /r "a-z" # echo %c%|findstr /r \[0-9\] # echo %c%|findstr /r "\[0-9\]" # echo %a%|findstr "[A-Z]" # echo %b%|findstr "a-z" # echo %c%|findstr a-z # findstr /r [A-Z] %a% # findstr /r [a-z] %b% # findstr /r [0-9] %c% # 上記のコマンドは間違っていて結果が全て空欄になっています。正しい場合は # set d=" あああ" # echo %d%|findstr /r /c:"^. ." # こちらの画面を見て頂ければと思います。それではどうかよろしくお願いします。 # # '全角英の大文字または小文字または全角数字が含まれているか検索する'(_文字列,_前文字列,_適合全角文字,_後文字列) :- atom_chars(_文字列,Chars), append(L0,[_適合全角文字|R],Chars), '全角英の大文字または小文字または全角数字が含まれているか'(_適合全角文字), atom_chars(_前文字列,L0), atom_chars(_後文字列,R). '全角英の大文字または小文字または全角数字が含まれているか'(A) :- '全角英の大文字が含まれている'(A),!. '全角英の大文字または小文字または全角数字が含まれているか'(L,L0,A,R) :- '全角英の小文字が含まれている'(A),!. '全角英の大文字または小文字または全角数字が含まれているか'(L,L0,A,R) :- '全角数字が含まれている'(A),!. '全角英の大文字が含まれている'(A) :- A @>= A, A @=< Z,!. '全角英の大文字が含まれている'(A) :- A @>= a, A @=< z,!. '全角英の数字が含まれている'(A) :- A @>= 1, A @=< 9,!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/968 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):文字列st の中に含まれる文字ch の個数(含まれて # いなければ0 とする)を返す関数 # int str_chnum(const char st[], int ch) # を作成せよ.以下の実行例のように,関数の動作を確認 # 例.文字列を入力してください:Koukadai # 検索する文字を入力してください:a # その文字は2 個含まれています。 # # '文字列st の中に含まれる文字ch の個数(含まれていなければ0 とする)を返す'(_st,_ch,_文字の個数) :- count(sub_atom(_st,_,1,_,_ch),_個数). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F) . findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0). sum([N|R],S) :- sum(R,S2), S is N + S2. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/727 # わかりにくい質問かもしれませんがよろしくお願いします。 # # ●正規表現の使用環境 # Java(Android) # # ●検索か置換か? # 検索 # # ●説明 # 文字列から、数値を含むURLを検索し、その数値を取得したい # # ●対象データ # http://ime.nu/some_website.net/category:63 # http://ime.nu/some_website.net/category:19 # ・・・ # のように、数値を含むURLを含んだ文字列 # # ●希望する結果 # http://ime.nu/some_website.net/category:63 # だったら、63を取得 # # '文字列から、数値を含むURLを検索し、その数値を取得したい'(_文字列,_前文字列,_適合文字列,_後文字列) :- '数値を含むURLを検索し'(_文字列,_前文字列_1,_数値を含むURL,_後文字列_1), 数値を取得したい(_数値を含むURL,_前文字列_2,_適合文字列,_後文字列_2), concat_atom([_前文字列_1,_前文字列_2],_前文字列), concat_atom([_後文字列_2,_後文字列_1],_後文字列). '数値を含むURLを検索し'(_文字列,_前文字列,_数値を含むURL,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列_1,_数値を含むURL_1,_後文字列_1,L1,L2,L3), 'URLである'(L2), 'L3は[]であるか先頭が空白'(L3), '数値を含むURLを検索し'(_前文字列_1,_数値を含むURL_1,_後文字列_1,_前文字列,_数値を含むURL,_後文字列). '数値を含むURLを検索し'(_前文字列,_数値を含むURL,_後文字列,_前文字列,_数値を含むURL,_後文字列). '数値を含むURLを検索し'(_前文字列_1,_数値を含むURL_1,_後文字列_1,_前文字列,_数値を含むURL,_後文字列) :- '数値を含むURLを検索し'(_後文字列_1,_前文字列_2,_数値を含むURL,_後文字列), concat_atom([_前文字列_1,_数値を含むURL_1,_前文字列_2],_前文字列). 'URLである'([h,t,t,p,:,/,/|R]) :- \+(member(' ',R)),!. 'URLである'([h,t,t,p,s,:,/,/|R]) :- \+(member(' ',R)),!. 'URLである'([f,t,p,:,/,/|R]) :- \+(member(' ',R)),!. 'URLである'([f,i,l,e,:,/,/|R]) :- \+(member(' ',R)),!. 'L3は[]であるか先頭が空白'([]) :- !. 'L3は[]であるか先頭が空白'([' '|_]). 数値を取得したい(_数値を含むURL,_前文字列,_適合文字列,_後文字列) :- sub_atom(_数値を含むURL,_,_,_,_前文字列_1,_適合文字列_1,_後文字列_1,L1_1,L2_1,L3_1), 全てが数字(L1), \+((last(L1,A),数字(A))), \+((L3 = [B|_],数字(B))). 数値を取得したい(_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列). 数値を取得したい(_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). 数値を取得したい(_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- 数値を取得したい(_後文字列_1,_前文字列_2,_適合文字列,_後文字列), concat_atom([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 全てが数字([]). 全てが数字([A|R]) :- 数字(A), 全てが数字(R). 数字(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']),!. 数字(A) :- member(A,[0,1,2,3,4,5,6,7,8,9]). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/147 # 1] 授業単元: Cプロ # [2] 問題文(含コード&リンク):文字列st の中に含まれる文字ch の個数(含まれて # いなければ0 とする)を返す関数 # int str_chnum(const char st[], int ch) # を作成せよ. # 以下の実行例のように,関数の動作を確認 # できるmain 関数も作成して完成させよ # 【実行例】文字列を入力してください:Koukka # 検索する文字を入力してください:k # その文字は2 個含まれています。 # (注意)】scanf で文字列を入力させた後にgetchar 関 # 数で文字を入力させたい場合,getchar で文字を入力 # させる前に # scanf("%*c"); # などとして,バッファに残った改行コードを読み捨て # ておく必要がある. # # '文字列st の中に含まれる文字ch の個数を表示しなさい' :- 文字列の入力(_文字列), 検索文字の入力(_検索する文字), '文字列st の中に含まれる文字ch の個数(含まれていなければ0 とする)を返す'(_文字列,_検索する文字,_個数), writef('文字列 %t に文字 %t は %t個含まれています。\n',[_文字列,_検索する文字,_含まれる個数]). 文字列の入力(_文字列) :- write('文字列を入力しなさい : '), get_line(_文字列). 検索文字の入力(_検索する文字) :- write('検索する文字を入力しなさい : '), get_line(_文字列), sub_atom(_文字列,0,1,_,_検索する文字). '文字列の中に含まれる文字の個数(含まれていなければ0 とする)を返す'(_文字列,_検索する文字,_含まれる個数) :- count(sub_atom(_文字列,_1,_,_検索する文字),_含まれる個数). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/762 # ●正規表現の使用環境 # MySQL4.1のREGEXP # ●検索か置換か? # 検索 # ●説明 # カラム内に <> を含むテキストデータがあるのですが # 調べたい数字が入っているかを調べたい # # ●対象データ # 3<>4 # 5<>32<>2 # 5<>3<>6 # 3 # 4 # # この中から3を含むものを検索したい(32はヒットしないように) # # ●希望する結果 # 3<>4 # 5<>3<>6 # 3 # # 'カラム内に <> を含むテキストデータがあるのですが調べたい数字が入っているかを調べたい'(_カラムならび,_調べたい数字,_適合カラム) :- append(_,[_カラム|_],_カラムならび), 調べたい数字が入っているか(_カラム). 調べたい数字が入っているか(_,_調べたい数字) :- !. 調べたい数字が入っているか(_カラム,_調べたい数字) :- split(_カラム,['<>'],L), append(_,[_調べたい数字|_],L). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/307 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/iup.2ch-library.com/i/i0478374-1321368771.jpg # 個人データは、以下の3項目から構成されることとする。 # 1 氏名 : (アルファベット) char[256](文字列) # 2 住所 : (アルファベット) char[256](文字列) # 3 電話番号 : char[16] (文字列) # 4 学籍番号 : int # 1) 最大5名分のデータが管理できること。 # 2) 新規追加が可能であること。 # 3) 指定されたデータの削除が可能であること。削除されたデータは次の仕様に従って登録がない状態とすること。 # 4) 登録がないデータ項目は氏名、住所、電話番号については、ヌル文字列、学籍番号は0が格納されていることとする。 # 5) 上記仕様を用いて、一度削除された項目は以降の新規追加処理で再利用可能であること。 # # 1. (データの新規追加) 引数を順に名前、電話番号、学籍番号を表す配列 name phone number を用いて実装せよ # 2. (データ項目の削除) 引数で指定されたデータ項目と合致する個人データを住所録から削除する関数 # 3. (データの検索) 引数で指定されたデータ項目を住所録から検索する関数 # 4. 住所録に登録されているすべての個人データを表示するものとする。未使用 # 領域も表示すること。 # 個人データの初期化 :- assertz(住所録(名前,['','','','',''])), assertz(住所録(住所,['','','','',''])), assertz(住所録(電話番号,['','','','',''])), assertz(住所録(学籍番号,[0,0,0,0,0])). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/307 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/iup.2ch-library.com/i/i0478374-1321368771.jpg # # 1. (データの新規追加) 引数を順に名前、電話番号、学籍番号を表す配列 name phone number を用いて実装せよ # 2. (データ項目の削除) 引数で指定されたデータ項目と合致する個人データを住所録から削除する関数 # 3. (データの検索) 引数で指定されたデータ項目を住所録から検索する関数 # 4. 住所録に登録されているすべての個人データを表示するものとする。未使用 # 領域も表示すること。 # 住所録に新規データの追加(_名前,_住所,_電話番号,_学籍番号) :- 住所録(名前,_名前ならび), 名前が空の位置を捜す(_名前ならび,_n番目), 各項目を置換してから登録(_n番目,_名前,_住所,_電話番号,_学籍番号),!. 名前が空の位置を捜す(_名前ならび,_n番目) :- append(L0,[''|R],_名前ならび), length([_|L0],_n番目). 各項目を置換してから登録(_n番目) :- 名前を置換してから登録(_n番目,_名前), 住所を置換してから登録(_n番目,_住所), 電話番号を置換してから登録(_n番目,_電話番号), 学籍番号を置換してから登録(_n番目,_学籍番号). 名前を置換してから登録(_n番目,_名前) :- retract(住所録(名前,_名前ならび)), length([_|L0],_n番目), append(L0,[_|R],_名前ならび), append(L0,[_名前|R],_置換された名前ならび), assertz(住所録(名前,_置換された名前ならび)). 住所を置換してから登録(_n番目,_住所) :- retract(住所録(住所,_住所ならび)), length([_|L0],_n番目), append(L0,[_|R],_住所ならび), append(L0,[_住所|R],_置換された住所ならび), assertz(住所録(住所,_置換された住所ならび)). 電話番号を置換してから登録(_n番目,_電話番号) :- retract(住所録(電話番号,_電話番号ならび)), length([_|L0],_n番目), append(L0,[_|R],_電話番号ならび), append(L0,[_電話番号|R],_置換された電話番号ならび), assertz(住所録(電話番号,_置換された電話番号ならび)). 学籍番号を置換してから登録(_n番目,_学籍番号) :- retract(住所録(学籍番号,_学籍番号ならび)), length([_|L0],_n番目), append(L0,[_|R],_学籍番号ならび), append(L0,[_学籍番号|R],_置換された学籍番号ならび), assertz(住所録(学籍番号,_置換された学籍番号ならび)). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/307 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/iup.2ch-library.com/i/i0478374-1321368771.jpg # # 1. (データの新規追加) 引数を順に名前、電話番号、学籍番号を表す配列 name phone number を用いて実装せよ # 2. (データ項目の削除) 引数で指定されたデータ項目と合致する個人データを住所録から削除する関数 # 3. (データの検索) 引数で指定されたデータ項目を住所録から検索する関数 # 4. 住所録に登録されているすべての個人データを表示するものとする。未使用 # 領域も表示すること。 # '引数で指定されたデータ項目と合致する個人データを住所録から削除する'(_データ項目) :- 住所録(名前,_名前ならび), nth1(_n番目,_名前ならび,_データ項目), 各項目を住所録から削除する(_n番目). 各項目を住所録から削除する(_n番目) :- 名前を削除する(_n番目,_名前ならび,_削除された名前ならび), 住所を削除する(_n番目,_住所ならび,_削除された住所ならび), 電話番号を削除する(_n番目,_電話番号ならび,_削除された電話番号ならび), 学籍番号を削除する(_n番目,_学籍番号ならび,_削除された学籍番号ならび). 名前を削除する(_n番目,_名前ならび) :- retract(住所録(名前,_名前ならび)), n番目の文字項目を削除(_n番目,_名前ならび,_削除された名前ならび), assertz(住所録(名前,_削除された名前ならび)). 住所を削除する(_n番目,_住所ならび) :- retract(住所録(住所,_住所ならび)), n番目の文字項目を削除(_n番目,_住所ならび,_削除された住所ならび), assertz(住所録(住所,_削除された住所ならび)). 電話番号を削除する(_n番目,_電話番号ならび) :- retract(住所録(電話番号,_電話番号ならび)), n番目の文字項目を削除(_n番目,_電話番号ならび,_削除された電話番号ならび), assertz(住所録(電話番号,_削除された電話番号ならび)). 学籍番号を削除する(_n番目,_学籍番号ならび) :- retract(住所録(学籍番号,_学籍番号ならび)), n番目の数値項目を削除(_n番目,_学籍番号ならび,_削除された学籍番号ならび), assertz(住所録(学籍番号,_削除された学籍番号ならび)). n番目の文字項目を削除(_n番目,L1,L2) :- length([_|L0],_n番目), append(L0,[''|R],L1), append(L0,R,L2). n番目の数値項目を削除(_n番目,L1,L2) :- length([_|L0],_n番目), append(L0,[0|R],L1), append(L0,R,L2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/307 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/iup.2ch-library.com/i/i0478374-1321368771.jpg # # 1. (データの新規追加) 引数を順に名前、電話番号、学籍番号を表す配列 name phone number を用いて実装せよ # 2. (データ項目の削除) 引数で指定されたデータ項目と合致する個人データを住所録から削除する関数 # 3. (データの検索) 引数で指定されたデータ項目を住所録から検索する関数 # 4. 住所録に登録されているすべての個人データを表示するものとする。未使用 # 領域も表示すること。 # 引数で指定されたデータ項目を住所録から検索する関数(_データ項目,_名前,_住所,_電話番号,_学籍番号) :- 登録位置を得る(_データ項目,_n番目), 指定された登録位置から各項目を取得する(_n番目,_名前,_住所,_電話番号,_学籍番号). 登録位置を得る(_データ項目,_n番目) :- 住所録(名前,_名前ならび), append(L0,[_名前|_],_名前ならび), sub_atom(_名前,_,_,_,_データ項目), length([_|L0],_n番目). 指定された登録位置から各項目を取得する(_n番目,_名前,_住所,_電話番号,_学籍番号) :- n番目の名前(_n番目,_名前), n番目の住所(_n番目,_住所), n番目の電話番号(_n番目,_電話番号), n番目の学籍番号(_n番目,_学籍番号). n番目の名前(_n番目,_名前) :- 住所録(名前,_名前ならび), nth1(_n番目,_名前ならび,_名前). n番目の電話番号(_n番目,_電話番号) :- 電話番号録(名前,_電話番号ならび), nth1(_n番目,_電話番号ならび,_電話番号). n番目の学籍番号(_n番目,_学籍番号) :- 学籍番号録(名前,_学籍番号ならび), nth1(_n番目,_学籍番号ならび,_学籍番号). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/307 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/iup.2ch-library.com/i/i0478374-1321368771.jpg # # 1. (データの新規追加) 引数を順に名前、電話番号、学籍番号を表す配列 name phone number を用いて実装せよ # 2. (データ項目の削除) 引数で指定されたデータ項目と合致する個人データを住所録から削除する関数 # 3. (データの検索) 引数で指定されたデータ項目を住所録から検索する関数 # 4. 住所録に登録されているすべての個人データを表示するものとする。未使用 # 領域も表示すること。 # '住所録に登録されているすべての個人データを表示するものとする。未使用領域も表示する' :- 住所録(名前,_名前ならび), 住所録(住所,_住所ならび), 住所録(電話番号,_電話番号ならび), 住所録(名前,_学籍番号ならび), 全ての個人データを表示する(_名前ならび,_住所ならび,_電話番号ならび,_学籍番号ならび). 全ての個人データを表示する(_名前ならび,_住所ならび,_電話番号ならび,_学籍番号ならび) :- 転置([_名前ならび,_住所ならび,_電話番号ならび,_学籍番号ならび],_転置された個人データならび), append(_,[[_名前,_住所,_電話番号,_学籍番号]|R],_転置された個人データならび), writef('名前 : %t\n住所 : %t\n電話番号 : %t\n学籍番号 : %t\n\n',[_名前,_住所,_電話番号,_学籍番号]), R = []. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/799 # ●正規表現の使用環境 # 秀丸 # # ●検索か置換か? # 置換 # # ●説明 # 文字列の中に同じ文字が2つ以上含まれる行を削除したい # # ●対象データ # aaaaaaaa # abcabcab # abcdefgh # agbchddf # cbfdaehg # dbcahebg # dffbdeha # echfbgad # fbadcaeh # habcdefg # # ●希望する結果 # abcdefgh # cbfdaehg # echfbgad # habcdefg # # # # 見づらいかと思いますが # どうかよろしくお願いします。 # # 文字列の中に同じ文字が2つ以上含まれる行を削除したい([],[]). 文字列の中に同じ文字が2つ以上含まれる行を削除したい([_|R1],R2) :- 同じ文字が2つ以上含まれる行は削除する(_行), 文字列の中に同じ文字が2つ以上含まれる行を削除したい(R1,R2). 文字列の中に同じ文字が2つ以上含まれる行を削除したい([A|R1],[A|R2]) :- 文字列の中に同じ文字が2つ以上含まれる行を削除したい(R1,R2). 同じ文字が2つ以上含まれる行は削除する(_行) :- atom_chars(_行,_文字ならび), 整列(_文字ならび,_整列された文字ならび), 整列した要素に重複がある(_整列された文字ならび). 整列した要素に重複がある([A,A|_]) :- !. 整列した要素に重複がある([_|R]) :- 整列した要素に重複がある(R). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301067486/865 # ../test/read.cgi/tech/1301067486/864 失礼しました # # ●正規表現の使用環境 # psstpsstというリネームソフト(Perl互換) # # ●検索か置換か? # 置換 # # ●説明 # 最大4桁で書かれた数字部分を3桁に統一したい # # ●対象データ # ABCA01.txt # BCAA2.txt # CABA0255.txt # # ●希望する結果 # AAA001.txt # AAA002.txt # AAA255.txt # # どうぞよろしくおねがいします # # 最大4桁で書かれた数字部分を3桁に統一したい(_文字列,_固定部分ファイル名,_置換された文字列) :- sub_atom(Line,_,_,_,S1,S2,S3,L1,L2,L3), ファイル部分の特定(S1,L2,L2_0,L2_1), 最大4桁で書かれた数字部分を3桁に統一したい(_固定部分ファイル名,S1,L2_0,L2_1,S3,_置換された文字列). ファイル部分の特定(S1,L2,L2_0,L2_1) :- \+((sub_atom(S1,_,1,0,A),ファイルを構成する文字(A))), append(L2_0,L2_1,['.',t,x,t],L2), すべて数字(L2_1), last(L2_0,B), \+(数字(B)). 最大4桁で書かれた数字部分を3桁に統一したい(_固定部分ファイル名,S1,L2_1,S3,_置換された文字列) :- 三桁の数字に変換する(L2_1,_三桁の数字列), concat_atom([S1,_固定部分ファイル名,_三桁の数字列,'.txt',S3],_置換された文字列). 最大4桁で書かれた数字部分を3桁に統一したい(_固定部分ファイル名,S1,L2_1,S3,_置換された文字列) :- 最大4桁で書かれた数字部分を3桁に統一したい(S3,_固定部分ファイル名,_置換された文字列_1), concat_atom([S1,_固定部分ファイル名,_三桁の数字列,'.txt',_置換された文字列_1],_置換された文字列). ファイルを構成する文字(A) :- 数字(A),!. ファイルを構成する文字(A) :- A @>= 'A', A @=< 'Z',!. ファイルを構成する文字(A) :- A @>= 'a', A @=< 'z',!. ファイルを構成する文字(A) :- member(A,['-','_','#','$','~','&']),!. 数字(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']). 全て数字([]). 全て数字([A|R]) :- 数字(A), 全て数字(R). 三桁の数字に変換する(L,_三桁の数字) :- concat_atom(['0','0','0'|L],S1), sub_atom(S1,_,3,0,_三桁の数字). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/db/1316769778/317 # 検索結果の集合の共通部分は求められますか。 # たとえばid=1の結果が{a, b, c, d}でid=2の結果が{b, c, e}なら{b, c}を求めたいです。 # '検索結果の集合の共通部分は求める'(_id1,_id2,_共通する値) :- setof(_値,(テーブル(_id1,_値),テーブル(_id2,_値)),L), member(_共通する値,L). % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1316769778/323 # 【質問テンプレ】 # ・DBMS名とバージョン MySQL 5.1 # ・テーブルデータ # ・欲しい結果 # ・説明 # # テーブル「カート」 # カラム 「セッションID」「商品種別」「カートに入れた時刻」 # # テーブル「カート詳細」 # カラム 「セッションID」「商品コード」 # # テーブル「商品リスト」 # カラム「商品コード」「商品種別」 # # というテーブルがあります。 # # 最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して、 # そのセッションIDを持つレコードを「カート」「カート詳細」の両方から # 全て削除したいのです。 # # 同じセッションIDを持つレコードは、両方のテーブルに複数あります。 # 「注文」テーブルで「セッションID」「商品種別」の組合せはユニークで、 # 「注文詳細」テーブルでは「セッションID」「商品コード」の組合せにユニークです。 # # 結合や副問い合わせを試してみましたが、うまいこと抽出できません。 # SQLで書くやり方があれば教えてください。よろしくお願いします。 # # '最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して、そのセッションIDを持つレコードを「カート」「カート詳細」の両方から全て削除する' :- '最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して'(_セッションID,R), 'そのセッションIDを持つレコードを「カート」「カート詳細」の両方から全て削除する'(_セッションID), R = []. '最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して'(_セッションID,R) :- findsetof(_セッションID,( カート(_セッションID,_商品種別,_カートに入れた時刻)), _セッションIDならび), append(_,[_セッションID|R],_セッションIDならび), findmax(_カートに入れた時刻,( カート(_セッションID,_商品種別,_カートに入れた時刻)), _最後にカートに入れた時刻), 最後にカートに入れた時刻から12時間以上経過している(_セッションID,_最後にカートに入れた時刻). 'そのセッションIDを持つレコードを「カート」「カート詳細」の両方から全て削除する'(_セッションID) :- retractall(カート(_セッションID,_,_)), retractall(カート詳細(_セッションID,_)). 最後にカートに入れた時刻から12時間以上経過している(_セッションID,_最後にカートに入れた時刻) :- split(_最後に入れた時刻,['/',' ',':'],[_年,_月,_日,_時,_分]), 現在の時刻(_年_1,_月_1,_日_1,_時_1,_分_1), '12時間後の日時'(_年,_月,_日,_時,_分,_年_2,_月_2,_日_2,_時_2,_分_2), [_年_1,_月_1,_日_1,_時_1,_分_1] @>= [_年_2,_月_2,_日_2,_時_2,_分_2],!. '12時間後の日時'(_年,_月,_日,_時,_分,_年,_月,_日,_時_2,_分) :- _時_2 is _時 + 12, _時_2 < 24,!. '12時間後の日時'(_年,_月,_日,_時,_分,_年,_月,_日_2,_時_2,_分) :- _時_1 is _時 + 12, _時_2 is _時_1 - 24, _日_2 is _日 + 1,!. retractall(P) :- retract(P), fail. retractall(_). % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1316769778/348 # (質問) #  チェックボックス値による検索を行いたいと思っています。 # # MYSQL5.1 # # T1 マスタテーブル # ID | DATE     | DATA # --+----------+----- # 1 | 2007-11-11 | aaa # 2 | 2007-11-11 | bbb # 3 | 2007-11-10 | ccc # # T2 チェックボックステーブル1 # ID | cate1     | # --+--------- | # 1 | 201      | # 1 | 202      | # 1 | 205      | # 2 | 202      | # 2 | 203      | # 3 | 203      | # 3 | 204      | # # T3チェックボックステーブル2 # ID | cate2     | # --+--------- | # 1 | 401      | # 1 | 403      | # 1 | 404      | # 3 | 403      | # 3 | 404      | # 3 | 405      | # # このような3つのテーブルから、下記のように出したいがどうすれば # # T2で 201、202、を含み # 且つ # T3で 403 を含む  # # 結果 T1のIDレコード # 1 | 2007-11-11 | aaa # # 試した事 # select * from `T1` # join `T2` using(ID) # join `T3` using(ID) # where # cate1 in(201,202) # and cate2 in(403) # group by ID # having count(*)=?? # # 絞るのにカウント数がT1、T2のチェックレコード数で # 可変するので詰まっています。 # そもそも、考え方がおかしいのかもしれません。 # 良い方法をご教示ください。 # 'T2で 201、202、を含み 且つ T3で 403 を含む T1のIDレコード' :- 'T1'(_ID,_DATE,_DATA), 'T2'(_ID,_cate1), '201、202、を含み'(_cate1), 'T3'(_ID,403), writef('%t | %t | %t\n',[_ID,_DATE,_DATA]), fail. 'T2で 201、202、を含み 且つ T3で 403 を含む T1のIDレコード'. '201、202、を含み'(201). '201、202、を含み'(202). % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1316769778/351 # 解決気味です。 # # 上記を諦め、 # # T1 マスタテーブル # ID | DATE    | DATA |ckbox # --+----------+----- |------ # 1 | 2007-11-11 | aaa | 201,202,205,401,403,404 # 2 | 2007-11-11 | bbb | 202,203 # 3 | 2007-11-10 | ccc | 203,204,403,404,405 # # 上記の形式にして # select ID,DATE,DATA from `T1` # where # CONCAT(',',chkbox,',') like '%,201,%' # and # CONCAT(',',chkbox,',') like '%,202,%' # and # CONCAT(',',chkbox,',') like '%,403,%' # # こういった形で取得。 # # チェックボックスは計300個程ありそれぞれユニークを振っています。 # チェックされている数は平均50個程。 # レコード数は約1万程なのですがこの方法で大丈夫かどうか心配です。 # 'チェックボックスならびを指定してT1の組を検索'(_チェックボックスならび,_ID,_DATE,_DATA,_ckbox) :- 'T1'(_ID,_DATE,_DATA,_ckbox), split(_ckbox,[','],L), 'チェックボックスならびの要素はすべてLの中にある'(_チェックボックスならび,L). 'チェックボックスならびの要素はすべてLの中にある'([],_). 'チェックボックスならびの要素はすべてLの中にある'([_要素|R],L) :- member(_要素,L), 'チェックボックスならびの要素はすべてLの中にある'(R,L). % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1316769778/365 # ・DB名:Firebird1.03 # ・テーブル #  ■メイン #   受注番号 受注日 注文社 #   11    2011/12/20 A社 #   12    2011/12/21 B社 #  ■サブ #   連番 受注番号 商品コード 数 #   50  11    A10    100 #   51  11    C30    20 #   52  12    A10    10 #  ■商品 #   商品コード 商品名 カテゴリ 納品番号(商品ごとで重複していません) #   A10     コート 洋服   100 #   C30     帯   和服   504 # # メインの受注番号とサブの受注番号、サブの商品コードと商品の商品コードで # リンクしています。 # # 欲しい結果 # 受注日の期間(いつからいつまで)と、商品のカテゴリと納品番号で、 # 受注の全内容(商品)が知りたいです。 # 受注日:2011/12/01から12/31まで # カテゴリ:洋服 納品番号:100で検索をして # # 受注番号 受注日 注文者 商品コード 商品名 数量 # 11    2011/12/20 A社 A10    コート 100 # 11    2011/12/20 A社 C30    帯   20----★ # 12    2011/12/21 B社 A10    コート 10 # ★受注の全内容が知りたいので、該当する受注番号のサブはすべて表示 # したい。メインの内容は重複表示となります。 # # 丸投げですみませんが、どなたかSQL文をお願いできませんでしょうか。 # テーブルが3つになるとどうしてよいものかわからないです。 # よろしくお願いします。 # # # '受注日の期間(いつからいつまで)と、商品のカテゴリと納品番号で、受注の全内容(商品)が知りたい'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号) :- 受注番号候補を得る(_受注日下限,_受注日上限,_カテゴリ,_納品番号,_受注番号ならび), findall([_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量],( append(_,[_受注番号|_],_受注番号ならび), 受注番号を鍵にデータベースからの選択(_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量)), LL1), 整列(LL1,LL2), 表示する(LL2). 受注番号候補を得る(_受注日下限,_受注日上限,_カテゴリ,_納品番号,_受注番号ならび) :- findsetof(_受注番号,( メイン(_受注番号,_受注日,_注文社), 受注日 @>= _受注日下限, 受注日 @=< _受注日上限, サブ(_連番,_受注番号,_商品コード,_数量), 商品(_商品コード,_商品名,_カテゴリ,_納品番号)), _受注番号ならび). 受注番号を鍵にデータベースを結合(_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量) :- メイン(_受注番号,_受注日,_注文社), サブ(_連番,_受注番号,_商品コード,_数量), 商品(_商品コード,_商品名,_カテゴリ,_納品番号). 表示する(LL) :- write('受注番号 受注日 注文者 商品コード 商品名 数量\n'), append(_,[[_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量]|R],LL), writef('%10l %8l %8c %8c %8c %14l %8r\n',[_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量]), R = []. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/41 # ●正規表現の使用環境 # c# # # ●検索か置換か? # 検索 # # ●説明 # 一番長い数字の連続を検索したいです # # ●対象データ # hogehoge120_hoge001218hoge1 # # ●希望する結果 # 001218 # # 一番長い数字の連続を検索したいです(_文字列,_前文字列,_適合文字列,_後文字列) :- '数字文字列の位置・長さの選択'(_文字列,L), 最大長の数字文字列(L,_文字列,_前文字列,_適合文字列,_後文字列). '数字文字列の位置・長さの選択'(_文字列,L) :- findall([P2,P1,P3],( sub_atom(_文字列,P1,P2,P3,S1,S2,S3,L1,L2,L3), 全て数字(L2), \+((last(L1,A),数字(A))), \+((L3=[B|_],数字(B)))), L). 最大長の数字文字列(L,_文字列,_前文字列,_適合文字列,_後文字列) :- max(L,[_最大長,_,_]), member([_最大長,P1,P3],L), 文字列の切り取り(_文字列,P1,_最大長,P3,_前文字列,_適合文字列,_後文字列). 文字列の切り取り(_文字列,P1,P2,P3,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,P1,P2,P3,_適合文字列), sub_atom(_文字列,0,P1,_,_前文字列), sub_atom(_文字列,P1+P2,_,0,_後文字列). 数字(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']). 全て数字([]). 全て数字([A|R]) :- 数字(A), 全て数字(R). % 以下のサイトは # 出典::正規表現 Part9 #101 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 置換 # # ●説明 # 文字列の先頭の部分のカッコを消したい # # ●対象データ # (hoge)あいうえお # # ●希望する結果 # hogeあいうえお # # よろしくお願いします # # 文字列の先頭の部分のカッコを消したい(_文字列,_置換した文字列) :- atom_chars(_文字列,_文字ならび), 文字ならびの先頭の部分のカッコを消す(_文字ならび,_置換した文字ならび), atom_chars(_置換した文字列,_置換した文字ならび). 文字ならびの先頭の部分のカッコを消す(_文字ならび,_置換した文字ならび) :- 先頭部分のカッコ内の文字ならびと残り文字ならびを得る(_文字ならび,_カッコ内の文字ならび,_残り文字ならび), カッコ内の文字ならびと残り文字ならびを結合する(_カッコ内の文字ならび,_残り文字ならび,_置換した文字ならび). 先頭部分のカッコ内の文字ならびと残り文字ならびを得る(_文字ならび,_カッコ内の文字ならび,_残り文字ならび) :- append(['('|_カッコ内の文字ならび],[')'|_残り文字ならび],_文字ならび), カッコ内の文字ならびはカッコを含まない(_カッコ内の文字ならび),!. カッコ内の文字ならびはカッコを含まない(_カッコ内の文字ならび) :- \+(member('(',_カッコ内の文字ならび)), \+(member(')',_カッコ内の文字ならび)). カッコ内の文字ならびと残り文字ならびを結合する(_カッコ内の文字ならび,_残り文字ならび,_置換した文字ならび) :- append(_カッコ内の文字ならび,_残り文字ならび,_置換した文字ならび). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/103 # あけましておめでとう # # ●正規表現の使用環境 # perl5 # # ●検索か置換か? # 置換 # # ●説明 # 全角,句読点と半角の間を消したい # 半角と半角は無視 # ●対象データ # みんなの憧れ Justin Drew Bieber が大好き # 私だけの Justin が欲しい # やっぱ Bieber 、Bieber って響きがいいよね # # ●希望する結果 # みんなの憧れJustin Drew Bieberが大好き # 私だけのJustinが欲しい # やっぱBieber、Bieberって響きがいいよね # # # 今までは([ぁ-煕]+)と([0-9A-Za-z]+)を組み合わせて何回もやっていたのですが # 例題の1行目の様な物が煩わしいので一括に処理したいです # お願いします # '全角,句読点と半角の間を消したい。半角と半角は無視'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 半角に挟まれていない空白の連続ならび(L1,L2,L3), '全角,句読点と半角の間を消したい 半角と半角は無視'(_S3,_置換された文字列_2), concat_atom([S1,S2,_置換された文字列_2],_置換された文字列),!. '全角,句読点と半角の間を消したい。半角と半角は無視'(_文字列,_文字列). 半角に挟まれていない空白の連続ならび(L1,L2,L3) :- 全て空白(L2), \+((last(L1,A),半角文字(A),L3=[C|_],半角文字(C))). 全て空白([]). 全て空白([' '|R]) :- 全て空白(R). 半角文字(' ') :- !,fail. 半角文字(_文字) :- char_code(_文字,_文字コード), _文字コード < 256. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/151 # ●JavaScriptかPHP(なければなんでも) # ●置換 # ●現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込むことできましたっけ? # ●あいうあいうあいう・・・ # ●1あいう2あいう3あいう・・・ # # # 検索パターン(L2,_検索パターン) :- L2 = _検索パターン.\ '現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込む'(_文字列,_検索パターン,_置換された文字列) :- '現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込む'(_文字列,[],_検索パターン,_置換された文字列). '現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込む'(_文字列,Ln,_検索パターン,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 検索パターン(L2,_検索パターン), length([_|Ln],Length), '現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込む'(S3,[_|Ln],_検索パターン,_置換された文字列_2), concat_atom([S1,Length,S2,_置換された文字列_2],_置換された文字列). '現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込む'(_文字列,_,_文字列). % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1316769778/411 # 質問です。DBはSQLite3です。 # 構成が同じなので../test/read.cgi/db/1316769778/244のテーブルを説明に使わせてもらいます # # shop # id name # 1 Aカンパニー # 2 Bカンパニー # 3 Cカンパニー # # area # 1 北海道 # 2 青森 # 3 岩手 # 4 秋田 # # shop_area # shop_id area_id # 1 1 # 1 2 # 1 3 # 2 2 # 2 4 # 3 2 # 3 3 # # # 北海道なら、Bカンパニー・Cカンパニー # 青森なら、無し # 岩手なら、Bカンパニー # 秋田なら、Aカンパニー・Cカンパニー # 北海道・秋田なら、Cカンパニー # # 除外検索の要領で、対象の支社が無い会社を呼び出したい時はどうすればよいのでしょうか # '除外検索の要領で、対象の支社が無い会社を呼び出す' :- '除外検索の要領で、対象の支社が無い会社を呼び出す'(_地域ならび,_対象の支社が無い会社ならび), concat_atom(_地域ならび,'・',S1), concat_atom(_対象の支社が無い会社ならび,'・',S2), writef('%tなら、%t\n',[S1,S2]), fail. '除外検索の要領で、対象の支社が無い会社を呼び出す'. '除外検索の要領で、対象の支社が無い会社を呼び出す'(_地域ならび,_対象の支社が無い会社ならび) :- findall([_area_name,_対象の支社が無い会社ならび],( '対象の支社が無い会社を呼び出す'(_area_name,_対象の支社が無い会社ならび)), L1), findsetof(_対象の支社が無い会社ならび,( append(_,[[_,_対象の支社が無い会社ならび]|_],L1)), _対象の支社が無い会社ならびパターン), append(_,[_対象の支社が無い会社ならび|_],_対象の支社が無い会社ならびパターン), findall(_area_name,( append(_,[[_area_name,_対象の支社が無い会社ならび]|_],L1)), _地域ならび). '対象の支社が無い会社を呼び出す'(_area_name,_対象の支社が無い会社ならび) :- area(_area_id,_area_name), findsetof([_shop_id,_name],( shop_area(_shop_id,_area_id), shop(_shop_id,_name)), L1), findall(_name,( append(_,[[_shop_id,_name]|_],L1), \+(shop_area(_shop_id,_area_id))), _対象の支社が無い会社ならび). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/157 # ●正規表現の使用環境 # PHP 5.2 で出来ればpreg_replace()で。 # # ●検索か置換か? # 置換 # # ●説明 # "/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したいです。 # fooの文字数は不定です。 # # ●対象データ # /foo/bar/baz/qux/ # /qwert/asd/fghjk/klzxv/ # /qazwsx/edc/rfvt/gbyhnu/ # /4756/78674/45756/34545/4564/546/ # # ●希望する結果 # /home/bar/baz/qux/ # /home/asd/fghjk/klzxv/ # /home/edc/rfvt/gbyhnu/ # /home/78674/45756/34545/4564/546/ # # '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,_,S3,_,L2,_), L2 = [/,f,o,o,/], '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(S1,S3,_置換された文字列),!. '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(_文字列,_文字列). '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(S1,S3,_置換された文字列) :- concat_atom([S1,'/home/',S3],_置換された文字列). '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(S1,S3,_置換された文字列) :- '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(S3,_置換されたS3), concat_atom([S1,'/home/',_置換されたS3). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/159 # ●正規表現の使用環境 # テキスト # # ●検索か置換か? # 置換 # # ●説明 # 文章内の指定した数の改行毎に、行を一段開けたい。 # 下記例文なら改行三つごとに行を一段開けたい。 # # ●対象データ # (例文) # 人は誰しも初体験にはほろ苦く、甘酸っぱい思い出があるものだが、人生の諸先輩方はどんな童貞喪失体験をしたのか? # 「シリーズ初体験」−−現在70歳の会社役員(兵庫県)が当時の思い出を語った。 # 中学2年の時、国語の女教師に「勉強を教えてあげるから家においで」といわれ、夏休みに入ってすぐに先生の家を訪れました。 # 教師になって3年目、美人ではないけれど、私にとっては優しいお姉さんのような存在でした。 # 何人かいるのかなと思ったんですが、先生の家に行くと私の他は誰もいませんでした。 # 勉強を教わり、夕食をご馳走になり、その日は泊めてもらいました。 # 夜中、下半身がもぞもぞするので目が覚めると、先生が私の浴衣の裾を広げていました。 # # ●希望する結果 # 人は誰しも初体験にはほろ苦く、甘酸っぱい思い出があるものだが、人生の諸先輩方はどんな童貞喪失体験をしたのか? # 「シリーズ初体験」−−現在70歳の会社役員(兵庫県)が当時の思い出を語った。 # 中学2年の時、国語の女教師に「勉強を教えてあげるから家においで」といわれ、夏休みに入ってすぐに先生の家を訪れました。 # # 教師になって3年目、美人ではないけれど、私にとっては優しいお姉さんのような存在でした。 # 何人かいるのかなと思ったんですが、先生の家に行くと私の他は誰もいませんでした。 # 勉強を教わり、夕食をご馳走になり、その日は泊めてもらいました。 # # 夜中、下半身がもぞもぞするので目が覚めると、先生が私の浴衣の裾を広げていました。 # ------------------------- # よろしくお願いします。 # # '文章内の指定した数の改行毎に、行を一段開ける'(_ファイル,_n行毎) :- get_lines(_ファイル,Lines), 'n行毎に改行を挿入する'(Lines,Lines2), 表示する(_ファイル,Lines2). 'n行毎に改行を挿入する'([A,B,C|R1],[A,B,C,'\n'|R2]) :- 'n行毎に改行を挿入する'(R1,R2),!. 'n行毎に改行を挿入する'(L,L). 表示する(_ファイル,Lines) :- put_lines(_ファイル,Lines). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/197 # ●正規表現の使用環境 # 秀丸エディタ # ●検索か置換か? # 置換 # ●説明 # <div class="main">の場合に限り、両端のdivをspanに置換したい。 # ※<div class="main">から</div>までの行数は、3行だったり5行だったりと色々変わります。 # ●対象データ # <div class="main">あああああ<br> # いいいいい<br> # ううううう<br> # えええええ<br> # おおおおお<br> # </div> # # ●希望する結果 # <span class="main">あああああ<br> # いいいいい<br> # ううううう<br> # えええええ<br> # おおおおお<br> # </span> # # # 下の正規表現を作ってみたのですが検索でマッチしません。 # どなたか助言頂けるとうれしいです。 # よろしくお願いいたします。 # # 置換元 # <div class="main">(.*\n*)</div> # 置換先 # <span class="main">\1</span> # 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換する'(_文字列,_置換された文字列) :- mainからspanへの置換(_文字列,_前文字列,_置換されたdiv部,_後文字列,_置換された文字列), 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換する'(_文字列,_前文字列,_置換されたdiv部,_後文字列,_置換された文字列). 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換する'(_文字列,_文字列). 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換数'(_文字列,_前文字列,_置換されたdiv部,_後文字列,_置換された文字列) :- concat_atom([_前文字列,_置換されたdiv部,_後文字列],_置換された文字列). 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換数'(_文字列,_前文字列,_置換されたdiv部,_後文字列,_置換された文字列) :- 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換する'(_後文字列,_置換された後文字列), concat_atom([_前文字列,_置換されたdiv部,_置換された後文字列],_置換された文字列). mainからspanへの置換(_文字列,_前文字列,_置換された文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[<,d,i,v,' ',c,l,a,s,s,=,'"',m,a,i,n,'"',>|R2],L3), append(L2_2,[<,/,d,i,v,>],R2), append([<,s,p,a,n,' ',c,l,a,s,s,=,'"',m,a,i,n,'"',>|L2_2],[<,/,s,p,a,n,>],L2_3), concat_atom(L2_3,_置換された文字列),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/224 # 全角文字(2バイト文字?)だけを検索するには # なんと書くんでしょうか? # # '全角文字(2バイト文字?)だけを検索する'(_文字列,_前文字列,_適合文字,_後文字列) :- sub_atom(_文字列,_,1,_,前文字列,_適合文字列,_後文字列,_,_,_), char_code(_適合文字列,_文字コード), _文字コード > 255. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/229 # 2時間ほど悩みましたが、解決方法が見つからないので教えて下さい。 # 検索条件 ★で始まり、間に「あ」を挟み、★でおわる # ★と「あ」の間にはx文字(0〜10文字)ランダムに挟まっている # 例文 # ★123あ133s★124か1256★863あ13qw3s★1rtyさ12fd★あ1s★ # 抜き出したい箇所 # ★123あ133s★ # ★863あ13qw3s★ # ★あ1s★ # どなたか頭のいいかた解決方法教えて下さい。 # # '★で始まり、間に「あ」を挟み、★でおわる。★と「あ」の間にはx文字(0〜10文字)ランダムに挟まっている '(_文字列,_前文字列,_適合文字列,_後文字列) :- '★で始まり、間に「あ」を挟み、★でおわる。'(_文字列,_前文字列,_適合文字列,L0,R2_2), '★と「あ」の間にはx文字(0〜10文字)ランダムに挟まっている'(L0,R2_2). '★で始まり、間に「あ」を挟み、★でおわる。'(_文字列,_前文字列,_適合文字列,L0,R2_2) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[★|R2],L3), append(R2_1,[★],R2), append(L0,[あ|R2_2],R2_1), 間に挟んではいけない(R2_1,L0,R2_2). 間に挟んではいけない(R2_1,L0,R2_2) :- \+(member(★,R2_1)), \+(member(あ,L0)), \+(member(あ,R2_2)). '★と「あ」の間にはx文字(0〜10文字)ランダムに挟まっている'(L0,R2_2) :- length(L0,Len1), length(R2_2,Len2), Len1 =< 10, len2 =< 10. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1309076891/732 # 【 課題 】超初心者なので理解できない点がありましたらすみません。 # 以下のイベント処理を行うアプレット作成をしたいと思っています。 # (インターフェースは無題.jpgを参照) # # 1、アプレットを起動すると「単語<tab>数字列」の組み合わせが # 格納されているテキストindex.txtを読み込み # 数字列の長さが最長〜9位までの単語(二字熟語〜四字熟語に限定する) # をコンポーネントのボタンのラベルに格納していき表示させる。 # (どのボタンのラベルに単語を格納するかは自由) #                                                                                             # 2、ボタンを押すとラベル(単語)に # 対応した数列をindex.txtから検索して見つけ # その数列をテキストファイルに出力する。  #                                                                                                             # 【 形態 】Applet # 【 GUI  】AWTのみ # 【 期限 】1月22日 # 【 Ver  】java version "1.7.0_02" # 【 補足 】なし # 無題.jpg(現在のアプレット) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2542721.jpg.html # index.txt(「単語<tab>数字列」の組み合わせが入っているテキストファイル) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2542722.txt.html # NounFreq.java(現在のアプレットを表示させているソースコード) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2542718.java.html # よろしくお願いします。 # # # # '「単語<tab>数字列」の組み合わせが格納されているテキストindex.txtを読み込み数字列の長さが最長〜9位までの単語(二字熟語〜四字熟語に限定する)を表示する' :- '「単語<tab>数字列」の組み合わせが格納されているテキストindex.txtを読み込み'(LL), '数字列の長さが最長〜9位までの単語(二字熟語〜四字熟語に限定する)を'(_単語ならび), 表示する(_単語ならび). '「単語<tab>数字列」の組み合わせが格納されているテキストindex.txtを読み込み'(LL) :- get_split_lines('index.txt',[','],LL). '最長〜9位までの単語(二字熟語〜四字熟語に限定する)を'(LL,_単語ならび) :- 要素数で逆順に整列して(LL,LL4), '最長〜9位までの'(LL4,_単語ならび), 単語を表示する(_単語ならび). 要素数で逆順に整列して(LL,LL4) :- findall([_要素数,_単語],( member([_単語|R],LL), length(R,_要素数)), LL2), sort(LL2,LL3), reverse(LL3,LL4). '最長〜9位までの'(LL4,_単語ならび) :- length(L0,9), append(L0,_,LL4). '単語を表示する'(_単語ならび) :- append(_,[[_,_単語]|R],_単語ならび), writef('%t\n',[_単語]), R = []. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/368 # お願いします # # ●正規表現の使用環境 # PHP5 # # ●検索か置換か? # 置換 # # ●説明 # 0123456789アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンABCDEFGHIJKLMNOPQRSTUVWXYZ゙ ゚\「」,.()-/ # # preg_replace関数を使い上記文字以外を全て削除したい # # ●対象データ # 0ガ9ギAグアaイbウcエdオ # # ●希望する結果 # 09Aアイウエオ # '0123456789アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンABCDEFGHIJKLMNOPQRSTUVWXYZ゙ ゚\\「」,.()-/ preg_replace関数を使い上記文字以外を全て削除したい'(_文字列,_置換された文字列) :- atom_chars('0123456789アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンABCDEFGHIJKLMNOPQRSTUVWXYZ゙ ゚\\「」,.()-/',_削除しない文字ならび), findall(_文字,( sub_atom(_文字列,_,1,_,_文字), member(_文字,_削除しない文字ならび)), _選択された文字ならび), concat_atom(_選択された文字ならび,_置換された文字列). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/461 # ●正規表現の使用環境 # linux 2.6系 grep / Scientific Linux 6.1 # # ●検索か置換か? # 検索 # # ●説明 # IPアドレス(xxx.xxx.xxx.xxx IPv4)にヒットさせたい # # ●対象データ # 192.168.0.1 # 255.255.255.0 # 999.999.999.999(注:IPアドレスとして許容されていない) # # ●試した正規表現 # "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" # # 今回の検索では目視で判別できましたが、 # 999.999.999.999←これにヒットしてしまう等、致命的な部分があります。 # # ご教示いただければ幸いです。 # # # 'IPアドレス(xxx.xxx.xxx.xxx IPv4)にヒットさせたい'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), 数字とピリオドのみ(L2), \+((last(L1,A),数字(A))), \+((L3=[B|_],数字(B))), split(_適合文字列,['.'],[N1,N2,N3]), 'IPアドレス範囲'([N1,N2,N3]). 数字とピリオドのみ([]). 数字とピリオドのみ([A|R]) :- member(A,['.','0','1','2','3','4','5','6','7','8','9']), 数字とピリオドのみ(R). 'IPアドレス範囲'([]). 'IPアドレス範囲'([N|R]) :- N >= 0, N =< 255, 'IPアドレス範囲'(R). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/458 # ●正規表現の使用環境 # wxWidets (wxRegEx) # # ●検索か置換か? # 検索 # # ●説明 # 一行の中に丸括弧で閉じられた文字列を検索したい。 # 丸括弧が出てくる位置や数は不定です # # ●対象データ # (2012年2月)北海道で撮影。(raw)で保存。猫と一緒(雄) # # ●希望する結果 # (2012年2月) (raw) (雄) # # (\\(.*?\\))で検索すると、"(2012年2月)"だけ検索されます。 # (\\(.*?\\))(?:.*)(\\(.*?\\))(?:.*)(\\(.*?\\))で検索すると(2012年2月)(raw)(雄)が検索されます。 # ただ括弧の位置が変わった場合には、この正規表現では検索にかからなくなります。 # # サクラテキストエディタ等の正規表現で検索すると、(\\(.*?\\)) 文章内にいくつ括弧文字列があっても # すべて検索されています。 # # 正規表現でどのように書けばいいのか、それとも、プログラム上で検索しているのかわかりません。 # どのように実現しているかまったくわかりません。 # # 考え方などをおしえてくださいませ。 # # '一行の中に丸括弧で閉じられた文字列を検索したい。丸括弧が出てくる位置や数は不定です'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 丸括弧に挟まれた文字列(L2,_適合文字列), concat_atom([S1,'('],_前文字列), concat_atom([')',S3],_後文字列). 丸括弧に挟まれた文字列(L2,_適合文字列) :- append(['('],L2_1,[')'],L2), \+(member('(',L2_1)), \+(member(')',L2_1)), atom_chars(_適合文字列,L2_1). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1328276597/190 # [1] 授業単元:C言語 # [2] リスト構造を使ったアドレス帳の作成。  # リスト構造で管理し次の機能が実現できること。 # •追加(データの新規登録) # •削除(任意のデータの削除) # •探索(任意のデータの詳細表示) # •一覧表示 # •データのソー扱うデータは氏名、住所、電話番号、eメールアドレス # http://ime.nu/ideone.com/lMgd3 # :- dynamic(アドレス帳/1). 追加(_氏名,_住所,_電話番号,_eメールアドレス) :- retract(アドレス帳(_追加前のアドレス帳)), 追加(_氏名,_住所,_電話番号,_eメールアドレス,_追加前のアドレス帳),!. 追加(_氏名,_住所,_電話番号,_eメールアドレス) :- asserta(アドレス帳([[_氏名,_住所,_電話番号,_eメールアドレス]]). 追加(_氏名,_住所,_電話番号,_eメールアドレス,_現在のアドレス帳) :- member([_氏名,_住所,_電話番号,_eメールアドレス],_現在のアドレス帳), asserta(アドレス帳(_現在のアドレス帳)), writef('追加指定された %t,%t,%t,%t,%t は既に登録されています\n',[_氏名,_住所,_電話番号,_eメールアドレス]),!. 追加(_氏名,_住所,_電話番号,_eメールアドレス,_追加前のアドレス帳) :- asserta(アドレス帳([[_氏名,_住所,_電話番号,_eメールアドレス]|_追加前のアドレス帳]). 削除(_氏名,_住所,_電話番号,_eメールアドレス) :- retract(アドレス帳(_削除前のアドレス帳)), 削除(_氏名,_住所,_電話番号,_eメールアドレス,_削除前のアドレス帳),!. 削除(_氏名,_住所,_電話番号,_eメールアドレス) :- asserta(アドレス帳([])). 削除(_氏名,_住所,_電話番号,_eメールアドレス,_削除前のアドレス帳) :- append(L0,[[_氏名,_住所,_電話番号,_eメールアドレス]|R],_削除前のアドレス帳), append(L0,R,_削除後のアドレス帳), asserta(アドレス帳(_削除後のアドレス帳)),!. 削除(_氏名,_住所,_電話番号,_eメールアドレス,_現在のアドレス帳) :- asserta(アドレス帳(_現在ののアドレス帳)), writef('指定された %t,%t,%t,%t で削除するべきアドレスは発見できませんでした\n',[_氏名,_住所,_電話番号,_eメールアドレス,_現在のアドレス帳]). 探索(_鍵項目ならび) :- list(_鍵項目ならび), 探索組生成(_鍵項目ならび,_組), 組表示(_組). 探索(_鍵項目,_鍵の値) :- 検索組生成(_鍵項目,_鍵の値,_組), 組表示(_組). 一覧表示 :- アドレス帳(_アドレス帳), writef('%20r,%32r,%14r,%64l\n',[氏名,住所,電話番号,eメールアドレス]), append(_,[[_氏名,_住所,_電話番号,_eメールアドレス]|R],_アドレス帳), writef('%20r,%32r,%14r,%64l\n',[_氏名,_住所,_電話番号,_eメールアドレス]), R = []. 探索組生成([],_). 探索組生成([[_鍵,_鍵の値]|R],_組) :- 検索組生成(_鍵,_鍵の値,_組), 探索組生成(R,_組). 検索組生成(氏名,_鍵の値,[_鍵の値,_,_,_]). 検索組生成(住所,_鍵の値,[_,_鍵の値,_,_]). 検索組生成(電話番号,_鍵の値,[_,_,_鍵の値,_]). 検索組生成(eメールアドレス,_鍵の値,[_,_,_,_鍵の値]). 組表示(_組) :- アドレス帳(_アドレス帳), append(_,[_組|R],_アドレス帳), writef('%t,%t,%t,%t\n',_組), R = []. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/563 # ●正規表現の使用環境 # PHP5.3 # # ●検索か置換か? # 置換 # # ●説明 # ページ内にある<h2>〜<h6>に対して内側に<span>を入れたいです。 # hタグににclassがある場合なども想定されますがそれは引き継ぎたいです。 # 何卒ご教授お願いいたします。 # # ●対象データ # <h2>あああああ</h2> # <h2 class="hoge">あああああ</h2> # <h2><span>あああああ</span></h2> # 以下h6まで同様 # <h6>あああああ</h6> # <h6 class="hoge">あああああ</h6> # <h6><span>あああああ</span></h6> # # ●希望する結果 # <h2><span>あああああ</span></h2> # <h2 class="hoge"><span>あああああ</span></h2> # <h2><span>あああああ</span></h2> # 以下h6まで同様 # <h6><span>あああああ</span></h6> # <h6 class="hoge"><span>あああああ</span></h6> # <h6><span>あああああ</span></h6> # # 'ページ内にある<h2>〜<h6>に対して内側に<span>を入れたい'(_文字列,_置換された文字列) :- 'Hタグを見つけて、情報を分離する'(_文字列,_前文字列,_前タグ,_中間情報,_後タグ,_後文字列), 'spanタグを付加'(_中間情報,_spanタグに挟まれた中間情報), 'ページ内にある<h2>〜<h6>に対して内側に<span>を入れたい'(_後文字列,_置換された文字列_2), concat_atom([_前文字列,_前タグ,_spanタグに挟まれた中間情報,_後タグ,_置換された文字列_2],_置換された文字列),!. 'ページ内にある<h2>〜<h6>に対して内側に<span>を入れたい'(_文字列,_文字列). 'Hタグを見つけて、情報を分離する'(_文字列,_前文字列,_前タグ,_中間情報,_後タグ,_後文字列) :- 前タグ(_文字列,_前文字列,_前タグ,A,_残り文字列), '中間情報・後タグ・後文字列'(_残り文字列,A,_中間情報,_後タグ,_後文字列),!. 前タグ(_文字列,_前文字列,_前タグ,A,_残り文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_前タグ,_残り文字列,L1,['<',h,A|R1],L3), 選択できる数字(A), append(L1_1,['>'],R1), \+(member('>',L1_1)),!. '中間情報・後タグ・後文字列'(_文字列,A,_中間情報,_後タグ,_後文字列) :- concat_atom(['<','/',h,A,'>'],_後タグ), sub_atom(_文字列,St,_,_,_中間情報,_後タグ,_後文字列,L1,L2,L3),!. 選択できる数字(A) :- member(A,['2','3','4','5','6']). 'spanタグの付加'(_中間情報,_spanタグに挟まれた中間情報) :- concat_atom(['',_中間情報,''],_spanタグに挟まれた中間情報). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1328439334/333 # # Prologに於ける文字置換のパターンを示す # # 文字列を検索して、適合パターンを置換していく行全体を置換したら終了 # 文字列置換(_文字列,_置換された文字列) :- 置換文字列定義を差分リストに変換する, atom_chars(_文字列,Chars), ならび置換(Chars,_置換されたChars), atom_chars(_置換された文字列,_置換されたChars). ならび置換([],[]). ならび置換(L1,L2) :- 置換ならび定義(L1,R1,L2,R2), ならび置換(R1,R2),!. ならび置換([A|R1],[A|R2]) :- ならび置換(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 置換文字列定義を差分リストに変換する :- abolish(置換ならび定義/4), clause(置換文字列定義(_文字列,_置換する文字列),_本体), 差分リストを構成する(_文字列,_置換する文字列,L1,R1,L2,R2), assertz((置換ならび定義(L1,R1,L2,R2) :- _本体)), fail. 置換文字列定義を差分リストに変換する. 差分リストを構成する(_文字列,_置換する文字列,L1,R1,L2,R2) :- atom_chars(_文字列,Chars_1), atom_chars(_置換する文字列,Chars_2), append(Chars_1,R1,L1), append(Chars_2,R2,L2). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1328439334/333 # # Prologに於ける文字置換のパターンを示す # # 置換対象文字列に出会う度に非決定性で置換される事を基本として # 併せて、置換回数が最大になるような置換述語を定義する # # 文字列を検索して、適合パターンを置換していく # 1) 文字列の先頭から検索パターンに適合する文字列の前の文字列 # 2) 検索パターンに適合した文字列 # 3) 検索パターンに適合した文字列より後の文字列 # # 2) 検索パターンに適合した文字列を置換文字列に置き換える # 置換文字列定義(def,'DEF'). '置換回数が最大になるような文字列置換'(_文字列,_置換された文字列) :- findall([_置換された回数,_置換された文字列],( '置換パターン'(_文字列,_置換された回数,_置換された文字列)), LL), findmax(N,( member([N,_],LL)), Max), member([Max,_置換された文字列],LL). '置換パターン'(_文字列,_置換された文字列) :- '置換回数付き置換パターン'(_文字列,0,_,_置換された文字列). '置換回数付き置換パターン'(_文字列,_置換された回数_1,_置換された回数,_置換された文字列) :- sub_atom(_文字列,_先頭位置,_長さ,_,_適合文字列_1), 置換文字列定義(_適合文字列_1,_置換する文字列), sub_atom(_文字列,0,_先頭位置,_,_前文字列_1), sub_atom(_文字列,_先頭位置+_長さ,_,0,_後文字列_1), _置換された回数_2 is _置換された回数_1 + 1, '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数_2,_置換された回数,_置換された文字列). '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数,_置換された回数,_置換された文字列) :- concat_atom([_前文字列_1,_置換する文字列,_後文字列_1],_置換された文字列). '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数_1,_置換された回数,_置換された文字列) :- '置換回数付き置換パターン'(_後文字列_1,_置換された回数_1,_置換された回数,_置換された文字列_2), concat_atom([_前文字列_1,_置換する文字列,_置換された文字列_2],_置換された文字列). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/595 # ●正規表現の使用環境 # C# # # ●検索か置換か? # 置換 # # ●説明 # りんご=20 以外を削除したい # # ●対象データ # みかん10 りんご20 バナナ30 # いちご40 めろん20 りんご20 # # ●希望する結果 # りんご20 # りんご20 # # よろしくお願いします # # 'りんご=20 以外を削除したい'(_文字列,_部分削除された文字列) :- sPLIT(_文字列,[' ','\n'],L), findall(A,( member(A,L), 置換(A)), L1), 部分削除文字列に変換(L1,_部分削除された文字列). 置換('りんご20'). 置換('\n'). 部分削除文字列に変換(L1,_部分削除された文字列) :- ならびを整形する(L1,L2), concat_atom(L2,_部分削除された文字列). ならびを整形する([],[]). ならびを整形する([A],[A]) :- \+(A = '\n'),!. ならびを整形する(['\n'|R1],R2) :- ならびを整形する(R1,R2),!. ならびを整形する([A,'\n'|R1],[A,'\n'|R2]) :- ならびを整形する(R1,R2),!. ならびを整形する([A,B|R1],[A,' '|R2]) :- ならびを整形する([B|R1],R2). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/595 # ●正規表現の使用環境 # C# # # ●検索か置換か? # 置換 # # ●説明 # りんご=20 以外を削除したい # # ●対象データ # みかん10 りんご20 バナナ30 # いちご40 めろん20 りんご20 # # ●希望する結果 # りんご20 # りんご20 # # よろしくお願いします # # 検索文字列(りんご20). 'りんご=20 以外を削除したい'(_文字列,_部分削除された文字列) :- findall(_検索文字列,( 検索文字列(_検索文字列)), _検索文字列ならび), 検索文字列と改行だけを切り出す(_文字列,_検索文字列ならび,L1), ならびを整形する(L1,L2), concat_atom(L2,_部分削除された文字列). 検索文字列と改行だけを切り出す(_文字列,_検索文字列ならび,L) :- sPLIT(_文字列,['\n'|_検索文字列ならび],L1), findall(_検索文字列,( member(_検索文字列,L1), member(_検索文字列,_検索文字列ならび)), L). ならびを整形する([],[]). ならびを整形する([A],[A]) :- \+(A = '\n'),!. ならびを整形する(['\n'|R1],R2) :- ならびを整形する(R1,R2),!. ならびを整形する([A,'\n'|R1],[A,'\n'|R2]) :- ならびを整形する(R1,R2),!. ならびを整形する([A,B|R1],[A,' '|R2]) :- ならびを整形する([B|R1],R2). % 以下のサイトは ?- 'a##'. http://toro.2ch.net/test/read.cgi/tech/1323566370/606 # 問い合せフォームから来たメールアドレスを正規表現を用いて抽出したいのですが # 秀丸メールを使っておりメール全文をテキスト化したものの中に以下の文章が含まれています # # ▼メールアドレス # aaaaaaaaaa@aaaaaaaaa.com # # ▼メールアドレスという文字列の下にある行だけを検索することは可能でしょうか? # # メールアドレスにマッチする正規表現を使用するとヘッダー内のよくわからないアドレスまで抽出されてしまい # とても面倒くさいのでどうにか文章の下にある行のみを抽出という手段を取りたいのです # # どうか解決策をご教授ください # '▼メールアドレスという文字列の下にある行だけを検索する'(_文字列,_前文字列,_下にある行,_後文字列,_メールアドレスならび) :- sPLIT(_文字列,['\n'],L), '▼メールアドレスという文字列の下にある行'(L,_前文字列,_下にある行,_後文字列), メールアドレスを検索(_下にある行,_メールアドレスならび). '▼メールアドレスという文字列の下にある行'(L,_前文字列,_下にある行,_後文字列) :- append(L0,[A,'\n',_下にある行,'\n'|R],L), sub_atom(A,_,8,_,'▼メールアドレス'), concat_atom(L0,S1), concat_atom([S1,A,'\n'],_前文字列), concat_atom(R,_後文字列). メールアドレスを検索(_行,_メールアドレスならび) :- findall(S2,( sub_atom(_行,_,_,_,S1,S2,S3,L1,L2,L3), メールアドレス形式(S2), 前後がアルファベットでない(S1,S3)), _メールアドレスならび). メールアドレス形式(S) :- split(S2,['@'],[U1,U2]), アルファベット(A), アルファベット(B). 前後がアルファベットでない(S1,S3) :- \+((last(S1,A),アルファベット(A))), \+((sub_atom(S3,0,1,_,B),アルファベット(B))). アルファベット('-') :- !. アルファベット('_') :- !. アルファベット('~') :- !. アルファベット(A) :- A @>= '0', A @=< '9',!. アルファベット(A) :- A @>= 'A', A @=< 'Z',!. アルファベット(A) :- A @>= 'a', A @=< 'z',!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/668 # 秀丸エディタのgrep(HMJRE.DLL V1.79)で # "hoge"という単語を検索するときに # '.'に続くもの以外を全て検索したいときの書き方を教えてください。 # # " hoge" ",hoge" 等は検索したいけど # ".hoge"は検索したくありません # # # '.に続くもの以外を全て検索したい'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,_,_), \+((sub_atom(_前文字列,_,1,0,'.'))). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1328276597/557 # 初めて書き込みます。よろしくお願い致します。固定長バイトの文字列の中の一部を抜き出すところがわかりませんでした。 # 1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上の # それぞれのテキストデータ・ファイルがある。 # 文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を # 比較し、 # 同じなら、文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を # 置き換える。 # 文字列Bの4カラム目が50バイト以下なら " "空白で埋める。 # 50バイトより大きい場合50バイトまでの大きさを対象とする。 # # 置き換え対象領域は日本語全角漢字含む文字列となる。 # 文字列Aの対象領域は2バイトx20文字+1バイト10文字で整形されている。 # 文字列AはSolaris10上のファイル。文字列BはエクセルファイルをCSV保存してFFFTPでSolaris10へコピーしたもの。 # 文字コード:文字列A(EUC-JP)、文字列B(sjis2eucで変換) # # 1ー77バイトが1バイト、77ー126が変換対象。126ー150が1バイトです。 '文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上のそれぞれのテキストデータ・ファイルがある。' :- get_lines('文字列A',Lines1), get_lines('文字列B',Lines2), '文字列Aの全行を置換する'(Lines1,Lines2,Lines3), 'Lines3を文字列Aに書き戻す'(Lines3,_文字列A),!. '文字列Aの全行を置換する'([],_,[]) :- !. '文字列Aの全行を置換する'([_文字列A|R1],Lines2,[_置換した文字列|R3]) :- 'Lines2を検索して文字列Aを置換する'(_文字列A,Lines2,_置換した文字列), '文字列Aの全行を置換する'(R1,Lines2,R3). 'Lines2を検索して文字列Aを置換する'(_文字列A,[],_文字列A) :- !. 'Lines2を検索して文字列Aを置換する'(_文字列A,[_文字列B|R2],_置換した文字列) :- '文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列),!. 'Lines2を検索して文字列Aを置換する'(_文字列A,[_|R2],_置換した文字列) :- 'Lines2を検索して文字列Aを置換する'(_文字列A,R2,_置換した文字列),!. '文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列) :- split(_文字列B,[' ',','],L), '文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を比較し同じなら'(_文字列A,L), '文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列). '文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列) :- sub_byte_atom(_文字列A,0,76,_,S1), sub_byte_atom(_文字列A,126,_,0,S3), '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2), concat_atom([S1,S2,S3],_置換された文字列),!. '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :- '文字列Bの4カラム目が'(L,S2_1), '50バイト以下なら'(S2_1), '" "空白で埋める'(S2_1,S2),!. '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :- nth1(4,L,S_1), sub_byte_atom(S_1,0,50,_,S2). '文字列Bの4カラム目が50バイト以下なら'(L) :- nth1(4,L,S_1), atom_byte_length(S_1,_長さ), _長さ =< 50,!. '" "空白で埋める'(S2_1,S2) :- length(L2,50), atom_byte_codes(S2_1,L_1), append(L_1,_,L2), 変数を空白に置換(L2), atom_byte_codes(S2,L2),!. 変数を空白に置換([]). 変数を空白に置換([' '|R]) :- 変数を空白に置換(R),!. 変数を空白に置換([A|R]) :- 変数を空白に置換(R). 'Lines3を文字列Aに書き戻す'(Lines3) :- put_lines('文字列A',Lines3). atom_byte_codes(Atom,ByteCodes) :- atom(Atom), atom_codes(Atom,Codes), バイトに分解(Codes,ByteCodes),!. atom_byte_codes(Atom,ByteCodes) :- \+(atom(Atom)), 'ByteCodes2Codes'(ByteCodes,Codes), atom_codes(Atom,Codes),!. 'ByteCodes2Codes'([],[]). 'ByteCodes2Codes'([A,B|R1],[C|R2]) :- A > 127, B > 127, C is 256 * A + B, 'ByteCodes2Codes'(R1,R2),!. 'ByteCodes2Codes'(R1,R2) :- 'ByteCodes2Codes'(R1,R2),!. atom_byte_length(Atom,ByteLength) :- atom_codes(_文字列,Codes), バイトに分解(Codes,ByteCodes), length(ByteCodes). atom_byte_codes(Atom,ByteCodes) :- atom_codes(Atom,Codes), バイトに分解(Code,ByteCodes). sub_byte_atom(_文字列,_スタートバイト位置,_バイト数,_残りバイト,_副文字列) :- atom_codes(_文字列,Codes), バイトに分解(Codes,ByteCodes), sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList), atom_code(_副文字列,SubList). sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList) :- length(L0,_スタートバイト位置), length(L1,_バイト数), append(L0,SubList,L2,ByteCodes), length(L2,_残りバイト),!. バイトに分解([],[]). バイトに分解([A|R1],[B,C|R2]) :- A > 255, B is A // 256, C is A mod 256, バイトに分解(R1,R2),!. バイトに分解([A|R1],[A|R2]) :- バイトに分解(R1,R2). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/729 # 超初心者質問で申し訳ないのですが、 # # javascriptで、 # ABC|DEF|GHI|JKL 等を検索した時に一致した文字列全てを得る方法はありますか? # 更にできればABCとGHIがマッチした場合に、0,2の値が取れれば嬉しいです。 # # 'ABC|DEF|GHI|JKL 等を検索した時に一致した文字列全てを得る方法はありますか? 更にできればABCとGHIがマッチした場合に、0,2の値が取れれば嬉しいです。'(_文字列,_前文字列,_適合文字列,_後文字列,_値) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), 検索した時に一致(_値,_適合文字列). 検索した時に一致(0,'ABC'). 検索した時に一致(1,'DEF'). 検索した時に一致(2,'GHI'). 検索した時に一致(3,'JKL'). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/741 # ●正規表現の使用環境 # PCREライブラリを使用したアプリケーション # # ●検索か置換か? # 置換 # # ●説明 # 括弧内に特定の文字列が有れば対応する括弧を装飾したい # # (例ではCCCを含むものを検索し対応する括弧に*を加える) # # ●対象データ # (AACCCDDAABBB) # (AACAABBDBABC) # CDAA(DB(CC)C)(CDD) # C(AA(ABBD)(BCCC)C) # # ●希望する結果 # (*AACCCDDAABBB*) # (AACAABBDBABC) # CDAA(DB(CC)C)(CDD) # C(AA(ABBD)(*BCCC*)C) # # '括弧内に特定の文字列が有れば対応する括弧を装飾したい'(_文字列,_特定文字列,_置換された文字列) :- sPLIT(_文字列,['(',')',' '],L), findall(_置換された要素,( append(L0,[A|R],L), 要素文字列置換(A,_特定文字列,_置換された要素)), L), atomic_list_concat(L,_置換された文字列). 要素文字列置換(A,_特定文字列,_置換された要素) :- sub_atom(A,_,_,_,_特定文字列), atomic_list_concat(['*',A,'*'],_置換された要素),!. 要素文字列置換(A,_,A). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/745 # ●正規表現の使用環境 # PCREライブラリを使用したアプリケーション # # ●検索か置換か? # 置換 # # ●説明 # HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索 # もし有れば対応する前方タグ内の後ろに@を付けたい # # ●対象データ # <AB><CD>nea##kv</CD>nk#eccu</AB> # nea<YY><EF>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK>#<CD>asiaev</CD>un##ima</KK> # # ●希望する結果 # <AB><CD@>nea##kv</CD>nk#eccu</AB> # nea<YY><EF@>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK@>#<CD>asiaev</CD>un##ima</KK> # # # 'HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_文字列,_置換された文字列) :- タグとデータに分割する(_文字列,_タグとデータならび), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_タグとデータならび,_置換されたタグとデータならび), atomic_list_concat(_置換されたタグとデータならび,_置換された文字列). タグとデータに分割する(_文字列,[_前データ,_タグ|R]) :- データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列), タグとデータに分割する(_残り文字列,R),!. タグとデータに分割する(_文字列,[_文字列]). データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列) :- sub_atom(_文字列,S1,1,_,'<'), sub_atom(_文字列,0,S1,_,_前データ), sub_atom(_文字列,S2,1,_,'>'), Len is S2 - S1 + 1, sub_atom(_文字列,S1,Len,R,_タグ), sub_atom(_文字列,S2_2,R,0,_残り文字列),!. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([],[]) :- !. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([A,B|R1],[A,C|R2]) :- タグである(A), '#が二つ以上ある'(B), sub_atom(A,_,_,2,A_1), atomic_list_concat([A_1,'@>'],C), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,R2),!. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([A|R1],[A|R2]) :- '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,R2). タグである(A) :- sub_atom(A,0,1,_,<), sub_atom(A,_,1,0,>). '#が二つ以上ある'(B) :- count(sub_atom(B,_,1,_,'#'),Count), Count >= 2. % % count/2 % % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/745 # ●正規表現の使用環境 # PCREライブラリを使用したアプリケーション # # ●検索か置換か? # 置換 # # ●説明 # HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索 # もし有れば対応する前方タグ内の後ろに@を付けたい # # ●対象データ # <AB><CD>nea##kv</CD>nk#eccu</AB> # nea<YY><EF>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK>#<CD>asiaev</CD>un##ima</KK> # # ●希望する結果 # <AB><CD@>nea##kv</CD>nk#eccu</AB> # nea<YY><EF@>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK@>#<CD>asiaev</CD>un##ima</KK> # % % ここでは、 % 非決定性の処理を考える。先頭から順に置換が進んでいくように。 % 注意するべきことは、普通に非決定性に書くと、既に置換したつもりの % 部分が変数の束縛が解かれて、置換前の状態にもどってしまうこと。 % この型の述語では常にその点に注意する。 % 'HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_文字列,_置換された文字列) :- タグとデータに分割する(_文字列,_タグとデータならび), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_タグとデータならび,_置換されたタグとデータならび), atomic_list_concat(_置換されたタグとデータならび,_置換された文字列). タグとデータに分割する(_文字列,[_前データ,_タグ|R]) :- データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列), タグとデータに分割する(_残り文字列,R),!. タグとデータに分割する(_文字列,[_文字列]). データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列) :- sub_atom(_文字列,S1,1,_,'<'), sub_atom(_文字列,0,S1,_,_前データ), sub_atom(_文字列,S2,1,_,'>'), Len is S2 - S1 + 1, sub_atom(_文字列,S1,Len,R,_タグ), sub_atom(_文字列,S2_2,R,0,_残り文字列),!. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L1,L2) :- append(L0,[A,B|R],L1). タグである(A), '#が二つ以上ある'(B), sub_atom(A,_,_,2,A_1), atomic_list_concat([A_1,'@>',B],C), append(L0,[C,B|R1],L2), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L0,A,B,C,R,L2). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([A|R1],[A|R2]) :- '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,R2). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([],[]). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L0,A,B,C,R1,L2). append(L0,[C|R1],L2). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L0,A,B,C,R1,L2) :- '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,L2_1), append(L0,[C,B|L2_1],L2). タグである(A) :- sub_atom(A,0,1,_,<), sub_atom(A,_,1,0,>). '#が二つ以上ある'(B) :- count(sub_atom(B,_,1,_,'#'),Count), Count >= 2. % % count/2 % % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/758 # ●正規表現の使用環境 # Firefox 3.6.28の*.uc.js # # ●検索か置換か? # 検索?置換? # # ●説明 # ・以前、別のスレでAのURLをBのように、v=以外のパラメータを消すものを書いてもらいました。 #  A: http://ime.nu/www.youtube.com/watch?v=abcdef123456&feature=related&etc=sexample #  B: http://ime.nu/www.youtube.com/watch?v=abcdef123456 # ・正規表現 #  [/^(http:\/\/(\w+\.)?youtube\.com\/watch).*[?&](v=[^&#]+).*/, '$1?$3'] # # 今回は別のURLからパラメータを消したいです。 # # ●対象データ # http://ime.nu/www.forest.impress.co.jp/docs/news/20120418_527251.html?ref=rss # # ●希望する結果 # http://ime.nu/www.forest.impress.co.jp/docs/news/20120418_527251.html # # # ※このようにしてみたのですが、上手くいきませんでした。 # var patterns = [ # //置換したいURLパターンを記述 # [/^(http:\/\/(\w+\.)?youtube\.com\/watch).*[?&](v=[^&#]+).*/, '$1?$3'], # [/^(http:\/\/www\.forest\.impress\.co\.jp\/docs\/news\/)[0-9]_[0-9]\.html\?ref=rss, '$1'] # ]; # # 'URLからパラメータを消したい'(_URL文字列,_パラメータの消されたURL文字列) :- split(_URL文字列,['?'],[_パラメータの消されたURL文字列|_]). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/765 # 以下の解決方法を教えてください。 # ●正規表現の使用環境 # emacs-lisp # ●検索か置換か? # 検索 # ●説明 # 特定の文字列Aにマッチしないが、文字列BorCにはマッチする文字列を検索したい。 # 初期状態でregexpは↓のようになっており # "-\\(ring\\|history\\)\\'" # 文字列末尾に -ring か -history があればマッチしてしまいます。 # この状態を維持しつつ特定の文字列を含む文字列であればマッチさせたくない状況を作りたいです。 # ●対象データ # hogehoge-kill-ring # hugahuga-history # user-hogehoge-kill-ring # user-hugahuga-history # hogehoge-user-kill-ring # hugahuga-user-history # ●希望する結果 # hogehoge-kill-ring # ^ # hugahuga-history # ^ # だけが難しければ最悪↓も含んでしまってOK # hogehoge-user-kill-ring # ^ # hugahuga-user-history # ^ # 以上よろしくお願いします。 # # # '特定の文字列Aにマッチしないが、文字列BorCにはマッチする検索'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,_,_), '文字列Aにマッチしない'(_適合文字列), '文字列BorCにはマッチする'(_適合文字列). '文字列Aにマッチしない'(_適合文字列) :- 文字列A(_文字列A), \+(_適合文字列=_文字列A). '文字列BorCにはマッチする'(_文字列B) :- 文字列B(_文字列B). '文字列BorCにはマッチする'(_文字列C) :- 文字列C(_文字列C). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/765 # 以下の解決方法を教えてください。 # ●正規表現の使用環境 # emacs-lisp # ●検索か置換か? # 検索 # ●説明 # 特定の文字列Aにマッチしないが、文字列BorCにはマッチする文字列を検索したい。 # 初期状態でregexpは↓のようになっており # "-\\(ring\\|history\\)\\'" # 文字列末尾に -ring か -history があればマッチしてしまいます。 # この状態を維持しつつ特定の文字列を含む文字列であればマッチさせたくない状況を作りたいです。 # ●対象データ # hogehoge-kill-ring # hugahuga-history # user-hogehoge-kill-ring # user-hugahuga-history # hogehoge-user-kill-ring # hugahuga-user-history # ●希望する結果 # hogehoge-kill-ring # ^ # hugahuga-history # ^ # だけが難しければ最悪↓も含んでしまってOK # hogehoge-user-kill-ring # ^ # hugahuga-user-history # ^ # 以上よろしくお願いします。 # # # '特定の文字列Aにマッチしないが、文字列BorCにはマッチする検索'(_文字列,_文字列A,_文字列B,_文字列C,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,_,_), '文字列Aにマッチしない'(_適合文字列,_文字列A), '文字列BorCにはマッチする'(_適合文字列,_文字列B,_文字列C). '文字列Aにマッチしない'(_文字列,_文字列A) :- \+(_文字列=_文字列A). '文字列BorCにはマッチする'(_文字列,_文字列B,_) :- _文字列 = _文字列B,!. '文字列BorCにはマッチする'(_文字列,_,_文字列C) :- _文字列 = _文字列C. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/765 # 以下の解決方法を教えてください。 # ●正規表現の使用環境 # emacs-lisp # ●検索か置換か? # 検索 # ●説明 # 特定の文字列Aにマッチしないが、文字列BorCにはマッチする文字列を検索したい。 # 初期状態でregexpは↓のようになっており # "-\\(ring\\|history\\)\\'" # 文字列末尾に -ring か -history があればマッチしてしまいます。 # この状態を維持しつつ特定の文字列を含む文字列であればマッチさせたくない状況を作りたいです。 # ●対象データ # hogehoge-kill-ring # hugahuga-history # user-hogehoge-kill-ring # user-hugahuga-history # hogehoge-user-kill-ring # hugahuga-user-history # ●希望する結果 # hogehoge-kill-ring # ^ # hugahuga-history # ^ # だけが難しければ最悪↓も含んでしまってOK # hogehoge-user-kill-ring # ^ # hugahuga-user-history # ^ # 以上よろしくお願いします。 # # # '特定の文字列Aにマッチしないが、文字列BorCにはマッチする検索'(_文字列,_文字列A,_文字列B,_文字列C,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,_,_), '文字列Aにマッチしない'(_適合文字列,_文字列A), '文字列BorCにはマッチする'(_適合文字列,_文字列B,_文字列C). '文字列Aにマッチしない'(_文字列,_文字列A) :- \+(_文字列=_文字列A). '文字列BorCにはマッチする'(_文字列,_文字列B,_) :- _文字列 = _文字列B,!. '文字列BorCにはマッチする'(_文字列,_,_文字列C) :- _文字列 = _文字列C. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/775 # ●正規表現の使用環境 # PCRE # # ●検索か置換か? # 置換 # # ●説明 # <tag>から</tag>内の文字列abcをABCへ置換したい # # ●対象データ # xabcxxx<tag>abcxxxxxxxxxxxabcxxxxxxxabcxx</tag>xxxxabcxxxabcxx # xabcxxx<tag>abc</tag>xxxxaxxxxxxxabcxxcxxxxx<tag>abcxx</tag>xxx # # ●希望する結果 # xabcxxx<tag>ABCxxxxxxxxxxxABCxxxxxxxABCxx</tag>xxxxabcxxxabcxx # xabcxxx<tag>ABC</tag>xxxxaxxxxxxxabcxxcxxxxx<tag>ABCxx</tag>xxx # # # '<tag>から</tag>内の文字列abcをABCへ置換したい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(L1_1,[<,t,a,g,>],L1), L3 = [<,/,t,a,g,>|R3], 'tagまたは/tagを含まない'(L2), abcをABCへ置換(S2,S2_2), '<tag>から</tag>内の文字列abcをABCへ置換したい'(S3,_置換された文字列_2), atomic_list_concat([S1,S2_2,_置換された文字列_2],_置換された文字列),!. '<tag>から</tag>内の文字列abcをABCへ置換したい'(_文字列,_文字列). 'tagまたは/tagを含まない'(L2) :- \+(append(_,[<,t,a,g,>|_],L2)), \+(append(_,[<,/,t,a,g,>|_],L2)). abcをABCへ置換(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,abc,S3,_,_,_), abcをABCへ置換(S3,_置換された文字列_2), atomic_list_concat([S1,'ABC',_置換された文字列_2],_置換された文字列),!. abcをABCへ置換(_文字列,_文字列). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/775 # ●正規表現の使用環境 # PCRE # # ●検索か置換か? # 置換 # # ●説明 # <tag>から</tag>内の文字列abcをABCへ置換したい # # ●対象データ # xabcxxx<tag>abcxxxxxxxxxxxabcxxxxxxxabcxx</tag>xxxxabcxxxabcxx # xabcxxx<tag>abc</tag>xxxxaxxxxxxxabcxxcxxxxx<tag>abcxx</tag>xxx # # ●希望する結果 # xabcxxx<tag>ABCxxxxxxxxxxxABCxxxxxxxABCxx</tag>xxxxabcxxxabcxx # xabcxxx<tag>ABC</tag>xxxxaxxxxxxxabcxxcxxxxx<tag>ABCxx</tag>xxx # # # '<tag>から</tag>内の文字列abcをABCへ置換したい'(_文字列,_タグ,_置換された文字列) :- タグと終了タグ文字ならび(_タグ,_タグ文字ならび,_終了タグ文字ならび), sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(L1_1,_タグ文字ならび,L1), append(_終了タグ文字ならび,R3,L3), タグまたは終了タグを含まない(L2,_タグ文字ならび,_終了タグ文字ならび), abcをABCへ置換(S2,S2_2), '<tag>から</tag>内の文字列abcをABCへ置換したい'(S3,_置換された文字列_2), atomic_list_concat([S1,S2_2,_置換された文字列_2],_置換された文字列),!. '<tag>から</tag>内の文字列abcをABCへ置換したい'(_文字列,_文字列). タグと終了タグ文字ならび(_タグ,_タグ文字ならび,_終了タグ文字ならび) :- atom_chars(_タグ,Chars), append([<],Chars,[>],_タグ文字ならび), append([<,/],Chars,[>],_終了タグ文字ならび),!. タグまたは終了タグを含まない(L,L1,L2) :- \+(append(_,L1,_,L)), \+(append(_,L2,_,L)). abcをABCへ置換(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,abc,S3,_,_,_), abcをABCへ置換(S3,_置換された文字列_2), atomic_list_concat([S1,'ABC',_置換された文字列_2],_置換された文字列),!. abcをABCへ置換(_文字列,_文字列). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/862 # 以下のように検索と置換をしたいのですが # name0 name1 name2が順番が異なる時どのような正規表現をかけばよいでしょうか # # <en_Image name0="image.png" name1="カツ丼" name2="ご飯"></en_Image> # <en_Image name0="image.png" name2="ご飯" name1="カツ丼"></en_Image> # <en_Image name2="ご飯" name1="カツ丼" name0="image.png"></en_Image> #             ↓ # <en_Image name="カツ丼ご飯image.png"></en_Image> # # name0 name1 name2が順番が異なる時,以下のような正規表現では取り出せますん # pattern="<en_Image.*?name0=\"(\\w+?).*?name1=\"(\\w+?).*?name2=\"(\\w+?)">.*?</en_Image>" # replace="<en_Image name==\"$2$3.$1\"></en_Image>" # # # 'name0 name1 name2が順番が異なる時の検索と置換'(_文字列,_置換文字列) :- sPLIT(_文字列,[''],L), 置換(L,L1), atomic_list_concat(L1,_置換された文字列). 置換([],[]) :- !. 置換([A1,B1,' ',A2,B2,' ',A3,C3|R1],['name="カツ丼ご飯image.png"'|R2]) :- 条件_1([A1,A2,A3]), 条件_2([B1,B2,B3]), 置換(R1,R2),!. 置換([A|R1],[A|R2]) :- 置換(R1,R2). 条件_1([]) :- !. 条件_1([A|R]) :- member(A,['name0=','name1=','name2=']), 条件_1(R). 条件_2([]) :- !. 条件_2([A|R]) :- member(A,['image.png','ご飯','カツ丼']), 条件_2(R). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/896 # すみません # Objective-CのNSRegularExpressionで、ある文字列について、 # ・順番通りに # ・一部が欠けてもよく # ・途中に余計な文字が入ってもよく # ・一致する数を数える # ようなパターンを組みたいのですが、 # 例えばABCDEという文字列があったとして # ABCDE→5(全件一致) # AABBCCDDEE→5(全件一致) # ADCBE→3(A,C,Eが一致) # AFGHBCDE→5(全件一致) # EDCBA→1(Eのみ一致) # というように数えたいのですが、上手くいきません。 # .*?(A)?.*?(B)?.*?(C)?.*?(D)?.*?(E)?.*? # ではダメみたいなのですがどうするのが正しいでしょうか # # '・順番通りに ・一部が欠けてもよく ・途中に余計な文字が入ってもよく ・一致する数を数えるようなパターンを評価する'(_文字列,_パターン,_評価) :- atom_chars(_文字列,Chars), 指定検索パターンの昇順要素のみ評価する('A',Chars,['A','B','C','D','E'],_重複可能なパターン), パターン評価(_重複可能なパターン,_パターン,_評価). 指定検索パターンの昇順要素のみ評価する(_,[],[]). 指定検索パターンの昇順要素のみ評価する(U,[A|R1],_検索文字ならび,[A|R2]) :- member(A,_検索文字ならび), U @=< A, 指定検索パターンの昇順要素のみ評価する(A,R1,_検索文字ならび,R2). 指定検索パターンの昇順要素のみ評価する(U,[A|R1],_検索文字ならび,R2) :- member(A,_検索文字ならび)), U @> A, 指定検索パターンの昇順要素のみ評価する(U,R1,_検索文字ならび,R2). 指定検索パターンの昇順要素のみ評価する(U,[A|R1],_検索文字ならび,R2) :- \+(member(A,_検索文字ならび)), 指定検索パターンの昇順要素のみ評価する(U,R1,_検索文字ならび,R2). パターン評価(_重複可能なパターン,_検索文字ならび,_パターン,_評価) :- 重複する文字を取り除く(_重複可能なパターン,_パターン), length(_パターン,_パターンの文字数), length(_検索文字ならび,_全件数), 評価(_パターンの文字数,_全件数,_評価). 重複する文字を取り除く(_重複可能なパターン,_パターン) :- setof(A,member(A,_重複可能なパターン),_パターン). 評価(_全件数,_全件数,全件一致). 評価(_パターンの文字数,_,_評価) :- atomic_list_concat([_パターンの文字数,件一致],_評価). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1323566370/921 # ●正規表現の使用環境 # 鬼車 # # ●検索か置換か? # 検索 # # ●対象データ # あああかか # うううきき # いいいくく # # ●希望する結果(あああ いいい うううをマッチさせる & きき くく の文字を含まない) # あああ # (あああ の部分のみマッチ) # # ●説明 # 複数の文字(文字列1)をマッチさせたい、そして # その文字列中で、指定した文字が入ってたとき、その文字(文字列1)はマッチしないということは可能でしょうか。 # # [例文] # あああかか # うううきき # いいいくく # # ↓構文はnot使ったりと正規表現と関係無くて申し訳ないですが自分のイメージ的にはこんな感じです。 # ( (あああ|いいい|ううう) (not (きき|くく)) ) # # この場合、「あああかか(正確には あああ の部分のみ)」がマッチとなり、 # 文字列中に「きき、くく」が文字列に含まれる # 「うううきき(正確には ううう の部分)」と「いいいくく(正確には いいい の部分)」はマッチさせない感じです。 # # 調べた感じですと、否定文を使う形になるとは思いますが、否定文が結構複雑そうで、 # それに複数の否定を加えるようだとかなり難しいように感じますが、実際に # このような正規表現を実現出来るか不安なのですが、実現可能でしょうか。 # また、もし上記を満たす正規表現が分かる方おりましたら教えて頂ければ幸いです。 # どうぞよろしくお願い致します。 文字列ならびの検索([_適合文字列|R],_適合文字列) :- \+(sub_atom(_適合文字列,_,2,_,きき)), \+(sub_atom(_適合文字列,_,2,_,くく)), 適合文字列(_適合文字列). 文字列ならびの検索([_文字列|R],_適合文字列) :- 文字列ならびの検索(R,_適合文字列). 適合文字列(_文字列) :- sub_atom(_文字列,0,3,_,あああ),!. 適合文字列(_文字列) :- sub_atom(_文字列,0,3,_,いいい),!. 適合文字列(_文字列) :- sub_atom(_文字列,0,3,_,ううう),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/64 # [1] 授業単元:配列 # [2] 問題文(含コード&リンク):身長(cm)と体重(kg)が、(170,85), (165,65), (180,78), #             (195,80), (188,72)の学生がいる。このデータを配列変数に保存し,身長 #             を入力すると体重を検索するプログラムを作成せよ。 #              該当する身長の学生がいない場合は「みつかりません。」を表示し #             繰り返しを終了せよ。 #             ここで,次のように配列宣言を行う。 #             int shincho[ ] = { 170, 165, 180, 195, 188, 0}; #             int taiju[ ] = { 85, 65, 78, 80, 72, 0}; # # データの最後は,データの個数である 5 を用いず、身長データが0になった # とき繰り返しを終了する方法を考えること。 # ヒント:for( i=0 ; shincho[i] != 0 ; i++)を使用する。 # # '身長(cm)と体重(kg)が、(170,85),(165,65),(180,78),(195,80),(188,72)の学生がいる。このデータを配列数に保存し,身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。' :- '身長(cm)と体重(kg)が、(170,85),(165,65),(180,78),(195,80),(188,72)の学生がいる。このデータを配列数に保存し'(_身長_体重ならび), '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび). '身長(cm)と体重(kg)が、(170,85),(165,65),(180,78),(195,80),(188,72)の学生がいる。このデータを配列数に保存し'(_身長_体重ならび) :- length(_身長_体重ならび,5), findall([_身長,_体重],( append(Ln,[_|_],_身長_体重ならび), 身長と体重の入力(Ln,_身長,_体重)), _身長体重ならび). 身長と体重の入力(Ln,_身長,_体重) :- length([_|Ln],N人目), writef('%t人目の 身長 : ',[N人目]), get_integer(_身長), write(' 体重 : '), get_integer(_体重). '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび) :- '身長を入力すると'(_身長), '体重を検索する'(_身長_体重ならび,_身長,_体重), writef('身長 %t の人の 体重は %t です。\n',[_身長,_体重]), '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび). '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび) :- writef('見つかりません\n'). '身長を入力すると'(_身長) :- write('身長を入力してください : '), get_line(Line), '診断: 身長を入力すると'(Line,_身長),!. '身長を入力すると'(_身長) :- '身長を入力すると'(_身長). '診断: 身長を入力すると'(Line,_身長) :- atom_to_term(Line,_身長,_), integer(_身長),!. '診断: 身長を入力すると'(Line,_身長) :- writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]), fail. '体重を検索する'(_身長_体重ならび,_身長,_体重) :- member([_身長,_体重],_身長_体重ならび). % 以下のサイトは # # 文字列検索の標準パターン # 文字列を受け取り条件一致させて、_前文字列,_適合文字列,_後文字列を返す述語を # 先に定義しておく。(ここでは 文字列一致/3) # 最初に一致させて、それで成功とせず子述語を目標として呼び出す。 # 子述語はいきなり一度成功して解を返す。(非決定性的動作になる) # バックトラックしてきたら次の節の定義で、目標は最初の文字列検索/4を相互的に # 呼び出す。 # 成功して来たら、これは後文字列部分について成功したのだから、それまでの部分(前回の 前文字列_1 + _適合文字列)と # 今回の(後文字列の)前文字列を結合して全体の前文字列とする。 # 文字列検索(_文字列,_前文字列,_適合文字列,_後文字列) :- 文字列一致(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1), 文字列検索(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列). 文字列検索(_文字列,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). 文字列検索(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- 文字列検索(_後文字列,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1340383120/26 # 教えてください。複数行からのある文字列を含んだ # 行の検索の記述方法です # # ●正規表現の使用環境 # Java7 # # ●検索か置換か? # 検索 # # ●説明 # 複数ある文字行からの検索で # 一行中に[A]and[C]を含む行を抽出する方法 # 一行中に[K]or[S]を含む行を抽出する方法 # # # ●対象データ # ABCDEFG # HIJKLMN # OPQRSTU # # ●希望する結果 # ABCDEFG (A and C) # HIJKLMN と OPQRSTU  (K or S) # # # # '複数ある文字行からの検索で一行中に[A]and[C]を含む行を抽出する方法'(_複数ある文字行,_適合行) :- split(_複数ある文字列,['\n'],_文字行ならび), member(_適合行,_文字行ならび), '一行中に[A]and[C]を含む行を'(_適合行). '一行中に[A]and[C]を含む行を'(_文字行) :- sub_atom(_文字行,_,1,_,'A'), sub_atom(_文字行,_,1,_,'C'),!. '複数ある文字行からの検索で一行中に[K]or[S]を含む行を抽出する方法'(_複数ある文字行,_適合行) :- split(_複数ある文字列,['\n'],_文字行ならび), member(_適合行,_文字行ならび), '一行中に[K]or[S]を含む行を'(_適合行). '一行中に[K]or[S]を含む行を'(_文字行) :- sub_atom(_文字行,_,1,_,'K'),!, '一行中に[K]or[S]を含む行を'(_文字行) :- sub_atom(_文字行,_,1,_,'S'),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1340383120/28 # ../test/read.cgi/tech/1340383120/27 # うあ!早々にありがとうございます。 # あまえついでに検索対象が「単語」になった場合はどうしたら良いでしょうか? # # # ●正規表現の使用環境 # Java7 # # ●検索か置換か? # 検索 # # ●説明 # # 複数ある文字行からの検索で【単語A】【単語B】をand/or検出 # # ●対象データ # # むかしむかし、おじいさんは山に芝刈りに、おばあさんは川に洗濯に行きました(改行)浦島太郎はかめにのって海に出て行きました(改行) # そうすると、おじいさんは「わたしは小さなつづらでよい」といいました(改行) # # ●希望する結果 # # 「おじいさん」and「おばあさん」 # むかしむかし、おじいさんは山に芝刈りに、おばあさんは川に洗濯に行きました(改行) # 「おじいさん」or 「おばあさん」 # むかしむかし、おじいさんは山に芝刈りに、おばあさんは川に洗濯に行きました(改行)そうすると、おじいさんは「わたしは小さなつづらでよい」といいました(改行) # '複数ある文字行からの検索で一行中に「おじいさん」and 「おばあさん」を含む行を抽出する方法'(_複数ある文字行,_適合行) :- split(_複数ある文字列,['\n'],_文字行ならび), member(_適合行,_文字行ならび), '一行中に「おじいさん」and 「おばあさん」を含む行を'(_適合行). '一行中に「おじいさん」and 「おばあさん」を含む行を'(_文字行) :- sub_atom(_文字行,_,_,_,'おじいさん'), sub_atom(_文字行,_,_,_,'おばあさん'),!. '複数ある文字行からの検索で一行中に「おじいさん」or 「おばあさん」を含む行を抽出する方法'(_複数ある文字行,_適合行) :- split(_複数ある文字列,['\n'],_文字行ならび), member(_適合行,_文字行ならび), '一行中に「おじいさん」or 「おばあさん」を含む行を'(_適合行). '一行中に「おじいさん」or 「おばあさん」を含む行を'(_文字行) :- sub_atom(_文字行,_,_,_,おじいさん),!, '一行中に「おじいさん」or 「おばあさん」を含む行を'(_文字行) :- sub_atom(_文字行,_,_,_,おばあさん),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1340383120/102 # 正規表現での置き換え文字列をランダム化する方法はありませんか? # # 例 # 検索文字列 半角スペースで挟まれたアルファベット4文字 # ( )(\w{1})(\w{1})(\w{1})(\w{1})( ) # 置き換え結果 以下から ランダムでどれかを出力 # \1●●\3\4\5 # \1●\2●\4\5 # \1●\2\3●\5 # \1\2●●\4\5 # \1\2●\3●\5 # \1\2\3●●\5 # 分かる方いましたらお願いします。 # サクラエディタつかってますが # 半角スペースで挟まれたアルファベット4文字ランダムに置換候補文字列に置き換える(_文字列,A,B,C,D,E,F,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[' '|R2],L3), append(L1_1,[' '],R2), \+(member(' ',L1_1)), ランダムに置換候補文字列を得る(A,B,C,D,E,F,_置換候補文字列), 半角スペースで挟まれたアルファベット4文字ランダムに置換候補文字列に置き換える(S3,A,B,C,D,E,F,_置換された文字列_2), atomic_list_concat([S1,' ',_置換候補文字列,' ',_置換された文字列_2],_置換された文字列),!. 半角スペースで挟まれたアルファベット4文字ランダムに置換候補文字列に置き換える(_文字列,A,B,C,D,E,F,_文字列). ランダムに置換候補文字列を得る(A,B,C,D,E,F,_置換候補文字列) :- R is random(6) + 1, 置換候補文字列(R,A,B,C,D,E,F,_置換候補文字列). 置換候補文字列(1,A,B,C,D,E,_文字列) :- atomic_list_concat([A,●●,C,D,E],__文字列),!. 置換候補文字列(2,A,B,C,D,E,_文字列) :- atomic_list_concat([A,●,B,●,D,E],__文字列),!. 置換候補文字列(3,A,B,C,D,E,_文字列) :- atomic_list_concat([A,B,●,C,●,E],__文字列),!. 置換候補文字列(4,A,B,C,D,E,_文字列) :- atomic_list_concat([A,B,●●,D,E],__文字列),!. 置換候補文字列(5,A,B,C,D,E,_文字列) :- atomic_list_concat([A,●,C,D,●,E],__文字列),!. 置換候補文字列(6,A,B,C,D,E,_文字列) :- atomic_list_concat([A,B,C,●●,E],__文字列),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1342966104/71 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/TO8Kg 問題です。 # http://ime.nu/ideone.com/ZvUuR 課題を提出したら関数の定義 #              をしろといわれました。 # http://ime.nu/ideone.com/Nd5ir 自分なりにやったのですが #              ここからができませんでしたので #              よろしくお願いします。 # # 生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙するプログラムkadai12.c を書きなさい。ただしファイル名は画面から入力されるものとする(scanf()を使う)。 # ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分からないものとする。 # # ヒント: # ○何をしなければならないかを大まかに書き下してみよう。 #  1. ファイルのオープン(これに先立ってファイル名を取得する必要がある) #  2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう) #  3.データの読み込み #  4.BMIの算出 #  5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい) #  6. 画面表示 # # ○BMIとは? # BMIは次のようにして計算されるものとする。 # BMI値=体重(キログラム)/(身長(メートル))^2 # '^2'は二乗を意味する。 # このBMI値が25を越えると、肥満とみなされる。 # # ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。 '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。ただしファイル名は画面から入力されるものとする。' :- '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL), 'BMI値を計算し'(LL,LL1), 'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1). '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL) :- write('データファイル名を入力してください : '), get_line(_データファイル名), get_split_lines(_データファイル名,[' ',','],LL). 'BMI値を計算し'(LL1,LL2) :- findall([_BMI値,_氏名],( member([_氏名,_身長,_体重],LL1), 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値)), LL2). /* 'BMI値を計算し'([],[]). 'BMI値を計算し'([[_氏名,_身長,_体重]|R1],[[_BMI値,_氏名]|R2]) :- 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値), 'BMI値を計算し'(R1,R2). */ 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値) :- _BMI値 is _体重 / _身長 ^ 2. 'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1) :- 'BMI値が大きいもの順に'(LL1,LL3), その人のBMI値および肥満か否かを列挙する(LL3). 'BMI値が大きいもの順に'(LL1,LL3) :- sort(LL1,LL2), reverse(LL2,LL3). その人のBMI値および肥満か否かを列挙する(LL3) :- append(_,[[_BMI値,_氏名]|R],LL3), 'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,_肥満判定), writef('%t は %t。\n',[_氏名,_肥満判定]), R = []. 'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,肥満です) :- _BMI値 > 25.0,!. 'このBMI値が25を越えると、肥満とみなされる。'(_,肥満ではない). % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1316769778/963 # ・DBMS名とバージョン # SQLite3 # # ・テーブルデータ # テーブル名 directory # folder   val # /contact/  index # /test/    connect # /example/  foo # /hoge/    bar # /fuga/    com # # ・欲しい結果 # 問い合わせ内容とfolderの内容が部分一致していればvalを返す # /contact/ にアクセスがあった場合はindexを返す # /contact/foo の場合もindexを返す # # ・説明 # $folder_hensuu = "%/contact/%"; # select * from directory WHERE folder LIKE $folder_hensuu # とした場合はヒットするが # # $folder_hensuu = "%/contact/hogehoge%"; # の場合はヒットしない。 # この場合はどうすれば一致判定が出来るようになりますか? # # '欲しい結果'(_検索語,_val) :- direcrory(_folder,_val), sub_atom(_folder,_,_,_,検索語). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1340383120/141 # ●正規表現の使用環境 # C# # # ●検索か置換か? # 検索 # # ●説明 # ●▼■ の部分をマッチさせたい # # ●対象データ # ほげほげ●▼■ほげおわり # ほげほげ●▼■ほげここまで # # ●希望する結果 # ●▼■ # # ほげほげ(?<1>.+?)ほげおわり|ほげここまで # # のように書きましたがだめみたいです。 # これだと # ほげほげ(?<1>.+?)ほげおわり もしくは # ほげここまで # という風になってしまうのでしょうか? # ほげおわり か ほげここまで のどちらかという書き方を教えてほしいです。 # # '「ほげほげ」で始まり「ほげほげおわり」か「ほげほげここまで」で終わる'(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), '「ほげほげ」で始まり'(S2,S2_1), '「ほげほげおわり」か「ほげほげここまで」で終わる'(S2_1), '「ほげほげ」で始まり「ほげほげおわり」か「ほげほげここまで」で終わる'(S1,S2,S3). '「ほげほげ」で始まり「ほげほげおわり」か「ほげほげここまで」で終わる'(_前文字列,_検索文字列,_後文字列,_前文字列,_検索文字列,_後文字列). '「ほげほげ」で始まり「ほげほげおわり」か「ほげほげここまで」で終わる'(S1,S2,S3,_前文字列,_検索文字列,_後文字列) :- '「ほげほげ」で始まり「ほげほげおわり」か「ほげほげここまで」で終わる'(S3,_前文字列_1,_検索文字列,_後文字列), atomic_list_concat([S1,S2,_前文字列_1],_前文字列). '「ほげほげ」で始まり'(S2,S2_1) :- sub_atom(S2,0,4,R,ほげほげ), sub_atom(S2,4,R,0,S2_1),!. '「ほげほげおわり」か「ほげほげここまで」で終わる'(S2_1) :- sub_atom(S2_1,S1,Len,0,ほげほげおわり), \+((sub_atom(S2_1,_,_,E,ほげほげ),E>3)). '「ほげほげおわり」か「ほげほげここまで」で終わる'(S2_1) :- sub_atom(S2,_,_,0,ほげほげここまで), \+((sub_atom(S2_1,_,_,E,ほげほげ),E>4)). % 以下のサイトは # 出典::SQL質疑応答スレ 13問目 #43 # 質問:「指定条件に一番近い最大値を持つレコード」でテーブル結合したい # 環境:postgresql 9.0 # # 価格変動テーブル # kakaku_datetime name price # 2012-08-01 10:00:00 トマト 100円 # 2012-08-01 10:00:00 バナナ 200円 # 2012-08-10 10:00:00 バナナ 180円 # 2012-08-15 10:00:00 トマト 150円 # # 売上履歴テーブル # uriage_datetime name # 2012-08-01 12:00:00 トマト # 2012-08-05 18:00:00 トマト # 2012-08-08 15:00:00 バナナ # 2012-08-16 19:00:00 トマト # # を結合させて、以下のように「その時にいくらだったか?」を含めたテーブルにしたいです。 # uriage_datetime name price # 2012-08-01 12:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる # 2012-08-05 18:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる # 2012-08-08 15:00:00 バナナ 200円 ←kakaku_datetime = 2012-08-01 10:00:00 のバナナの価格を取ってくる # 2012-08-16 19:00:00 トマト 150円 ←kakaku_datetime = 2012-08-15 10:00:00 のトマトの価格を取ってくる # # よろしくお願いします。 # # '「指定条件に一番近い最大値を持つレコード」でテーブル結合したい'(_uriage_datetime,_name,_price) :- 売上履歴テーブル(_uriage_datetime,_name), findmax([_kakaku_datetime,_price],( 価格変動テーブル(_kakaku_datetime,_name,_price), _uriage_datetime @>= _kakaku_datetime),[_kakaku_datetime,_price]). findmax(T,P,Max) :- findall(T,P,L), 最大値(L,Max). 最大値(L,_最大値) :- 第一要素を現在の最大値と置いて最大値を走査(L,_最大値). 第一要素を現在の最大値と置いて最大値を走査([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値([A|R],B,_最大値) :- 'AがBを上回った場合はBをAに差し替え、それ以外はそのまま検索する'([A|R],B,_最大値). 'AがBを上回った場合はBをAに差し替え、それ以外はそのまま検索する'([A|R],B,_最大値) :- 'AがBを上回った場合だけ差し替える'([A|R],B,_最大値). 'AがBを上回った場合はBをAに差し替え、それ以外はそのまま検索する'([A|R],B,_最大値) :- それ以外はそのまま検索する([A|R],B,_最大値). 'AがBを上回った場合だけ差し替える'([A|R],B,_最大値) :- A @> B, 最大値(R,A,_最大値). それ以外はそのまま検索する([A|R],B,_最大値) :- A @=< B, 最大値(R,B,_最大値). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1340383120/301 # よろしくお願いします。 # # ●正規表現の使用環境 # サクラエディタ bregonig.dll Ver.3.02 # # ●検索か置換か? # 検索 # # ●説明 # "START"から"END"に囲まれた"HOGE"を最短一致(というのか?)で含まれる行を検索したい # # ●対象データ # 1.xxxxxxxSTARTyyyyyyyyHOGEzzzzzzzzzzzENDaaaaaaa # 2.xxxxxxxSTARTyyyyyyyyENDbbbbbbbHOGEzzzzzzzzzzzENDaaaaaaa # # ●希望する結果 # 1.だけマッチ # 2.は"END"が"HOGE"の前に入ってるのでマッチ対象外 # # '"START"から"END"に囲まれた"HOGE"を最短一致(というのか?)で含まれる行を検索したい '(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,'HOGE',_後文字列,_,_,_), sub_atom(_前文字列,_,_,_,_,'START',_前文字列_3,_,_,_), \+(sub_atom(_前文字列_3,_,5,_,'START')), \+(sub_atom(_前文字列_3,_,3,_,'END')), sub_atom(_後文字列,_,_,_,_後文字列_1,'END',_,_,_,_), \+(sub_atom(_後文字列_1,_,5,_,'START')),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1340383120/296 # ●正規表現の使用環境 # C# # # ●検索か置換か? # 検索 # # ●説明 # タグの外にある文字列を順に取り出したい # # ●対象データ # <hoge><hoge></hoge>あああ<hoge><hoge></hoge>いいい<hoge></hoge>ううう<hoge><hoge>・・・ # # ●希望する結果 # while (m.Success) # の繰り返しの中であああ、いいい、ううう・・・と順に取り出していきたい # # よろしくお願いします。 # # タグの外にある文字列を順に取り出したい(_文字列,_タグの外にある文字列) :- atom_chars(_文字列,Chars), タグの外にある文字列を順に取り出したい(Chars,[],_タグの外にある文字列). タグの外にある文字列を順に取り出したい([],L,_タグの外にある文字列) :- \+(L=[]), atom_chars(_タグの外にある文字列,L). タグの外にある文字列を順に取り出したい(Chars,L,_タグの外にある文字列) :- タグを読み飛ばす(Chars,_残り文字ならび), atom_chars(_タグの外にある文字列,L). タグの外にある文字列を順に取り出したい([A|R],L,_タグの外にある文字列) :- append(L,[A],L2), タグの外にある文字列を順に取り出したい(R,L2,_タグの外にある文字列). タグを読み飛ばす(Chars,_残り文字ならび) :- タグで始まっている(Chars,_タグ,_終了タグ,_タグの後の文字ならび), append(_,_終了タグ,_残り文字ならび,_タグの後文字ならび),!. タグで始まっている(Chars,_タグ,_終了タグ,_タグの後の文字ならび) :- append(['<'|R1],['>'|_タグの後の文字ならび],Chars), \+(member('<',R1)), \+(member('>',R1)), append(['<','/'|R1],['>'],_終了タグ),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1343899481/169 # # Oracleについてです。 # # テーブル1 # 列A(PK) # 列B # 列C # 列D # # があり、列B、列C、列Dの複合INDEXが1つ設定されています。 # # 列B+列C+ 列Dで結合した列を # 複数の値を条件に検索する必要があり、 # # WHERE 列B||列C||列D IN ('XX','XX','XX') # # でとして検索しているのですが、 # これではINDEXを使用してくれず、 # 検索が非常に遅くなってしまっています。 # (テーブル1は200万件程度あります。) # # テーブル構成は変更できず、INDEXまたは # SQLで解決する必要があるのですが、 # 何か検索を向上させる方法がありますでしょうか。 # # '列B||列C||列D IN (検索値ならび)'(_検索値ならび,_A,_B,_C,_D) :- テーブル1(_A,_B,_C,_D), '値が_B,_C,_Dのどれかと適合'(_検索値ならび,_B,_C,_D). '値が_B,_C,_Dのどれかと適合'(_検索値ならび,_B,_C,_D) :- member(_値,_検索値ならび), member(_値,[_B,_C,_D]),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1340383120/311 # ●正規表現の使用環境 # 練馬、nemery等のリネームソフト # 可能なソフトに乗り換えようと思ってます # # ●検索か置換か? # 置換 # # ●説明 # 1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま #  ファイル名途中の数字はスルーさせたい # 2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい # # ●対象データ # キリン#◯☓動物園-10月1 # しろくま#△☓◯動物園-5月12 # 猫(2匹目)#我が家-11月5 # # ●希望する結果 # キリン-10月01 # しろくま-5月12 # 猫(2匹目)-11月05 # # よろしくお願いします # # 'ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_置換したファイル名) :- sub_atom(_ファイル名,_,_,2,_末尾文字2桁), 数字桁数評価(_末尾文字2桁,1), atomic_list_concat([_ファイル名,'0'],_置換したファイル名),!. 'ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_ファイル名). 数字桁数評価(_末尾文字2桁,2) :- atom_number(_末尾文字2桁,_数字),!. 数字桁数評価(_末尾文字2桁,2) :- sub_atom(_末尾文字2桁,1,1,0,_末尾文字1桁), atom_number(_末尾文字1桁,_数字),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1340383120/311 # ●正規表現の使用環境 # 練馬、nemery等のリネームソフト # 可能なソフトに乗り換えようと思ってます # # ●検索か置換か? # 置換 # # ●説明 # 1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま #  ファイル名途中の数字はスルーさせたい # 2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい # # ●対象データ # キリン#◯☓動物園-10月1 # しろくま#△☓◯動物園-5月12 # 猫(2匹目)#我が家-11月5 # # ●希望する結果 # キリン-10月01 # しろくま-5月12 # 猫(2匹目)-11月05 # # よろしくお願いします # # '特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_文字列,_特定の文字から,_特定の文字の前まで,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[_特定の文字から|R2],[_特定の文字の前まで|_]), atomic_list_concat([S1,S3],_置換された文字列),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1340383120/314 # tで始まる文字列を文頭のthe[スペース]を無視して検索する場合 # ^t[^h]|^th[^e]|^the tが思いついたけど、もっといい正規表現ありますか? # # 環境はActive Perl5で否定演算子!は使えません # # 'tで始まる文字列を文頭のthe[スペース]を無視して検索する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,0,4,R,'the '),!, sub_atom(_文字列,4,R,0,_文字列_1), sub_atom(_文字列_1,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[t|R_2],L3), \+(member(' ',R_2)), \+(member('\n',R_2)), (L3 = [],L3 = [' '|_]). 'tで始まる文字列を文頭のthe[スペース]を無視して検索する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[t|R_2],L3), \+(member(' ',R_2)), \+(member('\n',R_2)), (L3 = [],L3 = [' '|_]). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1340383120/357 # ●正規表現の使用環境 # MSVC2012 / .NET Framework 4.5 # # ●検索か置換か? # 検索 # # ●説明 # 「|」「(」「)」が文字として入っているデータから、特定の文字列を抜き出したい。 # # ●対象データ # area|name (value) # # tokyo|yamada benzo (123) # kyoto|namae tarou (21) # saga|shitemo mitukaranai you (7) # # ●希望する結果 # area, name, value # # "tokyo", "yamada benzo", "123" # "kyoto", "namae tarou", "21" # "saga", "shitemo mitukaranai you", "7" # # このように取り出したいのですが、どのように書くとよいでしょうか # # 文字列の整形(_文字列,_整形された文字列) :- split(_文字列,['|','(',')'],L_1), 各要素の末尾の空白を取り除く(L_1,L_2), 文字列に整形する(L_2,'',_整形された文字列). 各要素の末尾の空白を取り除く([],[]). 各要素の末尾の空白を取り除く([A|R1],[B|R2]) :- 末尾の空白を取り除く(A,B), 各要素の末尾の空白を取り除く(R1,R2). 末尾の空白を取り除く(A,B) :- atom_cahrs(A,Chars), append(L1,L2,Chars), all(L2,' '), atomic_list_concat(L1,B),!. 末尾の空白を取り除く(A,A). 文字列に整形する([A],S_1,S) :- atomic_list_concat([S_1,'"',A,'"'],S),!. 文字列に整形する([A|R],S_1,S) :- atomic_list_concat([S_1,'"',A,'", '],S_2), 文字列に整形する(R,S_2,S). % 以下のサイトは # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): あるテキストファイルに含まれるA〜Zの個数をカウントするプログラムをつくれ。 # [3] 環境 #  [3.1] OS: Windows #  [3.2] コンパイラ名とバージョン: lcc #  [3.3] 言語: C # [4] 期限: 11月28日まで # お願いします。どう検索すればいいかも分からないので教えていただきたいです。 # 答えがほしいですが、ヒントをいただければ自分でも努力はします。 あるテキストファイルに含まれるA〜Zの個数をカウントする(_文字列,_カウントならび) :- atom_chars(_文字列,Chars), 'A〜Zの個数をカウントする'(Chars,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],_カウントならび). 'A〜Zの個数をカウントする'([],_カウントならび,_カウントならび). 文字カウント([_文字|R],_カウントならび_1,_カウントならび) :- 文字カウント(_文字,_カウントならび_1,_カウントならび_2), 'A〜Zの個数をカウントする'(R,_カウントならび_2,_カウントならび). 文字カウント('A',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[AA,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- AA is A + 1,!. 文字カウント('B',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,BB,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- BB is B + 1,!. 文字カウント('C',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,CC,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- CC is C + 1,!. 文字カウント('D',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,DD,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- DD is D + 1,!. 文字カウント('E',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,EE,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- EE is E + 1,!. 文字カウント('F',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,FF,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- FF is F + 1,!. 文字カウント('G',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,GG,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- GG is G + 1,!. 文字カウント('H',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,HH,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- HH is H + 1,!. 文字カウント('I',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,II,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- II is I + 1,!. 文字カウント('J',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,JJ,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- JJ is J + 1,!. 文字カウント('K',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,KK,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- KK is K + 1,!. 文字カウント('L',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,LL,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- LL is L + 1,!. 文字カウント('M',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,MM,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- MM is M + 1,!. 文字カウント('N',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,NN,O,P,Q,R,S,T,U,V,W,X,Y,Z]) :- NN is N + 1,!. 文字カウント('O',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,OO,P,Q,R,S,T,U,V,W,X,Y,Z]) :- OO is O + 1,!. 文字カウント('P',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,PP,Q,R,S,T,U,V,W,X,Y,Z]) :- PP is P + 1,!. 文字カウント('Q',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,QQ,R,S,T,U,V,W,X,Y,Z]) :- QQ is Q + 1,!. 文字カウント('R',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,RR,S,T,U,V,W,X,Y,Z]) :- RR is R + 1,!. 文字カウント('S',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,SS,T,U,V,W,X,Y,Z]) :- SS is S + 1,!. 文字カウント('T',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,TT,U,V,W,X,Y,Z]) :- TT is T + 1,!. 文字カウント('U',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,UU,V,W,X,Y,Z]) :- UU is U + 1,!. 文字カウント('V',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,VV,W,X,Y,Z]) :- VV is V + 1,!. 文字カウント('W',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,WW,X,Y,Z]) :- WW is W + 1,!. 文字カウント('X',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,XX,Y,Z]) :- XX is X + 1,!. 文字カウント('Y',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,YY,Z]) :- YY is Y + 1,!. 文字カウント('Z',[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,ZZ]) :- ZZ is Z + 1,!. 文字カウント(_,L,L). % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1343899481/281 # SQL Server 2000においてです。 # # テーブルのフィールドに電話番号、携帯番号、FAX とあった場合、これらから例えば"0123"と検索するのに # Or で接続する以外に検索する方法はありますか? # # 普通?に考えれば以下の方になるかと思いますが、これを簡易的?にインデックスが利く状態で書き換えたい。 # > SELECT * # > FROM Tablehoge # > WHERE (電話番号="0123") OR (携帯番号="0123") OR (FAX="0123") # # なので以下の様なものは却下になります。 # > SELECT * # > FROM Tablehoge # > WHERE "|" & 電話番号 & "|" & 携帯番号 & "|" & FAX & "|" Like "*|0123|*" # # 'テーブルのフィールドに電話番号、携帯番号、FAX とあった場合、これらから例えば"0123"と検索するのにOr による遅い検索'(_電話番号,_携帯番号,_FAX) :- findsetof([_電話番号,_携帯番号,_FAX],( 'Or による遅い検索'(_電話番号,_携帯番号,_FAX)), LL), member([_電話番号,_携帯番号,_FAX],LL). 'Or による遅い検索'(_電話番号,_携帯番号,_FAX) :- テーブル(_電話番号,_携帯番号,_FAX), sub_atom(_電話番号,_,4,_,'0123'). 'Or による遅い検索'(_電話番号,_携帯番号,_FAX) :- テーブル(_電話番号,_携帯番号,_FAX), sub_atom(_携帯番号,_,4,_,'0123'). 'Or による遅い検索'(_電話番号,_携帯番号,_FAX) :- テーブル(_電話番号,_携帯番号,_FAX), sub_atom(_Fax,_,4,_,'0123'). 'テーブルのフィールドに電話番号、携帯番号、FAX とあった場合、これらから例えば"0123"と検索するのにOr で検索する'(_電話番号,_携帯番号,_FAX) :- テーブル(_電話番号,_携帯番号,_FAX), 'Orで検索する'(_電話番号,_携帯番号,_FAX). 'Orで検索する'(_電話番号,_携帯番号,_FAX) :- sub_atom(_電話番号,_,4,_'0123'),!. 'Orで検索する'(_電話番号,_携帯番号,_FAX) :- sub_atom(_携帯番号,_,4,_'0123'),!. 'Orで検索する'(_電話番号,_携帯番号,_FAX) :- sub_atom(_Fax,_,4,_'0123'). 'テーブルのフィールドに電話番号、携帯番号、FAX とあった場合、これらから例えば"0123"と検索するのにOr 以外で検索する'(_電話番号,_携帯番号,_FAX) :- テーブル(_電話番号,_携帯番号,_FAX), 'Or以外で検索する'(_電話番号,_携帯番号,_FAX). 'Or以外で検索する'(_電話番号,_携帯番号,_FAX) :- atomic_list_concat([_電話番号,_携帯番号,_FAX],S), sub_atom(S,_,4,_,'0123'),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1343899481/300 # MS SQL server2012です。 # # 下記のデータベースから # 親の値=Aで検索して # 子の値を取得し、さらに # 子の値=親の値で検索したいのですが # 求めたい結果を一気に表示する方法が # あったら教えてください。 # # 親子 # AB # BC # CD # XY # Z0 # # 求めいた結果 # 親子 # AB # BC # CD # よろしくお願いします。 # # 親子('A','B'). 親子('B','C'). 親子('C','D'). 親子('X','Y'). 親子('Z','0'). 'データベースから親の値=Aで検索して子の値を取得し、さらに子の値=親の値で検索したいのですが結果を一気に表示する方法があったら教えてください。' :- 'データベースから親の値=Aで検索して子の値を取得し、さらに子の値=親の値で検索した'('A',X,Y), writef('%t,%t\n',[X,Y]), fail. 'データベースから親の値=Aで検索して子の値を取得し、さらに子の値=親の値で検索したいのですが結果を一気に表示する方法があったら教えてください。'. 'データベースから親の値で検索して子の値を取得し、さらに子の値=親の値で検索した'(_親の値,_子の値) :- 親の値で検索して子の値を取得し(_親の値_1,_親の値,_子の値). 親の値で検索して子の値を取得し(A,X,Y) :- 親子(A,B), さらに子の値=親の値で検索した(A,B,X,Y). 'さらに子の値=親の値で検索した'(X,Y,X,Y). 'さらに子の値=親の値で検索した'(_,B,X,Y) :- 親の値で検索して子の値を取得し(B,X,Y). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1354070278/84 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # コマンド選択で,0) 終了,1) 追加,2) 検索(id),3) リスト表示,4) 変更 5) 削除 6) 特殊機能 が行える商品在庫管理プログラムを作成する。 # データは,商品の番号 商品名 数 単価 の形式で商品のデータを持っているファイルとする. # 上の機能ルーチンは,全て関数として作成すること. # ただし,追加と検索は実装済みである. # # 'コマンド選択で,0) 終了,1) 追加,2) 検索(id),3) リスト表示,4) 変更 5) 削除 6) 特殊機能 が行える商品在庫管理プログラムを作成する。データは,商品の番号 商品名 数 単価 の形式で商品のデータを持っているファイルとする.' :- reconsult('在庫管理.pro'), コマンド選択で(_コマンド), '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(_コマンド), '在庫管理.proの保存'. コマンド選択で(_コマンド) :- 整数を得る('0) 終了,1) 追加,2) 検索(id),3) リスト表示,4) 変更 5) 削除 6) 特殊機能を整数で',member(_整数,between(0,6,_整数),_整数), nth0(_整数,[終了,追加,'検索(id)',リスト表示,変更,削除,特殊機能],_コマンド). '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(終了) :- !. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(追加) :- 在庫追加. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(検索) :- 在庫検索. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(リスト表示) :- リスト表示. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(変更) :- 在庫変更. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(削除) :- 在庫削除. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(特殊機能) :- 特殊機能. 在庫追加 :- 商品名を得る(_商品名), 数量を得る(_数量), 在庫追加(_商品名,_数量). 在庫追加(_商品名,_数量). retract(在庫(_商品名,_現在の数量)), _更新された数量 is _現在の数量 + _数量, asserta(在庫(_商品名,_更新された数量)),!. 在庫追加(追加,_商品名,_数量) :- asserta(在庫(_商品名,_数量)),!. '在庫検索(id)' :- 商品名を得る(_商品名), 在庫(_商品名,_数量), writef('現在の在庫数量は %t です\n',[_数量]),!. '在庫検索(id)' :- write('現在の在庫はありません\n'). リスト表示 :- 在庫(_商品名,_数量), writef('%t,%t\n',[_商品名,_数量]), fail. リスト表示. 在庫変更 :- 整数を得る('1..商品名 2..数量 どちらを変更するか',between(1,2,_整数),_整数), 在庫変更(_整数). 在庫変更(1) :- 現在の商品名を得る(_現在の商品名), 正しい商品名を得る(_正しい商品名), 在庫変更(_現在の商品名,_正しい商品名),!. 在庫変更(1) :- 在庫変更(1). 在庫変更(2) :- 商品名を得る(_商品名), '診断:: 商品名'(_商品名), 数量を得る(_数量), retract(在庫(_商品名,_)), asserta(在庫(_商品名,_数量)),!. 現在の商品名を得る(_現在の商品名) :- write('現在の商品名を入力してください : '), get_line(_現在の商品名), '診断:: 現在の商品名'(_現在の商品名),!. '診断:: 現在の商品名'(_現在の商品名) :- 在庫(_現在の商品名,_),!. '診断:: 現在の商品名'(_商品名) :- writef('入力された商品名の在庫はありません\n',[_商品名]), fail. 正しい商品名を得る(_正しい商品名) :- write('正しい商品名を入力してください : '), get_line(_正しい商品名),!. '診断:: 商品名'(_商品名) :- 在庫(_商品名,_),!. '診断:: 商品名'(_商品名) :- writef('指定された商品名の %t の在庫登録はありません\n',[_商品名]), fail. 在庫変更(_現在の商品名,_正しい商品名) :- retract(在庫(_現在の商品名,_数量)), asserta(在庫(_正しいの商品名,_数量)),!. 在庫削除 :- 商品名を得る(_商品名), retract(在庫(_商品名,_)). 特殊機能. 数量を得る(_数量) :- 数を得る(数量,true,_数量). '在庫管理.proの保存' :- tell('在庫管理.pro'), listing(在庫), told. % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1343899481/318 # MySQL5.1 # # table1 # id,hoge1,hoge2 # # idが2,4,6の中で、hoge1が1,3,5のidを取得したい。 # # SELECT `id` FROM `table1` WHERE (`id` IN (2,4,6)) AND (`hoge1` IN (1,3,5)); # # このsqlでidが2,4,6の3件からの検索なりますか? # もっといいsqlありますか? # # 'table1 id,hoge1,hoge2 idが2,4,6の中で、hoge1が1,3,5のidを取得したい。'(_id) :- テーブル検索の副目標を得る(table1,[id,hoge1],_,_副目標,_,[_id,_hoge1]), member(_id,[2,4,6]), member(_hoge1,[1,3,5]), _副目標. テーブル検索の副目標を得る(_テーブル名,_鍵名ならび,_テーブル定義,_副目標,_値ならび,_鍵の変数ならび) :- テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび). 副目標に鍵を設定する(_テーブル定義,_鍵名ならび,_値ならび,_鍵の変数ならび),!. テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび) :- findall([_位置,_属性名],( テーブル定義(_テーブル名,_位置,_属性名)), _テーブル定義), length(_テーブル定義,Len), length(_値ならび,Len), _副目標 =.. [_テーブル名|_値ならび]. 副目標に鍵を設定する(_,[],_,[]). 副目標に鍵を設定する(_テーブル定義,[_鍵名|R2],_値ならび,[_鍵の変数|R4]) :- member([_鍵の位置,_鍵名],_テーブル定義), nth1(_鍵の位置,_値ならび,_鍵の変数), 副目標に鍵を設定する(_テーブル定義,R2,_値ならび,R4). % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1343899481/313 # SET型について質問です。 # # 'りんご', 'みかん', 'ばなな', 'めろん' # # のようなfruitという名のフィールドがあった時、 # 'りんご' と 'ばなな' 両方が含まれているデータを取得したいのですが、どのようにしたら良いでしょうか? # # WHERE `fruit` & 5 # # このようにしたら、 'りんご' または 'ばなな' のいずれかを持つデータが取得されてしまいます。 # # # MySQL5を使用しています。 # どなたかご教授お願いしますm(_ _)m # # 'りんご, みかん, ばなな, めろん のようなfruitという名のフィールドがあった時、 りんご と ばなな 両方が含まれているデータを取得したいのですが、どのようにしたら良いでしょうか?'(_fruit) :- テーブル検索の副目標を得る(テーブル1,[fruit],_テーブル定義,_副目標,_値ならび,[_fruit]), _副目標, 'fruitという名のフィールドがあった時、りんご と ばなな 両方が含まれているデータを取得したい'(_fruit). テーブル検索の副目標を得る(_テーブル名,_鍵名ならび,_テーブル定義,_副目標,_値ならび,_鍵の変数ならび) :- テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび). 副目標に鍵を設定する(_テーブル定義,_鍵名ならび,_値ならび,_鍵の変数ならび),!. テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび) :- findall([_位置,_属性名],( テーブル定義(_テーブル名,_位置,_属性名)), _テーブル定義), length(_テーブル定義,Len), length(_値ならび,Len), _副目標 =.. [_テーブル名|_値ならび]. 副目標に鍵を設定する(_,[],_,[]). 副目標に鍵を設定する(_テーブル定義,[_鍵名|R2],_値ならび,[_鍵の変数|R4]) :- member([_鍵の位置,_鍵名],_テーブル定義), nth1(_鍵の位置,_値ならび,_鍵の変数), 副目標に鍵を設定する(_テーブル定義,R2,_値ならび,R4). 'fruitという名のフィールドがあった時、りんご と ばなな 両方が含まれているデータを取得したい'(_fruit) :- sub_atom(_fruit,_,_,_,りんご), sub_atom(_fruit,_,_,_,ばなな). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1354070278/150 # [1] c言語 # [2] # (1) # キーボードから二つの文字列を配列x[256],y[256] に入力する.配列xに含まれる文字列の # 後ろに配列yに含まれる文字列をつなげたものを配列z[256] に代入し,画面表示するプログ # ラムを作成せよ.例えば二つの文字列が「sch」,「ool」の場合,配列z に「school」が代入され, # 画面表示される.なお,NULL文字「\0」の扱いに注意し,配列z の文字列の後ろにNULL文 # 字を入れておくこと # # (2)以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入 # 力して下さい」などの画面表示)を行うこと. # 文字配列name[5][64] を作成する. # キーボードから5 人分の名前を入力し,name 配列に格納する. # キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示 # する.ただし,見つからなかった場合には,「見つかりません」と表示する. # 「quit」が入力されるまでの処理を繰り返す. # # '以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入力して下さい」などの画面表示)を行うこと. 1) 文字配列name[5][64] を作成する. 2) キーボードから5 人分の名前を入力し,name 配列に格納する. 3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する. 4) 「quit」が入力されるまで3)の処理を繰り返す.' :- '1) 文字配列name[5][64] を作成する.'(_name), '2) キーボードから5 人分の名前を入力し,name 配列に格納する.'(_name), '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,_名前), '4) 「quit」が入力されるまで3)の処理を繰り返す.'(_名前). '1) 文字配列name[5][64] を作成する.'(_name) :- length(_name,5), findall(L,( member(L,LL), length(L,64)), _name). '2) キーボードから5 人分の名前を入力し,name 配列に格納する.'(_name) :- findall(L,( member(L,_name), '名前を入力し,name 配列に格納する'(L)), _name). '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,名前) :- キーボードから名前を入力し(_名前), 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(_名前,_name). '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,_名前) :- '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,_名前). 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(quit,_) :- !. 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(_名前,_name) :- 'name 配列の何番目に格納されているかを検索して'(_名前,_name), 表示する(_名前,_何番目),!. 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(_,_) :- writef('見つかりません\n'), fail. 'name 配列の何番目に格納されているかを検索して'(_名前,_name) :- atom_chars(_名前,Chars), nth1(_何番目,_name,L), append(Chars,_,L). 表示する(_名前,_何番目) :- writef('%tは%t番目にあります。\n',[_名前,_何番目]),!. '4) 「quit」が入力されるまで3)の処理を繰り返す.'(quit). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1354070278/682 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 以下の手順に従ってプログラムを作成せよ。 # 適宜printfを利用して、入力支援(「文字列を入力してください」等の画面表示)を行うこと。 # 1.文字配列name[5][64]を作成 # 2.キーボードから5人分の名前を入力し、name配列に格納 # 3.キーボードから名前を入力し、name配列の何番目に格納されているかを検索して表示 # (見つからなかった場合は「見つかりません」と表示) # 4.「quit」が入力されるまで3の処理を繰り返す # '以下の手順に従ってプログラムを作成せよ。 適宜printfを利用して、入力支援(「文字列を入力してください」等の画面表示)を行うこと。 1.文字配列名前[5][64]を作成 2.キーボードから5人分の名前を入力し、名前配列に格納 3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す' :- '1.文字配列名前[5][64]を作成'(_名前配列), '2.キーボードから5人分の名前を入力し、名前配列に格納'(_名前配列), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前). '1.文字配列名前[5][64]を作成'(LL) :- length(_名前配列,5), findall(L,( member(L,_名前配列), length(L,64)), _名前配列). '2.キーボードから5人分の名前を入力し、名前配列に格納'(_名前配列) :- findall(L,( member(L,_名前配列), 名前を入力し(_名前), 名前配列に格納(_名前,L)), _名前配列). 名前を入力し(_名前) :- write('名前を入力してください : '), get_line(_名前). 名前配列に格納(_名前,L) :- atom_chars(_名前,Chars), append(Chars,R,L), all(R,' '). '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前) :- 'キーボードから名前を入力し'(_名前), '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前). 'キーボードから名前を入力し'(_名前) :- write('検索する名前を入力してください : '), get_line(_名前). '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '4.「quit」が入力されるまで3の処理を繰り返す'(_名前),!. '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '名前配列の何番目に格納されているかを検索して'(_名前,_名前配列,_nth1), writef('%t番目 %t\n',[_nth,_名前]),!, fail. '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '見つからなかった場合は「見つかりません」と表示', fail. '見つからなかった場合は「見つかりません」と表示' :- write('見つかりません\n'). '名前配列の何番目に格納されているかを検索して'(_名前,_名前配列,_nth1) :- atom_chars(_名前,Chars), nth1(_nth1,_名前配列,L), append(Chars,R,L), all(R,' '). '4.「quit」が入力されるまで3の処理を繰り返す'(quit). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # [1] 授業単元: リスト処理 # [2] 問題文(含コード&) http://codepad.org/3DdhcBUM # # /* # # seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 # また、整列する際に要素どうしを比較した回数も表示しなさい。 # # 【実行例】 # # 番号 氏名      得点 # 1021 Machida Masato 100 # 1017 Nonaka Fujio 98 # 1011 Suzuki kenichi 93 # 1019 Fujimoto Kaoru 92 # 1006 kato Ichiro 91 # ・ ・     ・ # ・ ・     ・ # ・ ・     ・ # 1020 Hoshi Izumi 32 # 整列の為の比較回数=132回 # # ※長いので実行結果は途中省略しています。 # ※比較回数はコードによって異なる場合があります。 # # */ 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 また、整列する際に要素どうしを比較した回数も表示しなさい。' :- 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび), リスト処理による挿入法で得点の降順に整列して(_生徒ならび,[],_整列済み生徒ならび,0,_比較回数), 表示しなさい(_整列済み生徒ならび,_比較回数). 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび) :- get_split_lines('seito.dat',[' '],_生徒ならび). リスト処理による挿入法で得点の降順に整列して([[_学籍番号,_姓,_名,_得点]|R1],L1,_整列済み生徒ならび,_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,L1,L2,_比較回数_1,_比較回数_2), リスト処理による挿入法で得点の降順に整列して(R1,L2,_整列済み生徒ならび,_比較回数_2,_比較回数),!. リスト処理による挿入法で得点の降順に整列して([],_整列済み生徒ならび,_整列済み生徒ならび,_比較回数,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],[[_学籍番号,_名,_名,_得点],[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],_比較回数_1,_比較回数) :- 比較回数 is _比較回数_1 + 1, _得点 >= _得点_1,!. 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R1],[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R2],_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,R1,R2,_比較回数_1,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[],[[_学籍番号,_名,_名,_得点]],_比較回数,_比較回数) :- !. 表示しなさい(_整列済み生徒ならび,_比較回数) :- 見出しの表示, append(_,[[_学籍番号,_姓,_名,_得点]|R],_整列済み生徒ならび), 整形して表示する(_学籍番号,_姓,_名,_得点), R = [], writef('整列の為の比較回数=%t回\n',[_比較回数]). 見出しの表示 :- write('番号 氏名      得点\n'). 整形して表示する(_学籍番号,_姓,_名,_得点) :- 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列), 得点を頭部空白3桁に(_得点,_得点文字列), atomic_list_concat([_学籍番号,_姓文字列,_名文字列,_得点文字列],' ',_表示文字列), writef('%t\n',[_表示文字列]). 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列) :- '8桁に'(_姓,_姓文字列), '8桁に'(_名,_名文字列). '8桁に'(_項,_8桁文字列) :- atom_chars(_項,Chars_1), length(L,8), append(L1,L2,L), all(L2,' '), atom_chars(_8桁文字列,L). 得点を頭部空白3桁に(_得点,_得点文字列) :- number_chars(_得点,Chars), length(L,3), append(L0,Chars,L), all(L0,' '), atom_chars(_得点文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,( member(A,Lines1), split(A,Sep,Line)), Lines). get_lines(Instream,end_of_file,_,_,[]) :-!. get_lines(Instream,S,[],_終了検索対象ならび,[S]) :- member(A,_終了検索対象ならび), 検索(S,A),!. get_lines(Instream,S,[],[],[S|R]) :- get_line(Instream,S2), get_lines(Instream,S2,[],[],R),!. get_lines(Instream,S,[],_終了検索対象ならび,[S|R]) :- member(A,_終了検索対象ならび), \+(検索(S,A)), get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), member(B,_終了検索対象ならび), 検索(S,B),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S|R]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), !, get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,_,_開始検索対象ならび,_終了検索対象ならび,X) :- get_line(Instream,S2), get_lines(Instream,S2,_開始検索対象ならび,_終了検索対象ならび,X),!. get_lines(_ファイル,_スタート行,_最終行,X) :- integer(_スタート行), integer(_最終行), 行位置指定選択(_ファイル,_スタート行,_最終行,X). get_lines(_ファイル,_開始検索対象ならび,_終了検索対象ならび,X) :- \+(integer(_開始検索対象ならび)), \+(integer(_終了検索対象ならび)), open(_ファイル,read,Instream), get_line(Instream,S), get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,X), close(Instream),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat, get_line(user_input,Line), (Line = end_of_file , (!) , fail ; true)), Lines). get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_chars(Instream,end_of_file,[]) :- !. get_chars(Instream,_,[]) :- at_end_of_stream(Instream),!. get_chars(Instream,X,[X|R]) :- get_char(Instream,Y), get_chars(Instream,Y,R) . get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists_file(File_1), open(File_1,read,Instream), get_char(Instream,X), get_chars(Instream,X,L), close(Instream),!. get_chars(Instream,L) :- is_stream(_,Instream,_), get_char(Instream,X), get_chars(Instream,X,L),!. get_chars(L) :- findall(U,( repeat, get_char(U), (U = end_of_file , (!) , fail ; true)), L). get_line(X) :- get_line(user_input,X). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,_,[]) :- at_end_of_stream(Instream),!. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), atomic_list_concat(U,A), chars_lines(R,R2). split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y) , \+(member(U,_区切り符号ならび))), Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), C number Nl,!. split_5(B,C) :- atomic_list_concat(B,C),!. all([],_). all([V|R],V) :- all(R,V). 検索(_文字列,_副文字列) :- atom_length(_文字列,_文字列の文字数), atom_length(_副文字列,_副文字列の文字数), Max is _文字列の文字数 - _副文字列の文字数, between(0,Max,N), sub_atom(_文字列,N,_副文字列の文字数,_副文字列),!. 行位置指定選択(_ファイル,_選択先頭行,_選択最終行,X) :- wc(_ファイル,[[_行,_,_,_]]), _行数_1 is _行 - _選択先頭行 + 1, _行数_2 is _選択最終行 - _選択先頭行, atomic_list_concat(['tail -',_行数_1,' ',_ファイル,' | head -',_行数_2],S), shs(S,X). wc(F,X) :- exists_file(F1), atomic_list_concat(['wc ',F1],S), sh(S,X),!. wc(F,X) :- atomic_list_concat([F,' | wc'],S), sh(S,X),!. sh(Command,X) :- shs(Command,Y), findall(U,(member(V,Y) , make_list(V,[' ',','],U)),X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,_,[]) :- at_end_of_stream(Instream),!. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1357748713/79 # [1] 授業単元: システム開発 # [2] 問題文(含コード&amp;リンク): # 以下のヒントを元に、生徒の成績を管理するプログラムを作りなさい # http://ime.nu/codepad.org/vevYc04f # http://ime.nu/codepad.org/rCOCOccX # # /* seiseki.c 成績処理システム */ # #include /* 標準入出力 */ # #include /* 標準ライブラリー */ # #include /* 数学的関数 */ # #include /* 文字列関数 */ # #define SEN "--------------------\n" /* マクロ定義 */ # #define KEISEN "=====================\n" # # /* サブルーチンの宣言 */ # void data_write(void); /* データの書き込み */ # void data_read(void); /* データの読み込み */ # void data_disp(void); /* 成績一覧表の表示 */ # void data_kensk(void); /* 検索処理 */ # void the_end(void); /* プログラムの終了処理 */ # # /* 変数, 構造体の宣言 */ # struct seiseki{ # char simei[20]; /* 氏名 */ # int bango, kokugo, eigo, suugaku; /* 番号, 国語, 英語, 数学 */ # }; # struct seiseki a[100]; /* 登録数は100名まで */ # int n, i, goukei; /* 変数の定義 */ # double heikin, std; # # main() # { # int k; /* switch-case用の処理番号 */ # do{ /* 繰り返し処理do-while */ # /* 初期メニュー画面 */ # printf("\n"); # printf("☆☆ 成績処理メニュー ☆☆\n"); # printf(SEN); # printf("データの書き込み・・・・・・・・・【1】\n"); # printf("データの読み込み・・・・・・・・・【2】\n"); # printf("成績一覧表・・・・・・・・・・・・【3】\n"); # printf("検索処理・・・・・・・・・・・・・【4】\n"); # printf("終わり・・・・・・・・・・・・・・【9】\n"); # printf(SEN); # printf("処理番号を入力してください:"); # scanf("%d",&k); # printf("\n"); # # /* 関数の呼び出し */ # switch(k){ # case 1:data_write();break; # case 2:data_read();break; # case 3:data_disp();break; # case 4:data_kensk();break; # case 9:the_end();break; # default:printf("該当番号なし\n");break; # } # }while(k < 10); # } # # /* 成績一覧表の作成 */ # void data_disp(void) # { # int goukei_k=0, goukei_e=0, goukei_s=0; # double heikin_k=0.0, heikin_e=0.0, heikin_s=0.0; # double std_k=0.0, std_e=0.0, std_s=0.0; # # printf("☆☆☆ 成績一覧表 ☆☆☆\n"); # printf(KEISEN); # printf("番号 名前 国語 英語 数学 合計 平均\n"); # for(i=0;i < n;i++){ # printf("%5d %-10s %5d %5d %5d", a[i].bango, a[i].simei, a[i].kokugo, a[i].eigo, a[i].suugaku); # /* 3科目の合計計算 */ # goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku); # printf("%5d",goukei); # /* キャスト:3科目の平均計算 */ # heikin=(double)goukei/3; # printf("%6.1f\n",heikin); # } # printf("\n"); # # /* 各科目の合計計算 */ # for(i=0;i < n;i++){ # goukei_k+=a[i].kokugo; # goukei_e+=a[i].eigo; # goukei_s+=a[i].suugaku; # } # # /* 各科目の平均計算 */ # heikin_k=(double)goukei_k/n; # heikin_e=(double)goukei_e/n; # heikin_s=(double)goukei_s/n; # # /* 偏差の二乗和の計算 */ # for(i=0;i < n;i++){ # std_k+=pow((a[i].kokugo-heikin_k),2); # std_e+=pow((a[i].eigo-heikin_e),2); # std_s+=pow((a[i].suugaku-heikin_s),2); # } # # /* 標準偏差の計算 */ # std_k=sqrt(std_k/n); # std_e=sqrt(std_e/n); # std_s=sqrt(std_s/n); '繰り返し処理do-while'(P) :- 'do{ /* 繰り返し処理do-while */ }while(k < 10);'(P). 初期メニュー画面(_k) :- '/* 初期メニュー画面 */ printf("\n"); printf("☆☆ 成績処理メニュー ☆☆\n"); printf(SEN); printf("データの書き込み・・・・・・・・・【1】\n"); printf("データの読み込み・・・・・・・・・【2】\n"); printf("成績一覧表・・・・・・・・・・・・【3】\n"); printf("検索処理・・・・・・・・・・・・・【4】\n"); printf("終わり・・・・・・・・・・・・・・【9】\n"); printf(SEN); printf("処理番号を入力してください:"); scanf("%d",&k); printf("\n");'(_k). 関数の呼び出し(_k) :- '/* 関数の呼び出し */ switch(k){ case 1:data_write();break; case 2:data_read();break; case 3:data_disp();break; case 4:data_kensk();break; case 9:the_end();break; default:printf("該当番号なし\n");break; }'(_k). '3科目の合計計算'(_i,_a,_goukei) :- '/* 3科目の合計計算 */ goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku); printf("%5d",goukei);'(_i,_a,_goukei). 'キャスト:3科目の平均計算'(_goukei,_heikin) :- '/* キャスト:3科目の平均計算 */ heikin=(double)goukei/3; printf("%6.1f\n",heikin);'(_goukei,_heikin). 各科目の合計計算(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :- '/* 各科目の合計計算 */ for(i=0;i < n;i++){ goukei_k+=a[i].kokugo; goukei_e+=a[i].eigo; goukei_s+=a[i].suugaku; }'(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s). 各科目の平均計算((_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s) :- '/* 各科目の平均計算 */ heikin_k=(double)goukei_k/n; heikin_e=(double)goukei_e/n; heikin_s=(double)goukei_s/n;'(_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s). 偏差の二乗和の計算(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- '/* 偏差の二乗和の計算 */ for(i=0;i < n;i++){ std_k+=pow((a[i].kokugo-heikin_k),2); std_e+=pow((a[i].eigo-heikin_e),2); std_s+=pow((a[i].suugaku-heikin_s),2); }'(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s). 標準偏差の計算(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- '/* 標準偏差の計算 */ std_k=sqrt(std_k/n); std_e=sqrt(std_e/n); std_s=sqrt(std_s/n);'(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'do{ /* 繰り返し処理do-while */ }while(k < 10);'(P) :- between(1,10,N), call(P), N = 10. '/* 初期メニュー画面 */ printf("\n"); printf("☆☆ 成績処理メニュー ☆☆\n"); printf(SEN); printf("データの書き込み・・・・・・・・・【1】\n"); printf("データの読み込み・・・・・・・・・【2】\n"); printf("成績一覧表・・・・・・・・・・・・【3】\n"); printf("検索処理・・・・・・・・・・・・・【4】\n"); printf("終わり・・・・・・・・・・・・・・【9】\n"); printf(SEN); printf("処理番号を入力してください:"); scanf("%d",&k); printf("\n");'(_k) :- write('\n'), writef('☆☆ 成績処理メニュー ☆☆\n'), write('%t',['--------------------\n']), write('データの書き込み・・・・・・・・・【1】\n'), write('データの読み込み・・・・・・・・・【2】\n'), write('成績一覧表・・・・・・・・・・・・【3】\n'), write('検索処理・・・・・・・・・・・・・【4】\n'), write('終わり・・・・・・・・・・・・・・【9】\n'), write('--------------------\n'), write('処理番号を入力してください:'), 整数を得る(_k), write('\n'). '/* 関数の呼び出し */ switch(k){ case 1:data_write();break; case 2:data_read();break; case 3:data_disp();break; case 4:data_kensk();break; case 9:the_end();break; default:printf("該当番号なし\n");break; }'(_k) :- '_kの値によって述語を呼び出す'(_k). '_kの値によって述語を呼び出す'(1) :- data_write. '_kの値によって述語を呼び出す'(2) :- data_read. '_kの値によって述語を呼び出す'(3) :- data_disp. '_kの値によって述語を呼び出す'(4) :- data_kensk. '_kの値によって述語を呼び出す'(9) :- the_end. '/* 3科目の合計計算 */ goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku); printf("%5d",goukei);'(_i,_a,_goukei) :- nth0(_i,_a,[_kokugo,_eigo,_suugaku]), _goukei is _kokugo + _eigo + _suugaku, writef('%t',[_goukei]). '/* キャスト:3科目の平均計算 */ heikin=(double)goukei/3; printf("%6.1f\n",heikin);'(_goukei,_heikin) :- _heikin is _goukei / 3, format('~1f\n',[_heikin]). '/* 各科目の合計計算 */ for(i=0;i < n;i++){ goukei_k+=a[i].kokugo; goukei_e+=a[i].eigo; goukei_s+=a[i].suugaku; }'(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :- 各科目の合計計算(0,_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s). 各科目の合計計算(_n_1,_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :- _n_1 < _n, nth1(_nth1,_a,[_kokugo,_eigo,_suugaku]), _goukei_k_2 is _goukei_k_1 + _kokugo, _goukei_e_2 is _goukei_e_1 + _eigo, _goukei_s_2 is _goukei_s_1 + _suugaku, _n_2 is _n_1 + 1, 各科目の合計計算(_n_2,_n,_a,_goukie_k_2,_goukei_e_2,_goukei_s_2,_goukie_k,_goukei_e,_goukei_s). 各科目の合計計算(_n_1,_n,_a,_goukie_k,_goukei_e,_goukei_s,_goukie_k,_goukei_e,_goukei_s) :- _n_1 >= _n. '/* 各科目の平均計算 */ heikin_k=(double)goukei_k/n; heikin_e=(double)goukei_e/n; heikin_s=(double)goukei_s/n;'(_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s) :- _heikin_k is _heikin_k_1 + _goukei_k / _n, _heikin_e is _heikin_e_1 + _goukei_e / _n, _heikin_s is _heikin_s_1 + _goukei_s / _n. '/* 偏差の二乗和の計算 */ for(i=0;i < n;i++){ std_k+=pow((a[i].kokugo-heikin_k),2); std_e+=pow((a[i].eigo-heikin_e),2); std_s+=pow((a[i].suugaku-heikin_s),2); }'(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- 偏差の二乗和の計算(0,_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s). 偏差の二乗和の計算(_i_1,_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- _i_1 < _n, 偏差の二乗を加える(_i_1,_n,_a,_std_k_1,_std_e_1,std_s_1,_std_k_2,_std_e_2,std_s_2), _i_2 is _i_1 + 1, 偏差の二乗和の計算(_i_2,_n,_a,_std_k_2,_std_e_2,_std_s_2,_std_k,_std_e,_std_s). 偏差の二乗和の計算(_i_1,_n,_a,_std_k,_std_e,_std_s,_std_k,_std_e,_std_s) :- _i_1 >= _n. 偏差の二乗を加える(_i_1,_a,_std_k_1,_std_e_1,std_s_1,_std_k_2,_std_e_2,std_s_2) :- nth1(_i_1,_a,[_kokugo_heikin_k,_eigo_heikin_e,_suugaku_heikin_s]), _std_k_2 is _std_k_1 + _kokugo_heikin_k ^ 2, _std_e_2 is _std_e_1 + _eigo_heikin_e ^ 2, _std_s_2 is _std_s_1 + _suugaku_heikin_s ^ 2. '/* 標準偏差の計算 */ std_k=sqrt(std_k/n); std_e=sqrt(std_e/n); std_s=sqrt(std_s/n);'(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- _std_k is sqrt(_std_k_1) / _n, _std_e is sqrt(_std_e_1) / _n, _std_s is sqrt(_std_s_1) / _n. % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1343899481/490 # SQL SERVER2012です。 # # 列1をaとbで検索して # 新しく列2,列3を作成。 # 列2にaの値を # 列3にbの値を表示することが # 可能ならばやり方を教えてもらえませんでしょうか。 # # 列1 # a # b # a # b # c # # 求めたい結果 # 列2 列3 # a b # a b # # 宜しくお願いします。 # # '列1をaとbで検索して 新しく列2,列3を作成。 列2にaの値を 列3にbの値を表示する'(_列2,_列3) :- findall(a,table(a),L1), findall(b,table(b),L2), nth1(_nth1,L1,_列2), nth1(_nth1,L2,_列3). % 以下のサイトは # http://toro.2ch.net/test/read.cgi/tech/1357748713/477 # [1] 授業単元:c++ # [2] 問題文(含コード&リンク):不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、ローマ字名を入力してデータファイル内の情報を検索するプログラムを作成してください。 # 検索の結果として、該当者が居る場合画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。また、該当者が居ない場合はその旨を表示するようにしてください。 # [3] 環境 #  [3.1] OS: windows7 #  [3.2] コンパイラ名とバージョン: Borland C++ 5.5.1 #  [3.3] 言語:C++ # [4] 期限: 2013/2/1 # [5] その他の制限: 入出力の方法、変数、四則演算、分岐、繰り返し、関数、文字の出入力、文字列、構造体、ファイル処理の範囲内でお願い致します。 '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力してデータファイル内の情報を検索するプログラムを作成してください。 検索の結果として、該当者が居る場合画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示するようにしてください。' :- '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_検索結果,_ローマ字名,_漢字名,_番号,_得点), '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(_検索結果,_ローマ字名,_漢字名,_番号,_得点). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_検索結果,_入力されたローマ字名,_漢字名,_番号,_得点) :- ローマ字名を入力して(_入力されたローマ字名), '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_入力されたローマ字名,_検索結果,_漢字名,_番号,_得点). ローマ字名を入力して(_ローマ字名) :- write('検索するローマ字名を入力してください : '), get_line(_ローマ字名). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_入力されたローマ字名,該当者が居る,_漢字名,_番号,_得点) :- get_split_lines('seiseki.txt',[' ',','],LL), member([_入力されたローマ字名,_漢字名,_番号,_得点],LL). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_,該当者が居ない,_,_,_). '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(該当者が居る,_ローマ字名,_漢字名,_番号,_得点) :- '画面にその情報(ローマ字名、漢字名、番号、得点)を表示し'(_ローマ字名,_漢字名,_番号,_得点), 'なおかつその情報が記載された新しいファイル(kekka.txt)が生成される'(_ローマ字名,_漢字名,_番号,_得点). '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(該当者が居ない,_,_,_,_) :- write('該当者はいません\n'). '画面にその情報(ローマ字名、漢字名、番号、得点)を表示し'(_ローマ字名,_漢字名,_番号,_得点) :- writef('%t %t %t %t\n',[_ローマ字名,_漢字名,_番号,_得点]). 'なおかつその情報が記載された新しいファイル(kekka.txt)が生成される'(_ローマ字名,_漢字名,_番号,_得点) :- '新しいファイル(kekka.txt)が生成される'(Outstream), writef(Outstream,'%t %t %t %t\n',[_ローマ字名,_漢字名,_番号,_得点]), close(Outstream). '新しいファイル(kekka.txt)が生成される'(Outstream) :- open('kekka.txt',write,Outstream). % 以下のサイトは # http://d.hatena.ne.jp/E_Mattsan/20130211/1360590408 # 「E.Mattsan氏のブログ 20130211より」 # # 設問 # # まず、パタンマッチングの部分だけが見やすくなるように、「どう書く」の問題からいろいろ取り去ってより簡単な問題を作りました。 # # # 要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 # コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 # 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 # 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 # 要素がコンテナ中に見つからない場合、-1を返す。 # 検索(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- 形式(_指定された要素,L1), append(L0,L1,_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. 検索(_,_,-1). 形式(_指定された要素,[_指定された要素,_指定された要素,_指定された要素|_]). 形式(_指定された要素,[_指定された要素,_指定された要素|_]). 形式(_指定された要素,[_指定された要素|_]). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1340383120/600 # お願いします。 # # ●正規表現の使用環境 # Javascript # # ●検索か置換か? # 検索 # # ●説明 # HMVの商品IDらしき番号を取得したい # # ●対象データ # http://ime.nu/www.hmv.co.jp/artist_松平健_000000000039225/item_マツケンサンバ-2-リミックス-トラックス-dvd_1789889 # # http://ime.nu/www.hmv.co.jp/artist_松平健_000000000039225/item_マツケンサンバ-2-リミックス-トラックス-dvd_1789889/ref/1448035_8 # # ●希望する結果 # 1789889 # # 説明 # アンダーバー以降の末尾の自然数が商品IDなのですが(これなら簡単) # リファラー付きの場合は末尾じゃなくなるので初心者の自分には難しいです。 # なお、商品IDは0(ゼロ)で桁合わせはしていません # # 'HMVの商品IDらしき番号を取得したい'(_文字列,_商品ID) :- sub_atom(_文字列,S,5,_,'/ref/'), sub_atom(_文字列,0,S,_,_文字列_1), '商品IDは最後の_から末尾までの副文字列'(_文字列_1,_商品ID),!. 'HMVの商品IDらしき番号を取得したい'(_文字列,_商品ID) :- '商品IDは最後の_から末尾までの副文字列'(_文字列,_商品ID),!. '商品IDは最後の_から末尾までの副文字列'(_文字列,_商品ID) :- atom_chars(_文字列,Chars), append(_,['_'|R1],Chars), \+(member('_',R1)), atom_chars(_商品ID,R1). % 以下のサイトは % % 文字列検索/8 % 文字列検索(_文字列,_切り取り開始文字列ならび,_切り取り終了文字列ならび,_切り取り開始以前文字列,_切り取り開始文字列,_切り取り文字列,_切り取り終了文字列,_残り文字列) :- atom_chars(_文字列,_文字ならび), 切り取り文字列ならびを文字ならびのならびに変換(_切り取り開始文字列ならび,_切り取り終了文字列ならび,_切り取り開始文字ならび候補,_切り取り終了文字ならび候補), 切り取り文字列まで読み飛ばし(_文字ならび,_切り取り開始文字ならび候補,_切り取り開始以前文字ならび,_切り取り開始文字ならび,_残り文字ならびの一), 文字ならび切り取り(_残り文字ならびの一,_切り取り終了文字ならび候補,_切り取り文字ならび,_切り取り終了文字ならび,_残り文字ならび), 切り取り文字列文字ならび変換(_切り取り開始以前文字ならび,_切り取り文字ならび,_切り取り終了文字ならび,_残り文字ならび,_切り取り開始文字ならび,_切り取り開始以前文字列,_切り取り文字列,_切り取り終了文字列,_残り文字列,_切り取り開始文字列). 切り取り文字列ならびを文字ならびのならびに変換(_切り取り開始文字列ならび,_切り取り終了文字列ならび,_切り取り開始文字ならび候補,_切り取り終了文字ならび候補) :- findall(_切り取り開始文字ならびの一,( member(_切り取り開始文字列の一,_切り取り開始文字列ならび) , atom_chars(_切り取り開始文字列の一,_切り取り開始文字ならびの一)), _切り取り開始文字ならび候補), findall(_切り取り終了文字ならびの一,( member(_切り取り終了文字列の一,_切り取り終了文字列ならび), atom_chars(_切り取り終了文字列の一,_切り取り終了文字ならびの一)), _切り取り終了文字ならび候補). 切り取り文字列文字ならび変換(_切り取り開始以前文字ならび,_切り取り文字ならび,_切り取り終了文字ならび,_残り文字ならび,_切り取り開始文字ならび,_切り取り開始以前文字列,_切り取り文字列,_切り取り終了文字列,_残り文字列,_切り取り開始文字列) :- atom_chars(_切り取り開始以前文字列,_切り取り開始以前文字ならび), atom_chars(_切り取り文字列,_切り取り文字ならび), atom_chars(_切り取り終了文字列,_切り取り終了文字ならび), atom_chars(_残り文字列,_残り文字ならび), atom_chars(_切り取り開始文字列,_切り取り開始文字ならび). 切り取り文字列まで読み飛ばし(_文字ならび,[],[],[],_文字ならび) :- !. 切り取り文字列まで読み飛ばし(_文字ならび,_切り取り開始文字ならび候補,[],_切り取り開始文字ならび,_残り文字ならび) :- member(_切り取り開始文字ならび,_切り取り開始文字ならび候補), append(_切り取り開始文字ならび,_残り文字ならび,_文字ならび). 切り取り文字列まで読み飛ばし([A|R1],_切り取り開始文字ならび候補,[A|R2],_切り取り開始文字ならび,R3) :- 切り取り文字列まで読み飛ばし(R1,_切り取り開始文字ならび候補,R2,_切り取り開始文字ならび,R3). 文字ならび切り取り([],_,[],[],[]) :- !. 文字ならび切り取り(_文字ならび,[],_文字ならび,[],[]) :- !. 文字ならび切り取り(_残り文字ならびの一,_終了文字ならび候補,_切り取り文字ならび,_終了文字ならび,_残り文字ならび) :- member(_終了文字ならび,_終了文字ならび候補), append(_終了文字ならび,_残り文字ならび,_終了文字ならびの二), append(_切り取り文字ならび,_終了文字ならびの二,_残り文字ならびの一). % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1343899481/628 # t_guest、t_address、t_friend という3つのテーブルがあって、 # t_guestを基本にして、left joinをt_jushoとt_friendにそれぞれ仕掛けてselectのクエリを作りたいと考えています # # SELECT g.namae, a.prefecture, f.namae # FROM t_guest AS g # LEFT JOIN t_address AS a #  ON g.id = a.guestId # LEFT JOIN t_friend AS f #  ON g.id = f.guestId # WHERE g.age = 20; # # こんなイメージなんですが、ここで、t_addressに住所を登録していないguestのユーザーを検索しないようにするには # どうしたら良いんでしょうか # それぞれのテーブルのカラムへの条件付けはできるんですが、「登録していない状況」をどう表現したら良いのか # わかりません # # 't_guest、t_address、t_friend という3つのテーブルがあって、 t_guestを基本にして、left joinをt_jushoとt_friendにそれぞれ仕掛けてselectのクエリを作りたいと考えています SELECT g.namae, a.prefecture, f.namae FROM t_guest AS g LEFT JOIN t_address AS a  ON g.id = a.guestId LEFT JOIN t_friend AS f  ON g.id = f.guestId WHERE g.age = 20; こんなイメージなんですが、ここで、t_addressに住所を登録していないguestのユーザーを検索しないようにするにはどうしたら良いんでしょうか それぞれのテーブルのカラムへの条件付けはできるんですが、「登録していない状況」をどう表現したら良いのかわかりません'(_namae,_prefecture,_namae) :- t_guest(_id,g_namae), t_address(_id,_address,_prefecture), \+(_address = ''), t_friend(_id,f_namae). % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1343899481/659 # A_table # # ID | title | keyword # ------------------- # 1 | いうえ | あいうえお # 2 | きくけ | かきくけこ # 3 | しすせ | さしすせそ # # select * from A_table where "あいうえお" like "%titel%" # # 結果を # ID 1 の "いうえ" を結果としてだしたいのですが、 # WEBで入力した文字列の中に titleの中身を like検索してヒットする物をだしたい感じです。 # # MYSQLですが、、なかなかいい方法がわからなくて・・・ # 'A_table ID | title | data ------------------- 1 | いうえ | あいうえお 2 | きくけ | かきくけこ 3 | しすせ | さしすせそ select * from A_table where "あいうえお" like "%titel%" 結果を ID 1 の "いうえ" を結果としてだしたいのですが、 WEBで入力した文字列の中に titleの中身を like検索してヒットする物をだしたい感じです。'(_WEBで入力した文字列,_ID,_title,_data) :- 'A_table'(_ID,_title,_data), sub_atom(_WEBで入力した文字列,_,_,_,_title). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1340383120/591 # ●正規表現の使用環境 # Perl # # ●検索か置換か? # 検索 # # ●説明 # トップから第三レベルドメインまでをマッチさせたい。 # www.(mydomain.co.jp)※括弧の中 # サブドメインが無い場合も想定されます。 # mydomain.com # www.aaa.mydomain.com # aaa.bbb.mydomain.com # # ●対象データ # www.mydomain.co.jp # mydomain.co.jp # mydomain.com # www.aaa.mydomain.com # aaa.bbb.mydomain.com # # ●希望する結果 # mydomain.co.jp # mydomain.com # # よろしくお願いします。 # # 'トップから第三レベルドメインまでをマッチさせたい。'(_文字列,_第三レベルドメインまでの文字列) :- '第二・第一レベルドメインと第三以上レベルドメイン文字列を得る'(_文字列,_第二第一レベルドメイン,_第三以上レベルドメイン文字列), '第三レベルドメインを切り出す'(_第三以上レベルドメイン文字列,_第三レベルドメイン), atomic_list_concat([_第三レベルドメイン,_第二第一レベルドメイン],_第三レベルドメインまでの文字列]). '第二・第一レベルドメインと第三以上レベルドメイン文字列を得る'(_文字列,_第二第一レベルドメイン,_第三以上レベル文字列) :- '第二・第一レベルドメイン'(_第二第一レベルドメイン), sub_atom(_文字列,S,Len,R,_第二第一レベルドメイン), sub_atom(_文字列,0,S,_,_第三以上レベル文字列). '第三レベルドメインを切り出す'(_第三以上レベルドメイン文字列,_第三レベルドメイン) :- split(_第三以上レベルドメイン文字列,['.'],L), last(L,_第三レベルドメイン),!. '第二・第一レベルドメイン'(a). '第二・第一レベルドメイン'(ab). '第二・第一レベルドメイン'(abo). '第二・第一レベルドメイン'(abog). '第二・第一レベルドメイン'(aboga). '第二・第一レベルドメイン'(abogad). '第二・第一レベルドメイン'(abogado). '第二・第一レベルドメイン'(ac). '第二・第一レベルドメイン'(ad). '第二・第一レベルドメイン'(adu). '第二・第一レベルドメイン'(adul). '第二・第一レベルドメイン'(adult). '第二・第一レベルドメイン'(ae). '第二・第一レベルドメイン'(aer). '第二・第一レベルドメイン'(aero). '第二・第一レベルドメイン'(af). '第二・第一レベルドメイン'(afr). '第二・第一レベルドメイン'(afri). '第二・第一レベルドメイン'(afric). '第二・第一レベルドメイン'(africa). '第二・第一レベルドメイン'(ag). '第二・第一レベルドメイン'(ai). '第二・第一レベルドメイン'(al). '第二・第一レベルドメイン'(am). '第二・第一レベルドメイン'(ams). '第二・第一レベルドメイン'(amst). '第二・第一レベルドメイン'(amste). '第二・第一レベルドメイン'(amster). '第二・第一レベルドメイン'(amsterd). '第二・第一レベルドメイン'(amsterda). '第二・第一レベルドメイン'(amsterdam). '第二・第一レベルドメイン'(ap). '第二・第一レベルドメイン'(app). '第二・第一レベルドメイン'(as). '第二・第一レベルドメイン'(asi). '第二・第一レベルドメイン'(asia). '第二・第一レベルドメイン'(at). '第二・第一レベルドメイン'(au). '第二・第一レベルドメイン'(auc). '第二・第一レベルドメイン'(auct). '第二・第一レベルドメイン'(aucti). '第二・第一レベルドメイン'(auctio). '第二・第一レベルドメイン'(auction). '第二・第一レベルドメイン'(ax). '第二・第一レベルドメイン'(az). '第二・第一レベルドメイン'(b). '第二・第一レベルドメイン'(ba). '第二・第一レベルドメイン'(bab). '第二・第一レベルドメイン'(baby). '第二・第一レベルドメイン'(ban). '第二・第一レベルドメイン'(bank). '第二・第一レベルドメイン'(bar). '第二・第一レベルドメイン'(barc). '第二・第一レベルドメイン'(barce). '第二・第一レベルドメイン'(barcel). '第二・第一レベルドメイン'(barcelo). '第二・第一レベルドメイン'(barcelon). '第二・第一レベルドメイン'(barcelona). '第二・第一レベルドメイン'(bb). '第二・第一レベルドメイン'(be). '第二・第一レベルドメイン'(bee). '第二・第一レベルドメイン'(beer). '第二・第一レベルドメイン'(ber). '第二・第一レベルドメイン'(berl). '第二・第一レベルドメイン'(berli). '第二・第一レベルドメイン'(berlin). '第二・第一レベルドメイン'(bg). '第二・第一レベルドメイン'(bi). '第二・第一レベルドメイン'(bik). '第二・第一レベルドメイン'(bike). '第二・第一レベルドメイン'(biz). '第二・第一レベルドメイン'(bj). '第二・第一レベルドメイン'(bl). '第二・第一レベルドメイン'(blo). '第二・第一レベルドメイン'(blog). '第二・第一レベルドメイン'(bm). '第二・第一レベルドメイン'(bo). '第二・第一レベルドメイン'(boo). '第二・第一レベルドメイン'(book). '第二・第一レベルドメイン'(booki). '第二・第一レベルドメイン'(bookin). '第二・第一レベルドメイン'(booking). '第二・第一レベルドメイン'(bos). '第二・第一レベルドメイン'(bost). '第二・第一レベルドメイン'(bosto). '第二・第一レベルドメイン'(boston). '第二・第一レベルドメイン'(br). '第二・第一レベルドメイン'(bru). '第二・第一レベルドメイン'(brus). '第二・第一レベルドメイン'(bruss). '第二・第一レベルドメイン'(brusse). '第二・第一レベルドメイン'(brussel). '第二・第一レベルドメイン'(brussels). '第二・第一レベルドメイン'(bs). '第二・第一レベルドメイン'(bu). '第二・第一レベルドメイン'(bud). '第二・第一レベルドメイン'(buda). '第二・第一レベルドメイン'(budap). '第二・第一レベルドメイン'(budape). '第二・第一レベルドメイン'(budapes). '第二・第一レベルドメイン'(budapest). '第二・第一レベルドメイン'(by). '第二・第一レベルドメイン'(bz). '第二・第一レベルドメイン'(c). '第二・第一レベルドメイン'(ca). '第二・第一レベルドメイン'(cap). '第二・第一レベルドメイン'(cape). '第二・第一レベルドメイン'(capet). '第二・第一レベルドメイン'(capeto). '第二・第一レベルドメイン'(capetow). '第二・第一レベルドメイン'(capetown). '第二・第一レベルドメイン'(car). '第二・第一レベルドメイン'(care). '第二・第一レベルドメイン'(caree). '第二・第一レベルドメイン'(career). '第二・第一レベルドメイン'(cas). '第二・第一レベルドメイン'(cash). '第二・第一レベルドメイン'(cat). '第二・第一レベルドメイン'(cc). '第二・第一レベルドメイン'(cd). '第二・第一レベルドメイン'(cf). '第二・第一レベルドメイン'(cg). '第二・第一レベルドメイン'(ch). '第二・第一レベルドメイン'(chr). '第二・第一レベルドメイン'(chri). '第二・第一レベルドメイン'(chris). '第二・第一レベルドメイン'(christ). '第二・第一レベルドメイン'(christm). '第二・第一レベルドメイン'(christma). '第二・第一レベルドメイン'(christmas). '第二・第一レベルドメイン'(ci). '第二・第一レベルドメイン'(cl). '第二・第一レベルドメイン'(cli). '第二・第一レベルドメイン'(clic). '第二・第一レベルドメイン'(click). '第二・第一レベルドメイン'(cm). '第二・第一レベルドメイン'(cn). '第二・第一レベルドメイン'(co). '第二・第一レベルドメイン'('co.'). '第二・第一レベルドメイン'('co.a'). '第二・第一レベルドメイン'('co.ao'). '第二・第一レベルドメイン'('co.at'). '第二・第一レベルドメイン'('co.b'). '第二・第一レベルドメイン'('co.bw'). '第二・第一レベルドメイン'('co.c'). '第二・第一レベルドメイン'('co.ck'). '第二・第一レベルドメイン'('co.cm'). '第二・第一レベルドメイン'('co.cr'). '第二・第一レベルドメイン'('co.f'). '第二・第一レベルドメイン'('co.fk'). '第二・第一レベルドメイン'('co.h'). '第二・第一レベルドメイン'('co.hu'). '第二・第一レベルドメイン'('co.i'). '第二・第一レベルドメイン'('co.id'). '第二・第一レベルドメイン'('co.il'). '第二・第一レベルドメイン'('co.in'). '第二・第一レベルドメイン'('co.ir'). '第二・第一レベルドメイン'('co.j'). '第二・第一レベルドメイン'('co.jp'). '第二・第一レベルドメイン'('co.k'). '第二・第一レベルドメイン'('co.ke'). '第二・第一レベルドメイン'('co.kr'). '第二・第一レベルドメイン'('co.l'). '第二・第一レベルドメイン'('co.ls'). '第二・第一レベルドメイン'('co.m'). '第二・第一レベルドメイン'('co.mz'). '第二・第一レベルドメイン'('co.n'). '第二・第一レベルドメイン'('co.nl'). '第二・第一レベルドメイン'('co.no'). '第二・第一レベルドメイン'('co.nz'). '第二・第一レベルドメイン'('co.r'). '第二・第一レベルドメイン'('co.rs'). '第二・第一レベルドメイン'('co.t'). '第二・第一レベルドメイン'('co.th'). '第二・第一レベルドメイン'('co.tt'). '第二・第一レベルドメイン'('co.tz'). '第二・第一レベルドメイン'('co.u'). '第二・第一レベルドメイン'('co.ug'). '第二・第一レベルドメイン'('co.uk'). '第二・第一レベルドメイン'('co.z'). '第二・第一レベルドメイン'('co.za'). '第二・第一レベルドメイン'('co.zw'). '第二・第一レベルドメイン'(cof). '第二・第一レベルドメイン'(coff). '第二・第一レベルドメイン'(coffe). '第二・第一レベルドメイン'(coffee). '第二・第一レベルドメイン'(com). '第二・第一レベルドメイン'('com.'). '第二・第一レベルドメイン'('com.a'). '第二・第一レベルドメイン'('com.ag'). '第二・第一レベルドメイン'('com.ai'). '第二・第一レベルドメイン'('com.al'). '第二・第一レベルドメイン'('com.an'). '第二・第一レベルドメイン'('com.ar'). '第二・第一レベルドメイン'('com.au'). '第二・第一レベルドメイン'('com.aw'). '第二・第一レベルドメイン'('com.az'). '第二・第一レベルドメイン'('com.b'). '第二・第一レベルドメイン'('com.bd'). '第二・第一レベルドメイン'('com.bh'). '第二・第一レベルドメイン'('com.bn'). '第二・第一レベルドメイン'('com.bo'). '第二・第一レベルドメイン'('com.br'). '第二・第一レベルドメイン'('com.bs'). '第二・第一レベルドメイン'('com.bt'). '第二・第一レベルドメイン'('com.c'). '第二・第一レベルドメイン'('com.cm'). '第二・第一レベルドメイン'('com.cn'). '第二・第一レベルドメイン'('com.co'). '第二・第一レベルドメイン'('com.cy'). '第二・第一レベルドメイン'('com.d'). '第二・第一レベルドメイン'('com.de'). '第二・第一レベルドメイン'('com.dz'). '第二・第一レベルドメイン'('com.e'). '第二・第一レベルドメイン'('com.ec'). '第二・第一レベルドメイン'('com.eg'). '第二・第一レベルドメイン'('com.es'). '第二・第一レベルドメイン'('com.et'). '第二・第一レベルドメイン'('com.f'). '第二・第一レベルドメイン'('com.fj'). '第二・第一レベルドメイン'('com.g'). '第二・第一レベルドメイン'('com.ge'). '第二・第一レベルドメイン'('com.gh'). '第二・第一レベルドメイン'('com.gi'). '第二・第一レベルドメイン'('com.gl'). '第二・第一レベルドメイン'('com.gn'). '第二・第一レベルドメイン'('com.gr'). '第二・第一レベルドメイン'('com.gt'). '第二・第一レベルドメイン'('com.gu'). '第二・第一レベルドメイン'('com.h'). '第二・第一レベルドメイン'('com.hk'). '第二・第一レベルドメイン'('com.hr'). '第二・第一レベルドメイン'('com.j'). '第二・第一レベルドメイン'('com.jm'). '第二・第一レベルドメイン'('com.jo'). '第二・第一レベルドメイン'('com.k'). '第二・第一レベルドメイン'('com.kh'). '第二・第一レベルドメイン'('com.kw'). '第二・第一レベルドメイン'('com.l'). '第二・第一レベルドメイン'('com.lb'). '第二・第一レベルドメイン'('com.lr'). '第二・第一レベルドメイン'('com.lv'). '第二・第一レベルドメイン'('com.ly'). '第二・第一レベルドメイン'('com.m'). '第二・第一レベルドメイン'('com.mg'). '第二・第一レベルドメイン'('com.mk'). '第二・第一レベルドメイン'('com.mo'). '第二・第一レベルドメイン'('com.mt'). '第二・第一レベルドメイン'('com.mx'). '第二・第一レベルドメイン'('com.my'). '第二・第一レベルドメイン'('com.n'). '第二・第一レベルドメイン'('com.na'). '第二・第一レベルドメイン'('com.ng'). '第二・第一レベルドメイン'('com.ni'). '第二・第一レベルドメイン'('com.np'). '第二・第一レベルドメイン'('com.o'). '第二・第一レベルドメイン'('com.om'). '第二・第一レベルドメイン'('com.p'). '第二・第一レベルドメイン'('com.pa'). '第二・第一レベルドメイン'('com.pe'). '第二・第一レベルドメイン'('com.ph'). '第二・第一レベルドメイン'('com.pk'). '第二・第一レベルドメイン'('com.pl'). '第二・第一レベルドメイン'('com.pr'). '第二・第一レベルドメイン'('com.pt'). '第二・第一レベルドメイン'('com.py'). '第二・第一レベルドメイン'('com.q'). '第二・第一レベルドメイン'('com.qa'). '第二・第一レベルドメイン'('com.r'). '第二・第一レベルドメイン'('com.ro'). '第二・第一レベルドメイン'('com.s'). '第二・第一レベルドメイン'('com.sg'). '第二・第一レベルドメイン'('com.sn'). '第二・第一レベルドメイン'('com.sv'). '第二・第一レベルドメイン'('com.sy'). '第二・第一レベルドメイン'('com.t'). '第二・第一レベルドメイン'('com.tn'). '第二・第一レベルドメイン'('com.tr'). '第二・第一レベルドメイン'('com.tw'). '第二・第一レベルドメイン'('com.u'). '第二・第一レベルドメイン'('com.ua'). '第二・第一レベルドメイン'('com.uy'). '第二・第一レベルドメイン'('com.v'). '第二・第一レベルドメイン'('com.ve'). '第二・第一レベルドメイン'('com.vn'). '第二・第一レベルドメイン'(con). '第二・第一レベルドメイン'(cond). '第二・第一レベルドメイン'(condo). '第二・第一レベルドメイン'(condos). '第二・第一レベルドメイン'(cons). '第二・第一レベルドメイン'(consu). '第二・第一レベルドメイン'(consul). '第二・第一レベルドメイン'(consult). '第二・第一レベルドメイン'(consulti). '第二・第一レベルドメイン'(consultin). '第二・第一レベルドメイン'(consulting). '第二・第一レベルドメイン'(coo). '第二・第一レベルドメイン'(coop). '第二・第一レベルドメイン'(cor). '第二・第一レベルドメイン'(cors). '第二・第一レベルドメイン'(corsi). '第二・第一レベルドメイン'(corsic). '第二・第一レベルドメイン'(corsica). '第二・第一レベルドメイン'(cr). '第二・第一レベルドメイン'(cre). '第二・第一レベルドメイン'(cred). '第二・第一レベルドメイン'(credi). '第二・第一レベルドメイン'(credit). '第二・第一レベルドメイン'(cu). '第二・第一レベルドメイン'(cv). '第二・第一レベルドメイン'(cw). '第二・第一レベルドメイン'(cx). '第二・第一レベルドメイン'(cy). '第二・第一レベルドメイン'(cym). '第二・第一レベルドメイン'(cymr). '第二・第一レベルドメイン'(cymru). '第二・第一レベルドメイン'(cz). '第二・第一レベルドメイン'(d). '第二・第一レベルドメイン'(de). '第二・第一レベルドメイン'('de.'). '第二・第一レベルドメイン'('de.c'). '第二・第一レベルドメイン'('de.co'). '第二・第一レベルドメイン'('de.com'). '第二・第一レベルドメイン'(den). '第二・第一レベルドメイン'(dent). '第二・第一レベルドメイン'(denta). '第二・第一レベルドメイン'(dental). '第二・第一レベルドメイン'(dj). '第二・第一レベルドメイン'(dk). '第二・第一レベルドメイン'(dm). '第二・第一レベルドメイン'(do). '第二・第一レベルドメイン'(dow). '第二・第一レベルドメイン'(down). '第二・第一レベルドメイン'(downl). '第二・第一レベルドメイン'(downlo). '第二・第一レベルドメイン'(downloa). '第二・第一レベルドメイン'(download). '第二・第一レベルドメイン'(du). '第二・第一レベルドメイン'(dub). '第二・第一レベルドメイン'(duba). '第二・第一レベルドメイン'(dubai). '第二・第一レベルドメイン'(dz). '第二・第一レベルドメイン'(e). '第二・第一レベルドメイン'(ec). '第二・第一レベルドメイン'(eco). '第二・第一レベルドメイン'(ed). '第二・第一レベルドメイン'(edu). '第二・第一レベルドメイン'(ee). '第二・第一レベルドメイン'(eg). '第二・第一レベルドメイン'(em). '第二・第一レベルドメイン'(ema). '第二・第一レベルドメイン'(emar). '第二・第一レベルドメイン'(emara). '第二・第一レベルドメイン'(emarat). '第二・第一レベルドメイン'(es). '第二・第一レベルドメイン'(eu). '第二・第一レベルドメイン'('eu.'). '第二・第一レベルドメイン'('eu.c'). '第二・第一レベルドメイン'('eu.co'). '第二・第一レベルドメイン'('eu.com'). '第二・第一レベルドメイン'(ev). '第二・第一レベルドメイン'(eve). '第二・第一レベルドメイン'(even). '第二・第一レベルドメイン'(event). '第二・第一レベルドメイン'(events). '第二・第一レベルドメイン'(f). '第二・第一レベルドメイン'(fi). '第二・第一レベルドメイン'(fil). '第二・第一レベルドメイン'(film). '第二・第一レベルドメイン'(fl). '第二・第一レベルドメイン'(fli). '第二・第一レベルドメイン'(flig). '第二・第一レベルドメイン'(fligh). '第二・第一レベルドメイン'(flight). '第二・第一レベルドメイン'(flights). '第二・第一レベルドメイン'(fly). '第二・第一レベルドメイン'(fm). '第二・第一レベルドメイン'(fo). '第二・第一レベルドメイン'(foo). '第二・第一レベルドメイン'(food). '第二・第一レベルドメイン'(foot). '第二・第一レベルドメイン'(footb). '第二・第一レベルドメイン'(footba). '第二・第一レベルドメイン'(footbal). '第二・第一レベルドメイン'(football). '第二・第一レベルドメイン'(for). '第二・第一レベルドメイン'(foru). '第二・第一レベルドメイン'(forum). '第二・第一レベルドメイン'(fr). '第二・第一レベルドメイン'(fre). '第二・第一レベルドメイン'(free). '第二・第一レベルドメイン'(fri). '第二・第一レベルドメイン'(frie). '第二・第一レベルドメイン'(frien). '第二・第一レベルドメイン'(friend). '第二・第一レベルドメイン'(friends). '第二・第一レベルドメイン'(fu). '第二・第一レベルドメイン'(fun). '第二・第一レベルドメイン'(fund). '第二・第一レベルドメイン'(fut). '第二・第一レベルドメイン'(futb). '第二・第一レベルドメイン'(futbo). '第二・第一レベルドメイン'(futbol). '第二・第一レベルドメイン'(g). '第二・第一レベルドメイン'(ga). '第二・第一レベルドメイン'(gam). '第二・第一レベルドメイン'(game). '第二・第一レベルドメイン'(gay). '第二・第一レベルドメイン'(gd). '第二・第一レベルドメイン'(ge). '第二・第一レベルドメイン'(gen). '第二・第一レベルドメイン'(gent). '第二・第一レベルドメイン'(gf). '第二・第一レベルドメイン'(gg). '第二・第一レベルドメイン'(gl). '第二・第一レベルドメイン'(gm). '第二・第一レベルドメイン'(gmb). '第二・第一レベルドメイン'(gmbh). '第二・第一レベルドメイン'(go). '第二・第一レベルドメイン'(gol). '第二・第一レベルドメイン'(gold). '第二・第一レベルドメイン'(gov). '第二・第一レベルドメイン'(gp). '第二・第一レベルドメイン'(gr). '第二・第一レベルドメイン'('gr.'). '第二・第一レベルドメイン'('gr.c'). '第二・第一レベルドメイン'('gr.co'). '第二・第一レベルドメイン'('gr.com'). '第二・第一レベルドメイン'(gs). '第二・第一レベルドメイン'(gt). '第二・第一レベルドメイン'(gy). '第二・第一レベルドメイン'(h). '第二・第一レベルドメイン'(he). '第二・第一レベルドメイン'(hel). '第二・第一レベルドメイン'(hels). '第二・第一レベルドメイン'(helsi). '第二・第一レベルドメイン'(helsin). '第二・第一レベルドメイン'(helsink). '第二・第一レベルドメイン'(helsinki). '第二・第一レベルドメイン'(hi). '第二・第一レベルドメイン'(hiv). '第二・第一レベルドメイン'(hk). '第二・第一レベルドメイン'(hn). '第二・第一レベルドメイン'(ho). '第二・第一レベルドメイン'(hoc). '第二・第一レベルドメイン'(hock). '第二・第一レベルドメイン'(hocke). '第二・第一レベルドメイン'(hockey). '第二・第一レベルドメイン'(hol). '第二・第一レベルドメイン'(holi). '第二・第一レベルドメイン'(holid). '第二・第一レベルドメイン'(holida). '第二・第一レベルドメイン'(holiday). '第二・第一レベルドメイン'(hor). '第二・第一レベルドメイン'(hors). '第二・第一レベルドメイン'(horse). '第二・第一レベルドメイン'(hos). '第二・第一レベルドメイン'(hosp). '第二・第一レベルドメイン'(hospi). '第二・第一レベルドメイン'(hospit). '第二・第一レベルドメイン'(hospita). '第二・第一レベルドメイン'(hospital). '第二・第一レベルドメイン'(hot). '第二・第一レベルドメイン'(hote). '第二・第一レベルドメイン'(hotel). '第二・第一レベルドメイン'(hou). '第二・第一レベルドメイン'(hous). '第二・第一レベルドメイン'(house). '第二・第一レベルドメイン'(hr). '第二・第一レベルドメイン'(ht). '第二・第一レベルドメイン'(hu). '第二・第一レベルドメイン'(i). '第二・第一レベルドメイン'(ie). '第二・第一レベルドメイン'(im). '第二・第一レベルドメイン'(in). '第二・第一レベルドメイン'(inc). '第二・第一レベルドメイン'(inf). '第二・第一レベルドメイン'(info). '第二・第一レベルドメイン'(ins). '第二・第一レベルドメイン'(insu). '第二・第一レベルドメイン'(insur). '第二・第一レベルドメイン'(insure). '第二・第一レベルドメイン'(io). '第二・第一レベルドメイン'(iq). '第二・第一レベルドメイン'(ir). '第二・第一レベルドメイン'(iri). '第二・第一レベルドメイン'(iris). '第二・第一レベルドメイン'(irish). '第二・第一レベルドメイン'(is). '第二・第一レベルドメイン'(isl). '第二・第一レベルドメイン'(isla). '第二・第一レベルドメイン'(islam). '第二・第一レベルドメイン'(ist). '第二・第一レベルドメイン'(ista). '第二・第一レベルドメイン'(istan). '第二・第一レベルドメイン'(istanb). '第二・第一レベルドメイン'(istanbu). '第二・第一レベルドメイン'(istanbul). '第二・第一レベルドメイン'(it). '第二・第一レベルドメイン'(j). '第二・第一レベルドメイン'(je). '第二・第一レベルドメイン'(jo). '第二・第一レベルドメイン'(job). '第二・第一レベルドメイン'(jobs). '第二・第一レベルドメイン'(jp). '第二・第一レベルドメイン'(k). '第二・第一レベルドメイン'(kg). '第二・第一レベルドメイン'(ki). '第二・第一レベルドメイン'(kit). '第二・第一レベルドメイン'(kitc). '第二・第一レベルドメイン'(kitch). '第二・第一レベルドメイン'(kitche). '第二・第一レベルドメイン'(kitchen). '第二・第一レベルドメイン'(kn). '第二・第一レベルドメイン'(ko). '第二・第一レベルドメイン'(koe). '第二・第一レベルドメイン'(koel). '第二・第一レベルドメイン'(koeln). '第二・第一レベルドメイン'(kr). '第二・第一レベルドメイン'(ky). '第二・第一レベルドメイン'(kz). '第二・第一レベルドメイン'(l). '第二・第一レベルドメイン'(la). '第二・第一レベルドメイン'(lat). '第二・第一レベルドメイン'(law). '第二・第一レベルドメイン'(lc). '第二・第一レベルドメイン'(li). '第二・第一レベルドメイン'(lim). '第二・第一レベルドメイン'(limi). '第二・第一レベルドメイン'(limit). '第二・第一レベルドメイン'(limite). '第二・第一レベルドメイン'(limited). '第二・第一レベルドメイン'(lk). '第二・第一レベルドメイン'(lo). '第二・第一レベルドメイン'(lon). '第二・第一レベルドメイン'(lond). '第二・第一レベルドメイン'(londo). '第二・第一レベルドメイン'(london). '第二・第一レベルドメイン'(lot). '第二・第一レベルドメイン'(lott). '第二・第一レベルドメイン'(lotto). '第二・第一レベルドメイン'(lt). '第二・第一レベルドメイン'(lu). '第二・第一レベルドメイン'(lv). '第二・第一レベルドメイン'(ly). '第二・第一レベルドメイン'(m). '第二・第一レベルドメイン'(ma). '第二・第一レベルドメイン'(mc). '第二・第一レベルドメイン'(md). '第二・第一レベルドメイン'(me). '第二・第一レベルドメイン'(med). '第二・第一レベルドメイン'(medi). '第二・第一レベルドメイン'(medic). '第二・第一レベルドメイン'(medica). '第二・第一レベルドメイン'(medical). '第二・第一レベルドメイン'(mel). '第二・第一レベルドメイン'(melb). '第二・第一レベルドメイン'(melbo). '第二・第一レベルドメイン'(melbou). '第二・第一レベルドメイン'(melbour). '第二・第一レベルドメイン'(melbourn). '第二・第一レベルドメイン'(melbourne). '第二・第一レベルドメイン'(men). '第二・第一レベルドメイン'(menu). '第二・第一レベルドメイン'(mg). '第二・第一レベルドメイン'(mi). '第二・第一レベルドメイン'(mia). '第二・第一レベルドメイン'(miam). '第二・第一レベルドメイン'(miami). '第二・第一レベルドメイン'(mk). '第二・第一レベルドメイン'(mn). '第二・第一レベルドメイン'(mo). '第二・第一レベルドメイン'(mob). '第二・第一レベルドメイン'(mobi). '第二・第一レベルドメイン'(mos). '第二・第一レベルドメイン'(mosc). '第二・第一レベルドメイン'(mosco). '第二・第一レベルドメイン'(moscow). '第二・第一レベルドメイン'(mp). '第二・第一レベルドメイン'(ms). '第二・第一レベルドメイン'(mu). '第二・第一レベルドメイン'(mus). '第二・第一レベルドメイン'(musi). '第二・第一レベルドメイン'(music). '第二・第一レベルドメイン'(mv). '第二・第一レベルドメイン'(mw). '第二・第一レベルドメイン'(mx). '第二・第一レベルドメイン'(my). '第二・第一レベルドメイン'(n). '第二・第一レベルドメイン'(na). '第二・第一レベルドメイン'(nam). '第二・第一レベルドメイン'(name). '第二・第一レベルドメイン'(ne). '第二・第一レベルドメイン'(net). '第二・第一レベルドメイン'('net.'). '第二・第一レベルドメイン'('net.a'). '第二・第一レベルドメイン'('net.au'). '第二・第一レベルドメイン'('net.b'). '第二・第一レベルドメイン'('net.bn'). '第二・第一レベルドメイン'('net.br'). '第二・第一レベルドメイン'('net.c'). '第二・第一レベルドメイン'('net.cm'). '第二・第一レベルドメイン'('net.cn'). '第二・第一レベルドメイン'('net.g'). '第二・第一レベルドメイン'('net.gt'). '第二・第一レベルドメイン'('net.h'). '第二・第一レベルドメイン'('net.hk'). '第二・第一レベルドメイン'('net.i'). '第二・第一レベルドメイン'('net.il'). '第二・第一レベルドメイン'('net.m'). '第二・第一レベルドメイン'('net.mx'). '第二・第一レベルドメイン'('net.n'). '第二・第一レベルドメイン'('net.nz'). '第二・第一レベルドメイン'('net.p'). '第二・第一レベルドメイン'('net.ph'). '第二・第一レベルドメイン'('net.u'). '第二・第一レベルドメイン'('net.uk'). '第二・第一レベルドメイン'(new). '第二・第一レベルドメイン'(news). '第二・第一レベルドメイン'(nl). '第二・第一レベルドメイン'(no). '第二・第一レベルドメイン'(nom). '第二・第一レベルドメイン'('nom.'). '第二・第一レベルドメイン'('nom.e'). '第二・第一レベルドメイン'('nom.es'). '第二・第一レベルドメイン'(nr). '第二・第一レベルドメイン'(nu). '第二・第一レベルドメイン'(o). '第二・第一レベルドメイン'(or). '第二・第一レベルドメイン'(org). '第二・第一レベルドメイン'('org.'). '第二・第一レベルドメイン'('org.b'). '第二・第一レベルドメイン'('org.bn'). '第二・第一レベルドメイン'('org.c'). '第二・第一レベルドメイン'('org.cn'). '第二・第一レベルドメイン'('org.e'). '第二・第一レベルドメイン'('org.es'). '第二・第一レベルドメイン'('org.i'). '第二・第一レベルドメイン'('org.il'). '第二・第一レベルドメイン'('org.l'). '第二・第一レベルドメイン'('org.lv'). '第二・第一レベルドメイン'('org.n'). '第二・第一レベルドメイン'('org.nz'). '第二・第一レベルドメイン'('org.p'). '第二・第一レベルドメイン'('org.ph'). '第二・第一レベルドメイン'('org.pl'). '第二・第一レベルドメイン'('org.u'). '第二・第一レベルドメイン'('org.uk'). '第二・第一レベルドメイン'(orga). '第二・第一レベルドメイン'(organ). '第二・第一レベルドメイン'(organi). '第二・第一レベルドメイン'(organic). '第二・第一レベルドメイン'(p). '第二・第一レベルドメイン'(pa). '第二・第一レベルドメイン'(par). '第二・第一レベルドメイン'(pari). '第二・第一レベルドメイン'(paris). '第二・第一レベルドメイン'(pe). '第二・第一レベルドメイン'(ph). '第二・第一レベルドメイン'(pho). '第二・第一レベルドメイン'(phot). '第二・第一レベルドメイン'(photo). '第二・第一レベルドメイン'(pi). '第二・第一レベルドメイン'(pin). '第二・第一レベルドメイン'(pink). '第二・第一レベルドメイン'(piz). '第二・第一レベルドメイン'(pizz). '第二・第一レベルドメイン'(pizza). '第二・第一レベルドメイン'(pk). '第二・第一レベルドメイン'(pl). '第二・第一レベルドメイン'(pm). '第二・第一レベルドメイン'(pn). '第二・第一レベルドメイン'(po). '第二・第一レベルドメイン'(pok). '第二・第一レベルドメイン'(poke). '第二・第一レベルドメイン'(poker). '第二・第一レベルドメイン'(por). '第二・第一レベルドメイン'(porn). '第二・第一レベルドメイン'(pr). '第二・第一レベルドメイン'(pro). '第二・第一レベルドメイン'(ps). '第二・第一レベルドメイン'(pt). '第二・第一レベルドメイン'(pu). '第二・第一レベルドメイン'(pub). '第二・第一レベルドメイン'(pw). '第二・第一レベルドメイン'(q). '第二・第一レベルドメイン'(qa). '第二・第一レベルドメイン'(qu). '第二・第一レベルドメイン'(que). '第二・第一レベルドメイン'(queb). '第二・第一レベルドメイン'(quebe). '第二・第一レベルドメイン'(quebec). '第二・第一レベルドメイン'(r). '第二・第一レベルドメイン'(re). '第二・第一レベルドメイン'(rei). '第二・第一レベルドメイン'(reis). '第二・第一レベルドメイン'(reise). '第二・第一レベルドメイン'(rep). '第二・第一レベルドメイン'(repo). '第二・第一レベルドメイン'(repor). '第二・第一レベルドメイン'(report). '第二・第一レベルドメイン'(res). '第二・第一レベルドメイン'(rest). '第二・第一レベルドメイン'(resta). '第二・第一レベルドメイン'(restau). '第二・第一レベルドメイン'(restaur). '第二・第一レベルドメイン'(restaura). '第二・第一レベルドメイン'(restauran). '第二・第一レベルドメイン'(restaurant). '第二・第一レベルドメイン'(ro). '第二・第一レベルドメイン'(rom). '第二・第一レベルドメイン'(roma). '第二・第一レベルドメイン'(rs). '第二・第一レベルドメイン'(ru). '第二・第一レベルドメイン'(rug). '第二・第一レベルドメイン'(rugb). '第二・第一レベルドメイン'(rugby). '第二・第一レベルドメイン'(ruh). '第二・第一レベルドメイン'(ruhr). '第二・第一レベルドメイン'(rw). '第二・第一レベルドメイン'(s). '第二・第一レベルドメイン'(sa). '第二・第一レベルドメイン'(sc). '第二・第一レベルドメイン'(sco). '第二・第一レベルドメイン'(scot). '第二・第一レベルドメイン'(sd). '第二・第一レベルドメイン'(se). '第二・第一レベルドメイン'(sec). '第二・第一レベルドメイン'(secu). '第二・第一レベルドメイン'(secur). '第二・第一レベルドメイン'(secure). '第二・第一レベルドメイン'(sg). '第二・第一レベルドメイン'(sh). '第二・第一レベルドメイン'(sho). '第二・第一レベルドメイン'(shoe). '第二・第一レベルドメイン'(shoes). '第二・第一レベルドメイン'(shop). '第二・第一レベルドメイン'(si). '第二・第一レベルドメイン'(sk). '第二・第一レベルドメイン'(ska). '第二・第一レベルドメイン'(skat). '第二・第一レベルドメイン'(skate). '第二・第一レベルドメイン'(ski). '第二・第一レベルドメイン'(sl). '第二・第一レベルドメイン'(sm). '第二・第一レベルドメイン'(sn). '第二・第一レベルドメイン'(so). '第二・第一レベルドメイン'(sp). '第二・第一レベルドメイン'(spa). '第二・第一レベルドメイン'(spac). '第二・第一レベルドメイン'(space). '第二・第一レベルドメイン'(spo). '第二・第一レベルドメイン'(spor). '第二・第一レベルドメイン'(sport). '第二・第一レベルドメイン'(sr). '第二・第一レベルドメイン'(st). '第二・第一レベルドメイン'(sto). '第二・第一レベルドメイン'(stoc). '第二・第一レベルドメイン'(stock). '第二・第一レベルドメイン'(stockh). '第二・第一レベルドメイン'(stockho). '第二・第一レベルドメイン'(stockhol). '第二・第一レベルドメイン'(stockholm). '第二・第一レベルドメイン'(su). '第二・第一レベルドメイン'(sup). '第二・第一レベルドメイン'(supp). '第二・第一レベルドメイン'(suppo). '第二・第一レベルドメイン'(suppor). '第二・第一レベルドメイン'(support). '第二・第一レベルドメイン'(sur). '第二・第一レベルドメイン'(surf). '第二・第一レベルドメイン'(sv). '第二・第一レベルドメイン'(sx). '第二・第一レベルドメイン'(sy). '第二・第一レベルドメイン'(syd). '第二・第一レベルドメイン'(sydn). '第二・第一レベルドメイン'(sydne). '第二・第一レベルドメイン'(sydney). '第二・第一レベルドメイン'(t). '第二・第一レベルドメイン'(ta). '第二・第一レベルドメイン'(tat). '第二・第一レベルドメイン'(tatt). '第二・第一レベルドメイン'(tatto). '第二・第一レベルドメイン'(tattoo). '第二・第一レベルドメイン'(tc). '第二・第一レベルドメイン'(td). '第二・第一レベルドメイン'(te). '第二・第一レベルドメイン'(tel). '第二・第一レベルドメイン'(ten). '第二・第一レベルドメイン'(tenn). '第二・第一レベルドメイン'(tenni). '第二・第一レベルドメイン'(tennis). '第二・第一レベルドメイン'(tf). '第二・第一レベルドメイン'(tg). '第二・第一レベルドメイン'(th). '第二・第一レベルドメイン'(tha). '第二・第一レベルドメイン'(thai). '第二・第一レベルドメイン'(ti). '第二・第一レベルドメイン'(tir). '第二・第一レベルドメイン'(tiro). '第二・第一レベルドメイン'(tirol). '第二・第一レベルドメイン'(tj). '第二・第一レベルドメイン'(tk). '第二・第一レベルドメイン'(tl). '第二・第一レベルドメイン'(tm). '第二・第一レベルドメイン'(tn). '第二・第一レベルドメイン'(to). '第二・第一レベルドメイン'(tok). '第二・第一レベルドメイン'(toky). '第二・第一レベルドメイン'(tokyo). '第二・第一レベルドメイン'(tr). '第二・第一レベルドメイン'(tra). '第二・第一レベルドメイン'(trai). '第二・第一レベルドメイン'(train). '第二・第一レベルドメイン'(traini). '第二・第一レベルドメイン'(trainin). '第二・第一レベルドメイン'(training). '第二・第一レベルドメイン'(trav). '第二・第一レベルドメイン'(trave). '第二・第一レベルドメイン'(travel). '第二・第一レベルドメイン'(tv). '第二・第一レベルドメイン'(tw). '第二・第一レベルドメイン'(u). '第二・第一レベルドメイン'(ua). '第二・第一レベルドメイン'(ug). '第二・第一レベルドメイン'(uk). '第二・第一レベルドメイン'('uk.'). '第二・第一レベルドメイン'('uk.c'). '第二・第一レベルドメイン'('uk.co'). '第二・第一レベルドメイン'('uk.com'). '第二・第一レベルドメイン'(us). '第二・第一レベルドメイン'('us.'). '第二・第一レベルドメイン'('us.c'). '第二・第一レベルドメイン'('us.co'). '第二・第一レベルドメイン'('us.com'). '第二・第一レベルドメイン'('us.o'). '第二・第一レベルドメイン'('us.or'). '第二・第一レベルドメイン'('us.org'). '第二・第一レベルドメイン'(uy). '第二・第一レベルドメイン'(uz). '第二・第一レベルドメイン'(v). '第二・第一レベルドメイン'(vc). '第二・第一レベルドメイン'(vg). '第二・第一レベルドメイン'(vi). '第二・第一レベルドメイン'(via). '第二・第一レベルドメイン'(viaj). '第二・第一レベルドメイン'(viaje). '第二・第一レベルドメイン'(viajes). '第二・第一レベルドメイン'(vn). '第二・第一レベルドメイン'(vo). '第二・第一レベルドメイン'(voy). '第二・第一レベルドメイン'(voya). '第二・第一レベルドメイン'(voyag). '第二・第一レベルドメイン'(voyage). '第二・第一レベルドメイン'(w). '第二・第一レベルドメイン'(wa). '第二・第一レベルドメイン'(wal). '第二・第一レベルドメイン'(wale). '第二・第一レベルドメイン'(wales). '第二・第一レベルドメイン'(we). '第二・第一レベルドメイン'(web). '第二・第一レベルドメイン'('web.'). '第二・第一レベルドメイン'('web.d'). '第二・第一レベルドメイン'('web.do'). '第二・第一レベルドメイン'(wf). '第二・第一レベルドメイン'(wi). '第二・第一レベルドメイン'(wie). '第二・第一レベルドメイン'(wien). '第二・第一レベルドメイン'(win). '第二・第一レベルドメイン'(wine). '第二・第一レベルドメイン'(ws). '第二・第一レベルドメイン'(x). '第二・第一レベルドメイン'(xx). '第二・第一レベルドメイン'(xxx). '第二・第一レベルドメイン'(y). '第二・第一レベルドメイン'(yt). '第二・第一レベルドメイン'('м'). '第二・第一レベルドメイン'('мо'). '第二・第一レベルドメイン'('мос'). '第二・第一レベルドメイン'('моск'). '第二・第一レベルドメイン'('москв'). '第二・第一レベルドメイン'('москва'). '第二・第一レベルドメイン'('р'). '第二・第一レベルドメイン'('рф'). '第二・第一レベルドメイン'('с'). '第二・第一レベルドメイン'('ср'). '第二・第一レベルドメイン'('срб'). '第二・第一レベルドメイン'('香'). '第二・第一レベルドメイン'('香港'). '第二・第一レベルドメイン'('中'). '第二・第一レベルドメイン'('中国'). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1362913813/21 # # ●Regular Expressionの使用環境 # Ruby 1.9 # # ●検索か置換か? # 検索 # # ●説明 # red または blue が含まれてない行を検索したい。 # # ●対象データ # yellow red blue green orange # red green yellow orange # black yellow orange white # green yellow blue orange # # ●希望する結果 # black yellow orange white 'red または blue が含まれてない行を検索したい。'(Lines,Line) :- member(Line,Lines), 'red または blue が含まれてない'(Line). 'red または blue が含まれてない'(Line) :- \+(sub_atom(Line,_,_,_,red)), \+(sub_atom(Line,_,_,_,blue)). % 以下のサイトは # # abを含まない、かつ、bcを含まない、かつ、cdを含む行を検索する。 # 'abを含まない、かつ、bcを含まない、かつ、cdを含む行を検索する。'(_文字列,_行ならび,_行) :- member(_行,_行ならび), \+(sub_atom(_行,_,_,_,ab)), \+(sub_atom(_行,_,_,_,bd)), sub_atom(_行,_,_,_,cd). % 以下のサイトは # # abを含んで、かつ、bcを含んで、かつ、cdを含む行を検索する。 # 'abを含んで、かつ、bcを含んで、かつ、cdを含む行を検索する。'(_文字列,_行ならび,_行) :- member(_行,_行ならび), sub_atom(_行,_,_,_,ab), sub_atom(_行,_,_,_,bd), sub_atom(_行,_,_,_,cd). % 以下のサイトは % ユーティリティ述語 sub_atom/10 の提案 % % A .. 文字列 (atom) % S .. 検索文字列開始変位 (integer) % L .. 検索文字列の長さ (integer) % R .. 残り長さ (integer) % H .. 検索文字列より前側の文字列 (atom) % X .. 検索文字列 (atom) % T .. 検索文字列より後の残り文字列 (atom) % HL .. 検索文字列より前側の文字ならび (chars) % XL .. 検索文字列文字ならび (chars) % TL .. 検索文字列より後の残り文字ならび (chars) % A がvarである時はH-HL,X-XL,T-TLの3組の中にvar-varの組があってはなりません。 sub_atom_12(A,W1,W2,S,L,R,H,X,T,HL,XL,TL) :- '文字列W1から始まりW2で終わる。W1,W2の間にW1,W2は現れない'(A,V,W,S,L,R,H,X,T,HL,XL,TL). '文字列W1から始まりW2で終わる。W1,W2の間にW1,W2は現れない'(A,W1,W2,S,L,R,H,X,T,HL,XL,TL) :- sub_atom(A,S,L,R,H,X,T,HL,XL,TL), 文字列W1から始まりW2で終わる(X,W1,W2,S1,S2), 'W1,W2の間の文字列にW1,W2は現れない'(X,S1,S2,W1,W2). 文字列W1から始まりW2で終わる(X,W1,W2,S1,S2) :- sub_atom(X,0,S1,_,W1), sub_atom(X,S2,_,0,W2). 'W1,W2の間の文字列にW1,W2は現れない'(X,W1,W2,S1,S2) :- sub_atom(X,S1,_,S2,_W1とW2の間の文字列), \+(sub_atom(_W1とW2の間の文字列,_,_,_,W1)), \+(sub_atom(_W1とW2の間の文字列,_,_,_,W2)). count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- atom(A), !, sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), N is S + L, sub_atom(A,N,R,_,T), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- var(A), !, atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL), length(HL,S), length(XL,L), length(TL,R), concat_atom([H,X,T],A), sub_atom(A,S,L,R,H,X,T,HL,XL,TL). % 以下のサイトは # このディレクトリの索引 # ●Regular Expressionの使用環境 # Ruby 1.9 # # ●検索か置換か? # 検索 # # ●説明 # red または blue が含まれてない行を検索したい。 # # ●対象データ # yellow red blue green orange # red green yellow orange # black yellow orange white # green yellow blue orange # # ●希望する結果 # black yellow orange white # 'red または blue が含まれてない行を検索したい。'([_文字列|R],_文字列) :- \+(sub_atom(_文字列,_,_,_,red)), \+(sub_atom(_文字列,_,_,_,blue)). 'red または blue が含まれてない行を検索したい。'([_|R],_文字列) :- 'red または blue が含まれてない行を検索したい。'(R,_文字列). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1362913813/172 # ●Regular Expressionの使用環境 # PHP5 # # ●検索か置換か? # 置換 # # ●説明 # Javaのコメント・文字列を抽出してタグで囲みたいです。 # /**/, "", '' が入れ子になってる場合に外側だけ適応するのができません # 失敗例 <ダブル>"これは<シングル>'ペン'</シングル>です"</ダブル> # 成功例 <ダブル>"これは'ペン'です"</ダブル> # # ●対象データ() # /* "hello" 'world' */ # String var="これは'ペン'です"; # String apos='apopo "/* moge'; # # ●希望する結果 # <コメント>/* "hello" 'world' */</コメント> # String var=<ダブル>"これは'ペン'です"</ダブル>; # String apos=<シングル>'apopo "/* moge'</シングル>; # # 'Javaのコメント・文字列を抽出してタグで囲みたいです。'(_文字列,_置換された文字列) :- atom_chars(_文字列,Chars), '文字ならびからコメント・文字列を抽出してタグで囲む'(Chars,_置換された文字ならび), atom_chars(_置換された文字列,_置換された文字ならび). '文字ならびからコメント・文字列を抽出してタグで囲む'([],[]). '文字ならびからコメント・文字列を抽出してタグで囲む'([''''|R1],[<,シ,ン,グ,ル,>,''''|L1]) :- 'シングルクォートの外側入れ子を変換'(R1,L1,R2),!, '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). '文字ならびからコメント・文字列を抽出してタグで囲む'(['"'|R1],[<,ダ,ブ,ル,>,'"'|L1]) :- 'ダブルクォートの外側入れ子を変換'(R1,L1,R2),!, '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). '文字ならびからコメント・文字列を抽出してタグで囲む'([/,*|R1],[<,コ,メ,ン,ト,>,/,*|L1]) :- 'コメントの外側入れ子を変換'(R1,L1,R2),!, '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). '文字ならびからコメント・文字列を抽出してタグで囲む'([A|R1],[A|R2]) :- '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). シングルクォートの外側入れ子を変換(L,L1,R) :- append(L0,[''''|R],L), \+(member('''',R)), append(L0,['''',<,/,シ,ン,グ,ル,>|R],L1),!. ダブルクォートの外側入れ子を変換(L,L1,R) :- append(L0,['"'|R],L), \+(member('"',R)), append(L0,['"',<,/,ダ,ブ,ル,>|R],L1),!. コメントの外側入れ子を変換(L,L1,R) :- append(L0,[*,/|R],L), \+(append(_,[*,/|_],R)), append(L0,[*,/,<,/,コ,メ,ン,ト,>|R],L1),!. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/233 # # ●Regular Expressionの使用環境 # 秀丸 8.2.1 # ●検索か置換か? # 置換 # # ●説明 # 二つ目のTab以降を削除したいです。 # # ●対象データ # 100 こくご えいご 100 20 固定 # 共通 シャカイ スウガク 100 10 ランダム # # (データの間の空白は全部Tabです) # # ●希望する結果 # 100 こくご # 共通 すうがく # # # 下の正規表現で試してみました。 # ^(.*)?\t(.*)?\t[あ-ん ア-ン].* # \1\t\2 # (.*)?\t(.*)?\tでTabまでの最短マッチ(のつもり)二つで、えいご、スウガクまでを指定しています。 # # 3つめのカラムの1文字目がひらがなとカタカナなので、[あ-ん ア-ン]で指定しているのですが、 # 後ろの"ランダム"がマッチしてしまい、2行目が下のような結果になってしまいます。 # # 100 こくご # 共通 シャカイ スウガク 100 10 # # やり方教えて貰えればうれしいです。 # よろしくお願いします。 # '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- atom_chars(_文字列,Chars), '二つ目のTab以降を削除したいです。'(Chars,['\t','\t'],_二つ目のTab以降を削除後の文字ならび), atom_chars(_二つ目のTab以降を削除後の文字列,_二つ目のTab以降を削除後の文字ならび). '二つ目のTab以降を削除したいです。'([A|_二つめのTab以降],[A],[A]) :- !. '二つ目のTab以降を削除したいです。'([A|R1],[A|R2],[A|R3]) :- '二つ目のTab以降を削除したいです。'(R1,R2,R3). '二つ目のTab以降を削除したいです。'([B|R1],L2,[B|R3]) :- '二つ目のTab以降を削除したいです。'(R1,L2,R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- atom_chars(_文字列,Chars), '一文字ずつ最初のTabが来るまで'(Chars,_Tabまでの文字ならび,_残り文字ならび_1), '二個目のTabが来るまで'(_残り文字ならび_1,_二個目のTabまでの文字ならび), append(_Tabまでの文字ならび,_二個目のTabまでの文字ならび,_二つ目のTabまでの文字ならび), atom_chars(_二つ目のTab以降を削除後の文字列,_二つ目のTabまでの文字ならび). '一文字ずつ最初のTabが来るまで'(['\t'|_残り文字ならび],['\t'],_残り文字ならび) :- !. '一文字ずつ最初のTabが来るまで'([A|_残り文字ならび],[],_残り文字ならび) :- '一文字ずつ最初のTabが来るまで'([A|_残り文字ならび],[],_残り文字ならび),!. '二個目のTabが来るまで'(['\t'|_],['\t']) :- !. '二個目のTabが来るまで'([A|R1],[A|R2]) :- '二個目のTabが来るまで'(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- 文字ならびに変換する(_文字列,_文字ならび), 二つのTabが来るまで(_文字ならび,_最初のTabまで,_その後二つ目のTabまで), 文字列を復元(_最初のTabまで,_その後二つ目のTabまで,_二つ目のTab以降を削除後の文字列). 文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 二つのTabが来るまで(_文字ならび,_最初のTabまで,_その後二つ目のTabまで) :- append(L1,['\t'|R2],['\t'|_],_文字ならび). 文字列を復元(_最初のTabまで,_その後二つ目のTabまで,_二つ目のTab以降を削除後の文字列) :- append(_最初のTabまで,['\t'|_その後二つめのTabまで],['\t'],_二つ目のTab以降を削除後の文字ならび), atom_chars(_二つ目のTab以降を削除後の文字列,_二つ目のTab以降を削除後の文字ならび),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- 最初のTabから後の副文字列を得る(_文字列,_最初のTabを含めた文字列の長さ,_それ以後の文字列), それ以後の文字列の最初に現れたTabを含めた長さ(_それ以後の文字列,_それ以後の文字列の最初に現れたTabを含めた長さ), _長さ is _最初のTabを含めたそこまでの文字列の長さ + _それ以後の文字列の最初に現れたTabを含めた長さ, sub_atom(_文字列,0,_長さ,_,_二つ目のTab以降を削除後の文字列),!. 最初のTabから後の副文字列を得る(_文字列,_最初のTabを含めた文字列の長さ,_それ以後の文字列) :- sub_atom(_文字列,St1,1,R,'\t'), _最初のTabを含めたそこまでの文字列の長さ is St1 + 1, sub_atom(_文字列,_最初のTabを含めた文字列の長さ,R,0,_それ以後の文字列). それ以後の文字列の最初に現れたTabを含めた最初からの長さ(_それ以後の文字列,_それ以後の文字列の最初に現れたTabを含めた長さ) :- sub_atom(_それ以後の文字列,St,1,_,'\t'), _それ以後の文字列の最初に現れたTabを含めた長さ is St + 1,!. % 以下のサイトは 投機的検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列) :- 重い検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列). 投機的検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列) :- 重い検索(_検索文字列,_文字列,_前文字列_1,_検索情報,_後文字列_1), 投機的検索(_検索文字列,_後文字列_1,_前文字列_2,_検索情報,_後文字列), atomic_list_concat([_前文字列_1,_検索文字列,_前文字列_2],_前文字列). 重い検索(_検索文字列,_文字列,_前文字列,[_度数1,_度数2],_後文字列) :- sub_atom(_文字列,S,_,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列), count(sub_atom(_前文字列,_,_,_,'http://'),_度数1), count(sub_atom(_後文字列,_,_,_,'http://'),_度数2),!. % 以下のサイトは 検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列) :- 重い検索(_検索文字列,_文字列,_前文字列_1,_検索情報_1,_後文字列_1), 投機的検索(_検索文字列,_文字列,_前文字列_1,_検索情報_1,_後文字列_1,_前文字列,_検索情報,_後文字列). 検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列,_前文字列,_検索情報,_後文字列). 検索(_検索文字列,_文字列,_前文字列_1,_検索情報_1,_後文字列_1,_前文字列,_検索情報,_後文字列) :- 検索(_検索文字列,_後文字列_1,_前文字列_2,_検索情報,_後文字列), atomic_list_concat([_前文字列_1,_検索文字列,_前文字列_2],_前文字列). 重い検索(_検索文字列,_文字列,_前文字列,[_度数1,_度数2],_後文字列) :- sub_atom(_文字列,S,_,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列), count(sub_atom(_前文字列,_,_,_,'http://'),_度数1), count(sub_atom(_後文字列,_,_,_,'http://'),_度数2),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1362913813/370 # ●Regular Expressionの使用環境 # ActivePerl5.8 # # ●検索か置換か? # 検索 # # ●説明 # 連続する数を検索したい(1965から2011までの数) # # ●対象データ(配列内に格納) # 1952 # 1965 # 1986 # 2012 # 1972 # 2011 #  ・ #  ・ # ●希望する結果(配列の各要素を正規表現で検索して、マッチする要素だけ抽出) # 1965 # 1986 # 1972 # 2011 #  ・ #  ・ # # 配列の各要素が1955から2011までの数の場合にマッチする正規表現を教えてください # # '●検索か置換か? 検索 ●説明 連続する数を検索したい(1965から2011までの数) ●対象データ(配列内に格納) 1952 1965 1986 2012 1972 2011  ・  ・ ●希望する結果(配列の各要素を正規表現で検索して、マッチする要素だけ抽出) 1965 1986 1972 2011  ・  ・'(_文字列,_前文字列,_適合文字列,_後文字列) :- '連続する数を検索したい(1965から2011までの数)'(_文字列,_前文字列,_適合文字列,_後文字列). '連続する数を検索したい(1965から2011までの数)'(_文字列,_前文字列,_適合文字列,_後文字列) :- atom_chars(_文字列,_文字ならび), '文字ならびから連続する数を検索したい(1965から2011までの数)'(_文字ならび,_前文字列,_適合文字列,_後文字列). '文字ならびから連続する数を検索したい(1965から2011までの数)'(_文字ならび,_前文字列,_適合文字列,_後文字列) :- '数値を切り出す(1965から2011までの数)'(_文字ならび,L1,L2,L3,N), atom_chars(_前文字列,L1), atom_chars(_後文字列,L3), atom_chars(_適合文字列,L2). '数値を切り出す(1965から2011までの数)'(_文字ならび,L1,L2,L3,N) :- append(L1,L2,L3,_文字ならび), 全てが数字(L2), 'L1の最後の文字とL3の最初の文字は数字ではない'(L1,L3), number_chars(_数,L2), '1965から2011までの数'(_数). 全てが数字(_ならび) :- forall(member(_数字,_ならび),数字(_数字)). 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. 'L1の最後の文字とL3の最初の文字は数字ではない'(L1,L3) :- 'L1の最後の文字は数字ではない'(L1), 'L3の最初の文字は数字では無い'(L3). 'L1の最後の文字は数字ではない'(L1) :- \+((last(L1,A),数字(A))). 'L3の最初の文字は数字では無い'(L3) :- \+(([B|_]=L3,数字(B))). '1965から2011までの数'(_数) :- between(1965,2011,_数). % 以下のサイトは # # 文字列から数字列を検索する # 数字文字列を検索してその数値を得る(_文字列,_前文字列,_数字文字列,_後文字列,_数値) :- 数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列), その数値を得る(_数字文字列,_数値). 数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列) :- 数字文字列を検索する(_文字列,_前文字列,_数字文字列,_後文字列). その数値を得る(_数字文字列,_数値) :- atom_number(_数字文字列,_数値). 数字文字列を検索する(_文字列,_前文字列,_数字文字列,_後文字列) :- '前文字列・数字文字列・後文字列に分割'(_文字列,_前文字列,_数字文字列,_後文字列), 前文字列が空文字であるか前文字列の最後の文字が数字ではない(_前文字列), 後文字列が空文字であるか後文字列の最初の文字が数字ではない(_後文字列). '前文字列・数字文字列・後文字列に分割'(_文字列,_前文字列,_数字文字列,_後文字列) :- sub_atom(_文字列,_開始点,_長さ,_残り長さ,_数字文字列), _長さ > 0, 数字文字列である(_数字文字列), sub_atom(_文字列,0,_開始点,_,_前文字列), sub_atom(_文字列,_,_残り長さ,0,_後文字列). 前文字列が空文字であるか前文字列の最後の文字が数字ではない(''). 前文字列が空文字であるか前文字列の最後の文字が数字ではない(_前文字列) :- sub_atom(_前文字列,_,1,0,_文字), 符号とピリオドを含む数字ではない(_文字). 後文字列が空文字であるか後文字列の最初の文字が数字ではない(''). 後文字列が空文字であるか後文字列の最初の文字が数字ではない(_後文字列) :- sub_atom(_後文字列,0,1,_,_文字), 符号とピリオド含む数字ではない(_文字). 符号とピリオドを含む数字である('+'). 符号とピリオドを含む数字である('-'). 符号とピリオドを含む数字である('.'). 符号とピリオドを含む数字である(_文字) :- 数字である(_文字). 符号とピリオドを含む数字ではない(_文字) :- \+(符号とピリオドを含む数字である(_文字)). 数字である(_文字) :- _文字 @>= '0', _文字 @=< '9'. 数字ではない(_文字) :- \+(数字である(_文字)). 数字文字列である(_数字文字列) :- 'IEEE974等の浮動小数点数表示形式'(_数字文字列). 数字文字列である(_数字文字列) :- 全ての文字が数字である(_数字文字列), \+(数字列の禁則(_数字文字列)). 全ての文字が符号とピリオドを含む数字である(_数字文字列) :- forall(sub_atom(_数字文字列,_,1,_,_文字),符号とピリオドを含む数字である(_文字)). 全ての文字が数字である(_数字文字列) :- forall(sub_atom(_数字文字列,_,1,_,_文字),数字である(_文字)). 'IEEE974等の浮動小数点数表示形式'(_数字文字列) :- sub_atom(_数字文字列,S,2,R,_二文字), member(_二文字,['E+','E-','e+','e-']), 二文字は先頭または末尾にはこない(S,R), 前後文字列の形式が正しい(_数字文字列,S,R). 二文字は先頭または末尾にはこない(S,R) :- S > 0, R > 0. 前後文字列の形式が正しい(_数字文字列,S,R) :- sub_atom(_数字文字列,0,S,_,_数字文字列_1), sub_atom(_数字文字列,_,S,0,_数字文字列_2), 全ての文字が符号とピリオドを含む数字である(_数字文字列_1), 全ての文字が数字である(_数字文字列_2). 数字列の禁則(_数字文字列) :- ピリオドが2個以上ある(_数字文字列),!. 数字列の禁則(_数字文字列) :- ピリオドが先頭文字か末尾文字にある(_数字文字列),!. 数字列の禁則(_数字文字列) :- 'ピリオドの前後に+か-がある'(_数字文字列),!. 数字列の禁則(_数字文字列) :- '+が先頭文字以外にある'(_数字文字列),!. 数字列の禁則(_数字文字列) :- '-が先頭文字以外にある'(_数字文字列),!. ピリオドが2個以上ある(_数字文字列) :- findall(1,sub_atom(_数字文字列,_,1,_,'.'),L), length(L,_度数), _度数 > 1,!. ピリオドが先頭文字か末尾文字にある(_数字文字列) :- sub_atom(_数字文字列,0,1,_,'.'),!. ピリオドが先頭文字か末尾文字にある(_数字文字列) :- sub_atom(_数字文字列,_,1,0,'.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'+.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'-.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'.+'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'.-'),!. '+が先頭文字以外にある'(_数字文字列) :- sub_atom(_数字文字列,_開始点,1,_,'+'), _開始点 > 0,!. '-が先頭文字以外にある'(_数字文字列) :- sub_atom(_数字文字列,_開始点,1,_,'-'), _開始点 > 0,!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1362913813/391 # ●要望 # 5桁の英数字の文字列データから、各桁が M W w のいずれかのみ、で構成されている文字列を検索する # # MwwWM # wwWMw # WWWMM # wMWww などがヒットするようにする # # [MWw][MWw][MWw][MWw][MWw]と書けば良いとは思いますが、[MWw]{5}と記述しても同様の結果は得られるのでしょうか? # 10桁とか12桁でも考えているので、コンパクトにまとめたいのです # {}は直前の繰り返しだから # MMMMM # WWWWW # wwwww としか一致しないのでしょうか? # # 一日でヒットするデータが得られるとは限らないものなので、簡単に検証できないのです # # よろしくです # # '5桁の英数字の文字列データから、各桁が M W w のいずれかのみ、で構成されている文字列を検索する'(_5桁の英数字の文字列) :- forall(sub_atom(_5桁の英数字の文字列,_,1,_,A),member(A,['M','W',w])). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1362913813/397 # 質問です # # ●正規表現の使用環境 # PHP5.3.3 # # ●検索か置換か? # 置換 # # ●説明 # ・URLが含まれていたときに、jpg,png,gifならimgタグへ変換。 # ・それ以外ならaタグへ変換。 # ・URLに日本語が含まれていた場合も、スペースや改行、文字列の終端にくるまでのものも上記のようにリンク化 # # ●対象データ # [1] こちらへ→http://ime.nu/example.com/index.html # [2] 写真はこれです→https://example.com/写真.jpg # # ●希望する結果 # [1] こちらへ→<a href="http://ime.nu/example.com/index.html">http://example.com/index.html</a> # [2] 写真はこれです→<img src="https://example.com/写真.jpg" /> # # '・URLが含まれていたときに、jpg,png,gifならimgタグへ変換。 ・それ以外ならaタグへ変換。 '(_文字列,_imgタグ) :- 'URL部分の切り出し'(_文字列,_前文字列,_URL部分文字列,_後文字列), 'jpg,png,gifならimgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ),!. '・URLが含まれていたときに、jpg,png,gifならimgタグへ変換。 ・それ以外ならaタグへ変換。 '(_文字列,_imgタグ) :- 'URL部分の切り出し'(_文字列,_前文字列,_URL部分文字列,_後文字列), 'それ以外ならaタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_imgタグ). 'jpg,png,gifならimgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ) :- 'jpg,png,gifなら'(_URL部分文字列), 'imgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ). 'jpg,png,gifなら'(_URL部分文字列) :- sub_atom(_URL部分文字列,_,4,0,_サフィックス部分文字列), member(_サフィックス部分文字列,['.jpg','.png','.gif']). 'imgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ) :- atomic_list_concat([_前文字列,'',_後文字列],_imgタグ). 'それ以外ならaタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_aタグ) :- 'それ以外なら'(_URL部分文字列), 'aタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_aタグ). 'それ以外なら'(_URL部分文字列) :- sub_atom(_URL部分文字列,_,4,0,_サフィックス部分文字列), \+(member(_サフィックス部分文字列,['.jpg','.png','.gif'])). 'aタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_aタグ) :- atomic_list_concat([_前文字列,'',_URL部分文字列,'',_後文字列],_aタグ). 'URL部分の切り出し'(_文字列,_前文字列,_URL部分文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,A), member(A,['http://','file://','ftp://']), S_2 is S + Len, 'URL部分の切り出し'(_文字列,S,S_2,_前文字列,_URL部分文字列,_後文字列). 'URL部分の切り出し'(_文字列,S,S_2,_前文字列,_URL部分文字列,_後文字列) :- sub_atom(_文字列,S_2,_,0,_副文字列), 区切り文字で分割(_副文字列,_URL部分文字列,_後文字列), sub_atom(_文字列,0,S,_,_前文字列),!. 区切り文字で分割(_副文字列,_URL部分文字列,_後文字列) :- sub_atom(_副文字列,S,1,R,_文字), member(_文字,[' ','\t','\n']), sub_atom(_副文字列,0,S,R,_URL部分文字列), sub_atom(_副文字列,_,R,0,_後文字列),!. 区切り文字で分割(_URL部分文字列,_URL部分文字列,''). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1362913813/419 # ●Regular Expressionの使用環境 # sakura editor # # ●検索か置換か? # 置換 # # ●説明 # xmlのtaxiwaypath要素のなかに # type="TAXI"と centerLineLighted="FALSE"が存在するときに、 他の属性を書き換えずにcenterLineLighted="TRUE"に書き換えたいです # # ●対象データ # <TaxiwayPath # type="TAXI" # … # centerLineLighted="FALSE" # … # /> # # ●希望する結果 # <TaxiwayPath # type="TAXI" # … # centerLineLighted="TRUE" # … # /> # # …は省略していると言う意味です # # ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" に置換する'(_文字列,_置換された文字列) :- sPLIT(_文字列,['>',' ','\n','\t'],_区切りを含む要素ならび), ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" にする'(R2,R2_2), atomic_list_concat(_置換された区切りを含む要素ならび,_置換された文字列),!. ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" に置換する'(_文字列,_文字列). ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" に置換する'(R2,_置換された区切りを含む要素ならび) :- append(L1,[''|R3],_区切りを含む要素ならび), \+(member('>',R2)), member('type="TAXI"',R2), ならびの置換(R2,'centerLineLighted="FALSE"','centerLineLighted="TRUE"',R2_2), append(L1,[''|R3],_置換された区切りを含む要素ならび),!. % 以下のサイトは # プログラム: 言語(a) を受理するNDFA # # a # ------------------------- # 状態_0 | # <------------------------ # # # 図 簡単なオートマトン # '次の文字列を非決定性有限オートマトンが言語(a)を受理するまで検索する'(_文字列,_前文字列,_受理された文字列,_後文字列) :- '文字列を、前・受信された・後文字ならび候補に分解する'(_前文字ならび,_受信された文字ならび,_後文字ならび), '言語(a)を受理する非決定性有限オートマトン'(_受信された文字ならび), '各部文字ならびを文字列に変換する'(_前文字ならび,_受信された文字ならび,_後文字ならび,_前文字列,_受信された文字列,_後文字列). '文字列を、前・受信された・後文字ならび候補に分解する'(_文字列,_前文字ならび,_受信された文字ならび,_後文字ならび) :- atom_chars(_文字列,_文字ならび), append(_前文字ならび,_受信された文字ならび,_後文字ならび,_文字ならび). '各部文字ならびを文字列に変換する'(_前文字ならび,_受信された文字ならび,_後文字ならび,_前文字列,_受信された文字列,_後文字列) :- atom_chars(_前文字列,L1), atom_chars(_受信された文字列,L2), atom_chars(_後文字列,L3). '言語(a)を受理する非決定性有限オートマトン'(_記号ならび) :- '言語(a)初期状態'(_状態), '言語(a)を受理する非決定性有限オートマトン'(_状態,_記号ならび). '言語(a)を受理する非決定性有限オートマトン'(_状態,[_記号|R]) :- '言語(a)'(_状態,_記号,_状態_1), '言語(a)を受理する非決定性有限オートマトン'(_状態_1,R). '言語(a)を受理する非決定性有限オートマトン'(_状態,[]) :- '言語(a)終了状態'(_状態). '言語(a)初期状態'(状態_0). '言語(a)終了状態'(状態_0). '言語(a)'(状態_0,a,状態_0). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1362913813/528 # ●Regular Expressionの使用環境 # サクラエディタ # # ●検索か置換か? # 置換 # # ●説明 # 1行の中に同じ単語が2連続しているのを1つだけにしたいです。 # # ●対象データ # appleapple # orangeorange # grapegrape # # ●希望する結果 # apple # orange # grape # # よろしくお願いします。 # # '1行の中に同じ単語が2連続しているのを1つだけにしたいです。'(_文字列,_短縮した文字列) :- findmax([Len,S],( sub_atom(_文字列,_,Len,_,S1,_,S3,_,L2,_), append(L,L,L2), atom_chars(S4,L), atomic_list_concat([S1,S4,S3],S)), [_,_短縮した文字列]). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1362913813/535 # "123,456,789"から","だけを削除して"123456789"にするにはどうすればいいの? # 前後が数字になっている","だけにマッチするのって正規表現だけでできるの? # "[0-9],[0-9]だと前後の数字にもマッチしちゃうよね。 '"123,456,789"から","だけを削除して"123456789"にするにはどうすればいいの? 前後が数字になっている","だけにマッチするのって正規表現だけでできるの? "[0-9],[0-9]だと前後の数字にもマッチしちゃうよね。'(_文字列,_カンマを削除した文字列) :- 文字列からアラビア数字に囲まれたカンマを削除する(_文字列,_カンマを削除した文字列). 文字列からアラビア数字に囲まれたカンマを削除する(_文字列,_カンマを削除した文字列) :- sub_atom(_文字列,_開始点,_検索語の長さ,_残り長さ,S1,',',S3,L1,L2,L3),!, 検索語の前後はアラビア数字である(_文字列,_開始点,_検索語の長さ), 文字列からアラビア数字に囲まれたカンマを削除する(S1,S3,_カンマを削除した文字列). 文字列からアラビア数字に囲まれたカンマを削除する(S1,S3,_カンマを削除した文字列) :- atomic_list_concat([S1,S3],_カンマを削除した文字列). 文字列からアラビア数字に囲まれたカンマを削除する(S1,S3,_カンマを削除した文字列) :- 文字列からアラビア数字に囲まれたカンマを削除する(S3,_カンマを削除した文字列_2), atomic_list_concat([S1,_カンマを削除した文字列_2],_カンマを削除した文字列). 検索語の前後はアラビア数字である(_文字列,_開始点,_検索語の長さ) :- 検索語の前はアラビア数字である(_文字列,_開始点), 検索語の後はアラビア数字である(_文字列,_開始点,_検索語の長さ). 検索語の前はアラビア数字である(_文字列,_開始点) :- _開始点_1 is _開始点 - 1, sub_atom(_文字列,_開始点_1,1,_,A), アラビア数字(A). 検索語の後はアラビア数字である(_文字列,_開始点,_検索語の長さ) :- _開始点_2 is _開始点 + _検索語の長さ, sub_atom(_文字列,_開始点_2,1,_,A), アラビア数字(A). アラビア数字('0'). アラビア数字('1'). アラビア数字('2'). アラビア数字('3'). アラビア数字('4'). アラビア数字('5'). アラビア数字('6'). アラビア数字('7'). アラビア数字('8'). アラビア数字('9'). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1354393458/700 # お題:重複した文字のうち最初に現れた文字だけ削除する。 # 例 # "Hello, world" -> "Hel, world" 重複した文字のうち最初に現れた文字だけ削除する(_文字列,_重複した文字のうち最初に現れた文字だけ削除された文字列) :- 重複した文字のうち最初に現れた文字だけ削除する(_文字列,[],_重複した文字のうち最初に現れた文字だけ削除された文字列). 重複した文字のうち最初に現れた文字だけ削除する(_文字列,_既に削除対象となった文字列ならび,_重複した文字のうち最初に現れた文字だけ削除された文字列) :- '重複した文字のうち最初に現れた文字の前方文字列・後方文字列'(_文字列,_削除対象文字列,_既に削除対象となった文字列ならび,_前方文字列,_後方文字列), 重複した文字のうち最初に現れた文字だけ削除する(_後方文字列,[_削除対象文字列|_既に削除対象となった文字列ならび],_重複した文字のうち最初に現れた文字だけ削除された後方文字列), atomic_list_concat([_前方文字列,_重複した文字のうち最初に現れた文字だけ削除された後方文字列],_重複した文字のうち最初に現れた文字だけ削除された文字列),!. 重複した文字のうち最初に現れた文字だけ削除する(_文字列,_,_文字列). '重複した文字のうち最初に現れた文字の前方文字列・後方文字列'(_文字列,_削除対象文字列,_既に削除対象となった文字列ならび,_前方文字列,_後方文字列) :- '文字列を検索し前方文字列・後方文字列を得る'(_文字列,_前方文字列,_削除対象文字列,_後方文字列), \+(member(_削除対象文字列,_既に削除対象となった文字列ならび)), sub_atom(_後方文字列,_,_,_,_削除対象文字列),!. '文字列を検索し前方文字列・後方文字列を得る'(_文字列,_前方文字列,_対象文字列,_後方文字列) :- sub_atom(_文字列,_開始位置,_,_残り長さ,_対象文字列), sub_atom(_文字列,0,_開始位置,_,_前方文字列), sub_atom(_文字列,_,_残り長さ,0,_後方文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% p_1(_1,_2) :- p_2(_1,[],_2). p_2(_1,_2,_3) :- p_3(_1,_4,_2,_5,_6), p_2(_6,[_4|_2],_7), atomic_list_concat([_4,_7],_3),!. p_2(_1,_,_1). p_3(_1,_2,_3,_4,_5) :- p_4(_1,_4,_2,_5), \+(member(_2,_3)), sub_atom(_5,_,_,_,_2),!. p_4(_1,_2,_3,_4) :- sub_atom(_1,_5,_,_6,_3), sub_atom(_1,0,_5,_,_2), sub_atom(_1,_,_,0,_4). % 以下のサイトは # # ●Regular Expressionの使用環境 # Visual C# # # ●検索か置換か? # 検索 # # ●説明 # 同じ文字が5回以上繰り返されている箇所のある行を検索したい # # ●対象データ→結果 # うわあああああい → マッチ # aaaaaaaa      → マッチ # あいあいあい   → マッチせず # 同じ文字が5回以上繰り返されている箇所のある行を検索したい(_文字列,_行) :- split(_文字列,['\n'],_行ならび), 同じ文字が5回以上繰り返されている箇所のある行ならびを検索する(_行ならび,_行). 同じ文字が5回以上繰り返されている箇所のある行ならびを検索する(_行ならび,_行) :- nth1(_,_行ならび,_行), 同じ文字が5回以上繰り返されている箇所のある行(_行). 同じ文字が5回以上繰り返されている箇所のある行(_文字列) :- sub_atom(_文字列,_,5,_,_適合文字列), atom_chars(_適合文字列,[A,A,A,A,A]),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1362913813/689 # ●Java1.5 # ●検索 # ●真ん中のAを否定 かつ Aが含まれる にマッチするか # # ●対象データ 3桁限定 # ABC true # BAC false # CBA true # DEF false # # .*1.* & ^.[^9].* # こんな正規を使ったのですができませんでした。 # 宜しくお願いします。 # # '真ん中のAを否定 かつ Aが含まれる にマッチするか(対象データ 3桁限定)'(_対象データ,_A) :- '真ん中のAを否定(対象データ 3桁限定)'(_対象データ,_A), 'Aが含まれる(対象データ 3桁限定)'(_対象データ,_A). '真ん中のAを否定(対象データ 3桁限定)'(_対象データ,_A) :- \+(sub_atom(_対象データ,1,1,1,_A)). 'Aが含まれる(対象データ 3桁限定)'(_対象データ,_A) :- sub_atom(_対象データ,_,1,_,_A). % 以下のサイトは # @1to100pen: # git grep -e abc --and -e 123 で「abc」と「123」が順不同で両方が現れる行を検索できる --and オプションを知った。(grepコマンドでは grep abc | grep 123 みたいにしないとできない) 'git grep -e abc --and -e 123 で「abc」と「123」が順不同で両方が現れる行を検索できる'(_文字列) :- sub_atom(_文字列,_,_,_,'abc'), sub_atom(_文字列,_,_,_,'123'). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1362913813/779 # ●Regular Expressionの使用環境 # Perl(Emeditor) # # ●検索か置換か? # 検索 # # ●説明 # 各行の1番目のAまでを検索したい # # ●対象データ # お肉料理 # お魚料理 # 料理 # # # ●希望する結果 # 3行目の"料理"のみマッチさせたいです。 # '各行の1番目のAまでを検索したい。ただし前部に忌避する連接した語が存在します。'(_文字列,_A,_前文字列,_A,_後文字列) :- sub_atom(_文字列,S,Len,R,_A), sub_atom(_文字列,0,S,0,_前文字列), forall(忌避する連接した語(_A,_忌避する連接した語),\+(sub_atom(_前文字列,_,_,0,_忌避する連接した語))), sub_atom(_文字列,_,R,0,_後文字列). 忌避する連接した語(料理,お肉). 忌避する連接した語(料理,お魚). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1362913813/779 # ●Regular Expressionの使用環境 # Perl(Emeditor) # # ●検索か置換か? # 検索 # # ●説明 # 各行の1番目のAまでを検索したい # # ●対象データ # お肉料理 # お魚料理 # 料理 # # # ●希望する結果 # 3行目の"料理"のみマッチさせたいです。 '各行の1番目のAまでを検索したい。ただし前部に忌避する連接した語が存在します。'(_文字列,_A,_前文字列,_A,_後文字列) :- sub_atom(_文字列,_前文字列,_A,_後文字列), forall(忌避する連接した語(_A,_忌避する連接した語),\+(sub_atom(_前文字列,_,_,0,_忌避する連接した語))),!. 忌避する連接した語(料理,お肉). 忌避する連接した語(料理,お魚). % 以下のサイトは # 出題場所 # # ●Regular Expressionの使用環境 # Python3.3 # # ●検索か置換か? # 置換 # # ●説明 # 均等割りにしているスペースを削除したい # 一文字ずつスペースが入っている文字のスペースを削除したい # # ●対象データ # あ い う え お # かき くけ ここ # # ●希望する結果 # あいうえお # かき くけ ここ # 均等割りにしているスペースを削除したい(_文字列,_スペースを削除した文字列) :- atom_chars(_文字列,_文字ならび), 均等割りにしているスペースを削除したい(_文字列,_均等割長さ,_スペースを削除した文字列), atom_chars(_スペースを削除した文字列,_スペースを削除した文字ならび). 均等割りにしているスペースを削除したい(_文字ならび,_均等割長さ,_文字ならび) :- 要素のどれもスペースではない(_文字ならび), length(_文字ならび,_均等割長さ),!. 均等割りにしているスペースを削除したい(_文字ならび,_均等割長さ,_スペースを削除した文字ならび) :- 均等割りにしているスペースを(_文字ならび,_均等割長さ,_文字ならび_1,_残り文字ならび), 均等割りにしているスペースを削除したい(_残り文字ならび,_均等割長さ,_スペースを削除した文字列_2), append(_文字ならび_1,_スペースを削除した文字ならび_2,_スペースを削除した文字ならび). 均等割りにしているスペースを(_文字ならび,_均等割長さ,_文字ならび_1,_残り文字ならび) :- append(_文字ならび_1,_スペースならび,L3,_文字ならび), 要素のどれもスベースではない(_文字ならび_1), 要素の全てがスペースである(_スペースならび), 均等割(_文字ならび_1,_スペースならび,_均等割長さ). 均等割(_文字ならび_1,_スペースならび,_均等割長さ) :- length(_文字ならび_1,_均等割長さ), length(_スペースならび,_均等割長さ). 要素の全てがスペースである(L) :- forall(member(A,L),A = ' '). 要素のどれもスペースではない(L) :- forall(member(A,L),\+(A = ' ')). % 以下のサイトは # 出題場所 # # ●Regular Expressionの使用環境 # Python3.3 # # ●検索か置換か? # 置換 # # ●説明 # 均等割りにしているスペースを削除したい # 一文字ずつスペースが入っている文字のスペースを削除したい # # ●対象データ # あ い う え お # かき くけ ここ # # ●希望する結果 # あいうえお # かき くけ ここ # '一文字ずつスペースが入っている文字列のスペースを削除したい'(_文字列,_スペースを削除された文字列) :- atom_chars(_文字列,_文字ならび), '一文字ずつスペースが入っている文字ならびのスペースを削除したい'(_文字ならび,_スペースを削除された文字ならび), atom_chars(_スペースを削除された文字列,_スペースを削除された文字ならび). '一文字ずつスペースが入っている文字ならびのスペースを削除したい'([_文字],[_文字]) :- \+(_文字=' '). '一文字ずつスペースが入っている文字ならびのスペースを削除したい'([_文字,' '|R1],[_文字|R2]) :- '一文字ずつスペースが入っている文字ならびのスペースを削除したい'(R1,R2). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/854 # ●Regular Expressionの使用環境 # Becky! Internet Mail Ver.2 # # ●検索か置換か? # 検索 # # ●説明 # +0900を含まないものを検索したい # # ●対象データ # +0900 # +0500 # +0630 # # ●希望する結果 # +0500 # +0630 # # よろしくお願いします。 # # '+0900を含まないものを検索したい'(_文字列) :- get_lines(Lines), '+0900を含まないものを検索したい'(Lines,_文字列). '+0900を含まないものを検索したい'(Lines,_文字列) :- member(_文字列,Lines), '+0900を含まないものを'(_文字列). '+0900を含まないものを'(_文字列) :- \+(sub_atom(_文字列,_,_,_,'+0900')). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/14 # ●Regular Expressionの使用環境 # Perl # # ●検索か置換か? # 検索 # # ●説明 # ミドルネームを含む名前も、ミドルネームを含まない名前も分解して抽出したい # また、名前の区切りはスペースやドットなど色々なものに対応したい # # ●対象データ # Edward Snowden # Edward.Joseph.Snowden # エドワード・スノーデン # エドワード=ジョセフ=スノーデン # # ●希望する結果 # (値を入れているわけではなく、$1〜$3に入っていて欲しいものです) # $1 = "Edward"   $2 = ""   $3 = "Snowden" # $1 = "Edward"   $2 = "Joseph"   $3 = "Snowden" # $1 = "エドワード"   $2 = ""   $3 = "スノーデン" # $1 = "エドワード"   $2 = "ジョセフ"   $3 = "スノーデン" # # 'ミドルネームを含む名前も、ミドルネームを含まない名前も分解して抽出したい また、名前の区切りはスペースやドットなど色々なものに対応したい'(_名前,_ファーストネーム,_ミドルネーム,_ラストネーム) :- split(_名前,[' ','.','=','・','='],L), 名前の分解(L,_ファーストネーム,_ミドルネーム,_ラストネーム). 名前の分解([_ファーストネーム,_ラストネーム],_ファーストネーム,'',_ラストネーム) :- !. 名前の分解([_ファーストネーム,_ミドルネーム,_ラストネーム],_ファーストネーム,_ミドルネーム,_ラストネーム). % 以下のサイトは 語候補(2,尾崎,尾崎). 語候補(3,太加夫,隆大). 文字列から最長一致法を用いて語候補を検索する(_文字列,_前文字列,_適合文字列,_後文字列) :- 候補文字列長さならび(_候補文字列長さならび), [_最長候補文字列長さ|_] = _候補文字列長さならび, 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_最長候補文字列長さ,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_最長候補文字列長さ,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り長さ,_適合文字列_1), _長さ =< _最長候補文字列長さ, 文字列の長さと候補文字列を得る(_文字列,_候補文字列長さならび,_長さ,_適合文字列_1,_適合文字列_1_2), 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1), 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列_1,_適合文字列_1_2,_後文字列_1,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- 文字列から最長一致法を用いて語候補を検索する(_後文字列_1,_候補文字列長さならび,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 候補文字列長さならび(_候補文字列長さならび) :- findall(_長さ,( setof(_長さ,語候補(_長さ,_,_),[_長さ])), _候補文字列長さならび_1), reverse(_候補文字列長さならび_1,_候補文字列長さならび),!. 文字列の長さと候補文字列を得る(_文字列,_候補文字列長さならび,_長さ,_適合文字列_1,_適合文字列_1_2) :- member(_長さ,_候補文字列長さならび), 語候補(_長さ,_適合文字列_1,_適合文字列_1_2). 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1) :- sub_atom(_文字列,0,_開始位置,_,_前文字列_1), sub_atom(_文字列,_,_残り長さ,0,_後文字列_1). % 以下のサイトは 語候補(2,_,_,尾崎,尾崎). 語候補(3,_前文字列,_後文字列,太加夫,隆大) :- sub_atom(_前文字列,_,_,_,尾崎). 語候補(3,_前文字列,_後文字列,太加夫,太加夫) :- \+(sub_atom(_前文字列,_,_,_,尾崎)). 文字列から最長一致法を用いて語候補を検索する(_文字列,_前文字列,_適合文字列,_後文字列) :- 候補文字列長さならび(_候補文字列長さならび), 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り長さ,_適合文字列_1), member(_長さ,_候補文字列長さならび), 文字列の長さと候補文字列を得る(_文字列,_候補文字列長さならび,_長さ,_適合文字列_1,_適合文字列_1_2), 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1), 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_文字列長により降順整列した語候補ならび,_前文字列_1,_適合文字列_1_2,_後文字列_1,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- 文字列から最長一致法を用いて語候補を検索する(_後文字列_1,_候補文字列長さならび,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 候補文字列長さならび(_候補文字列長さならび) :- findall(_長さ,( setof(_長さ,語候補(_長さ,_,_,_,_),[_長さ])), _候補文字列長さならび_1), reverse(_候補文字列長さならび_1,_候補文字列長さならび),!. '文字列の長さと前文字列・適合文字列・後文字列を得る'(_文字列,_開始位置,_長さ,_残り長さ,_語候補,_前文字列_1,_適合文字列_1,_後文字列_1) :- 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1), 語候補(_長さ,_前文字列,_後文字列,_語候補,_適合文字列_1). 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1) :- sub_atom(_文字列,0,_開始位置,_,_前文字列_1), sub_atom(_文字列,_,_残り長さ,0,_後文字列_1). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/696 # [1] 授業単元: Cプログラミング # [2] 問題文(含コード&amp;リンク): データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が # 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の # 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 # 探索は二分探索法を使いソートにはクイックソートを使うこと。 # # 表示は以下のようにすること。 # Input A Student Number: 14【Enter】 # Ranking : #269 /*最高得点は1位とせよ.*/ # Subject A : 86 # Subject B : 59.1 # Subject C : 220.42 # Total : 365.52 # # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/697 # 【備考】 # 科目 A の得点は int 型,科目 B,C の得点は double 型で扱うこと. # 合計点が同じになる学生はいないということは既知とせよ. # データの人数は 1000 人であることもわかっているとせよ. # 学籍番号には抜けがある.学籍番号が存在しない場合は,”No data”と表示するようにせよ. # 雛型 (121.c) を用いよ.main 関数は完成しているので,main 関数内で呼び出している関数を作成せよ. # 'データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 探索は二分探索法を使いソートにはクイックソートを使うこと。' :- 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび), 合計得点の順位表を作る(_学生成績ならび,_合計得点の順位表), キーボードから入力された学籍番号の(_学籍番号), 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績), '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績). 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび) :- get_lines('rep_data.txt',Lines), findall(L,( member(_行,Lines), split(_行,[','],L)), _学生成績ならび). 合計得点の順位表を作る(_学生成績ならび,_合計得点の重複要素を許す降順ならび) :- findall(_合計,( member([_,A,B,C],_学生成績ならび), _合計 is A + B + C), _合計得点ならび), 重複要素を許す降順整列(_合計得点ならび,_合計得点の重複要素を許す降順ならび). キーボードから入力された学籍番号の(_学籍番号) :- 整数を得る(学籍番号,_学籍番号 >= 0,_学籍番号). キーボードから入力された学籍番号の(_学籍番号) :- キーボードから入力された学籍番号の(_学籍番号). 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績) :- length(Lines,_最大要素位置), 二分探索法を使い学生の成績を得る(1,_最大要素位置,_最大要素位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_要素位置,_要素位置,Lines,_学籍番号,_学生の成績) :- !, nth1(_要素位置,Lines,[_学籍番号|_学生の成績]). 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- succ(_要素位置_1,1,_要素位置_2),!, 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績), 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- _検索位置 is (_要素位置_1 + _要素位置_2) // 2, nth1(_検索位置,Lines,[_学籍番号_1|_学生の成績_1]), 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_学生の成績_1,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績,_学籍番号,_学生の成績) :- !. 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @< _学籍番号, 二分探索法を使い学生の成績を得る(_要素位置_1,_検索位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @> _学籍番号, 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_2,Lines,_学籍番号,_学生の成績). 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_1,Lines,[_学籍番号|_学生の成績]),!. 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_2,Lines,[_学籍番号|_学生の成績]). 重複要素を許す降順整列([],[]). 重複要素を許す降順整列([_軸要素|_残りならび],_合計得点の重複要素を許す降順ならび) :- 重複要素を許す降順分割(_軸要素,_残りならび,_軸要素と等しいか大きいならび,_軸要素より小さいならび), 重複要素を許す降順整列(_軸要素と等しいか大きいならび,_合計得点の重複要素を許す降順ならび_1), 重複要素を許す降順整列(_軸要素より小さいならび,_合計得点の重複要素を許す降順ならび_2), append(_合計得点の重複要素を許す降順ならび_1,[_軸要素|_合計得点の重複要素を許す降順ならび_2],_合計得点の重複要素を許す降順ならび). 重複要素を許す降順分割(_,[],[],[]) :- !. 重複要素を許す降順分割(_軸要素,[A|R],[A|R2],R3) :- A @>= _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). 重複要素を許す降順分割(_軸要素,[A|R],R2,[A|R3]) :- A @< _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績) :- _学生の成績 = [_科目Aの得点,_科目Bの得点,_科目Cの得点], _学生の合計得点 = _科目Aの得点+_科目Bの得点+_科目Cの得点, nth1(_順位,_合計得点の重複を許す降順ならび,_学生の合計得点), writef('学籍番号 :: %t\n順位 :: #%t\n,科目%t :: %t\n科目%t :: %t\n科目%t :: %t\n',[_学籍番号,_順位,'A',_科目Aの得点,'B',_科目Bの得点,'C',_科目Cの得点]). get_lines(Lines) :- get_lines(user_input,Lines). get_lines(Stream,Lines) :- findall(Line,( get_line(Stream,Line), ( Line=end_of_file,!,fail; true)), Lines). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/189 # ●Regular Expressionの使用環境 # ruby # # ●検索か置換か? # 置換 # # ●説明 # 行中の改行を削除したい # 以下でやると改行だけでなく改行の前の一文字も何故か消えてうまくいきません # 対象データの場合は「元」が消えてしまいます # # ruby -e 'puts open("input.txt").read.gsub(/[^。¥n]¥n/,"")' > output.txt # # ●対象データ # こんにちはお元 # 気ですか。 # 私は元気です。 # # ●希望する結果 # こんにちはお元気ですか。 # 私は元気です。 # # 文字列中の改行を削除したい(_文字列,_改行を削除された文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(_文字 = '\n')), _改行を削除された文字ならび), atomic_list_concat(_改行を削除された文字ならび,_改行を削除された文字列). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/263 # ●Regular Expressionの使用環境 # Javascript # # ●検索か置換か? # 置換 # # ●説明 # '1'を含まないABCからDEFまでを削除したいです # # ●対象データ # ABC # 1 # DEF # # ABC # 2 # DEF # # ABC # 3 # DEF # # ●希望する結果 # ABC # 1 # DEF # # '''1''を含まないABCからDEFまでを削除したいです'(_文字列,_希望する結果) :- atom_char(_文字列,_文字ならび), '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(_文字ならび,L), atomic_list_concat(L,_希望する結果). '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'([],[]). '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(_文字ならび,L) :- '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までを'(_文字列,L3), '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(L3,L),!. '''1''を含まないABCからDEFまでを削除したいです'([A|R1],[A|R2]) :- '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(R1,R2). '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までを'(_文字列,L3) :- append(['A','B','C'|L2],['D','E','F'|L3],_文字ならび), \+(append(_,['A','B','C'|_],L2)), \+(append(_,['D','E','F'|_],L2)), \+(append(_,['1'|_],L2)),!. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/351 # ●Regular Expressionの使用環境 # サクラエディタ # # ●検索か置換か? # 置換 # # ●説明 # Exampleの文字列を含まない行を削除したい # # ●対象データ # ABCA Test # BCAA Example # CABA Abc # # ●希望する結果 # BCAA Example # # # ネットで検索して出てきた^(?!.*Example).+$や^((?!Example).)*$ # で試したんですが空行が残ってしまいました # # 'Exampleの文字列を含まない行を削除したい'(_文字列,_Exampleの文字列を含まない行を削除された文字列) :- 改行記号付きの行ならびを得る(_文字列,_改行記号付きの行ならび), findall(_行,( member(_行,_文字列ならび), \+(sub_atom(_行,_,_,_,'Example'))), _Exampleの文字列を含まない行を削除された行ならび), atomic_list_concat(_Exampleの文字列を含まない行を削除された行ならび,_Exampleの文字列を含まない行を削除された文字列). 改行記号付きの行ならびを得る('',[]) :- !. 改行記号付きの行ならびを得る(_文字列,[_改行記号付き行|R]) :- 改行記号を含む行を得る(_文字列,_改行記号付き行,_残り文字列), 改行記号付きの行ならびを得る(_残り文字列,R). 改行記号を含む行を得る(_文字列,_改行記号付き行,_残り文字列) :- sub_atom(_文字列,S,1,R,'\n'), sub_atom(_文字列,0,_,R,_改行記号付き行), sub_atom(_文字列,_,R,0,_残り文字列),!. 改行記号を含む行を得る(_文字列,_文字列,''). % 以下のサイトは # ●Regular Expressionの使用環境 # # # ●検索か置換か? # 置換 # # ●説明 # 複数行の空行を1つの空行にしたい # # ●対象データ # # # # # # ●希望する結果 # 複数行の空行を1つの空行にしたい(_ファイル) :- get_chars(_ファイル,_文字ならび), 複数行の空行を1つの空行にしたい(_行ならび,_複数の空行を1つの空行にした文字ならび), put_chars(_ファイル,_複数の空行を1つの空行にした文字ならび). 複数行の空行を1つの空行にしたい([],[]). 複数行の空行を1つの空行にしたい(['\n','\n'|_残り行ならび],_複数の空行を1つの空行にした行ならび) :- 複数行の空行を1つの空行にしたい(['\n'|_残り行ならび],_複数の空行を1つの空行にした行ならび),!. 複数行の空行を1つの空行にしたい([A|R1],[A|R2]) :- 複数行の空行を1つの空行にしたい(R1,R2),!. get_chars(_ファイル,_文字ならび) :- open(_ファイル,read,Instream), findall(_文字,( at_end_of_stream(Instream),!,fail; get_char(Instream,_文字))), _文字ならび), close(Instream). put_chars(_ファイル,_文字ならび) :- open(_ファイル,write,Outstream), append(_,[_文字|R],_文字ならび), putchar(Outstream,_文字), R = [], close(Outstream). % 以下のサイトは # 出題: http://toro.2ch.net/test/read.cgi/tech/1387257592/395 # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 同じ文字の4回以上の繰り返しを3回にしたい # # ●対象データ # ああああああああああああああああああいいいいいいいいいいいいいいいうえおおおおおおおおおおおおおお # # ●希望する結果 # あああいいいうえおおお 同じ文字の4回以上の繰り返しを3回にしたい(_文字列,_置換した文字列) :- atom_chars(_文字列,Chars_1), ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(Chars_1,Chars_2), atom_chars(_置換した文字列,Chars_2). ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([],[]). ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([A,A,A,A|R1],[A,A,A|R2]) :- ならびの先頭からの指定要素を読み飛ばす(R1,A,R1_1), ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(R1_1,R2),!. ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([A|R1],[A|R2]) :- ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(R1,R2),!. ならびの先頭からの指定要素を読み飛ばす([],_,[]) :- !. ならびの先頭からの指定要素を読み飛ばす([A|R],B,[A|R]) :- \+(A = B),!. ならびの先頭からの指定要素を読み飛ばす([A|R1],A,R2) :- ならびの先頭からの指定要素を読み飛ばす(R1,A,R2). % 以下のサイトは # twitter_by_@dll7_20140324 # @dll7 29分 # 正規表現で # AXAYAZ # BXBYBZ # CXCYZC # のA B Cがマッチするように書くには何が一番楽? # ただし、 # AXBYCZ # BXAYAZ # とかはマッチしないようにする。三つ同じ時だけマッチしたいとき '正規表現で AXAYAZ BXBYBZ CXCYZC のA B Cがマッチするように書くには何が一番楽?'(_文字列,_検索文字) :- 文字候補(_文字列,_検索文字), findall(_,sub_atom(_文字列,_,1,_,_検索文字),[_,_,_]). 文字候補(_文字列,_文字) :- setof(_文字,一文字ずつ取り出す(_文字列,_文字),_文字ならび), member(_文字,_文字ならび). 一文字ずつ取り出す(_文字列,_文字) :- sub_atom(_文字列,_,1,_,_文字). % 以下のサイトは % % ?- 戦艦(_艦船名,_レベル,_耐久,_火力,_雷装,_対空,_速力). 出典('twitter by @kamina741'). 参照('テーブル定義付き'). 参照('テーブル定義・検索項目付き'). 参照('テーブル定義・条件・検索項目付き'). 戦艦(比叡改二,124,91,144,0,100,高速). 戦艦(比叡改二,112,91,131,0,90,高速). 戦艦(比叡改,110,83,134,0,96,高速). 戦艦(比叡改,107,83,174,0,75,高速). 戦艦(比叡改,107,83,121,0,95,高速). 戦艦(比叡改,100,83,145,0,99,高速). 戦艦(比叡改,100,83,121,0,95,高速). 戦艦(比叡,100,71,78,0,29,高速). 戦艦(比叡,100,71,64,0,25,高速). 戦艦(比叡,100,71,98,0,32,高速). % 以下のサイトは % % ?- 戦艦(_艦船名,_レベル,_耐久,_火力,_雷装,_対空,_速力). 出典('twitter by @kamina741'). 戦艦(比叡改二,124,91,144,0,100,高速). 戦艦(比叡改二,112,91,131,0,90,高速). 戦艦(比叡改,110,83,134,0,96,高速). 戦艦(比叡改,107,83,174,0,75,高速). 戦艦(比叡改,107,83,121,0,95,高速). 戦艦(比叡改,100,83,145,0,99,高速). 戦艦(比叡改,100,83,121,0,95,高速). 戦艦(比叡,100,71,78,0,29,高速). 戦艦(比叡,100,71,64,0,25,高速). 戦艦(比叡,100,71,98,0,32,高速). テーブル定義(戦艦,1,艦船名). テーブル定義(戦艦,2,レベル). テーブル定義(戦艦,3,耐久). テーブル定義(戦艦,4,火力). テーブル定義(戦艦,5,雷装). テーブル定義(戦艦,6,対空). テーブル定義(戦艦,7,速力). テーブル検索(_テーブル名,_検索項目名,_検索した値) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび), 値ならび(_テーブル名,_値ならび), テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび) :- findall(_,テーブル定義(_テーブル名,_,_),L). 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび) :- テーブル定義(_テーブル名,_nth1,_検索項目名), nth1(_nth1,_値ならび,_検索した値). 値ならび(_テーブル名,_値ならび) :- _副目標 =.. [_テーブル名|_値ならび], catch(_副目標,error(S,_error),true), 実行検査(_項,_error). 実行検査(_項,_error) :- var(_error),!. 参照('Prolog Wikipedia リレーショナルデータベース'). % 以下のサイトは % % ?- 戦艦(_艦船名,_レベル,_耐久,_火力,_雷装,_対空,_速力). 出典('twitter by @kamina741'). 戦艦(比叡改二,124,91,144,0,100,高速). 戦艦(比叡改二,112,91,131,0,90,高速). 戦艦(比叡改,110,83,134,0,96,高速). 戦艦(比叡改,107,83,174,0,75,高速). 戦艦(比叡改,107,83,121,0,95,高速). 戦艦(比叡改,100,83,145,0,99,高速). 戦艦(比叡改,100,83,121,0,95,高速). 戦艦(比叡,100,71,78,0,29,高速). 戦艦(比叡,100,71,64,0,25,高速). 戦艦(比叡,100,71,98,0,32,高速). テーブル定義(戦艦,1,艦船名). テーブル定義(戦艦,2,レベル). テーブル定義(戦艦,3,耐久). テーブル定義(戦艦,4,火力). テーブル定義(戦艦,5,雷装). テーブル定義(戦艦,6,対空). テーブル定義(戦艦,7,速力). テーブル検索(_テーブル名,_検索項目名,_検索した値) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値), 値ならび(_テーブル名,_値ならび). テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび) :- findall(_,テーブル定義(_テーブル名,_,_),_値ならび). 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値) :- テーブル定義(_テーブル名,_nth1,_検索項目名), nth1(_nth1,_値ならび,_検索した値). 値ならび(_テーブル名,_値ならび) :- _副目標 =.. [_テーブル名|_値ならび], catch(_副目標,error(S,_error),true), 実行検査(_項,_error). 実行検査(_項,_error) :- var(_error),!. 参照('Prolog Wikipedia リレーショナルデータベース'). % 以下のサイトは % % ?- 戦艦(_艦船名,_レベル,_耐久,_火力,_雷装,_対空,_速力). 出典('twitter by @kamina741'). 戦艦(比叡改二,124,91,144,0,100,高速). 戦艦(比叡改二,112,91,131,0,90,高速). 戦艦(比叡改,110,83,134,0,96,高速). 戦艦(比叡改,107,83,174,0,75,高速). 戦艦(比叡改,107,83,121,0,95,高速). 戦艦(比叡改,100,83,145,0,99,高速). 戦艦(比叡改,100,83,121,0,95,高速). 戦艦(比叡,100,71,78,0,29,高速). 戦艦(比叡,100,71,64,0,25,高速). 戦艦(比叡,100,71,98,0,32,高速). テーブル定義(戦艦,1,艦船名). テーブル定義(戦艦,2,レベル). テーブル定義(戦艦,3,耐久). テーブル定義(戦艦,4,火力). テーブル定義(戦艦,5,雷装). テーブル定義(戦艦,6,対空). テーブル定義(戦艦,7,速力). テーブル検索(_テーブル名,_条件項目名ならび,_条件値ならび,_検索項目名,_検索した値) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 条件値ならびの設定(_テーブル名,_条件項目名ならび,_条件値ならび,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値), 値ならび(_テーブル名,_値ならび). テーブル検索(_テーブル名,_検索項目名,_検索した値) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値), 値ならび(_テーブル名,_値ならび). テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび) :- findall(_,テーブル定義(_テーブル名,_,_),_値ならび). 条件値ならび(_,[],[],_値ならび). 条件値ならび(_テーブル名,[_条件項目名|R1],[_条件値|R2],_値ならび) :- テーブル定義(_テーブル名,_nth1,_条件項目名), nth1(_nth1,_値ならび,_条件値), 条件値ならび(_テーブル名,R1,R2,_値ならび). 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値) :- テーブル定義(_テーブル名,_nth1,_検索項目名), nth1(_nth1,_値ならび,_検索した値). 値ならび(_テーブル名,_値ならび) :- _副目標 =.. [_テーブル名|_値ならび], catch(_副目標,error(S,_error),true), 実行検査(_項,_error). 実行検査(_項,_error) :- var(_error),!. 参照('Prolog Wikipedia リレーショナルデータベース'). % 以下のサイトは % % ?- 戦艦(_艦船名,_レベル,_耐久,_火力,_雷装,_対空,_速力). 出典('twitter by @kamina741'). 参照('戦艦'). 参照('テーブル定義付き'). 参照('テーブル定義・検索項目付き'). 参照('テーブル定義・条件・検索項目付き'). 参照('Prolog Wikipedia リレーショナルデータベース'). 戦艦(比叡改二,124,91,144,0,100,高速). 戦艦(比叡改二,112,91,131,0,90,高速). 戦艦(比叡改,110,83,134,0,96,高速). 戦艦(比叡改,107,83,174,0,75,高速). 戦艦(比叡改,107,83,121,0,95,高速). 戦艦(比叡改,100,83,145,0,99,高速). 戦艦(比叡改,100,83,121,0,95,高速). 戦艦(比叡,100,71,78,0,29,高速). 戦艦(比叡,100,71,64,0,25,高速). 戦艦(比叡,100,71,98,0,32,高速). テーブル定義(戦艦,1,艦船名). テーブル定義(戦艦,2,レベル). テーブル定義(戦艦,3,耐久). テーブル定義(戦艦,4,火力). テーブル定義(戦艦,5,雷装). テーブル定義(戦艦,6,対空). テーブル定義(戦艦,7,速力). テーブル検索(_テーブル名,_条件項目名ならび,_条件値ならび,_検索項目名ならび,_値ならび,_検索した値ならび) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 条件値ならびの設定(_テーブル名,_条件項目名ならび,_条件値ならび,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名ならび,_値ならび,_検索した値ならび), 値ならび(_テーブル名,_値ならび). テーブル検索(_テーブル名,_検索項目名,_検索した値) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値), 値ならび(_テーブル名,_値ならび). テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび) :- findall(_,テーブル定義(_テーブル名,_,_),_値ならび). 条件値ならび(_,[],[],_値ならび). 条件値ならび(_テーブル名,[_条件項目名|R1],[_条件値|R2],_値ならび) :- テーブル定義(_テーブル名,_nth1,_条件項目名), nth1(_nth1,_値ならび,_条件値), 条件値ならび(_テーブル名,R1,R2,_値ならび). 値ならび中の検索項目を選択(_,[],_値ならび,[]). 値ならび中の検索項目を選択(_テーブル名,[_検索項目名|R1],_値ならび,[_検索した値|R2]) :- テーブル定義(_テーブル名,_nth1,_検索項目名), nth1(_nth1,_値ならび,_検索した値), 値ならび中の検索項目を選択(_テーブル名,R1,_値ならび,R2). 値ならび(_テーブル名,_値ならび) :- _副目標 =.. [_テーブル名|_値ならび], catch(_副目標,error(S,_error),true), 実行検査(_項,_error). 実行検査(_項,_error) :- var(_error),!. % 以下のサイトは # ●Regular Expressionの使用環境 # サクラエディタ 2.1.1.1 # # ●検索か置換か? # 置換 # # ●説明 # []内の文字だけにしたい # ※ [ と ] と (半角スペース)の3つを消したい # # ●対象データ # [あいうえお] ←最後に半角スペースあり(以下同じ) # [カキクケコ] # [AIUEO] # [漢字等々] # # ●希望する結果 # あいうえお←最後の半角スペースも消したい(以下同じ) # カキクケコ # AIUEO # 漢字等々 '[]内の文字だけとしたい'(_文字列,_変換されたデータ) :- '[]内の文字だけとしたい'(_文字列,S1,S2_2,S3), '[]内の文字だけにしたい'(S3,S3_2), atomic_list_concat([S1,S2_2,S3_2],_変換されたデータ),!. '[]内の文字だけとしたい'(_文字列,_文字列). '[]内の文字だけとしたい'(_文字列,S1,S2_2,S3) :- sub_atom(_文字列,S1,S2,S3,L1,L2,L3), sub_atom(S2,0,1,_,'['), sub_atom(S2,_,1,0,']'), '[]とスペースを削除する'(S2,S2_2),!. '[]とスペースを削除する'(S2,S2_2) :- '[]を削除する'(S2,S2_1), スペースを削除する(S2_1,S2_2). '[]を削除する'(S2,S2_1) :- sub_atom(S2,1,_,1,S2_2). スペースを削除する(S2_1,S2_2) :- findall(A,( スペースでない文字を取り出す(S2_1,A)), L), atom_chars(S2_2,L). スペースでない文字を取り出す(S2,A) :- sub_atom(S2,_,1,_,A), \+(A = ' ')). % 以下のサイトは # 出題: http://toro.2ch.net/test/read.cgi/tech/1387257592/395 # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 同じ文字の4回以上の繰り返しを3回にしたい # # ●対象データ # ああああああああああああああああああいいいいいいいいいいいいいいいうえおおおおおおおおおおおおおお # # ●希望する結果 # あああいいいうえおおお 同じ文字の4回以上の繰り返しを3回にしたい(_文字列,_置換した文字列) :- atom_chars(_文字列,Chars_1), ならびの同じ文字要素のm回以上の繰り返しをn回にしたい(Chars_1,4,3,Chars_2), atom_chars(_置換した文字列,Chars_2). ならびの同じ文字要素のm回以上の繰り返しをn回にしたい([],_,_,[]). ならびの同じ文字要素のm回以上の繰り返しをn回にしたい(L1,_m,_n,L2) :- ならびの同じ文字要素のm回以上の繰り返しをn回にしたい(L1,_m,_n,R1,L_n), ならびの同じ文字要素のm回以上の繰り返しをn回にしたい(R1,_m,_n,R2_2), append(L_n,R2_2,L2),!. ならびの同じ文字要素のm回以上の繰り返しをn回にしたい([A|R1],_m,_n,[A|R2]) :- ならびの同じ文字要素のm回以上の繰り返しをn回にしたい(R1,_m,_n,R2). ならびの同じ文字要素のm回以上の繰り返しをn回にしたい(R1,_m,_n,R1_2,L_n) :- length(L_m,_m), length(L_n,_n), all(L_m,A), all(L_n,A), append(L_m,R1_2,R1). % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #468 # # ●Regular Expressionの使用環境 # sed、grep # ●検索か置換か? # 置換 # ●説明 # マッチした結果をそのまま置き換えるでなく、 # 1つ前に改行を入れたい。 # # ●対象データ # 0ABC1DEF2GHI3JKL4MNO # # ●希望する結果 # 0ABC # 1DEF # 2GHI # 3JKL # 4MNO # # よろしくお願いします。 'マッチした結果をそのまま置き換えるでなく、1つ前に改行を入れたい。'(_文字列,_検索文字列,_置換文字列) :- sub_atom(_文字列,S1,_検索文字列,S3,L1,L2,L3), 'マッチした結果をそのまま置き換えるでなく、1つ前に改行を入れたい。'(S3,_検索文字列,_置換文字列_2), atomic_list_concat([S1,'\n',_検索文字列,_置換文字列_2],_置換文字列),!. 'マッチした結果をそのまま置き換えるでなく、1つ前に改行を入れたい。'(_文字列,_,_文字列). % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #507 # ●Regular Expressionの使用環境 # 秀丸 # # ●検索か置換か? # 置換 # # ●説明 # 行の一番最後の全角文字から後を削除したい。 # # ●対象データ # # 東京 abc 大阪静岡 123 名古屋 apple orange # # # ●希望する結果 # # 東京 abc 大阪静岡 123 名古屋 # # # 宜しくお願いします。 '行の一番最後の全角文字から後を削除したい。'(_行文字列,_行の一番最後の全角文字から後を削除した文字列) :- sub_atom(_行文字列,N,1,S,_), sub_atom(_行文字列,S,1,N,_文字), 全角文字(_文字), sub_atom(_行文字列,0,_,N,_行の一番最後の全角文字から後を削除した文字列),!. 全角文字(_全角文字) :- char_code(_全角文字,_文字コード), _文字コード > 255. % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #524 # # よろしくお願いします。 # # ●Regular Expressionの使用環境 # javascript # # ●検索か置換か? # 置換 # # ●説明 # {{ と }} で囲まれた文字を削除したい # 改行あり # # ●対象データ # {{ABCA # BCAA}} # CABA # {{ABCA}} # # ●希望する結果 # CABA '●検索か置換か? 置換 ●説明 {{ と }} で囲まれた文字を削除したい 改行あり'(_文字列,_二重括弧を削除した文字列) :- '{{ と }} で囲まれた文字を削除したい 改行あり'(_文字列,_二重括弧を削除した文字列). '{{ と }} で囲まれた文字を削除したい 改行あり'(_文字列,_二重括弧を削除した文字列) :- '{{を切り出し、前文字列と後文字列に分解する'(_文字列,_前文字列,_後文字列), '}} まで文字列を削除したい 改行あり'(_後文字列,_二重括弧を削除した後文字列), atom_concat(_前文字列,_二重括弧を削除された後文字列,_二重括弧を削除された文字列),!. '{{ と }} で囲まれた文字を削除したい 改行あり'(_文字列,_文字列). '}} まで文字列を削除したい 改行あり'(_文字列,_二重括弧を削除した文字列) :- sub_atom(_文字列,S,2,R,'}}'), sub_atom(_文字列,_,R,0,_後文字列), '{{ と }} で囲まれた文字を削除したい 改行あり'(_残り文字列,_二重括弧を削除した後文字列),!. '}} まで文字列を削除したい 改行あり'(_文字列,_文字列). '{{を切り出し、前文字列と後文字列に分解する'(_文字列,_前文字列,_後文字列) :- sub_atom(_文字列,S,2,R,'{{'), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 出典: C/C++の宿題片付けます 167代目 #429 # [1] 授業単元:配列 # [2] 問題文:文字列txtを"abcdefg"、 # 文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、 # 途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。 # (※txtとptnの値が変わっても正常動作するようにし、ptnが出現しない場合はそのことを出力せよ。) # [3] #  [3.2]linux #  [3.1] gcc #  [3.3] C言語 # [4] 期限:14/6/12 # [5] その他の制限:ポインタはまだ習っとりません。 # 先日for、whileによる繰り返し処理を習いました。 txt(abcdefg). ptn(ef). '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。' :- txt(_対象文字列), ptn(_検索文字列), '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,_検索文字列,0,_比較回数). '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,'',_比較回数,_比較回数) :- !. '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,_検索文字列,_比較回数_1,_比較回数) :- sub_atom(_対象文字列,0,1,_,A), sub_atom(_検索文字列,0,1,_,B), succ(_比較回数_1,_比較回数_2), '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,_検索文字列,_出現位置_1,A,_出現位置_2,B,_比較回数_2,_比較回数). '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,_検索文字列,_出現位置_1,_文字,_出現位置_2,_文字,_比較回数_2,_比較回数) :- writef('成功! %t[%t]=%t, %t[%t]= %t, %t\n',[_対象文字列,_出現位置_1,_文字,_検索文字列,_出現位置_2,_文字,_比較回数_2]). '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,_検索文字列,_出現位置_1,A,_出現位置_2,A,_比較回数_2,_比較回数) :- '一文字一致したら対象文字列、検索文字列ともに位置を移動して検索する'(_対象文字列,_検索文字列,_出現位置_1,A,_出現位置_2,A,_比較回数_2,_比較回数). '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,_検索文字列,_出現位置_1,_文字_1,_出現位置_2,_文字_2,_比較回数_2,_比較回数) :- \+(_文字_1 = _文字_2), writef('失敗! %t[%t]=%t, %t[%t]=%t, %t\n',[_対象文字列,_出現位置_1,_文字_1,_検索文字列,_出現位置_2,_文字_2,_比較回数_2]). '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,_検索文字列,_出現位置_1,A,_出現位置_2,B,_比較回数_2,_比較回数) :- '不一致の時は、対象文字列の位置だけ移動して検索する'(_対象文字列,_検索文字列,_出現位置_1,A,_出現位置_2,B,_比較回数_2,_比較回数). '一文字一致したら対象文字列、検索文字列ともに位置を移動して検索する'(_対象文字列,_検索文字列,_出現位置_1,_文字,_出現位置_2,_文字,_比較回数_2,_比較回数) :- _出現位置_1_2 is _出現位置_1 + 1, sub_atom(_対象文字列,_出現位置_1_2,_,0,_対象文字列_2), _出現位置_2_2 is _出現位置_2 + 1, sub_atom(_検索文字列,_出現位置_2_2,_,0,_検索文字列_2), '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列_2,_検索文字列_2,_比較回数_2,_比較回数). '不一致の時は、対象文字列の位置だけ移動して検索する'(_対象文字列,_検索文字列,_出現位置_1,_文字_1,_,_文字_2,_比較回数_2,_比較回数) :- \+(_文字_1 = _文字_2), _出現位置_1_2 is _出現位置_1 + 1, sub_atom(_対象文字列,1,_,0,_対象文字列_2), '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列_2,_検索文字列,_比較回数_2,_比較回数). % 以下のサイトは # 出典: Regular Expression(正規表現)Part12 #561 # ●Regular Expressionの使用環境 # Perl # # ●検索か置換か? # 検索 # # ●説明 # 前に指定したデータを含まない、「スケート」だけマッチさせたい # # # ●対象データ # アイススケート # ローラースケート # スケート # '前に指定したデータを含まない、「スケート」だけマッチさせたい'(_文,_前に指定したデータならび,_前データ,_検索データ,_後データ) :- sub_atom(_文,_前データ,スケート,_後データ), 前に指定したデータを含まない(S1,_指定したデータならび). 前に指定したデータを含まない(S1,_指定したデータならび) :- member(_指定したデータ,_指定したデータならび), sub_atom(S1,_,_,0,_指定したデータ),!, fail. 前に指定したデータを含まない(_,_). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #723 # # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 例えばある文字列の中の「体」を「體」へ、「旧」を「舊」へ…、というように変換したいときに全て書き連ねるのではなく正規表現で簡潔に表現する方法はないでしょうか # '例えばある文字列の中の「体」を「體」へ、「旧」を「舊」へ…、というように変換したいときに全て書き連ねるのではなく正規表現で簡潔に表現する方法はないでしょうか'(_文字列,_置換された文字列) :- findall(_文字,文字列中の文字を可能ならば異体字に変換する(_文字列,_文字),L), atomic_list_concat(L,_置換された文字列). 文字列中の文字を可能ならば異体字に変換する(_文字列,_文字) :- sub_atom(_文字列,_,1,_,_文字_1), 異体字変換(_文字_1,_文字). 異体字変換(_文字_1,_文字_2) :- 異体字(_文字_1,_文字_2),!. 異体字変換(_文字,_文字). % 以下のサイトは 挟区間文字列(_文字列,_副文字列A,_副文字列B,_前文字列,_挟区間文字列,_後文字列) :- '文字列の中で副文字列Aと副文字列Bに挟まれた挟区間文字列(ただし、_挟区間文字列のなかに副文字列Aと副文字列Bは含まれない)'(_文字列,_副文字列A,_副文字列B,_前文字列,_挟区間文字列,_後文字列). '文字列の中で副文字列Aと副文字列Bに挟まれた挟区間文字列(ただし、_挟区間文字列のなかに副文字列Aと副文字列Bは含まれない)'(_文字列,_副文字列A,_副文字列B,_前文字列,_挟区間文字列,_後文字列) :- '副文字列Aと副文字列Bで検索する'(_文字列,_副文字列A,_副文字列B,_前文字列_1,_挟区間文字列,_後文字列_2), '挟区間文字列の中に副文字列Aと副文字列Bは含まれない'(_挟区間文字列,_副文字列A,_副文字列B), 前文字列と後文字列を構成する(_前文字列_1,_副文字列A,_副文字列B,_後文字列_2,_前文字列,_後文字列). '副文字列Aと副文字列Bで検索する'(_文字列,_副文字列A,_副文字列B,_前文字列_1,_挟区間文字列,_後文字列_2) :- 検索文字列(_文字列,_前文字列_1,_副文字列A,_後文字列_1), 検索文字列(_後文字列_1,_挟区間文字列,_副文字列B,_後文字列_2), '挟区間文字列の中に副文字列Aと副文字列Bは含まれない'(_挟区間文字列,_副文字列A,_副文字列B). 前文字列と後文字列を構成する(_前文字列_1,_副文字列A,_副文字列B,_後文字列_2,_前文字列,_後文字列) :- atomic_list_concat([_前文字列_1,_副文字列A],_前文字列), atomic_list_concat([_副文字列B,_後文字列_2],_後文字列). 検索文字列(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). '挟区間文字列の中に副文字列Aと副文字列Bは含まれない'(_挟区間文字列,_副文字列A,_副文字列B) :- \+(sub_atom(_挟区間文字列,_,_,_,_副文字列A)), \+(sub_atom(_挟区間文字列,_,_,_,_副文字列B)). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1387257592/898 # ●Regular Expressionの使用環境 # 2ちゃんねる専ブラ「JaneView」 または 「php」 # # ●検索か置換か? # 検索 # # ●説明 # ・「季節」「まだ寒い」「もうすぐ」「今は」「もうすぐ」のいずれかの文字列と「春」または「冬」の文字が入った文章を検出したい。 # ・「春」または「冬」という文字は「季節」「まだ寒い」「今は」「もうすぐ」という文字列の前にあっても後ろにあっても良い。 # #   ((春|冬).*(季節|まだ寒い|もうすぐ|今は|もうすぐ)|(季節|まだ寒い|もうすぐ|今は|もうすぐ).*(春|冬)) # ということがしたいのですが短くなりませんか? # # 同じ単語がそれぞれ2つずつ必要だと正規表現が長くなりがちなので (季節|まだ寒い|もうすぐ|今は|もうすぐ) # は1回で済ませるのが希望です。 # #   (春|冬(注:後ろあれば不要))(季節|まだ寒い|もうすぐ|今は|もうすぐ)(春|冬(注:前にあれば不要)) # ↑こんな感じが希望です # # ●対象データ ●希望する結果 # 1 まもなく「季節」は「春」ですね   結果:検出 (季節 & 春) # 2 「春」はよい「季節」ですね     結果:検出 (春 & もうすぐ) # 3 「春」よこい             結果:非検出 # # '・「季節」「まだ寒い」「もうすぐ」「今は」「もうすぐ」のいずれかの文字列と「春」または「冬」の文字が入った文章を検出したい。 ・「春」または「冬」という文字は「季節」「まだ寒い」「今は」「もうすぐ」という文字列の前にあっても後ろにあっても良い。'(_文字列) :- '「季節」「まだ寒い」「もうすぐ」「今は」「もうすぐ」のいずれかの文字列と'(_文字列), '「春」または「冬」の文字が入った文章を'(_文字列), 検出したい. '「季節」「まだ寒い」「もうすぐ」「今は」「もうすぐ」のいずれかの文字列と'(_文字列) :- sub_atom(_文字列,_,_,_,_副文字列_1), member(_副文字列_1,[季節,まだ寒い,もうすぐ,今は,もうすぐ]). '「春」または「冬」の文字が入った文章を'(_文字列) :- sub_atom(_文字列,_,_,_,_副文字列_2), member(_副文字列_2,[春,冬]). 検出したい.