このディレクトリの索引

% 以下のサイトは ことば溜まり(かまきり). ことば溜まり(くり). ことば溜まり(りす). ことば溜まり(すいか). しりとり(_最初の言葉,_しりとりならび) :- しりとり(_最初の言葉,[_最初の言葉],_しりとりならび). しりとり(_前の言葉,_しりとりならび_1,_しりとりならび) :- 前の言葉の最後の文字と後の言葉の最初の文字が同じになるようにまだ使われていない言葉を後の言葉として取り出す(_しりとりならび_1,_前の言葉,_後の言葉), 後の言葉をスタックに積む(_後の言葉,_しりとりならび_1,_しりとりならび). 後の言葉をスタックに積む(_後の言葉,_しりとりならび_1,_しりとりならび) :- reverse([_後の言葉|_しりとりならび_1],_しりとりならび). 後の言葉をスタックに積む(_後の言葉,_しりとりならび_1,_しりとりならび) :- しりとり(_後の言葉,[_後の言葉|_しりとりならび_1],_しりとりならび). 前の言葉の最後の文字と後の言葉の最初の文字が同じになるようにまだ使われていない言葉を後の言葉として取り出す(_しりとりならび_1,_前の言葉,_後の言葉) :- 前の言葉の最後の文字と後の言葉の最初の文字が同じになるように(_前の言葉,_後の言葉), まだ使われていない言葉を後の言葉として取り出す(_しりとりならび_1,_後の言葉). 前の言葉の最後の文字と後の言葉の最初の文字が同じになるように(_前の言葉,_後の言葉) :- 前の言葉の最後の文字(_前の言葉,_文字), 後の言葉の最初の文字(_後の言葉,_文字). 前の言葉の最後の文字(_前の言葉,_最後の文字) :- sub_atom(_前の言葉,_,1,0,_最後の文字). 後の言葉の最初の文字(_後の言葉,_最初の文字) :- freeze(_後の言葉,sub_atom(_後の言葉,0,1,_,_最初の文字)). まだ使われていない言葉を後の言葉として取り出す(_しりとりならび_1,_後の言葉) :- まだ使われていない(_しりとりならび_1,_後の言葉), 言葉を後の言葉として取り出す(_後の言葉). まだ使われていない(_しりとりならび_1,_後の言葉) :- freeze(_後の言葉,\+(member(_後の言葉,_しりとりならび_1))). 言葉を後の言葉として取り出す(_後の言葉) :- ことば溜まり(_後の言葉). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #111 # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '文字列から"CGUU"をギャップ("-")を含んでいても検出する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_前文字列,_適合文字列,_後文字列), '"CGUU"をギャップ("-")を含んでいても検出する'(_適合文字列). '"CGUU"をギャップ("-")を含んでいても検出する'(_適合文字列) :- 'ギャップ("-")を取り除くとCGUUという文字列になる'(_適合文字列). 'ギャップ("-")を取り除くとCGUUという文字列になる'(_適合文字列) :- findall(_ギャップではない文字, 'ギャップ("-")ではない文字'(_適合文字列,_ギャップではない文字),_ギャップではない文字ならび), atomic_list_concat(_ギャップではない文字ならび,'CGUU'). 'ギャップ("-")ではない文字'(_適合文字列,_ギャップではない文字) :- sub_atom(_適合文字列,_,1,_,_ギャップではない文字), \+(_ギャップではない文字 = '-'). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 出題: http://toro.2ch.net/test/read.cgi/tech/1387257592/395 # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 同じ文字の4回以上の繰り返しを3回にしたい # # ●対象データ # ああああああああああああああああああいいいいいいいいいいいいいいいうえおおおおおおおおおおおおおお # # ●希望する結果 # あああいいいうえおおお 同じ文字の4回以上の繰り返しを3回にしたい(_文字列,_置換した文字列) :- 同じ文字の4回以上の繰り返しを(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列), '3回にしたい'(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列,_置換した文字列),!. 同じ文字の4回以上の繰り返しを3回にしたい(_文字列,_文字列). 同じ文字の4回以上の繰り返しを(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列) :- 同一文字からなる限界副文字列(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列), _文字列長 >= 4. '3回にしたい'(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列,_置換した文字列) :- atomic_list_concat([_同一文字,_同一文字,_同一文字],_同一三文字), 同じ文字の4回以上の繰り返しを3回にしたい(_後文字列,_後文字列を置換した文字列), atomic_list_concat([_前文字列,_同一三文字,_後文字列を置換した文字列],_置換した文字列),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 同一文字からなる限界副文字列(_文字列,_同一文字,_限界副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列) :- 同一文字からなる限界副文字列候補(_文字列,_同一文字,_限界副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列), 前文字列の最後と後文字列の最初に同一文字が来ない(_同一文字,_前文字列,_後文字列). 同一文字からなる限界副文字列候補(_文字列,_同一文字,_限界副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列) :- 副文字列は同一文字からなる(_文字列,_同一文字,_限界副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列). 副文字列は同一文字からなる(_文字列,_同一文字,_限界副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列) :- 副文字列は(_文字列,_限界副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列), 同一文字からなる文字列(_同一文字からなる限界副文字列,_同一文字). 副文字列は(_文字列,_副文字列の文字列長,_前文字列,_副文字列,_後文字列) :- sub_atom(_文字列,S,_副文字列の文字列長,E,_副文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). 同一文字からなる文字列(_文字列,_同一文字) :- sub_atom(_文字列,0,1,_,_同一文字), forall(sub_atom(_文字列,_,1,_,A),A = _同一文字). 前文字列の最後と後文字列の最初に同一文字が来ない(_同一文字,_前文字列,_後文字列) :- 前文字列の最後に同一文字が来ない(_同一文字,_前文字列), 後文字列の最後に同一文字が来ない(_同一文字,_後文字列). 前文字列の最後に同一文字が来ない(_同一文字,_前文字列) :- \+(sub_atom(_前文字列,_,1,0,_同一文字)). 後文字列の最後に同一文字が来ない(_同一文字,_後文字列) :- \+(sub_atom(_後文字列,0,1,_,_同一文字)). % 以下のサイトは 同一文字からなる限界副文字列(_文字列,_同一文字,_副文字列の文字列長,_同一文字からなる限界副文字列) :- 同一文字からなる限界副文字列(_文字列,_同一文字,_副文字列の文字列長,_,_同一文字からなる限界副文字列,_). 同一文字からなる限界副文字列(_文字列,_同一文字,_副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列) :- 同一文字からなる副文字列(_文字列,_同一文字,_副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列), 前文字列の最後と後文字列の最初に同一文字が来ない(_同一文字,_前文字列,_後文字列). 同一文字からなる副文字列(_文字列,_同一文字,_副文字列の文字列長,_前文字列,_同一文字からなる副文字列,_後文字列) :- 副文字列は同一文字からなる(_文字列,_同一文字,_副文字列の文字列長,_前文字列,_同一文字からなる副文字列,_後文字列). 副文字列は同一文字からなる(_文字列,_同一文字,_副文字列の文字列長,_前文字列,_同一文字からなる副文字列,_後文字列) :- 副文字列は(_文字列,_副文字列の文字列長,_前文字列,_同一文字からなる副文字列,_後文字列), 同一文字からなる文字列(_同一文字からなる副文字列,_同一文字). 副文字列は(_文字列,_副文字列の文字列長,_前文字列,_副文字列,_後文字列) :- sub_atom(_文字列,S,_副文字列の文字列長,E,_副文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). 同一文字からなる文字列(_文字列,_同一文字) :- sub_atom(_文字列,0,1,_,_同一文字), forall(sub_atom(_文字列,_,1,_,A),A = _同一文字). 前文字列の最後と後文字列の最初に同一文字が来ない(_同一文字,_前文字列,_後文字列) :- 前文字列の最後に同一文字が来ない(_同一文字,_前文字列), 後文字列の最後に同一文字が来ない(_同一文字,_後文字列). 前文字列の最後に同一文字が来ない(_同一文字,_前文字列) :- \+(sub_atom(_前文字列,_,1,0,_同一文字)). 後文字列の最後に同一文字が来ない(_同一文字,_後文字列) :- \+(sub_atom(_後文字列,0,1,_,_同一文字)). % 以下のサイトは 同一文字からなる限界文字列(_文字列,_同一文字,_文字列長,_同一文字からなる限界文字列) :- 同一文字からなる限界文字列(_文字列,_同一文字,_文字列長,_,_同一文字からなる限界文字列,_). 同一文字からなる限界文字列(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる限界文字列,_後文字列) :- 同一文字からなる副文字列(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる限界文字列,_後文字列), 前文字列の最後と後文字列の最初に同一文字が来ない(_同一文字,_前文字列,_後文字列). 同一文字からなる副文字列(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる副文字列,_後文字列) :- 副文字列は同一文字からなる(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる副文字列,_後文字列). 副文字列は同一文字からなる(_文字列,_同一文字,_同一文字からなる副文字列長,_前文字列,_同一文字からなる副文字列,_後文字列) :- 副文字列は(_文字列,_同一文字からなる限界文字列の文字列長,_前文字列,_同一文字からなる副文字列,_後文字列), 同一文字からなる文字列(_同一文字からなる副文字列,_同一文字). 副文字列は(_文字列,_副文字列の文字列長,_前文字列,_副文字列,_後文字列) :- sub_atom(_文字列,S,_副文字列の文字列長,E,_副文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). 同一文字からなる文字列(_文字列,_同一文字) :- sub_atom(_文字列,0,1,_,_同一文字), forall(sub_atom(_文字列,_,1,_,A),A = _同一文字). 前文字列の最後と後文字列の最初に同一文字が来ない(_同一文字,_前文字列,_後文字列) :- 前文字列の最後に同一文字が来ない(_同一文字,_前文字列), 後文字列の最後に同一文字が来ない(_同一文字,_後文字列). 前文字列の最後に同一文字が来ない(_同一文字,_前文字列) :- \+(sub_atom(_前文字列,_,1,0,_同一文字)). 後文字列の最後に同一文字が来ない(_同一文字,_後文字列) :- \+(sub_atom(_後文字列,0,1,_,_同一文字)). % 以下のサイトは # p=1231, q=4567を選びます。 # eに65537 # e^-1=d mod φ(n) のdを計算して求めます。 #     d=3988493 # となります。 # # 暗号化と複合化の手順 # 公開鍵:N = 1231 * 4567 # E = 65537 # d = 3988493 # 文字コード:「a〜z」=01〜26、「A〜Z」=27〜52、空白=53 # 文書:This Anser p(1231). % 素数1 q(4567). % 素数2 法とする数(5621977). % 法とする数 公開鍵(65537). % 公開鍵 秘密鍵(3988493). % 秘密鍵 'RSA暗号化'(_文書,_暗号文字コードならび) :- 文書を文字コードで数値化します(_文書,_文字コードならび), 'RSA方式によるコード暗号化'(_文字コードならび,_暗号文字コードならび). 'RSA復号化'(_暗号文字コードならび,_文書) :- 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび), 文字コードならびから文書を復元します(_文字コードならび,_文書). 'RSA方式によるコード暗号化'(_文字コードならび,_暗号コードならび) :- 公開鍵(_公開鍵), 法とする数(_法とする数), findall(_暗号コード,( '_文字コードを_暗号コードに変換'(_文字コードならび,_公開鍵,_法とする数,_暗号コード)),_暗号コードならび). '_文字コードを_暗号コードに変換'(_文字コードならび,_公開鍵,_法とする数,_暗号コード) :- member(_文字コード,_文字コードならび), _暗号コード is _文字コード ^ _公開鍵 mod _法とする数. 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび) :- 秘密鍵(_秘密鍵), 法とする数(_法とする数), findall(_文字コード,( '_暗号文字コードを_文字コードに復号する'(_暗号文字コードならび,_秘密鍵,_法とする数,_文字コード)),_文字コードならび). '_暗号文字コードを_文字コードに復号する'(_暗号文字コードならび,_秘密鍵,_法とする数,_文字コード) :- member(_暗号文字コード,_暗号文字コードならび), _文字コード is _暗号文字コード ^ _秘密鍵 mod _法とする数. 文書を文字コードで数値化します(_文書,_文字コードならび) :- findall(_文字コード,( sub_atom(_文書,_,1,_,_文字), 文字コード(_文字,_文字コード)), _文字コードならび). 暗号コードを暗号文に変換(_暗号コードならび,_暗号文) :- findall(_暗号文字,( member(_暗号コード,_暗号コードならび), 文字コード(_暗号文字,_暗号コード)),_暗号文字ならび), atom_chars(_暗号文,_暗号文字ならび). 文字コードならびから文書を復元します(_文字コードならび,_文書) :- findall(_文字,( member(_文字コード,_文字コードならび), 文字コード(_文字,_文字コード)),_文字ならび), atom_chars(_文書,_文字ならび). 文字コード(_文字,_コード) :- char_code(_文字,_コード). '秘密鍵の候補'(_素数p,_素数q,_公開鍵,_秘密鍵) :- '_素数p_1と_素数q_1の最小公倍数'(_素数p,_素数q,_素数p_1と_素数q_1の最小公倍数), '((_素数p_1と_素数q_1の最小公倍数 * N + 1) / _公開鍵) が整数となる秘密鍵候補を得る'(_素数p_1と_素数q_1の最小公倍数,_公開鍵,_秘密鍵). '((_素数p_1と_素数q_1の最小公倍数 * N + 1) / _公開鍵) が整数となる秘密鍵候補を得る'(_素数p_1と_素数q_1の最小公倍数,_公開鍵,_秘密鍵) :- between(1,9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999,N), 0 is (_素数p_1と_素数q_1の最小公倍数 * N + 1) mod _公開鍵, _秘密鍵 is (_素数p_1と_素数q_1の最小公倍数 * N + 1) // _公開鍵. '_素数p_1と_素数q_1の最小公倍数'(_素数p,_素数q,_素数p_1と_素数q_1の最小公倍数) :- succ(_素数p_1,_素数p), succ(_素数q_1,_素数q), 最小公倍数(_素数p_1,_素数q_1,_素数p_1と_素数q_1の最小公倍数). 最小公倍数(_m,_n,_最小公倍数) :- Y is _m * _n, ユークリッドの互除法により最大公約数を得る(_m,_n,_最大公約数), _最小公倍数 is ( _m * _n ) // _最大公約数. 'ユークリッドの互除法により最大公約数を得る'(_m,_m,_m). 'ユークリッドの互除法により最大公約数を得る'(_m,_n,_最大公約数) :- _m > _n, _剰余 is _m mod _n, ユークリッドの互除法により最大公約数を得る(_m,_n,_剰余,_最大公約数). 'ユークリッドの互除法により最大公約数を得る'(_m,_n,_最大公約数) :- _m < _n, ユークリッドの互除法により最大公約数を得る(_n,_m,_最大公約数). ユークリッドの互除法により最大公約数を得る(_,_最大公約数,0,_最大公約数) :- !. ユークリッドの互除法により最大公約数を得る(_m,_n,_剰余,_最大公約数) :- 'ユークリッドの互除法により最大公約数を得る'(_n,_剰余,_最大公約数). % 以下のサイトは 最長反復文字列(_文字列,_最長反復文字列) :- setof([Len,_最長反復文字列], [Len,_最長反復文字列] ^ ( 最長反復文字列(_文字列,Len,_最長反復文字列)),LL), 最長反復文字列を取り出す(LL,_最長反復文字列). 最長反復文字列(_文字列,Len,_最長反復文字列) :- sub_atom(_文字列,_前文字列,_最長反復文字列,_後文字列), atom_length(_最長反復文字列,Len), sub_atom(_後文字列,0,Len,_,_最長反復文字列). 最長反復文字列を取り出す(LL,_最長反復文字列) :- findmax(N,member([N,_],LL),_最長文字数), member([_最長文字数,_最長反復文字列],LL). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは ことば溜まり(かまきり). ことば溜まり(くり). ことば溜まり(りす). ことば溜まり(すいか). しりとり(_最初の言葉,_しりとりならび) :- しりとり(_最初の言葉,[_最初の言葉],_しりとりならび). しりとり(_前の言葉,_しりとりならび_1,_しりとりならび) :- 前の言葉の最後の文字と後の言葉の最初の文字が同じまだ使われていない言葉を取り出す(_しりとりならび_1,_前の言葉,_後の言葉), 後の言葉をスタックに積む(_後の言葉,_しりとりならび_1,_しりとりならび). 後の言葉をスタックに積む(_後の言葉,_しりとりならび_1,[_後の言葉|_しりとりならび_1]). 後の言葉をスタックに積む(_後の言葉,_しりとりならび_1,_しりとりならび) :- しりとり(_後の言葉,[_後の言葉|_しりとりならび_1],_しりとりならび). 前の言葉の最後の文字と後の言葉の最初の文字が同じまだ使われていない言葉を取り出す(_しりとりならび_1,_前の言葉,_後の言葉) :- まだ使われていない後の言葉を取り出す(_しりとりならび_1,_後の言葉), 前の言葉の最後の文字と後の言葉の最初の文字が同じ(_前の言葉,_後の言葉). まだ使われていない後の言葉を取り出す(_しりとりならび_1,_後の言葉) :- まだ使われていない(_しりとりならび_1,_後の言葉), 後の言葉を取り出す(_後の言葉). まだ使われていない(_しりとりならび_1,_後の言葉) :- freeze(_後の言葉,\+(member(_後の言葉,_しりとりならび_1))). 後の言葉を取り出す(_後のことば) :- ことば溜まり(_後の言葉). 前の言葉の最後の文字と後の言葉の最初の文字が同じ(_前の言葉,_後の言葉) :- 前の言葉の最後の文字(_前の言葉,_文字), 後の言葉の最初の文字(_後の言葉,_文字). 前の言葉の最後の文字(_前の言葉,_最後の文字) :- sub_atom(_前の言葉,_,1,0,_最後の文字). 後の言葉の最初の文字(_後の言葉,_最初の文字) :- sub_atom(_後の言葉,0,1,_,_最初の文字). % 以下のサイトは ことば集(かまきり). ことば集(くり). ことば集(りす). ことば集(すいか). しりとり(_最初の言葉,_しりとりならび) :- しりとり(_最初の言葉,[_最初の言葉],_しりとりならび). しりとり(_前の言葉,_しりとりならび_1,_しりとりならび) :- 前の言葉の最後の文字と後の言葉の最初の文字が同じ既出ではない言葉を取り出す(_しりとりならび_1,_前の言葉,_後の言葉), しりとり_1(_後の言葉,_しりとりならび_1,_しりとりならび). しりとり_1(_後の言葉,_しりとりならび_1,[_後の言葉|_しりとりならび_1]). しりとり_1(_後の言葉,_しりとりならび_1,_しりとりならび) :- しりとり(_後の言葉,[_後の言葉|_しりとりならび_1],_しりとりならび). 前の言葉の最後の文字と後の言葉の最初の文字が同じ既出ではない言葉を取り出す(_しりとりならび_1,_前の言葉,_後の言葉) :- 既出ではない後の言葉を取り出す(_しりとりならび_1,_後の言葉), 前の言葉の最後の文字と後の言葉の最初の文字が同じ(_前の言葉,_後の言葉). 既出ではない後の言葉を取り出す(_しりとりならび_1,_後の言葉) :- ことば集(_後の言葉), \+(member(_後の言葉,_しりとりならび_1)). 前の言葉の最後の文字と後の言葉の最初の文字が同じ(_前の言葉,_後の言葉) :- 前の言葉の最後の文字(_前の言葉,_文字), 後の言葉の最初の文字(_後の言葉,_文字). 前の言葉の最後の文字(_前の言葉,_最後の文字) :- sub_atom(_前の言葉,_,1,0,_最後の文字). 後の言葉の最初の文字(_後の言葉,_最初の文字) :- sub_atom(_後の言葉,0,1,_,_最初の文字). % 以下のサイトは # 出典 :: Regular Expression(正規表現) Part13 # 「1回以上の abcdefg いずれかの文字の繰り返し、ただし ccd+cc を含まない」 # 例えば abcd 、 ffgabc 、 bbbbbbbbbbbbbdddddbbbbbbb にはヒットし # abcdffgabcbbbbbbbbbbbbbdddddbccdddddddddccbbbbbb をかけると abcdffgabcbbbbbbbbbbbbbdddddb (と bbbbbb )を得られる正規表現 # どうやって作ったら良いんでしょうか '「1回以上の abcdefg いずれかの文字の繰り返し、ただし ccd+cc を含まない」 例えば abcd 、 ffgabc 、 bbbbbbbbbbbbbdddddbbbbbbb にはヒットし abcdffgabcbbbbbbbbbbbbbdddddbccdddddddddccbbbbbb をかけると abcdffgabcbbbbbbbbbbbbbdddddb (と bbbbbb )を得られる'(_文字列,_部分適合文字列ならび) :- '文字列は1回以上の abcdefg いずれかの文字の繰り返し、ただし ccd+cc を含まない'(_文字列,_部分適合文字列ならび). '文字列は1回以上の abcdefg いずれかの文字の繰り返し、ただし ccd+cc を含まない'(_文字列,_部分適合文字列ならび) :- '文字列は1回以上の abcdefg いずれかの文字の繰り返し'(_文字列), 'ただし ccd+cc を含まない'(_文字列,_部分適合文字列ならび). '文字列は1回以上の abcdefg いずれかの文字の繰り返し'(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),sub_atom(abcdefg,_,1,_,_文字)). 'ただし ccd+cc を含まない'(_文字列,[_前文字列|R]) :- sub_atom(_文字列,_前文字列,_除外文字列,_後文字列), sub_atom(_除外文字列,0,3,_,ccd), sub_atom(_除外文字列,_,2,0,cc), 'ただし ccd+cc を含まない'(_後文字列,R),!. 'ただし ccd+cc を含まない'(_文字列,[_文字列]). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # # 文字列の中で或る文字がn回以上続いた部分がある # 或る文字がn回以上続いた部分がある(_n,_或る文字,_文字列) :- 或る文字がn回以上続いた(_n,_或る文字,_文字列長,_或る文字がn回以上続いた文字列), 部分がある(_文字列,_文字列長,_或る文字がn回以上続いた文字列). 或る文字がn回以上続いた(_n,_或る文字,_文字列長,_或る文字がn回以上続いた文字列) :- freeze(_文字列長,_文字列長 >= _n), freeze(_或る文字がn回以上続いた文字列,forall(sub_atom(_或る文字がn回以上続いた文字列,_,1,_,_文字),_或る文字 = _文字)). 部分がある(_文字列,_文字列長,_或る文字がn回以上続いた文字列) :- sub_atom(_文字列,_,_文字列長,_,_或る文字がn回以上続いた文字列). % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒の成績を管理するプログラムを作成する。 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 内容は 数学:70 英語:80 国語:75 理科:80 社会:60 となっている このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(_テキストファイル名ならび), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(_テキストファイル名ならび,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(_テキストファイル名ならび) :- shs('ls -N *.txt',_テキストファイル名ならび). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する([],_,_) :- !. 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(_テキストファイル名,_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の場合は出席番号を表示して行く(_テキストファイル名,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の場合は出席番号を表示して行く([_テキストファイル名|R],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の場合は出席番号を表示する([_テキストファイル名|R],_指定した科目,_指定した点数), 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(R,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の場合は出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数) :- forall(指定した科目で指定した点数の(_テキストファイル名,_指定した科目,_指定した点数), 生徒の出席番号を表示する(_テキストファイル名)). 指定した科目で指定した点数の(_テキストファイル名,_指定した科目,_指定した点数) :- get_split_lines(_テキストファイル名,[' ',':'],_行ならび), member([_指定した科目,_指定した点数],_行ならび). 生徒の出席番号を表示する(_テキストファイル名) :- 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(L1,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1) :- shs('ls -N *.txt',L1). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([],_,_). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_テキストファイル名|R1],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_|R1],_指定した科目,_指定した点数) :- 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(R1,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号) :- get_split_lines(_テキストファイル名,[' ',':'],L), member([_指定した科目,_指定した点数],L), 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # # SWI-Prolog用 sub_atom/5 の遅延評価版述語 副文字列/5 # # 第一引数の_文字列が変数であってもすぐにはエラーとならない # 副文字列(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- '選択開始位置0起源、残り長さが共に0で、かつ、文字列が変数'(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列),!. 副文字列(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- freeze(_文字列,sub_atom(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列)). '選択開始位置0起源、残り長さが共に0で、かつ、文字列が変数'(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- '選択開始位置0起源、残り長さが共に0で、'(_選択開始位置0起源,_残り長さ), 'かつ、文字列が変数'(_文字列,_副文字列,_選択長さ). '選択開始位置0起源、残り長さが共に0で、'(_選択開始位置0起源,_残り長さ) :- '選択開始位置0起源、残り長さは整数で'(_選択開始位置0起源,_残り長さ), 共に0である(_選択開始位置0起源,_残り長さ). '選択開始位置0起源、残り長さは整数で'(_選択開始位置0起源,_残り長さ) :- integer(_選択開始位置0起源), integer(_残り長さ). 共に0である(0,0). 'かつ、文字列が変数'(_文字列,_副文字列,_選択長さ) :- var(_文字列), _文字列 = _副文字列, freeze(_文字列,atom_length(_文字列,_選択長さ)). % 以下のサイトは 前文字列の副文字列として適合文字列は現れない(_前文字列,_適合文字列) :- \+(sub_atom(_前文字列,_,_,_,_適合文字列)). % 以下のサイトは '適合文字列の最初の文字は前文字列の最後の文字ではないし、適合文字列の最後の文字は後文字列の最初の文字ではない。'(_前文字列,_適合文字列,_後文字列) :- '適合文字列の最初の文字は前文字列の最後の文字ではないし、'(_前文字列,_適合文字列), '適合文字列の最後の文字は後文字列の最初の文字ではない。'(_適合文字列,_後文字列). '適合文字列の最初の文字は前文字列の最後の文字ではないし、'(_前文字列,_適合文字列) :- 適合文字列の最初の文字は(_適合文字列,_適合文字列の最初の文字), '前文字列の最後の文字ではないし、'(_前文字列,_適合文字列の最初の文字). 適合文字列の最初の文字は(_適合文字列,_適合文字列の最初の文字) :- sub_atom(_適合文字列,0,1,_,_適合文字列の最初の文字). '前文字列の最後の文字ではないし、'(_前文字列,_適合文字列の最初の文字) :- \+(sub_atom(_前文字列,_,1,0,_適合文字列の最初の文字)). '適合文字列の最後の文字は後文字列の最初の文字ではない。'(_適合文字列,_後文字列) :- 適合文字列の最後の文字は(_適合文字列,_適合文字列の最後の文字), '後文字列の最初の文字ではない。'(_適合文字列の最後の文字,_後文字列). 適合文字列の最後の文字は(_適合文字列,_適合文字列の最後の文字) :- sub_atom(_適合文字列,_,1,0,_適合文字列の最後の文字). '後文字列の最初の文字ではない。'(_適合文字列の最後の文字,_後文字列) :- \+(sub_atom(_後文字列,0,1,_,_適合文字列の最後の文字)). % 以下のサイトは '適合文字列の最初の文字は前文字列の最後の文字ではないし、適合文字列の最後の文字は後文字列の最初の文字ではない。'(_前文字列,_適合文字列,_後文字列) :- '適合文字列の最初の文字は前文字列の最後の文字ではないし、'(_前文字列,_適合文字列), '適合文字列の最後の文字は後文字列の最初の文字ではない。'(_適合文字列,_後文字列). '適合文字列の最初の文字は前文字列の最後の文字ではないし、'(_前文字列,_適合文字列) :- 適合文字列の最初の文字は(_適合文字列,_適合文字列の最初の文字), '前文字列の最後の文字ではないし、'(_前文字列,_適合文字列の最初の文字). 適合文字列の最初の文字は(_適合文字列,_適合文字列の最初の文字) :- sub_atom(_適合文字列,0,1,_,_適合文字列の最初の文字). '前文字列の最後の文字ではないし、'(_前文字列,_適合文字列の最初の文字) :- \+(sub_atom(_前文字列,_,1,0,_適合文字列の最初の文字)). '適合文字列の最後の文字は後文字列の最初の文字ではない。'(_適合文字列,_後文字列) :- 適合文字列の最後の文字は(_適合文字列,_適合文字列の最後の文字), '後文字列の最初の文字ではない。'(_適合文字列の最後の文字,_後文字列). 適合文字列の最後の文字は(_適合文字列,_適合文字列の最後の文字) :- sub_atom(_適合文字列,_,1,0,_適合文字列の最後の文字). '後文字列の最初の文字ではない。'(_適合文字列の最後の文字,_後文字列) :- \+(sub_atom(_後文字列,0,1,_,_適合文字列の最後の文字)). % 以下のサイトは 'a-zを50回繰り返し、その文字列のn番目のnが素数かつその数値文字列の中に3を含まないものは、大文字に変換する'(_目標文字列) :- '小文字のa-zを50回繰り返したならびと大文字のA-Zを50回繰り返したならび'(_小文字ならび,_大文字ならび), 'エラトステネスの篩の変形'(_大文字ならび,Lx), 第二引数のならびの変数を第一引数の同一位置要素で埋めて文字列に変換する(_小文字ならび,Lx,_目標文字列). 第二引数のならびの変数を第一引数の同一位置要素で埋めて文字列に変換する(_小文字ならび,Lx,_目標文字列) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(_小文字ならび,Lx), atom_chars(_目標文字列,Lx). 第二引数のならびの変数を第一引数の同一位置要素で埋める([],[]). 第二引数のならびの変数を第一引数の同一位置要素で埋める(L1,L2) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(L1,L2). 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く([A|R1],[B|R2]) :- 第二引数が変数の時は第一引数と単一化(A,B), 第二引数のならびの変数を第一引数の同一位置要素で埋める(R1,R2). 第二引数が変数の時は第一引数と単一化(A,A) :- !. 第二引数が変数の時は第一引数と単一化(A,B). '小文字のa-zを50回繰り返したならびと大文字のA-Zを50回繰り返したならび'(L1,L2) :- '小文字のa-zを50回繰り返したならびと'(L1), '大文字のA-Zを50回繰り返したならび'(L2). '小文字のa-zを50回繰り返したならびと'(L1) :- findall(A,( between(1,50,_), sub_atom(abcdefghijklmnopqrstuvwxyz,_,1,_,A)),L1). '大文字のA-Zを50回繰り返したならび'(L2) :- findall(A,( between(1,50,_), sub_atom('ABCDEFGHIJKLMNOPQRSTRVWXYZ',_,1,_,A)),L2). 素数でその数値文字列に3を含まない時大文字で挿入する(_大文字ならび,L) :- findall(N,between(2,1300,N),_篩候補), length(L,1300), '素数でその数値文字列に3を含まない時大文字で挿入する'(_篩候補,_大文字ならび,L). '素数でその数値文字列に3を含まない時大文字で挿入する'([],_大文字ならび,L) :- !. '素数でその数値文字列に3を含まない時大文字で挿入する'([A|R1],_大文字ならび,L) :- '数字列に3を含まない時は大文字を素数の位置に挿入'(A,_大文字ならび,L), '素数でその数値文字列に3を含まない時大文字で挿入する'(A,R1,R2,_大文字ならび,L), '素数でその数値文字列に3を含まない時大文字で挿入する'(R2,_大文字ならび,L). '素数でその数値文字列に3を含まない時大文字で挿入する'(_,[],[],_大文字ならび,L) :- !. '素数でその数値文字列に3を含まない時大文字で挿入する'(N,[A|R1],R,_大文字ならび,L) :- 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L). 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L) :- 'AがNで割り切れたらそのまま篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L). 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L) :- 'AがNで割り切れなかったら篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L). 'AがNで割り切れたらそのまま篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L) :- 0 is A mod N, '素数でその数値文字列に3を含まない時大文字で挿入する'(N,R1,R,_大文字ならび,L),!. 'AがNで割り切れなかったら篩を掛け続ける'(N,[A|R1],[A|R2],_大文字ならび,L) :- '素数でその数値文字列に3を含まない時大文字で挿入する'(N,R1,R2,_大文字ならび,L). '数字列に3を含まない時は大文字を素数の位置に挿入'(N,_大文字ならび,L) :- 数字列に3を含まない時は(N,_大文字ならび), 大文字を素数の位置に挿入(N,_大文字ならび,L),!. '数字列に3を含まない時は大文字を素数の位置に挿入'(_,_,L). 数字列に3を含まない時は(N,_大文字ならび) :- number_chars(N,Chars), \+(member('3',Chars)). 大文字を素数の位置に挿入(N,_大文字ならび,L) :- nth1(N,_大文字ならび,A), nth1(N,L,A). % 以下のサイトは '乱数によってズンかドコを表示して、その表示した文字列にズンズンズンズンドコという副文字列が現れたらキ・ヨ・シ!を表示して終了します。' :- 'ズンズンズンズンドコキ・ヨ・シ!'. 'ズンズンズンズンドコキ・ヨ・シ!' :- 'ズンズンズンズンドコキ・ヨ・シ!'(''),!. 'ズンズンズンズンドコキ・ヨ・シ!'(_文字列) :- 'ズンズンズンズンドコが現れたらキ・ヨ・シ!を表示して終了する'(_文字列). 'ズンズンズンズンドコキ・ヨ・シ!'(_文字列) :- ズンズンズンズンドコが現れるまでズンかドコを付加して行く(_文字列). 'ズンズンズンズンドコが現れたらキ・ヨ・シ!を表示して終了する'(_文字列) :- ズンズンズンズンドコが現れたら(_文字列), 'キ・ヨ・シ!を表示して終了する'. ズンズンズンズンドコが現れたら(_文字列) :- sub_atom(_文字列,_,_,0,ズンズンズンズンドコ). 'キ・ヨ・シ!を表示して終了する' :- format('~w\n',['キ・ヨ・シ!']). ズンズンズンズンドコが現れるまでズンかドコを付加して行く(_文字列) :- 乱数によってズンかドコを選択して表示し文字列の末尾に付加する(_文字列,_ズンかドコを付加された文字列), 'ズンズンズンズンドコキ・ヨ・シ!'(_ズンかドコを付加された文字列). 乱数によってズンかドコを選択して表示し文字列の末尾に付加する(_文字列,_ズンかドコを付加された文字列) :- 乱数によってズンかドコを選択して表示し(_ズンかドコ), 文字列の末尾に付加する(_文字列,_ズンかドコ,_ズンかドコを付加された文字列). 乱数によってズンかドコを選択して表示し(_ズンかドコ) :- 乱数によってズンかドコを選択して(_ズンかドコ), 表示し(_ズンかドコ). 乱数によってズンかドコを選択して(_ズンかドコ) :- random_select(_ズンかドコ,[ズン,ドコ],_). 表示し(_ズンかドコ) :- format('~w',[_ズンかドコ]). 文字列の末尾に付加する(_文字列,_ズンかドコ,_ズンかドコを付加された文字列) :- atom_concat(_文字列,_ズンかドコ,_ズンかドコを付加された文字列). % 以下のサイトは 'ズンズンズンズンドコキ・ヨ・シ!' :- 'ズンズンズンズンドコキ・ヨ・シ!'(''). 'ズンズンズンズンドコキ・ヨ・シ!'(_文字列) :- 末尾がズンズンズンズンドコになったらキヨシを付加して終了する(_文字列),!. 'ズンズンズンズンドコキ・ヨ・シ!'(_文字列) :- 末尾にズンズンズンズンドコが現れるまでズンかドコを付加して行く(_文字列). '末尾がズンズンズンズンドコになったらキ・ヨ・シ!を表示して終了する'(_文字列) :- 末尾がズンズンズンズンドコになったら(_文字列), 'キ・ヨ・シ!を表示して'(_文字列). 末尾がズンズンズンズンドコになったら(_文字列) :- sub_atom(_文字列,_,_,0,ズンズンズンズンドコ). 'キ・ヨ・シ!を表示して'(_文字列) :- write('キ・ヨ・シ!\n'). 末尾にズンズンズンズンドコが現れるまでズンかドコを付加して行く(_文字列) :- 乱数によってズンかドコを選択して文字列の末尾に付加する(_文字列,_ズンかドコを付加された文字列), 'ズンズンズンズンドコキ・ヨ・シ!'(_ズンかドコを付加された文字列). 乱数によってズンかドコを選択してそれを表示し文字列の末尾に付加する(_文字列,_ズンかドコを付加された文字列) :- 乱数によってズンかドコを選択してそれを表示し(_ズンかドコ), 文字列の末尾に付加する(_文字列,_ズンかドコを付加された文字列). 乱数によってズンかドコを選択してそれを表示し(_ズンかドコ) :- 乱数によってズンかドコを選択して(_ズンかドコ), それを表示し(_ズンかドコ). 乱数によってズンかドコを選択して(_ズンかドコ) :- random_select(_ズンかドコ,[ズン,ドコ],_). それを表示し(_ズンかドコ) :- wrtitef('%w\n',[_ズンかドコ]). 文字列の末尾に付加する(_文字列,_ズンかドコ,_ズンかドコを付加された文字列) :- atom_concat(_文字列,_ズンかドコ,_ズンかドコを付加された文字列). % 以下のサイトは 'ズンズンズンズンドコキ・ヨ・シ!'(_ズンズンズンズンドコキヨシ) :- 'ズンズンズンズンドコキ・ヨ・シ!'('',_ズンズンズンズンドコキヨシ),!. 'ズンズンズンズンドコキ・ヨ・シ!'(_文字列,_ズンズンズンズンドコキヨシ) :- '末尾がズンズンズンズンドコになったらキ・ヨ・シ!を付加して終了する'(_文字列,_ズンズンズンズンドコキヨシ). 'ズンズンズンズンドコキ・ヨ・シ!'(_文字列,_ズンズンズンズンドコキヨシ) :- 末尾にズンズンズンズンドコが現れるまでズンかドコを付加して行く(_文字列,_ズンズンズンズンドコキヨシ). '末尾がズンズンズンズンドコになったらキ・ヨ・シ!を付加して終了する'(_文字列,_ズンズンズンズンドコキヨシ) :- sub_atom(_文字列,_,_,0,ズンズンズンズンドコ), atom_concat(_文字列,'キ・ヨ・シ!',_ズンズンズンズンドコキヨシ). 末尾にズンズンズンズンドコが現れるまでズンかドコを付加して行く(_文字列,_ズンズンズンズンドコキヨシ) :- 乱数によってズンかドコを選択して文字列の末尾に付加する(_文字列,_ズンかドコを付加された文字列), 'ズンズンズンズンドコキ・ヨ・シ!'(_ズンかドコを付加された文字列,_ズンズンズンズンドコキヨシ). 乱数によってズンかドコを選択して文字列の末尾に付加する(_文字列,_ズンかドコを付加された文字列) :- random_select(_ズンかドコ,[ズン,ドコ],_), atom_concat(_文字列,_ズンかドコ,_ズンかドコを付加された文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 157代目 #602 # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し、'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力せよ。'(_文字列). '文字列を入力し、'(_文字列) :- read_line_to_codes(user_input,Codes), atom_chars(_文字列,Codes). 'その文字列に含まれる英字、数字、その他の文字の数を出力せよ。'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力せよ(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- 文字ごとの種別判定行列を作る(_文字列,_文字ごとの種別判定行列), 列を合計したならび(_文字ごとの種別判定行列,[_英字の数,_数字の数,_その他の文字の数]). 文字ごとの種別判定行列を作る(_文字列,_文字ごとの種別判定行列) :- findall([A,B,C],( sub_atom(_文字列,_,1,_,_文字), 文字種判定(_文字,A,B,C)),_文字ごとの種別判定行列). 列を合計したならび(_行列,[_英字の数,_数字の数,_その他の文字の数]) :- 転置(_行列,_転置された行列), 転置された行の合計をならびに取る(_転置された行列,[_英字の数,_数字の数,_その他の文字の数]). 転置された行の合計をならびに取る(_転置された行列,_行の合計ならび) :- findall(S,( member(L,_転置された行列), sum_list(L,S)),_行の合計ならび). 出力せよ(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数は %w,数字の数は %w,その他の文字の数は %w\n',[_英字の数,_数字の数,_その他の文字の数]). 文字種判定(_文字,1,0,0) :- 英字(_文字),!. 文字種判定(_文字,0,1,0) :- 数字(_文字),!. 文字種判定(_文字,0,0,1). 英字(A) :- A @>='A',A @=< 'Z'; A @>='a',A @=< 'z'. 数字(A) :- A @>= '0', A @=< '9'. 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #531 # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # 平成○年の値を入力し、西暦に変換するプログラムを作成 # '平成○年の値を入力し、西暦に変換する' :- '平成○年の値を入力し漢数字を数字に変換する'(_数字), '平成元年は西暦1989年であることから西暦を得る'(_数字,_西暦), format('西暦は ~w です。\n',[_西暦]). '平成○年の値を入力し漢数字を数字に変換する'(_数字) :- '平成○年の値を入力し'(_漢数字年), 漢数字を数字に変換する(_漢数字年,_数字). '平成○年の値を入力し'(_漢数字年) :- write('平成○年を入力してください : '), 漢数字年を得る(_漢数字年). 漢数字年を得る(_漢数字年) :- 行入力されたものが漢数字であるか検査する(_漢数字年),!. 漢数字年を得る(_漢数字年) :- 漢数字年を得る(_漢数字年). 行入力されたものが漢数字であるか検査する(_漢数字年) :- 行入力(_行), 年は切り取って検査する(_行,_年が切り取られた行), 漢数字年入力検査(_年が切り取られた行,_漢数字年). 年は切り取って検査する(_行,_年が切り取られた行) :- 末尾文字が年だったら切り取る(_行,_年が切り取られた行),!. 年は切り取って検査する(_行,_行). 末尾文字が年だったら切り取る(_行,_年が切り取られた行) :- sub_atom(_行,_,1,0,年), sub_atom(_行,0,_,1,_年が切り取られた行). 漢数字年入力検査(元,元) :- !. 漢数字年入力検査(_漢数字年,_漢数字年) :- forall(sub_atom(_漢数字年,_,1,_,A),'漢数字・数字'(A,_)),!. 漢数字年入力検査(_行,_) :- writef('入力された %t からは漢数字が得られませんでした。再入力をお願いします。\n',[_行]), fail. 漢数字を数字に変換する(元,1) :- !. 漢数字を数字に変換する(_年,_数字) :- '二桁年の数字を得る'(_年,_数字). 漢数字を数字に変換する(_年,_数字) :- '一桁年の数字を得る'(_年,_数字). '二桁年の数字を得る'(_年,_数字) :- '十の桁、一の桁の漢数字を切り取り数字を得る'(_年,_数字). '十の桁、一の桁の漢数字を切り取り数字を得る'(_年,_数字) :- '十の桁、一の桁の漢数字を得る'(_年,_十の桁の漢数字,_一の桁の漢数字), '十の桁、一の桁の数字を得る'(_十の桁の漢数字,_一の桁の漢数字,_十の桁の数字,_一の桁の数字), _数字 is _十の桁の数字 * 10 + _一の桁の数字. '十の桁、一の桁の漢数字を得る'(_年,_十の桁の漢数字,_一の桁の漢数字) :- sub_atom(_年,0,1,R,_十の桁の漢数字), sub_atom(_年,R,1,0,_一の桁の漢数字), R > 0. '十の桁、一の桁の数字を得る'(_十の桁の漢数字,_一の桁の漢数字,_十の桁の数字,_一の桁の数字) :- '漢数字・数字'(_十の桁の漢数字,_十の桁の数字), '漢数字・数字'(_一の桁の漢数字,_一の桁の数字). '一桁年の数字を得る'(_年,_数字) :- sub_atom(_年,0,1,0,_一の桁の漢数字), '漢数字・数字'(_一の桁の漢数字,_数字). '平成元年は西暦1989年であることから西暦を得る'(_数字,_西暦) :- _西暦 is _数字 + 1989 - 1. '漢数字・数字'(一,1). '漢数字・数字'(二,2). '漢数字・数字'(三,3). '漢数字・数字'(四,4). '漢数字・数字'(五,5). '漢数字・数字'(六,6). '漢数字・数字'(七,7). '漢数字・数字'(八,8). '漢数字・数字'(九,9). '漢数字・数字'(十,1). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 145代目 #749 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):ー由に文字列を定義して、その文字列のn番目の文字を表示するプログラムを作れ。 #                ⊆由に文字列を定義して、n番目以降の文字をすべて表示するプログラムを作れ。 #                自由に文字列を定義して、n番目からo番目(n<=o)の文字を表示するプログラムを作れ。 # '自由に文字列を定義して、その文字列のn番目の文字を表示する'(_文字列,_n番目) :- succ(_変位,_n番目), sub_atom(_文字列,_変位,1,_,_文字), writef('%w',[_文字]). '自由に文字列を定義して、n番目以降の文字をすべて表示する'(_文字列,_n番目) :- succ(_変位,_n番目), sub_atom(_文字列,_変位,_,0,_副文字列), writef('%w',[_副文字列]). '自由に文字列を定義して、n番目からo番目(n<=o)の文字を表示する'(_文字列,_n番目,_o番目) :- 'n番目からo番目(n<=o)の文字を'(_文字列,_n番目,_o番目,_文字ならび), 表示する(_文字ならび). 'n番目からo番目(n<=o)の文字を'(_文字列,_n番目,_o番目,_文字ならび) :- findall(_文字,( '変位Mの文字を取り出す'(_文字列,_n番目,_o番目,_変位M,_文字)),_文字ならび). '変位Mの文字を取り出す'(_文字列,_n番目,_o番目,_変位_M,_文字) :- 変位に変換(_n番目,_o番目,_変位_n番目,_変位_o番目), between(_変位_n番目,_変位_o番目,_変位_M), sub_atom(_文字列,_変位_M,1,_,_文字). 変位に変換(_n番目,_o番目,_変位_n番目,_変位_o番目) :- succ(_変位_n番目,_n番目), succ(_変位_o番目,_o番目). 表示する(_文字ならび) :- atomic_list_concat(_文字ならび,_副文字列), writef('%w',[_副文字列]). /* for(S,S,S) :- !. for(S,S,E). for(S,N,E) :- succ(S,E,S1), for(S1,N,E). succ(S,E,S1) :- S =< E, succ(S,S1),!. succ(S,E,S1) :- S > E, succ(S1,S). */ % 以下のサイトは #出典: Regular Expression(正規表現) Part12 #507 #●Regular Expressionの使用環境 #秀丸 # #●検索か置換か? #置換 # #●説明 #行の一番最後の全角文字から後を削除したい。 # #●対象データ # #東京 abc 大阪静岡 123 名古屋 apple orange # # #●希望する結果 # #東京 abc 大阪静岡 123 名古屋 # # #宜しくお願いします。 '行の一番最後の全角文字から後を削除したい。'(_行文字列,_行の一番最後の全角文字から後を削除した文字列) :- 行の一番最後の全角文字から(_行文字列,_全角文字から後の長さ), '後を削除したい。'(_行文字列,_全角文字から後の長さ,_行の一番最後の全角文字から後を削除した文字列),!. 行の一番最後の全角文字から(_行文字列,_全角文字から後の長さ) :- 行の一番最後の(_行文字列,_全角文字から後の長さ,_文字), 全角文字から(_文字). 行の一番最後の(_行文字列,_全角文字から後の長さ,_文字) :- sub_atom(_行文字列,_全角文字から後の長さ,1,_最後の全角文字の開始位置,_), sub_atom(_行文字列,_最後の全角文字の開始位置,1,_全角文字から後の長さ,_文字). 全角文字から(_全角文字) :- char_code(_全角文字,_文字コード), _文字コード > 255. '後を削除したい。'(_行文字列,_全角文字から後の長さ,_行の一番最後の全角文字から後を削除した文字列) :- sub_atom(_行文字列,0,_,_全角文字から後の長さ,_行の一番最後の全角文字から後を削除した文字列). % 以下のサイトは # 出典 :: SQL質疑応答スレ 12問目 #984 # ・SQL Server2008R2Express # テーブルデータ # ・2012-08-01 11:35:00, りんご, 1 # ・2012-08-01 16:22:00, みかん, 2 # ・2012-08-02 13:54:00, りんご, 2 # ・2012-08-02 14:32:00, りんご, 1 # ・2012-08-04 16:22:00, みかん, 3 # # ・欲しい結果 # 2012-08-01 # 2012-08-02 # 2012-08-04 # # ・説明 # 件数に関係なく売り上げがあった日だけのリストが欲しいのですが # うまい方法あるでしょうか # # 売上('2012-08-01 11:35:00', りんご, 1 ). 売上('2012-08-01 16:22:00', みかん, 2 ). 売上('2012-08-02 13:54:00', りんご, 2 ). 売上('2012-08-02 14:32:00', りんご, 1 ). 売上('2012-08-04 16:22:00', みかん, 3 ). 件数に関係なく売り上げがあった日(_売上のあった日) :- 売上のあった日を選ぶ(_売上のあった日候補日リスト), 実際に売上のあった日(_売上のあった日候補日リスト,_売上のあった日). 売上のあった候補日を選ぶ(_売上のあった候補日リスト) :- setof(_年月日,[_年月日] ^ 売上のあった日(_年月日),_売上のあった候補日リスト). 売上のあった日(_年月日) :- 売上(_日付時刻,_,_件数), 日付時刻から年月日を切り取る(_日付時刻,_年月日). 日付時刻から年月日を切り取る(_日付時刻,_年月日) :- sub_atom(_日付時刻,0,10,_,_年月日). 実際に売上のあった日(_売上のあった日候補日リスト,_年月日) :- member(_年月日,_売上のあった日候補日リスト), 合計件数を得る(_年月日,_合計件数), _合計件数 > 0. 合計件数を得る(_年月日,_合計件数) :- findsum(_件数,売上の件数を得る(_年月日,_件数),_合計件数). 売上の件数を得る(_年月日,_件数) :- 売上(_日付時刻,_,_件数), 日付時刻から年月日を切り取る(_日付時刻,_年月日). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは 二文字以上の同一文字文字列(_文字列,_前文字列,_同一文字文字列,_後文字列) :- 二文字以上の同一文字文字列(_文字列,S,R,_同一文字文字列,_同一文字), 同一文字と異なった文字で接する前文字列と後文字列(_文字列,S,R,_同一文字,_前文字列,_後文字列). 二文字以上の同一文字文字列(_文字列,S,R,_同一文字文字列,_同一文字) :- 二文字以上の(_文字列,S,R,_同一文字文字列), 同一文字文字列(_同一文字文字列,_同一文字). 二文字以上の(_文字列,S,R,_同一文字文字列) :- sub_atom(_文字列,S,_文字数,R,_同一文字文字列), _文字数 > 1. 同一文字と異なった文字で接する前文字列と後文字列(_文字列,S,R,_同一文字,_前文字列,_後文字列) :- 前文字列と後文字列(_文字列,S,R,_前文字列,_後文字列), 同一文字と異なった文字で接する(_前文字列,_後文字列,_同一文字). 前文字列と後文字列(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 同一文字と異なった文字で接する(_前文字列,_後文字列,_同一文字) :- 前文字列の最後の文字は同一文字ではない(_前文字列,_同一文字), 後文字列の最初の文字は同一文字ではない(_後文字列,_同一文字). 前文字列の最後の文字は同一文字ではない(_前文字列,_同一文字) :- \+(sub_atom(_前文字列,_,1,0,_同一文字)). 後文字列の最初の文字は同一文字ではない(_後文字列,_同一文字) :- \+(sub_atom(_後文字列,0,1,_,_同一文字)). 同一文字文字列(_文字列,_同一文字) :- 標本となる同一文字を得る(_文字列,_同一文字), 全ての文字列中の文字は同一文字と一致する(_文字列,_同一文字). 標本となる同一文字を得る(_文字列,_同一文字) :- sub_atom(_文字列,0,1,_,_同一文字). 全ての文字列中の文字は同一文字と一致する(_文字列,_同一文字) :- forall(sub_atom(_文字列,_,1,_,_文字),_文字 = _同一文字). % 以下のサイトは # 出典: Regular Expression(正規表現)Part12 #561 # ●Regular Expressionの使用環境 # Perl # # ●検索か置換か? # 検索 # # ●説明 # 前に指定したデータを含まない、「スケート」だけマッチさせたい # # # ●対象データ # アイススケート # ローラースケート # スケート # '前に指定したデータを冠としない検索文字列'(_文,_検索文字列,_指定したデータならび,_前データ,_検索文字列,_後データ) :- sub_atom(_文,_前データ,_検索文字列,_後データ), 前に指定したデータを含まない(_前データ,_指定したデータならび). 前に指定したデータを含まない(_前データ,_指定したデータならび) :- \+(前に指定したデータを含む(_前データ,_指定したデータならび)). 前に指定したデータを含む(_前データ,_指定したデータならび) :- member(_指定したデータ,_指定したデータならび), sub_atom(_前データ,_,_,0,_指定したデータ). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). ?- '前に指定したデータを冠としない検索文字列'(お気に入りのローラースケート,スケート,[アイス,ローラー],_前データ,_検索文字列,_後データ). false. ?- '前に指定したデータを冠としない検索文字列'(お気に入りのスケート,スケート,[アイス,ローラー],_前データ,_検索文字列,_後データ). _前データ = お気に入りの, _検索文字列 = スケート, _後データ = ''. ?- % 以下のサイトは 限界まで同一文字の副文字列(_文字列,_前文字列,_限界まで同一文字の副文字列,_後文字列) :- sub_atom(_文字列,_前文字列,_限界まで同一文字の副文字列,_後文字列), 文字列は全て同一文字からなる(_限界まで同一文字の副文字列,_文字), '_前文字列の最後の文字と_後文字列の最初の文字が_文字ではない'(_文字列,_文字,_前文字列,_限界まで同一文字の副文字列,_後文字列). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 文字列は全て同一文字からなる('',_). 文字列は全て同一文字からなる(_文字列,_文字) :- sub_atom(_文字列,0,1,R,_文字), sub_atom(_文字列,1,R,0,_残り文字列), 文字列は全て同一文字からなる(_残り文字列,_文字). '_前文字列の最後の文字と_後文字列の最初の文字が_文字ではない'(_文字列,_文字,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_前文字列,_適合文字列,_後文字列), '_前文字列の最後の文字は_文字ではない'(_前文字列,_文字), '_後文字列の最初の文字は_文字ではない'(_後文字列,_文字). '_前文字列の最後の文字は_文字ではない'(_前文字列,_文字) :- \+(sub_atom(_前文字列,_,1,0,_文字)). '_後文字列の最初の文字は_文字ではない'(_後文字列,_文字) :- \+(sub_atom(_後文字列,0,1,_,_文字)). % 以下のサイトは '2文字の抽出とその出現頻度を求める'(_文字列,_抽出された出現頻度付きの2文字ならび) :- '2文字の抽出と'(_文字列,_抽出された2文字ならび), その出現頻度を求める(_文字列,_抽出された2文字ならび,_抽出された出現頻度付きの2文字ならび). '2文字の抽出と'(_文字列,_抽出された2文字ならび) :- setof(_2文字,[_文字列,S,R,_2文字] ^ sub_atom(_文字列,S,2,R,_2文字),_抽出された2文字ならび). その出現頻度を求める(_文字列,_抽出された2文字ならび,_抽出された出現頻度付きの2文字ならび) :- findall([_2文字,_出現頻度],( member(_2文字,_抽出された2文字ならび), 出現頻度(sub_atom(_文字列,_,2,_,_2文字),_出現頻度)),_抽出された出現頻度付きの2文字ならび). 出現頻度(P,_出現頻度) :- findall(1,P,L), length(L,_出現頻度). % 以下のサイトは '2つの文字列の先頭から一致する文字数を返す'(_文字列_1,_文字列_2,_先頭から一致する文字数) :- findall(_先頭から一致する文字数, 先頭から一致する文字数(_文字列_1,_文字列_2,_先頭から一致する文字数),_先頭から一致する文字数ならび), 最大長(_先頭から一致する文字数ならび,_先頭から一致する文字数). 先頭から一致する文字数(_文字列_1,_文字列_2,先頭から一致する文字数) :- sub_atom(_文字列_1,0,先頭から一致する文字数,_,_先頭から一致する副文字列), sub_atom(_文字列_2,0,先頭から一致する文字数,_,_先頭から一致する副文字列). 最大長(L,_最大長) :- max_list(L,_最大長). % 以下のサイトは '2つの文字列の先頭から一致する文字数を返す'(_文字列_1,_文字列_2,_先頭から一致する文字数) :- findall(_長さ,先頭から一致する文字数(_文字列_1,_文字列_2,_長さ),_長さならび), max_list(_長さならび,_先頭から一致する文字数). 先頭から一致する文字数(_文字列_1,_文字列_2,_長さ) :- sub_atom(_文字列_1,0,_長さ,_,_副文字列), sub_atom(_文字列_2,0,_長さ,_,_副文字列). % 以下のサイトは # # 出典::パスワード向け文字列検査 # 半角英数字8文字以上100文字以下(_文字列) :- '8文字以上100文字以下'(_文字列), forall(sub_atom(_文字列,_,1,_,_文字),半角英数(_文字)). 半角英数字をそれぞれ1種類以上含む8文字以上100文字以下(_文字列) :- '8文字以上100文字以下'(_文字列), forall(sub_atom(_文字列,_,1,_,_文字),半角英数(_文字)), 半角英字が一文字はある(_文字列), 半角数字が一文字はある(_文字列). 半角英小文字大文字数字をそれぞれ1種類以上含む8文字以上100文字以下(_文字列) :- '8文字以上100文字以下'(_文字列), forall(sub_atom(_文字列,_,1,_,_文字),半角英数(_文字)), 半角英大文字が一文字はある(_文字列), 半角英小文字が一文字はある(_文字列), 半角数字が一文字はある(_文字列). 半角英数字記号をそれぞれ1種類以上含む8文字以上100文字以下(_文字列) :- '8文字以上100文字以下'(_文字列), forall(sub_atom(_文字列,_,1,_,_文字),半角英数字記号(_文字)), 半角英大文字が一文字はある(_文字列), 半角英小文字が一文字はある(_文字列), 半角数字が一文字はある(_文字列), 半角英記号が一文字はある(_文字列). '8文字以上100文字以下'(_文字列) :- atom_length(_文字列,_文字列の長さ), between(8,100,_文字列の長さ),!. 半角英字が一文字はある(_文字列) :- sub_atom(_文字列,_,1,_,_半角英字), 半角英字(_半角英字),!. 半角数字が一文字はある(_文字列) :- sub_atom(_文字列,_,1,_,_半角数字), 半角英字(_半角数字). 半角英大文字が一文字はある(_文字列) :- sub_atom(_文字列,_,1,_,_半角英大文字), 半角英大文字(_半角英大文字),!. 半角英小文字が一文字はある(_文字列) :- sub_atom(_文字列,_,1,_,_半角英小文字), 半角英小文字(_半角英小文字),!. 半角英記号が一文字はある(_文字列) :- sub_atom(_文字列,_,1,_,_半角英記号), 半角英記号(_半角英記号),!. 半角英数(_文字) :- 半角英字(_半角英字). 半角英数(_数字) :- 半角数字(_半角数字). 半角英数字記号(_半角英数) :- 半角英数(_半角英数). 半角英数字記号(_半角英記号) :- 半角英記号(_半角英記号). 半角英字(_半角英小英字) :- 半角英小文字(_半角英小文字). 半角英字(_半角英大文字) :- 半角英大文字(_半角英大文字). 半角英小文字(_半角英小文字) :- _半角英小文字 @>= a, _半角英小文字 @=< z. 半角英大文字(_半角英大文字) :- _半角英大文字 @>= 'A', _半角英大文字 @=< 'Z'. 半角数字(_半角数字) :- _半角数字 @>= '0', _半角数字 @=< '9'. 半角英記号(_半角英記号) :- member(_半角英記号,['!','"','#','$','%','&','\'','(',')','=','-','~','^','|','\\','@','[','}',']','+','*',';',':','<',',','>','.','?','/','_','\']). % 以下のサイトは '0から9までの数字に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列) :- '0から9までの数字に一致する適合文字列'(_文字列,_適合文字列,S,R), 前後の文字列を切り取る(_文字列,S,R,_前文字列,_後文字列). '0から9までの数字に一致する適合文字列'(_文字列,_適合文字列,S,R) :- sub_atom(_文字列,S,1,R,_適合文字列), member(_適合文字列,['0','1','2','3','4','5','6','7','8','9']). 前後の文字列を切り取る(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- 'キャリッジ・リターンが30回登場したら30回目より'(_文字列,_削除する文字数), '後ろの文字を削除したい'(_文字列,_削除する文字数,_末尾を削除された文字列). 'キャリッジ・リターンが30回登場したら30回目より'(_文字列,_削除する文字数) :- n個収集した最後(30,_残り文字数,sub_atom(_文字列,_,1,_残り文字数,'\r'),_削除する文字数). n個収集した最後(_n個,_射影項,_目標,_n個収集した最後) :- n個収集した(_n個,_射影項,_目標,_n個収集した), 最後(_n個収集した,_n個収集した最後). n個収集した(_n個,_射影項,_目標,_n個収集した) :- findnsols(_n個,_射影項,_目標,_n個収集した). 最後(_ならび,_ならびの最後) :- last(_ならび,_ならびの最後). '後ろの文字を削除したい'(_文字列,_削除する文字数,_末尾を削除された文字列) :- sub_atom(_文字列,0,_,_削除する文字数,_末尾を削除された文字列). % 以下のサイトは # 出典 :: SQL質疑応答スレ 12問目 #689 # すみません。 # 高専機械科卒なんですがお願いいたします。 # # 以下のようなテーブルにて、あかさたなでGROUP BYしてそれぞれの件数を出力できないかどうか悩んでおります。 # # CREATE TABLE `name_list` ( # kanji varchar(64), # yomi varchar(64) # ) # # INSERT INTO name_list (kanji,yomi) VALUES # ('安部','あべ'), # ('井口','いぐち'), # ('臼井','うすい'), # ('江本','えもと'), # ('小川','おがわ'), # ('柿本','かきもと'), # ('木島','きじま'), # ('九条','くじょう'), # ('毛森','けもり'), # ('小島','こじま'), # ('佐藤','さとう'), # ('しみず','')・・・・・・ # # 勿論、各頭文字で一件ずつじゃないのですが # これを # # あ行 5件 # か行 5件 # さ行 8件 # # のように集計をかけたいと思っておりますが # よい方法が思いつかず… # # 出力結果は、例でして出力した左側のフィールドはなんでもOKです。 # 右側のあかさたな行のそれぞれのレコード数がチェックできればOKです。 # # なにとぞよろしくお願いいたします。 # 名簿(安部,あべ). 名簿(井口,いぐち). 名簿(臼井,うすい). 名簿(江本,えもと). 名簿(小川,おがわ). 名簿(柿本,かきもと). 名簿(木島,きじま). 名簿(九条,くじょう). 名簿(毛森,けもり). 名簿(小島,こじま). 名簿(佐藤,さとう). 名簿(しみず,''). '各頭文字で一件ずつじゃないのですが、これを あ行 5件 か行 5件 さ行 8件 のように集計をかけたい'(_あかさたなはまやらわん,_件数) :- あかさたなはまやらわん(_あかさたなはまやらわん), '件数(但し0件は除く)'('名簿のひらがな読みの最初の文字は_あかさたなはまやらわんの行範囲'(_あかさたなはまやらわん),_件数). '名簿のひらがな読みの最初の文字は_あかさたなはまやらわんの行範囲'(_あかさたなはまやらわん) :- 名簿のひらがな読みの最初の文字は(_ひらがな読みの最初の文字), あかさたなはまやらわん(_あかさたなはまやらわん,_ひらがな読みの最初の文字). 名簿のひらがな読みの最初の文字は(_ひらがな読みの最初の文字) :- 名簿(_,_ひらがな読み), sub_atom(_ひらがな読み,0,1,_,_ひらがな読みの最初の文字). '件数(但し0件は除く)'(_目標,_件数) :- findall(1,_目標,[_|L]), length([_|L],_件数). あかさたなはまやらわん(あ). あかさたなはまやらわん(か). あかさたなはまやらわん(さ). あかさたなはまやらわん(た). あかさたなはまやらわん(な). あかさたなはまやらわん(は). あかさたなはまやらわん(ま). あかさたなはまやらわん(や). あかさたなはまやらわん(ら). あかさたなはまやらわん(わ). あかさたなはまやらわん(ん). あかさたなはまやらわん(あ,あ). あかさたなはまやらわん(あ,ぃ). あかさたなはまやらわん(あ,い). あかさたなはまやらわん(あ,ぅ). あかさたなはまやらわん(あ,う). あかさたなはまやらわん(あ,ぇ). あかさたなはまやらわん(あ,え). あかさたなはまやらわん(あ,ぉ). あかさたなはまやらわん(あ,お). あかさたなはまやらわん(か,か). あかさたなはまやらわん(か,が). あかさたなはまやらわん(か,き). あかさたなはまやらわん(か,ぎ). あかさたなはまやらわん(か,く). あかさたなはまやらわん(か,ぐ). あかさたなはまやらわん(か,け). あかさたなはまやらわん(か,げ). あかさたなはまやらわん(か,こ). あかさたなはまやらわん(か,ご). あかさたなはまやらわん(さ,さ). あかさたなはまやらわん(さ,ざ). あかさたなはまやらわん(さ,し). あかさたなはまやらわん(さ,じ). あかさたなはまやらわん(さ,す). あかさたなはまやらわん(さ,ず). あかさたなはまやらわん(さ,せ). あかさたなはまやらわん(さ,ぜ). あかさたなはまやらわん(さ,そ). あかさたなはまやらわん(さ,ぞ). あかさたなはまやらわん(た,た). あかさたなはまやらわん(た,だ). あかさたなはまやらわん(た,ち). あかさたなはまやらわん(た,ぢ). あかさたなはまやらわん(た,っ). あかさたなはまやらわん(た,つ). あかさたなはまやらわん(た,づ). あかさたなはまやらわん(た,て). あかさたなはまやらわん(た,で). あかさたなはまやらわん(た,と). あかさたなはまやらわん(た,ど). あかさたなはまやらわん(な,な). あかさたなはまやらわん(な,に). あかさたなはまやらわん(な,ぬ). あかさたなはまやらわん(な,ね). あかさたなはまやらわん(な,の). あかさたなはまやらわん(は,は). あかさたなはまやらわん(は,ば). あかさたなはまやらわん(は,ぱ). あかさたなはまやらわん(は,ひ). あかさたなはまやらわん(は,び). あかさたなはまやらわん(は,ぴ). あかさたなはまやらわん(は,ふ). あかさたなはまやらわん(は,ぶ). あかさたなはまやらわん(は,ぷ). あかさたなはまやらわん(は,へ). あかさたなはまやらわん(は,べ). あかさたなはまやらわん(は,ぺ). あかさたなはまやらわん(は,ほ). あかさたなはまやらわん(は,ぼ). あかさたなはまやらわん(は,ぽ). あかさたなはまやらわん(ま,ま). あかさたなはまやらわん(ま,み). あかさたなはまやらわん(ま,む). あかさたなはまやらわん(ま,め). あかさたなはまやらわん(ま,も). あかさたなはまやらわん(や,ゃ). あかさたなはまやらわん(や,や). あかさたなはまやらわん(や,ゅ). あかさたなはまやらわん(や,ゆ). あかさたなはまやらわん(や,ょ). あかさたなはまやらわん(や,よ). あかさたなはまやらわん(ら,ら). あかさたなはまやらわん(ら,り). あかさたなはまやらわん(ら,る). あかさたなはまやらわん(ら,れ). あかさたなはまやらわん(ら,ろ). あかさたなはまやらわん(わ,ゎ). あかさたなはまやらわん(わ,わ). あかさたなはまやらわん(わ,ゐ). あかさたなはまやらわん(わ,ゑ). あかさたなはまやらわん(わ,を). あかさたなはまやらわん(な,ん). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- n個収集した最後(30,_残り文字数,sub_atom(_文字列,_,1,_残り文字数,'\r'),_削除する文字数), '30回目より後ろの文字を削除したい'(_文字列,_削除する文字数,_末尾を削除された文字列). n個収集した最後(_n個,_射影項,_目標,_n個収集した最後) :- n個収集した(_n個,_射影項,_目標,_n個収集した), 最後(_n個収集した,_n個収集した最後). n個収集した(_n個,_射影項,_目標,_n個収集した) :- findnsols(_n個,_射影項,_目標,_n個収集した). 最後(_ならび,_ならびの最後) :- last(_ならび,_ならびの最後). '30回目より後ろの文字を削除したい'(_文字列,_削除する文字数,_末尾を削除された文字列) :- sub_atom(_文字列,0,_,_削除する文字数,_末尾を削除された文字列). % 以下のサイトは # 出典 :: # すいませんおねがいします。日曜までです。 # # # String型の配列として与えられた人の名前を全て使って「しりとり」を作りましょう。 # 参考資料ファイルを自分のプロジェクトにコピーもしくはインポートし、50音順で並んでいる配列をしりとりの原理で並び替え、出力するプログラムを作成してください。 # -----------Original NameList----------- # ごりら # らっぱ # りんご # -----------Sorted NameList----------- # りんご # ごりら # らっぱ # # 単語は適当に自分がうめるのでプログラミングそのものだけつくってもらえませんか? # # # 語彙集(ごりら). 語彙集(らっぱ). 語彙集(りんご). 語彙集(もも). 語彙集(もり). 語彙集(こくご). 語彙集(らっこ). しりとり(_任意の語彙,_最長のしりとり) :- findall(_しりとり,しりとり([_任意の語彙],_任意の語彙,_しりとり),_しりとりならび), 最長のしりとりを得る(_しりとりならび,_最長のしりとり). しりとり(_すでに使った語彙ならび,_語彙,_しりとり) :- 次の語彙を捜ししりとりを続ける(_すでに使った語彙ならび,_語彙,_しりとり). しりとり(_逆順しりとり,_語彙,_しりとり) :- 逆順しりとりを正順に戻して停止(_逆順しりとり,_しりとり). 次の語彙を捜ししりとりを続ける(_すでに使った語彙ならび,_語彙,_しりとり) :- 次の語彙(_すでに使った語彙ならび,_語彙,_次の語彙), しりとり([_次の語彙|_すでに使った語彙ならび],_次の語彙,_しりとり). 次の語彙(_すでに使った語彙ならび,_語彙,_次の語彙) :- '語彙の末尾の文字と一致する語彙を語彙集の中から捜す'(_語彙,_次の語彙), 次の語彙はすでに使った語彙ではない(_次の語彙,_すでに使った語彙ならび). '語彙の末尾の文字と一致する語彙を語彙集の中から捜す'(_語彙,_次の語彙) :- sub_atom(_語彙,_,1,0,_語彙の最後の文字), 語彙集(_次の語彙), sub_atom(_次の語彙,0,1,_,_語彙の最後の文字). 次の語彙はすでに使った語彙ではない(_次の語彙,_すでに使った語彙ならび) :- \+(member(_次の語彙,_すでに使った語彙ならび)). 逆順しりとりを正順に戻して停止(_逆順しりとり,_しりとり) :- reverse(_逆順しりとり,_しりとり). 最長のしりとりを得る(_しりとりならび,_最長のしりとり) :- しりとりならびの最大要素数を得る(_しりとりならび,_最大要素数), 最大要素数のしりとりを得る(_しりとりならび,_最大要素数,_最長のしりとり). しりとりならびの最大要素数を得る(_しりとりならび,_最大要素数) :- findmax(_要素数,しりとりの要素数(_しりとりならび,_要素数),_最大要素数). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). しりとりの要素数(LL,_要素数) :- member(_しりとり,LL), length(_しりとり,_要素数). 最大要素数のしりとりを得る(LL,_最大要素数,_最長のしりとり) :- member(_最長のしりとり,LL), length(_最長のしりとり,_最大要素数). % 以下のサイトは 副文字列の性質適用(_文字列,_前文字列の性質,_適合文字列の性質,_後文字列の性質,_前文字列,_適合文字列,_後文字列) :- 適合文字列の性質適用(_文字列,_適合文字列の性質,S,R,_適合文字列), 前文字列の性質適用(_文字列,S,_前文字列の性質,_前文字列), 後文字列の性質適用(_文字列,R,_後文字列の性質,_後文字列). 適合文字列の性質適用(_文字列,_適合文字列の性質,S,R,_適合文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), call(_適合文字列の性質). 前文字列の性質適用(_文字列,S,_前文字列の性質,_前文字列) :- sub_atom(_文字列,0,S,_,_前文字列), call(_前文字列の性質). 後文字列の性質適用(_文字列,R,_後文字列の性質,_後文字列) :- sub_atom(_文字列,_,R,0,_後文字列), call(_後文字列の性質). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % ここでは以下の比較をしたい % ?- 副文字列の性質適用(abcdef,sub_atom(X,_,1,0,b),true,sub_atom(Z,0,1,_,e),X,Y,Z). X = ab, Y = cd, Z = ef; false. ?- sub_atom(abcdef,X,Y,Z), sub_atom(X,_,1,0,b), sub_atom(Z,0,1,_,e). X = ab, Y = cd, Z = ef; false. % 本当に引数に適用目標を持ち込んだ 副目標の性質適用/7 の表現が % 理解しやすい、使いやすいと言い得るであろうか? % 以下のサイトは 一文字の副文字列(_文字列,_前文字列,_一文字の副文字列,_後文字列) :- sub_atom(_文字列,S,1,R,_一文字の副文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 一文字の副文字列(_文字列,_一文字の副文字列の性質,_前文字列,_一文字の副文字列,_後文字列) :- sub_atom(_文字列,S,1,R,_一文字の副文字列), call(_一文字の副文字列の性質), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 目標である _一文字の副文字列の性質 の引数の中に、 _一文字の副文字列 を含ませる。 % 以下のサイトは '0から9までの数字に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,1,R,_適合文字列), member(_適合文字列,['0','1','2','3','4','5','6','7','8','9']), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは '0から9までの数字に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,1,R,_適合文字列), member(_適合文字列,['0','1','2','3','4','5','6','7','8','9']), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 出典:: C/C++の宿題片付けます 127代目 #413 # # 演習 # 今日は友引の火曜日である。今日からN日後までに仏滅ではない日曜日が何日あるか求めるプログラムを作成せよ。 # 六曜:先勝,友引,先負,仏滅,大安,赤口 '日付の六曜・曜日を得る'(_8桁の日付文字列,_六曜,_曜日) :- '日付から整数の年・月・日を得る'(_8桁の日付文字列,_年,_月,_日), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日を答えよ'(_年,_月,_日,_六曜,_曜日),!. '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日を答えよ'(_年,_月,_日,_六曜,_曜日) :- '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(2015,10,15,大安,木曜,_年,_月,_日,_六曜,_曜日). '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年,_月,_日,_六曜,_曜日,_年,_月,_日,_六曜,_曜日). '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- '2015年10月15日以後の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日). '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- '2015年10月15日より前の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日). '2015年10月15日以後の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- [_年_1,_月_1,_日_1] @>= [2015,10,15], '翌日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年,_月,_日,_六曜,_曜日). '2015年10月15日より前の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- [_年_1,_月_1,_日_1] @< [2015,10,15], '翌日の六曜、曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年_1,_月_1,_日_1,_六曜_1,_曜日_1), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年,_月,_日,_六曜,_曜日). '翌日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), 六曜連鎖(_六曜_1,_六曜_2), 曜日連鎖(_曜日_1,_曜日_2). '前日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2) :- 翌日(_年_2,_月_2,_日_2,_年_1,_月_1,_日_1), 六曜連鎖(_六曜_2,_六曜_1), 曜日連鎖(_曜日_2,_曜日_1). 六曜連鎖(先勝,友引). 六曜連鎖(友引,先負). 六曜連鎖(先負,仏滅). 六曜連鎖(仏滅,大安). 六曜連鎖(大安,赤口). 六曜連鎖(赤口,先勝). 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). 翌日(_年,12,31,_翌年の年,1,1) :- succ(_年,_翌年の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,30,_年,_翌日の月,1) :- member(_月,[4,6,9,11]), succ(_月,_翌日の月),!. 翌日(_年,_月,31,_年,_翌日の月,1) :- member(_月,[1,3,5,7,8,10,12]), succ(_月,_翌日の月),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). うるう年(_うるう年) :- 0 is _うるう年 mod 400,!. うるう年(_うるう年) :- 0 is _うるう年 mod 100,!,fail. うるう年(_うるう年) :- 0 is _うるう年 mod 4. '日付から整数の年・月・日を得る'(_日付,_年,_月,_日) :- 日付から整数年を得る(_日付,_年), 日付から整数月を得る(_日付,_月), 日付から整数日を得る(_日付,_日). 日付から整数年を得る(_日付,_整数年) :- sub_atom(_日付,0,4,_,_年文字列), atom_number(_年文字列,_整数月). 日付から整数月を得る(_日付,_整数月) :- sub_atom(_日付,4,2,_,_月文字列), atom_number(_月文字列,_整数月). 日付から整数日を得る(_日付,_整数日) :- sub_atom(_日付,6,2,_,_日文字列), atom_number(_日文字列,_整数日). % 以下のサイトは # 出典:: C/C++の宿題片付けます 127代目 #413 # # 演習 # 今日は友引の火曜日である。今日からN日後までに仏滅ではない日曜日が何日あるか求めるプログラムを作成せよ。 # 六曜:先勝,友引,先負,仏滅,大安,赤口 六曜連鎖(先勝,友引). 六曜連鎖(友引,先負). 六曜連鎖(先負,仏滅). 六曜連鎖(仏滅,大安). 六曜連鎖(大安,赤口). 六曜連鎖(赤口,先勝). 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). '日付の六曜・曜日を得る'(_日付,_六曜,_曜日) :- '日付から整数の年・月・日を得る'(_日付,_年,_月,_日), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日を答えよ'(_年,_月,_日,_六曜,_曜日). '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日を答えよ'(_年,_月,_日,_六曜,_曜日) :- '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(2015,10,15,大安,木曜,_年,_月,_日,_六曜,_曜日),!. '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年,_月,_日,_六曜,_曜日,_年,_月,_日,_六曜,_曜日) :- !. '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- '2015年10月15日以後の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日). '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- '2015年10月15日より前の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日). '2015年10月15日以後の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- [_年_1,_月_1,_日_1] @>= [2015,10,15], '翌日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年,_月,_日,_六曜,_曜日). '2015年10月15日より前の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- [_年_1,_月_1,_日_1] @< [2015,10,15], '翌日の六曜、曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年_1,_月_1,_日_1,_六曜_1,_曜日_1), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年,_月,_日,_六曜,_曜日). '翌日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), 六曜連鎖(_六曜_1,_六曜_2), 曜日連鎖(_曜日_1,_曜日_2). '前日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2) :- 翌日(_年_2,_月_2,_日_2,_年_1,_月_1,_日_1), 六曜連鎖(_六曜_2,_六曜_1), 曜日連鎖(_曜日_2,_曜日_1). 翌日(_年,12,31,_翌年の年,1,1) :- succ(_年,_翌年の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,30,_年,_翌日の月,1) :- member(_月,[4,6,9,11]), succ(_月,_翌日の月),!. 翌日(_年,_月,31,_年,_翌日の月,1) :- member(_月,[1,3,5,7,8,10,12]), succ(_月,_翌日の月),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). うるう年(_うるう年) :- 0 is _うるう年 mod 400,!. うるう年(_うるう年) :- 0 is _うるう年 mod 100,!,fail. うるう年(_うるう年) :- 0 is _うるう年 mod 4. '日付から整数の年・月・日を得る'(_日付,_年,_月,_日) :- 日付から整数年を得る(_日付,_年), 日付から整数月を得る(_日付,_月), 日付から整数日を得る(_日付,_日). 日付から整数年を得る(_日付,_整数年) :- sub_atom(_日付,0,4,_,_年文字列), atom_number(_年文字列,_整数月). 日付から整数月を得る(_日付,_整数月) :- sub_atom(_日付,4,2,_,_月文字列), atom_number(_月文字列,_整数月). 日付から整数日を得る(_日付,_整数日) :- sub_atom(_日付,6,2,_,_日文字列), atom_number(_日文字列,_整数日). % 以下のサイトは 非決定性の置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 非決定性の置換('',_文字列,_置換対象文字列,_置換文字列,_置換された文字列). 非決定性の置換(_既に置換された文字列,_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 新たな置換された文字列を作りだす(_既に置換された文字列,_文字列,_置換対象文字列,_置換文字列,_前文字列,_後文字列,_新たな置換された文字列), 非決定性の置換_1(_新たな置換された文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列). 新たな置換された文字列を作りだす(_既に置換された文字列,_文字列,_置換対象文字列,_置換文字列,_前文字列,_後文字列,_新たな置換された文字列) :- sub_atom(_文字列,_前文字列,_置換対象文字列,_後文字列),!, atomic_list_concat([_既に置換された文字列,_前文字列,_置換文字列],_新たな置換された文字列). 非決定性の置換_1(_新たな置換された文字列,_後文字列,_,_,_置換された文字列) :- atomic_list_concat([_新たな置換された文字列,_後文字列],_置換された文字列). 非決定性の置換_1(_新たな置換された文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 非決定性の置換(_新たな置換された文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは 性質の異なる文字に挟まれた適合文字列(_文字列,_性質,_文字,_前文字列,_適合文字列,_後文字列) :- 'ある性質を持つ適合文字列'(_文字列,_性質,_文字,S,R,_適合文字列), 直前にある性質を持つ文字がない(_文字列,S,_性質,_文字,_前文字列), 直後にある性質を持つ文字がない(_文字列,R,_性質,_文字,_後文字列). 'ある性質を持つ適合文字列'(_文字列,_性質,_文字,S,R,_適合文字列) :- '適合文字列(空文字にはならない)'(_文字列,S,_適合文字列,R), 'ある性質を持つ適合文字列'(_適合文字列,_性質,_文字). '適合文字列(空文字にはならない)'(_文字列,S,_適合文字列,R) :- sub_atom(_文字列,S,_,R,_適合文字列), \+(_適合文字列=''). 'ある性質を持つ適合文字列'(_適合文字列,_性質,_文字) :- forall(sub_atom(_適合文字列,_,1,_,_文字),_性質). 直前にある性質を持つ文字がない(_文字列,S,_性質,_文字,_前文字列) :- sub_atom(_文字列,0,S,_,_前文字列), 直前にある性質を持つ文字がない(_前文字列,_性質,_文字). 直前にある性質を持つ文字がない(_前文字列,_性質,_文字) :- \+(前文字列の最後の文字の性質(_前文字列,_文字,_性質)). 前文字列の最後の文字の性質(_前文字列,_文字,_性質) :- sub_atom(_前文字列,_,1,0,_文字), \+(_文字=''), call(_性質). 直後にある性質を持つ文字がない(_文字列,R,_性質,_文字,_後文字列) :- sub_atom(_文字列,_,R,0,_後文字列), 直後にある性質を持つ文字がない(_後文字列,_性質,_文字). 直後にある性質を持つ文字がない(_後文字列,_性質,_文字) :- \+(後文字列の最初の文字の性質(_後文字列,_文字,_性質)). 後文字列の最初の文字の性質(_後文字列,_文字,_性質) :- sub_atom(_後文字列,0,1,_,_文字), \+(_文字=''), call(_性質). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/689 # # すみません。 # 高専機械科卒なんですがお願いいたします。 # # 以下のようなテーブルにて、あかさたなでGROUP BYしてそれぞれの件数を出力できないかどうか悩んでおります。 # # CREATE TABLE `name_list` ( # kanji varchar(64), # yomi varchar(64) # ) # # INSERT INTO name_list (kanji,yomi) VALUES # ('安部','あべ'), # ('井口','いぐち'), # ('臼井','うすい'), # ('江本','えもと'), # ('小川','おがわ'), # ('柿本','かきもと'), # ('木島','きじま'), # ('九条','くじょう'), # ('毛森','けもり'), # ('小島','こじま'), # ('佐藤','さとう'), # ('しみず','')・・・・・・ # # 勿論、各頭文字で一件ずつじゃないのですが # これを # # あ行 5件 # か行 5件 # さ行 8件 # # のように集計をかけたいと思っておりますが # よい方法が思いつかず… # # 出力結果は、例でして出力した左側のフィールドはなんでもOKです。 # 右側のあかさたな行のそれぞれのレコード数がチェックできればOKです。 # # なにとぞよろしくお願いいたします。 # 名簿(安部,あべ). 名簿(井口,いぐち). 名簿(臼井,うすい). 名簿(江本,えもと). 名簿(小川,おがわ). 名簿(柿本,かきもと). 名簿(木島,きじま). 名簿(九条,くじょう). 名簿(毛森,けもり). 名簿(小島,こじま). 名簿(佐藤,さとう). 名簿(しみず,''). '各頭文字で一件ずつじゃないのですが、これを あ行 5件 か行 5件 さ行 8件 のように集計をかけたい'(_行,_件数) :- append(_,[_行|R],[あ,か,さ,な,ま,や,ら,わ,ん]), '件数(但し0件は除く)'('_行の読み範囲の中に名簿の_ひらがな読みは入っている'(_行,R),_件数). '_行の読み範囲の中に名簿の_ひらがな読みは入っている'(_行,_残りの行) :- '名簿の_ひらがな読みの一字目は行の範囲'(_行,_残りの行). '名簿の_ひらがな読みの一字目は行の範囲'(_行,[]) :- '名簿の_ひらがな読みの一字目は「ん」'. '名簿の_ひらがな読みの一字目は行の範囲'(_行,[_次の行|_]) :- '名簿の一字目は行の範囲'(_行,_次の行). '名簿の一字目は行の範囲'(_行,_次の行) :- 名簿(_,_ひらがな読み), _ひらがな読み @>= _行, _ひらがな読み @< _次の行. '名簿の_ひらがな読みの一字目は「ん」' :- 名簿(_,_ひらがな読み), sub_atom(_ひらがな読み,0,1,_,ん). '件数(但し0件は除く)'(_目標,_件数) :- findall(1,_目標,[_|L]), length([_|L],_件数). % 以下のサイトは # 出典 :: 正規表現 Part10 #311 # ●正規表現の使用環境 # 練馬、nemery等のリネームソフト # 可能なソフトに乗り換えようと思ってます # # ●検索か置換か? # 置換 # # ●説明 # 1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま #  ファイル名途中の数字はスルーさせたい # 2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい # # ●対象データ # キリン#◯☓動物園-10月1 # しろくま#△☓◯動物園-5月12 # 猫(2匹目)#我が家-11月5 # # ●希望する結果 # キリン-10月01 # しろくま-5月12 # 猫(2匹目)-11月05 # # よろしくお願いします # # '1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのままファイル名途中の数字はスルーさせたい 2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_ファイル名,_削除開始文字,_削除終了の次の文字,_置換されたファイル名) :- '1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_置換されたファイル名_1), '2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_置換されたファイル名_1,_削除開始文字,_削除終了の次の文字,_置換されたファイル名). '1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_ファイル名) :- '2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名),!. 'ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_置換されたファイル名) :- 'ファイル名末尾の数字が1桁の場合、0をつける。'(_ファイル名,_置換されたファイル名). '2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名) :- sub_atom(_ファイル名,S,2,0,_末尾文字2桁), atom_number(_末尾文字2桁,_). 'ファイル名末尾の数字が1桁の場合、0をつける。'(_ファイル名,_置換されたファイル名) :- 'ファイル名末尾の数字が1桁の場合、'(_ファイル名,S,_末尾文字1桁), '0をつける。'(_ファイル名,S,_末尾文字1桁,_置換されたファイル名). 'ファイル名末尾の数字が1桁の場合、'(_ファイル名,S,_末尾文字1桁) :- sub_atom(_ファイル名,S,1,0,_末尾文字1桁), atom_number(_末尾文字1桁,_). '0をつける。'(_ファイル名,S,_末尾文字1桁,_置換されたファイル名) :- sub_atom(_ファイル名,0,S,1,_前文字列), atomic_list_concat([_前文字列,'0',_末尾文字1桁],_置換されたファイル名). '2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_文字列,_削除開始文字,_削除終了の次の文字,_削除された文字列) :- '削除開始文字と終了の次の文字で指定された範囲を削除する'(_文字列,_削除開始文字,_削除終了の次の文字,_前文字列,_後文字列),!. '特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_文字列,_,_,_文字列). '削除開始文字と終了の次の文字で指定された範囲を削除する'(_文字列,_削除開始文字,_削除終了の次の文字,_削除された文字列) :- '削除開始文字と終了の次の文字で指定された範囲を'(_文字列,_削除開始文字,_削除終了の次の文字,_前文字列,_後文字列), 削除する(_前文字列,_後文字列,_削除された文字列). '削除開始文字と終了の次の文字で指定された範囲を'(_文字列,_削除開始文字,_削除終了の次の文字,_前文字列,_後文字列) :- sub_atom(_文字列,_前文字列,_削除される文字列,_後文字列), sub_atom(_削除される文字列,0,1,_,_削除開始文字), sub_atom(_後文字列,0,1,_,削除終了の次の文字). sub_atom(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 削除する(_前文字列,_後文字列,_削除された文字列) :- atom_concat(_前文字列,_後文字列,_削除された文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- n個収集した最後(30,_前文字列,'キャレッジ・リターンが登場'(_文字列,_前文字列),_末尾を削除された文字列),!. 'キャレッジ・リターンが登場'(_文字列,_前文字列) :- sub_atom(_文字列,S,1,R,'\r'), sub_atom(_文字列,0,_,R,_前文字列). n個収集した最後(_n個,_射影項,_目標,_n個収集した最後) :- n個収集した(_n個,_射影項,_目標,_n個収集した), 最後(_n個収集した,_n個収集した最後). n個収集した(_n個,_射影項,_目標,_n個収集した) :- findnsols(_n個,_射影項,_目標,_n個収集した). 最後(_ならび,_ならびの最後) :- last(_ならび,_ならびの最後). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- n個収集したm番目(30,30,_前文字列,'キャレッジ・リターンが登場'(_文字列,_前文字列),_末尾を削除された文字列),!. 'キャレッジ・リターンが登場'(_文字列,_前文字列) :- sub_atom(_文字列,S,1,R,'\r'), sub_atom(_文字列,0,_,R,_前文字列). n個収集したm番目(_n個,_m番目,_射影項,_目標,_n個収集したm番目) :- n個収集した(_n個,_射影項,_目標,_n個収集した), m番目(_m番目,_n個収集した,_n個収集したm番目). n個収集した(_n個,_射影項,_目標,_n個収集した) :- findnsols(_n個,_射影項,_目標,_n個収集した). m番目(_m番目,_ならび,_ならびのm番目) :- nth1(_m番目,_ならび,_ならびのm番目). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- findnsols(30,_前文字列,'キャレッジ・リターンが登場'(_文字列,_前文字列),LL), last(LL,_末尾を削除された文字列),!. 'キャレッジ・リターンが登場'(_文字列,_前文字列) :- sub_atom(_文字列,S,1,R,'\r'), sub_atom(_文字列,0,_,R,_前文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- length(_30行ならび,30), 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_文字列,_30行ならび), atomic_list_concat(_30行ならび,_末尾を削除された文字列). 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_,[]) :- !. 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_文字列,[_前文字列|R]) :- 'キャレッジ・リターンが登場'(_文字列,_前文字列,_後文字列), 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_後文字列,R). 'キャレッジ・リターンが登場'(_文字列,_前文字列,_後文字列) :- sub_atom(_文字列,S,1,R,'\r'), sub_atom(_文字列,0,_,R,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 出題場所 :: Regular Expression(正規表現) Part11 #844 # たぶんやりたいことはこうだろう。数字以外の文字が1文字でもあればエラーを出す。# # [[ "$A" =~ [^0-9] ]] && echo "not number" # 数字以外の文字が1文字でもあればエラーを出す(_文字列) :- 数字以外の文字が1文字でもあれば(_文字列), エラーを出す. 数字以外の文字が1文字でもあれば(_文字列) :- sub_atom(_文字列,_,1,_,_数字以外の文字), 数字以外の文字(_数字以外の文字),!. 数字以外の文字(_数字以外の文字) :- \+(member(_数字以外の文字,['0','1','2','3','4','5','6','7','8','9'])). エラーを出す :- write('エラー\n'). % 以下のサイトは # 出典 :: twitter_by_@yantene_20150911 # 受験番号、 # 先頭二桁が入学年度(2016年度)、 # 次の一桁が受験先学年種別(博士前期)、 # 次の一桁が試験種別(学内入試)、 # 次の一桁が受験先系(3系)、 # 最後三桁が連番、といったところかな? 'といったところかな?'. '受験番号、 先頭二桁が入学年度(2016年度)、 次の一桁が受験先学年種別(博士前期)、 次の一桁が試験種別(学内入試)、 次の一桁が受験先系(3系)、 最後三桁が連番、といったところかな?'(_受験番号,_年度,_受験先学年種別,_試験種別,_受験先系,_連番) :- '受験番号、'(_受験番号,_年度,_受験先学年種別,_試験種別,_受験先系,_連番). '受験番号、'(_受験番号,_年度,_受験先学年種別,_試験種別,_受験先系,_連番) :- 先頭二桁が入学年度(_受験番号,_年度), 次の一桁が受験先学年種別(_受験番号,_受験先学年種別), 次の一桁が試験種別(_受験番号,_試験種別), 次の一桁が受験先系(_受験番号,_受験先系), 最後三桁が連番(_受験番号,_連番), 'といったところかな?'. 先頭二桁が入学年度(_受験番号,_年度) :- 整数の西暦年を得る(_受験番号,_整数の西暦年), atom_number(_年度数字列,_整数の西暦年), atom_concat(_年度数字列,年度,_年度). 整数の西暦年を得る(_受験番号,_整数の西暦年) :- sub_atom(_受験番号,0,2,_,_年度_1), atom_number(_年度_1,_整数の西暦年の下2桁), _整数の西暦年 is _整数の西暦年の下2桁 + 2000. 次の一桁が受験先学年種別(_受験番号,_受験先学年種別) :- sub_atom(_受験番号,2,1,_,_受験先学年種別コード), 受験先学年種別コード(_受験先学年種別,_受験先学年種別コード). 受験先学年種別コード(修士過程,'1'). 受験先学年種別コード(博士過程前期,'2'). 受験先学年種別コード(博士過程後期,'3'). 次の一桁が試験種別(_受験番号,_試験種別) :- sub_atom(_受験番号,3,1,_,_試験種別コード), 試験種別コード(_試験種別,_試験種別コード). 試験種別コード(学内入試,'1'). 試験種別コード(学外入試,'2'). 次の一桁が受験先系(_受験番号,_受験先系) :- sub_atom(_受験番号,4,1,_,_受験先系コード), 受験先系コード('1系','1'). 受験先系コード('2系','2'). 受験先系コード('3系','3'). 最後の三桁が連番(_受験番号,_連番) :- sub_atom(_受験番号,5,3,_,_連番). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/726 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力した10文字以内の任意の文字列の中で、 # ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す関数 # char *cut_str(char *address1, char target_char)を定義し、 # その動作を確認するkadai7-2.cを作りなさい。 # ただし、文字列と、ある特定の文字の入力は、 # char str[10], target_char; # scanf("%s %c", str, &target_char); # で入力されるものとして、 # 答えは以下で出力されるものとする。 # printf("answer = %s\n", cut_str(str, target_char)); # # 'キーボードから入力した10文字以内の任意の文字列の中で、ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す'(_ある特定の文字が最初に現れる位置からそれ以降の部分文字列) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字), 'ある特定の文字が最初に現れる位置からそれ以降の部分文字列を返す'(_文字列,_ある特定の文字,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列). キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- 催促の後一行入力して文字列とある特定の文字を得る(_文字列,_ある特定の文字),!. キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字). 催促の後一行入力して文字列とある特定の文字を得る(_文字列,_ある特定の文字) :- 催促の後一行入力する(_入力文字列), 文字列入力診断(_入力文字列,_文字列,_ある特定の文字). 催促の後一行入力する(_入力文字列) :- write('10文字以内の任意の文字列とある特定の文字を空白区切りで入力してください : '), 一行読み込む(_入力文字列,_). 文字列入力診断(_入力文字列,_文字列,_ある特定の文字) :- 文字列とある特定の文字を切り出す(_入力文字列,_文字列,_ある特定の文字), 文字列の長さ診断(_文字列,_ある特定の文字),!. 文字列入力診断(_入力文字列,_,_) :- writef('入力された %t から適切な情報が得られません。再入力をお願いします。\n',[_入力文字列]), fail. 文字列とある特定の文字を切り出す(_入力文字列,_文字列,_ある特定の文字) :- sub_atom(_入力文字列,_文字列,_空白文字列,_ある特定の文字), 空白文字列(_空白文字列), ある特定の文字は先頭文字は空白になり得ない(_ある特定の文字). 空白文字列(_空白文字列) :- sub_atom(_空白文字列,_,1,_,' '), forall(sub_atom(_空白文字列,_,1,_,_文字),_文字 = ' '). ある特定の文字は先頭文字は空白になり得ない(_ある特定の文字) :- \+(sub_atom(_ある特定の文字,0,1,_,' ')). 文字列の長さ診断(_文字列,_ある特定の文字) :- '10文字以内の文字列と1文字のある特定の文字'(_文字列,_ある特定の文字),!. 文字列の長さ診断(_文字列,_ある特定の文字) :- atom_length(_文字列,_文字列の長さ), writef('入力された文字列 %t は%t文字あります。10文字以下の長さで再入力をお願いします\n',[_文字列,_文字列の長さ]), fail. '10文字以内の文字列と1文字のある特定の文字'(_文字列,_ある特定の文字) :- '10文字以内の文字列'(_文字列), '1文字のある特定の文字'(_ある特定の文字). '10文字以内の文字列'(_文字列) :- atom_length(_文字列,_文字列の長さ), _文字列の長さ =< 10. '1文字のある特定の文字'(_ある特定の文字) :- atom_length(_ある特定の文字,1). 'ある特定の文字が最初に現れる位置からそれ以降の部分文字列を返す'(_文字列,_ある特定の文字,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列) :- sub_atom(_文字列,S,_,_,_ある特定の文字), sub_atom(_文字列,S,_,0,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列),!. 一行読み込む(_行,_終了状態) :- 行入力(_行,_終了状態). 行入力(X,_終了状態) :- get_char(C), '行入力/3'(C,Chars,_終了状態), atom_chars(X,Chars). '行入力/3'('\n',[],改行) :- !. '行入力/3'([A],[A],end_of_file) :- at_end_of_stream(user_input),!. '行入力/3'(C,[C|R],_終了状態) :- get_char(C2), '行入力/3'(C2,R,_終了状態). % 以下のサイトは '13桁のISBNコードを検査せよ。'(_13桁のISBNコード) :- '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(_13桁のISBNコード,_12要素の数値ならび,_最終桁の数), '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_12要素の数値ならび,_加算された数), '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数). '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(_13桁のISBNコード,_12要素の数値ならび,_最終桁の数) :- 各桁を数値に変換した上で(_13桁のISBNコード,_13要素の数値ならび), '12要素の数値ならびと最終桁の数に分離し'(_13要素の数値ならび,_12要素の数値ならび,_最終桁の数). 各桁を数値に変換した上で(_13桁のISBNコード,_13要素の数値ならび) :- findall(_数値,各桁を数値に変換する(_13桁のISBNコード,_数値),_13要素の数値ならび). 各桁を数値に変換する(_13桁のISBNコード,_数値) :- sub_atom(_13桁のISBNコード,_,1,_,_数字), atom_number(_数字,_数値). '12要素の数値ならびと最終桁の数に分離し'(_13要素の数値ならび,_12要素の数値ならび,_最終桁の数) :- append(_12要素の数値ならび,[_最終桁の数],_13要素の数値ならび). '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_12要素の数値ならび,_加算された数) :- '12要素の数値ならびを逆順にして'(_12要素の数値ならび,_反転した12要素の数値ならび), '順に3,1を掛けて加算し'(_反転した12要素の数値ならび,_加算された数). '12要素の数値ならびを逆順にして'(_12要素の数値ならび,_反転した12要素の数値ならび) :- reverse(_12要素の数値ならび,_反転した12要素の数値ならび). '順に3,1を掛けて加算し'(_反転した12要素の数値ならび,_加算された数) :- findsum(S,'順に3,1を掛けて'(_反転した12要素の数値ならび,S),_加算された数). '順に3,1を掛けて'(_反転した12要素の数値ならび,S) :- 順に(_反転した12要素の数値ならび,N1,N2), '3,1を掛けて'(N1,N2,S). 順に(_反転した12要素の数値ならび,N1,N2) :- append(L0,[N1,N2|_],_反転した12要素の数値ならび), 要素数が偶数(L0). 要素数が偶数(L) :- length(L,_要素数), 0 is _要素数 mod 2. '3,1を掛けて'(N1,N2,S) :- S is N1 * 3 + N2 * 1. '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数) :- _最終桁の数 is 10 - (_加算された数 mod 10). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 出典:: 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のみを除外したい'(_文字列,_前文字列,_検索文字列,_後文字列) :- '4桁の西暦で'(_文字列,_前文字列,_検索文字列,_後文字列), '0000のみ除外したい'(_検索文字列). '4桁の西暦で'(_文字列,_前文字列,_検索文字列,_後文字列) :- 検索文字列を得る(_文字列,S,R,_検索文字列), 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_文字列,S,R,_前文字列,_検索文字列,_後文字列). 検索文字列を得る(_文字列,S,R,_検索文字列) :- sub_atom(_文字列,S,4,R,_検索文字列), 全ての文字が数字である(_検索文字列). 全ての文字が数字である(_検索文字列) :- forall(sub_atom(_検索文字列,_,1,_,_文字),数字(_文字)). 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_文字列,S,R,_前文字列,_後文字列) :- 前文字列の最後の文字は数字ではない(_文字列,S,_前文字列), 後文字列の最初の文字は数字ではない(_文字列,R,_後文字列). 前文字列の最後の文字は数字ではない(_文字列,S,_前文字列) :- 前文字列の(_文字列,S,_前文字列), 最後の文字は数字ではない(_前文字列). 前文字列の(_文字列,S,_前文字列) :- sub_atom(_文字列,0,S,_,_前文字列). 最後の文字は数字ではない(_後文字列) :- \+((sub_atom(_後文字列,_,1,0,_文字),数字(_文字))). 後文字列の最初の文字は数字ではない(_文字列,R,_後文字列) :- 後文字列の(_文字列,R,_後文字列), 最初の文字は数字ではない(_後文字列). 後文字列の(_文字列,R,_後文字列) :- sub_atom(_文字列,_,R,0,_後文字列). 最初の文字は数字ではない(_前文字列) :- \+((sub_atom(_前文字列,0,1,_,_文字),数字(_文字))). 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. '0000のみ除外したい'(_検索文字列) :- \+(sub_atom(_検索文字列,0,1,_,'0')). % 以下のサイトは # 出典 :: 正規表現 Part9 #786 # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- 'キャリッジ・リターンが30回登場したら'(_文字列,_末尾を削除された文字列). 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列_1,_文字列) :- 'キャリッジ・リターンが30回未満しかない場合そのまま文字列を解とする'(_文字列_1,_文字列). 'キャリッジ・リターンが30回登場したら'(_文字列,_末尾を削除された文字列) :- sub_atom(_文字列,0,_,_,_末尾を削除された文字列), sub_atom(_文字列,_,1,0,'\r'), 度数(sub_atom(_末尾を削除された文字列,_,1,_,'\r'),30). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 'キャリッジ・リターンが30回未満しかない場合そのまま文字列を解とする'(_文字列,_文字列) :- \+('キャリッジ・リターンが30回登場したら'(_文字列,_)). % 以下のサイトは 文字列の中である副文字列の最後の出現を検出する(_文字列,_前文字列,_ある副文字列,_後文字列) :- 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列), 最後の出現を検出する(_後文字列,_ある副文字列). 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_,_残り文字数,_ある副文字列), sub_atom(_文字列,0,_開始位置,_,_前文字列), sub_atom(_文字列,_,_残り文字数,0,_後文字列). 最後の出現を検出する(_後文字列,_ある副文字列) :- 後文字列の中にある副文字列は存在しない(_後文字列,_ある副文字列). 後文字列の中にある副文字列は存在しない(_後文字列,_ある副文字列) :- \+(sub_atom(_後文字列,_,_,_,_ある副文字列)). % 以下のサイトは 文字列の中である副文字列の最初の出現を検出する(_文字列,_前文字列,_ある副文字列,_後文字列) :- 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列), 最初の出現を検出する(_前文字列,_ある副文字列). 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_,_残り文字数,_ある副文字列), sub_atom(_文字列,0,_開始位置,_,_前文字列), sub_atom(_文字列,_,_残り文字数,0,_後文字列). 最初の出現を検出する(_前文字列,_ある副文字列) :- 前文字列の中にある副文字列は存在しない(_前文字列,_ある副文字列). 前文字列の中にある副文字列は存在しない(_前文字列,_ある副文字列) :- \+(sub_atom(_前文字列,_,_,_,_ある副文字列)). % 以下のサイトは 文字列の中である副文字列の最後の出現を検出する(_文字列,_前文字列,_ある副文字列,_後文字列) :- 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列), 最後の出現を検出する(_後文字列,_ある副文字列). 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_,_残り文字数,_ある副文字列), sub_atom(_文字列,0,_開始位置,_,_前文字列), sub_atom(_文字列,_,_残り文字数,0,_後文字列). 最後の出現を検出する(_後文字列,_ある副文字列) :- 後文字列の中にある副文字列は存在しない(_後文字列,_ある副文字列). 後文字列の中にある副文字列は存在しない(_後文字列,_ある副文字列) :- \+(sub_atom(_後文字列,_,_,_,_ある副文字列)). % 以下のサイトは 文字列の中である副文字列の最初の出現を検出する(_文字列,_前文字列,_ある副文字列,_後文字列) :- 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列), 最初の出現を検出する(_前文字列,_ある副文字列). 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_,_残り文字数,_ある副文字列), sub_atom(_文字列,0,_開始位置,_,_前文字列), sub_atom(_文字列,_,_残り文字数,0,_後文字列). 最初の出現を検出する(_前文字列,_ある副文字列) :- 前文字列の中にある副文字列は存在しない(_前文字列,_ある副文字列). 前文字列の中にある副文字列は存在しない(_前文字列,_ある副文字列) :- \+(sub_atom(_前文字列,_,_,_,_ある副文字列)). % 以下のサイトは 文字列の中である文字の最初の出現を検出する(_文字列,_前文字列,_ある文字,_後文字列) :- 文字列の中である文字の(_文字列,_前文字列,_ある文字,_後文字列), 最初の出現を検出する(_ある文字,_前文字列). 文字列の中である文字の(_文字列,_前文字列,_ある文字,_後文字列) :- sub_atom(_文字列,_開始位置,1,_残り文字数,_ある文字), sub_atom(_文字列,0,_開始位置,_,_前文字列), sub_atom(_文字列,_,_残り文字数,0,_後文字列). 最初の出現を検出する(_ある文字,_前文字列) :- 前文字列の中にある文字は存在しない(_ある文字,_前文字列). 前文字列の中にある文字は存在しない(_ある文字,_前文字列) :- ある文字は存在しない(_前文字列,_ある文字). ある文字は存在しない(_前文字列,_ある文字) :- \+(sub_atom(_前文字列,_,1,_,_ある文字)). % 以下のサイトは 文字列の中である文字の最初の出現を検出する(_文字列,_前文字列,_ある文字,_後文字列) :- 文字列の中である文字の(_文字列,_開始位置,_ある文字,_残り文字数), 最初の出現を検出する(_文字列,_ある文字,_開始文字数,_前文字列), 後文字列(_文字列,_残り文字数,_後文字列). 文字列の中である文字の(_文字列,_開始位置,_ある文字,_残り文字数) :- sub_atom(_文字列,_開始位置,1,_残り文字数,_ある文字). 最初の出現を検出する(_文字列,_ある文字,_開始位置,_前文字列) :- 前文字列の中にある文字は存在しない(_文字列,_ある文字,_開始位置,_前文字列). 前文字列の中にある文字は存在しない(_文字列,_ある文字,_開始位置,_前文字列) :- 前文字列(_文字列,_開始位置,_前文字列), ある文字は存在しない(_前文字列,_ある文字). ある文字は存在しない(_前文字列,_ある文字) :- \+(sub_atom(_前文字列,_,1,_,_ある文字)). 前文字列(_文字列,_開始位置,_前文字列) :- sub_atom(_文字列,0,_開始位置,_,_前文字列). 後文字列(_文字列,_残り文字数,_後文字列) :- sub_atom(_文字列,_,_残り文字数,0,_後文字列). % 以下のサイトは 文字列の中である文字の最後の出現を検出する(_文字列,_前文字列,_ある文字,_後文字列) :- 文字列の中である文字の(_文字列,_前文字列,_ある文字,_後文字列), 最後の出現を検出する(_ある文字,_後文字列). 文字列の中である文字の(_文字列,_前文字列,_ある文字,_後文字列) :- sub_atom(_文字列,_開始位置,1,_残り文字数,_ある文字), sub_atom(_文字列,0,_開始位置,_,_前文字列), sub_atom(_文字列,_,_残り文字数,0,_後文字列). 最後の出現を検出する(_ある文字,_後文字列) :- 後文字列の中にある文字は存在しない(_ある文字,_後文字列). 後文字列の中にある文字は存在しない(_ある文字,_後文字列) :- ある文字は存在しない(_後文字列,_ある文字). ある文字は存在しない(_後文字列,_ある文字) :- \+(sub_atom(_後文字列,_,1,_,_ある文字)). % 以下のサイトは 文字列の中である文字の最後の出現を検出する(_文字列,_前文字列,_ある文字,_後文字列) :- 文字列の中である文字の(_文字列,_開始位置,_ある文字,_残り文字数), 最後の出現を検出する(_文字列,_ある文字,_残り文字数,_後文字列), 前文字列(_文字列,_開始位置,_前文字列). 文字列の中である文字の(_文字列,_開始位置,_ある文字,_残り文字数) :- sub_atom(_文字列,_開始位置,1,_残り文字数,_ある文字). 最後の出現を検出する(_文字列,_ある文字,_残り文字数,_後文字列) :- 後文字列の中にある文字は存在しない(_文字列,_ある文字,_残り文字数,_後文字列). 後文字列の中にある文字は存在しない(_文字列,_ある文字,_残り文字数,_後文字列) :- 後文字列(_文字列,_残り文字数,_後文字列), ある文字は存在しない(_後文字列,_ある文字). ある文字は存在しない(_後文字列,_ある文字) :- \+(sub_atom(_後文字列,_,1,_,_ある文字)). 後文字列(_文字列,_残り文字数,_後文字列) :- sub_atom(_文字列,_,_残り文字数,0,_後文字列). 前文字列(_文字列,_開始位置,_前文字列) :- sub_atom(_文字列,0,_開始位置,_,_前文字列). % 以下のサイトは 最長しりとりならび(_語彙ならび,_最長しりとりならび) :- 全しりとりならびを得てその中から最長しりとりを得る(_語彙ならび,_最長しりとりならび). 全しりとりならびを得てその中から最長しりとりを得る(_語彙ならび,_最長しりとりならび) :- 全しりとりならびを得て(_語彙ならび,_全しりとりならび), その中から最長しりとりならびを得る(_全しりとりならび,_最長しりとりならび). 全しりとりならびを得て(_語彙ならび,_全しりとりならび) :- findall(_しりとりならび,( select(_語彙,_語彙ならび,_残り語彙ならび), しりとり(_語彙,_残り語彙ならび,_しりとりならび)),_全しりとりならび). その中から最長しりとりならびを得る(_全しりとりならび,_最長しりとりならび) :- 最長しりとり要素数を得る(_全しりとりならび,_最長しりとり要素数), 最長しりとりならびは(_最長しりとり要素数,_全しりとりならび,_最長しりとりならび). 最長しりとり要素数を得る(_全しりとりならび,_最長しりとり要素数) :- findmax(_要素数,( member(_しりとりならび,_全しりとりならび), length(_しりとりならび,_要素数)),_最長しりとり要素数). 最長しりとりならびは(_最長しりとり要素数,_全しりとりならび,_最長しりとりならび) :- member(_最長しりとりならび,_全しりとりならび), length(_最長しりとりならび,_最長しりとり要素数). しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびになければしりとりを終了する(_前の語彙,_語彙ならび,_しりとりならび). しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,_しりとりならび). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびになければしりとりを終了する(_前の語彙,_語彙ならび,[_前の語彙]) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙が語彙ならびになければ(_語彙の先頭文字,_語彙ならび). 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字) :- sub_atom(_前の語彙,_,1,0,_語彙の先頭文字). 語彙が語彙ならびになければ(_語彙の先頭文字,_語彙ならび) :- forall(select(_語彙,_語彙ならび,_),\+(sub_atom(_語彙,0,1,_,_語彙の先頭文字))). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,[_前の語彙|R]) :- 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび), しりとり(_語彙,_残り語彙ならび,R). 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび). 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび) :- select(_語彙,_語彙ならび,_残り語彙ならび), sub_atom(_語彙,0,1,_,_語彙の先頭文字). findmax(A,B,Max) :- findall(A,B,L), max_list(L,Max). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #111 # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '文字列から"CGUU"をギャップ("-")を含んでいても検出する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_前文字列,_適合文字列,_後文字列), '"CGUU"をギャップ("-")を含んでいても検出する'(_適合文字列). '"CGUU"をギャップ("-")を含んでいても検出する'(_適合文字列) :- 'ギャップ("-")を取り除くとCGUUという文字列になる'(_適合文字列). 'ギャップ("-")を取り除くとCGUUという文字列になる'(_適合文字列) :- findall(_ギャップではない文字, 'ギャップ("-")ではない文字'(_適合文字列,_ギャップではない文字),_ギャップではない文字ならび), atomic_list_concat(_ギャップではない文字ならび,'CGUU'). 'ギャップ("-")ではない文字'(_適合文字列,_ギャップではない文字) :- sub_atom(_適合文字列,_,1,_,_ギャップではない文字), \+(_ギャップではない文字 = '-'). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは 末尾までの空白列を取り除いた文字列(_文字列,_末尾までの空白列を取り除いた文字列) :- sub_atom(_文字列,0,_,R,_末尾までの空白列を取り除いた文字列), \+(sub_atom(_末尾までの空白列を取り除いた文字列,_,1,0,' ')), 末尾までの空白列(_文字列,R,_末尾までの空白列). 末尾までの空白列(_文字列,R,_末尾までの空白列) :- 末尾までの(_文字列,R,_末尾までの空白列), 空白列(_末尾までの空白列). 末尾までの(_文字列,R,_末尾までの空白列) :- sub_atom(_文字列,_,R,0,_末尾までの空白列). 空白列(_末尾までの空白列) :- forall(sub_atom(_末尾までの空白列,_,1,_,_文字),_文字 = ' '). % 以下のサイトは 排他的区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列) :- 排他的区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_). 排他的区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_排他的区間文字列) :- 区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_排他的区間文字列), 排他的区間文字列には区間先頭文字列も区間末尾文字列も含まれることはない(_排他的区間文字列,_区間先頭文字列,_区間末尾文字列). 区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_排他的区間文字列) :- '前文字列・区間文字列・後文字列'(_文字列,_前文字列,_区間文字列,_後文字列), 排他的区間文字列を切り取る(_区間文字列,_区間先頭文字列,_区間末尾文字列,_排他的区間文字列). '前文字列・区間文字列・後文字列'(_文字列,_前文字列,_区間文字列,_後文字列) :- sub_atom(_文字列,_前文字列文字数,_,_後文字列文字数,_区間文字列), sub_atom(_文字列,0,_前文字列文字数,_,_前文字列), sub_atom(_文字列,_,_後文字列文字数,0,_後文字列). 排他的区間文字列を切り取る(_区間文字列,_区間先頭文字列,_区間末尾文字列,_排他的区間文字列) :- sub_atom(_区間文字列,0,_区間先頭文字列文字数,_,_区間先頭文字列), sub_atom(_区間文字列,_,_区間末尾文字列文字数,0,_区間末尾文字列), sub_atom(_区間文字列,_区間先頭文字列文字数,_,_区間末尾文字列文字数,_排他的区間文字列). 排他的区間文字列には区間先頭文字列も区間末尾文字列も含まれることはない(_排他的区間文字列,_区間先頭文字列,_区間末尾文字列) :- \+('区間先頭文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間先頭文字列)), \+('区間末尾文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間末尾文字列)). '区間先頭文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間先頭文字列) :- sub_atom(_排他的区間文字列,_,_文字数,_,_区間先頭文字列), _文字数 > 0. '区間末尾文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間末尾文字列) :- sub_atom(_排他的区間文字列,_,_文字数,_,_区間末尾文字列), _文字数 > 0. % 以下のサイトは % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り記号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_先頭からの変位,_,_後方からの変位,_適合文字列), sub_atom(_文字列,0,_先頭からの変位,_,_前文字列), sub_atom(_文字列,_,_後方からの変位,0,_後文字列). % 以下のサイトは 排他的区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列) :- 排他的区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_). 排他的区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_排他的区間文字列) :- 区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_排他的区間文字列), 排他的区間文字列には区間先頭文字列も区間末尾文字列も含まれることはない(_排他的区間文字列,_区間先頭文字列,_区間末尾文字列). 区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_排他的区間文字列) :- '前文字列・区間文字列・後文字列'(_文字列,_前文字列,_区間文字列,_後文字列), 排他的区間文字列を切り取る(_区間文字列,_区間先頭文字列,_区間末尾文字列,_排他的区間文字列). '前文字列・区間文字列・後文字列'(_文字列,_前文字列,_区間文字列,_後文字列) :- sub_atom(_文字列,_前文字列文字数,_,_後文字列文字数,_区間文字列), sub_atom(_文字列,0,_前文字列文字数,_,_前文字列), sub_atom(_文字列,_,_後文字列文字数,0,_後文字列). 排他的区間文字列を切り取る(_区間文字列,_区間先頭文字列,_区間末尾文字列,_排他的区間文字列) :- sub_atom(_区間文字列,0,_区間先頭文字列文字数,_,_区間先頭文字列), sub_atom(_区間文字列,_,_区間末尾文字列文字数,0,_区間末尾文字列), sub_atom(_区間文字列,_区間先頭文字列文字数,_,_区間末尾文字列文字数,_排他的区間文字列). 排他的区間文字列には区間先頭文字列も区間末尾文字列も含まれることはない(_排他的区間文字列,_区間先頭文字列,_区間末尾文字列) :- \+('区間先頭文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間先頭文字列)), \+('区間末尾文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間末尾文字列)). '区間先頭文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間先頭文字列) :- sub_atom(_排他的区間文字列,_,_文字数,_,_区間先頭文字列), _文字数 > 0. '区間末尾文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間末尾文字列) :- sub_atom(_排他的区間文字列,_,_文字数,_,_区間末尾文字列), _文字数 > 0. % 以下のサイトは 数字に一致する(_文字列,_前文字列,_一致文字列,_後文字列,_数値) :- sub_atom(_文字列,_前文字列,_一致文字列,_後文字列), freeze(_文字列,catch(atom_number(_一致文字列,_数値),E,fail)). 偶数に一致する(_文字列,_前文字列,_一致文字列,_後文字列,_数値) :- 数字に一致する(_文字列,_前文字列,_一致文字列,_後文字列,_数値), 0 is _数値 mod 2. 奇数に一致する(_文字列,_前文字列,_一致文字列,_後文字列,_数値) :- 数字に一致する(_文字列,_前文字列,_一致文字列,_後文字列,_数値), 1 is _数値 mod 2. sub_atom(_文字列,_前文字列,_一致文字列,_後文字列) :- freeze(_文字列,sub_atom(_文字列,S,_,R,_一致文字列)), freeze(_文字列,sub_atom(_文字列,0,S,_,_前文字列)), freeze(_文字列,sub_atom(_文字列,_,R,0,_後文字列)). % 以下のサイトは 検索した用語の医療用語である確信度(_文字列,_検索した用語,_変位,_文字数,_医療用語,_医療用語文字数,_確信度) :- 最も長い医療用語(_最も長い医療用語文字数), 検索した用語(_文字列,_最も長い医療用語文字数,_変位,_文字数,_検索した用語), 検索した用語は医療用語でありその確信度は(_検索した用語,_文字数,_医療用語,_医療用語文字数,_確信度). 最も長い医療用語文字数(_最も長い医療用語文字数) :- findmax(_文字数,( 医療用語集(_医療用語), sub_atom(_医療用語,0,_文字数,0,_医療用語)),_最も長い医療用語文字数). 検索した用語(_文字列,_最も長い医療用語文字数,_変位,_文字数,_検索した用語) :- sub_atom(_文字列,_変位,_文字数,_,_検索した用語), between(1,_最も長い医療用語文字数,_文字数). 検索した用語は医療用語の一部を構成する(_検索した用語,_文字数,_医療用語,_医療用語文字数) :- 医療用語集(_医療用語), sub_atom(_医療用語,0,_医療用語の文字数,0,_医療用語), sub_atom(_医療用語,_,_文字数,_,_検索した用語). 検索した用語は医療用語でありその確信度は(_検索した用語,_文字数,_医療用語,_医療用語文字数,_確信度) :- 検索した用語は医療用語の一部を構成する(_検索した用語,_文字数,_医療用語,_医療用語文字数), _確信度 is _文字数 / _医療用語の文字数. % 以下のサイトは # 出典 :: わかりやすい Javaによる医療言語処理入門 p62-65 # # n-gram :: 文字列から文字の出現確率を求める。 # 'n-gram'(_文字列,_文字,_出現確率) :- 文字の出現頻度の総数を求める(_文字列,_文字の出現頻度の総数), 文字の出現頻度(_文字列,_文字,_文字の出現頻度), _出現確率 is _文字の出現頻度 / _文字の出現頻度の総数. 文字の出現頻度の総数を求める(_文字列,_文字の出現頻度の総数) :- sub_atom(_文字列,_,_文字の出現頻度の総数,_,_文字列). 文字の出現頻度(_文字列,_文字,_文字の出現頻度) :- 重複なく文字を取り出す(文字列,_文字), 頻度(文字を取り出す(_文字列,_文字),_文字の出現頻度). 重複なく文字を取り出す(_文字列,_文字) :- 文字の集合(_文字列,_文字の集合), member(_文字,_文字の集合). 文字の集合(_文字列,_文字の集合) :- setof(C,(A,B,C) ^ sub_atom(_文字列,A,1,B,C),_文字の集合). 文字を取り出す(_文字列,_文字) :- sub_atom(_文字列,_,1,_,_文字). 頻度(P,_頻度) :- findall(1,P,L), length(L,_頻度). % 以下のサイトは # 出典 :: わかりやすい Javaによる医療言語処理入門 p90 # # 2つの文字列の先頭から一致する文字数を返す。 # '2つの文字列の先頭から一致する文字数を返す'(_文字列_1,_文字列_2,_2つの文字列の先頭から一致する文字数) :- '2つの文字列の先頭から一致する文字数の最大値を返す'(_文字列_1,_文字列_2,_2つの文字列の先頭から一致する文字数). '2つの文字列の先頭から一致する文字数の最大値を返す'(_文字列_1,_文字列_2,_2つの文字列の先頭から一致する最大文字数) :- findall(文字数,'2つの文字列の先頭から一致する文字数'(_文字列_1,_文字列_2,_文字数),_文字数ならび), max_list(_文字数ならび,_2つの文字列の先頭から一致する最大文字数). '2つの文字列の先頭から一致する文字数'(_文字列_1,_文字列_2,_文字数) :- sub_atom(_文字列_1,0,_文字数,_,_副文字列), sub_atom(_文字列_2,0,_文字数,_,_副文字列). % 以下のサイトは # 出典 :: わかりやすい Javaによる医療言語処理入門 p60-61 # 文字列から二文字の出現頻度を求める。 # 二文字の出現頻度(_文字列,_二文字,_二文字の出現頻度) :- 重複なく二文字を取り出す(文字列,_二文字), 頻度(二文字を取り出す(_文字列,_二文字),_二文字の出現頻度). 重複なく二文字を取り出す(_文字列,_二文字) :- 二文字の集合(_文字列,_二文字の集合), member(_二文字,_二文字の集合). 二文字の集合(_文字列,_二文字の集合) :- setof(C_2,(A,B,C_2) ^ sub_atom(_文字列,A,2,B,C_2),_二文字の集合). 二文字を取り出す(_文字列,_二文字) :- sub_atom(_文字列,_,2,_,_二文字). 頻度(P,_頻度) :- findall(1,P,L), length(L,_頻度). % 以下のサイトは 縦書文書を横書文書に変形する(_縦書文書,_横書文書) :- 縦書文書を横書行ならびに変形する(_縦書文書,_横書き行ならび), atomic_list_concat(_横書行ならび,'\n',_縦書文書). 縦書文書を横書行ならびに変形する(_縦書文書,_横書き行ならび) :- 改行を区切りに行ならびに変形する(_縦書文書,_縦書行ならび), 縦書行ならびを横書行ならびに変形する(_縦書行ならび,_横書き行ならび). 縦書行ならびを横書行ならびに変形する(_縦書行ならび,_横書き行ならび) :- 縦書行ならびを反転した行文字ならびに変換(_縦書行ならび,_反転した行文字ならび), 転置(_反転した行文字ならび,_転置した行文字ならび), 転置した行文字ならびを横書き行ならびに変換(_転置した行文字ならび,_横書き行ならび). 縦書行ならびを反転した行文字ならびに変換(_縦書行ならび,_反転した行文字ならび) :- findall(_反転した文字ならび,( member(_行文字列,_縦書行ならび), 文字列を反転した文字ならびに変換(_行文字列,_反転した文字ならび)),_反転した行文字ならび). 文字列を反転した文字ならびに変換(_文字列,_反転した文字ならび) :- 文字列を反転した文字ならびに変換(_文字列,[],_反転した文字ならび). 文字列を反転した文字ならびに変換('',_反転した文字ならび,_反転した文字ならび) :- !. 文字列を反転した文字ならびに変換(_文字列,L1,_反転した文字ならび) :- 先頭文字と残り文字列(_文字列,_先頭文字,_残り文字列), 文字列を反転した文字ならびに変換(_残り文字列,[_先頭文字|L1],_反転した文字ならび). 先頭文字と残り文字列(_文字列,_先頭文字,_残り文字列) :- sub_atom(_文字列,0,1,_末尾からの変位,_先頭文字), sub_atom(_文字列,_,_末尾からの変位,0,_残り文字列). 改行を区切りに行ならびに変形する(_縦書文書,[_前文字列|R]) :- 改行を区切りに(_縦書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_縦書文書,_前文字列,_後文字列) :- sub_atom(_縦書文書,_先頭からの変位,1,_末尾からの変位,'\n'), sub_atom(_縦書文書,0,_先頭からの変位,_,_前文字列), sub_atom(_縦書文書,_,_末尾からの変位,0,_後文字列),!. 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置した行文字ならびを横書き行ならびに変換(_転置した行文字ならび,_横書き行ならび) :- findall(_行文字列,( 空白行を取り除きながら行文字ならびを行文字列に変換する(_転置した行文字ならび,_行文字列)),_横書き行ならび). 空白行を取り除きながら行文字ならびを行文字列に変換する(_転置した行文字ならび,_行文字列) :- member(_行文字ならび,_転置した行文字ならび), 空白行ではない(_行文字ならび), atom_chars(_行文字列,_行文字ならび). 空白行ではない(_行文字ならび) :- \+(空白行(_行文字ならび)). 空白行(_行文字ならび) :- forall(member(_文字,_行文字ならび),_文字 = ' '). % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,0,_縦書文書). 横書文書を縦書文書に変形する(_横書文書,_列間隔文字数,_縦書文書) :- 改行を区切りに行ならびに変形する(_横書文書,_行ならび), 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書). 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書) :- 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび), 行ならびを転置する(_矩形ならび,_転置した矩形ならび), 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書). 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書) :- 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび), 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 改行を区切りに行ならびに変形する(_横書文書,[_前文字列|R]) :- 改行を区切りに(_横書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_横書文書,_前文字列,_後文字列) :- sub_atom(_横書文書,S,1,R,'\n'), sub_atom(_横書文書,0,S,_,_前文字列), sub_atom(_横書文書,_,R,0,_後文字列),!. 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび) :- 最大文字列長を調べ(_行ならび,_最大文字列長), その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび). 最大文字列長を調べ(_行ならび,_最大文字列長) :- findmax(_文字数,( member(_行,_行ならび), atom_length(_行,_文字数)),_最大文字列長). その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび) :- findall(_空白を付加した文字列,( member(_行,_行ならび), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列)),_矩形ならび). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列) :- atom_length(_行,_文字列長), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列) :- 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列), atom_concat(_行,_空白文字列,_空白を付加した文字列). 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列) :- _nth1 is _最大文字列長 - _文字列長, findall(' ',( between(1,_nth1,_)),_空白文字ならび), 文字ならびを文字列に変換する(_空白文字列,_空白文字ならび). 行ならびを転置する(_矩形ならび,_転置された矩形ならび) :- 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび), 転置(_矩形文字ならび,_転置された矩形文字ならび), 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび). 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび) :- findall(_文字ならび,( member(_行,_矩形ならび), 文字列を文字ならびに変換する(_行,_文字ならび)),_矩形文字ならび). 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび) :- findall(_文字列,( member(_文字ならび,_転置された矩形文字ならび), 文字ならびを文字列に変換する(_文字列,_文字ならび)),_転置された矩形ならび). 転置した矩形ならびの各行文字列を反転する(_転置した矩形ならび,_反転した行文字列) :- member(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列). 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび) :- findall(_反転した行文字列,( member(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列)),_要素が反転した転置した矩形ならび). 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 列間隔文字を挟んで縦書文書に変形する(_矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで(_矩形ならび,_列間隔文字数,_矩形ならび_1), 縦書文書に変形する(_矩形ならび_1,_縦書文書). 列間隔文字を挟んで(_矩形ならび_1,_列間隔文字数,_矩形ならび_2) :- 列間隔文字(_列間隔文字数,_列間隔文字), findall(_行,( 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行)),_矩形ならび_2). 列間隔文字(_列間隔文字数,_列間隔文字) :- findall(' ',( between(1,_列間隔文字数,_)),_列間隔文字ならび), atomic_list_concat(_列間隔文字ならび,_列間隔文字). 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行) :- member(_行_1,_矩形ならび_1), 文字列を文字ならびに変換する(_行_1,_文字ならび), atomic_list_concat(_文字ならび,_列間隔文字,_行). 縦書文書に変形する(_矩形ならび_1,_縦書文書) :- atomic_list_concat(_矩形ならび_1,'\n',_縦書文書). 文字列の反転(_文字列,_反転した文字列) :- 文字列を文字ならびに変換する(_文字列,_文字ならび), 文字ならびを反転する(_文字ならび,_反転した文字ならび), 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 文字ならびを反転する(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび) :- atom_chars(_反転した文字列,_反転した文字ならび). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). findmax(A,P,_最大値) :- findall(A,P,L), max_list(L,_最大値). % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # :- op(700,xfx,は). 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,0,_縦書文書). 横書文書を縦書文書に変形する(_横書文書,_列間隔文字数,_縦書文書) :- 改行を区切りに行ならびに変形する(_横書文書,_行ならび), 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書). 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書) :- 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび), 行ならびを転置する(_矩形ならび,_転置した矩形ならび), 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書). 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書) :- 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび), 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 改行を区切りに行ならびに変形する(_横書文書,[_前文字列|R]) :- 改行を区切りに(_横書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_横書文書,_前文字列,_後文字列) :- 副文字列(_横書文書,_先頭からの変位,1,_末尾からの変位,'\n'), 副文字列(_横書文書,0,_先頭からの変位,_,_前文字列), 副文字列(_横書文書,_,_末尾からの変位,0,_後文字列),!. 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび) :- 最大文字列長を調べ(_行ならび,_最大文字列長), その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび). 最大文字列長を調べ(_行ならび,_最大文字列長) :- 解の最大値(_文字数,( 行ならびから行を取り出す(_行,_行ならび), 文字列長(_行,_文字数)),_最大文字列長). その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび) :- 解を集める(_空白を付加した文字列,( 行ならびから行を取り出す(_行,_行ならび), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列)),_矩形ならび). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列) :- 文字列長(_行,_文字列長), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列) :- 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列), 二つの文字列を結合する(_行,_空白文字列,_空白を付加した文字列). 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列) :- _最大文字列長と文字列長の差 は _最大文字列長 - _文字列長, 解を集める(' ',( 整数を順に生成する(1,_最大文字列長と文字列長の差,_)),_空白文字ならび), 文字ならびを文字列に変換する(_空白文字列,_空白文字ならび). 行ならびを転置する(_矩形ならび,_転置された矩形ならび) :- 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび), 転置(_矩形文字ならび,_転置された矩形文字ならび), 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび). 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび) :- 解を集める(_文字ならび,( 矩形ならびから行を取り出す(_行,_矩形ならび), 文字列を文字ならびに変換する(_行,_文字ならび)),_矩形文字ならび). 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび) :- 解を集める(_文字列,( 矩形文字ならびから文字ならびを取り出す(_文字ならび,_転置された矩形文字ならび), 文字ならびを文字列に変換する(_文字列,_文字ならび)),_転置された矩形ならび). 転置した矩形ならびの各行文字列を反転する(_転置した矩形ならび,_反転した行文字列) :- 要素の取り出し(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列). 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび) :- 解を集める(_反転した行文字列,( 矩形ならびから行を取り出す(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列)),_要素が反転した転置した矩形ならび). 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 列間隔文字を挟んで縦書文書に変形する(_矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで(_矩形ならび,_列間隔文字数,_矩形ならび_1), 縦書文書に変形する(_矩形ならび_1,_縦書文書). 列間隔文字を挟んで(_矩形ならび_1,_列間隔文字数,_矩形ならび_2) :- 列間隔文字(_列間隔文字数,_列間隔文字), 解を集める(_行,( 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行)),_矩形ならび_2). 列間隔文字(_列間隔文字数,_列間隔文字) :- 解を集める(' ',( 整数を順に生成する(1,_列間隔文字数,_)),_列間隔文字ならび), 文字列を結合する(_列間隔文字ならび,_列間隔文字). 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行) :- 矩形ならびから行を取り出す(_行_1,_矩形ならび_1), 文字列を文字ならびに変換する(_行_1,_文字ならび), 文字列を結合する(_文字ならび,_列間隔文字,_行). 縦書文書に変形する(_矩形ならび_1,_縦書文書) :- 文字列を結合する(_矩形ならび_1,'\n',_縦書文書). 文字列の反転(_文字列,_反転した文字列) :- 文字列を文字ならびに変換する(_文字列,_文字ならび), 文字ならびを反転する(_文字ならび,_反転した文字ならび), 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 副文字列(_文字列,_開始位置,_長さ,_残り文字数,_副文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り文字数,_副文字列). 矩形ならびから行を取り出す(_行,_矩形ならび) :- member(_行,_矩形ならび). 矩形文字ならびから文字ならびを取り出す(_文字ならび,_転置された矩形文字ならび) :- member(_文字ならび,_転置された矩形文字ならび). 行ならびから行を取り出す(_行,_行ならび) :- member(_行,_行ならび). 二つの文字列を結合する(_文字列_1,_文字列_2,_結合した文字列) :- atom_concat(_文字列_1,_文字列_2,_結合した文字列). 文字列を結合する(_文字列ならび,_挿入文字,_結合した文字列) :- atomic_list_concat(_文字列ならび,_挿入文字,_結合した文字列). 文字列を結合する(_文字列ならび,_結合した文字列) :- atomic_list_concat(_文字列ならび,_結合した文字列). 文字列を文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 文字ならびを反転する(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび) :- atom_chars(_反転した文字列,_反転した文字ならび). 文字列長(_文字列,_文字列長) :- atom_length(_文字列,_文字列長). 整数を順に生成する(1,_列間隔文字数,_) :- between(1,_列間隔文字数,_). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 解を集める(_候補項,_目標,_解ならび) :- findall(_候補項,_目標,_解ならび). 解の最大値(_候補項,_目標,_解の最大値) :- findall(_候補項,_目標,_解ならび), 最大値(_解ならび,_解の最大値). 最大値(_ならび,_最大値) :- select(_最大値,_ならび,_残りならび), forall(member(_値,_残りならび),_最大値 @>= _値). 解の最小値(_候補項,_目標,_解の最小値) :- findall(_候補項,_目標,_解ならび), 最小値(_解ならび,_解の最小値). 最小値(_ならび,_最小値) :- select(_最小値,_ならび,_残りならび), forall(member(_値,_残りならび),_最小値 @=< _値). _値 は _式 :- _値 is _式. % 以下のサイトは 'PGMファイルの読み取り'(_入力ファイル) :- abolish(画像構造/2), raw_read_pgm(_入力ファイル). raw_read_pgm(_入力ファイル,_画像構造ならび) :- headerを読み取る(_入力ファイル,_headerの文字数), 画像データの読み込み(_入力ファイル,_headerの文字数,_画像データ), assertz(画像構造(画像データ,_画像データ)). headerを読み取る(_入力ファイル,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- open(_入力ファイル,read,Input), '型・矩形サイズ・色の深さを得る'(Input,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数), close(Input). '型・矩形サイズ・色の深さを得る'(Input,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- get_line(Input,Line), '型・矩形サイズ・色の深さを得る'(Input,Line,[],0,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数), '型・矩形サイズ・色の深さを定義する'(_型,_矩形サイズ,_色の深さ). '型・矩形サイズ・色の深さを得る'(Input,Line,[_色の深さ,_矩形サイズ,_型],_ヘッダの文字数,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- !. '型・矩形サイズ・色の深さを得る'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- 'コメント行は無視して、_ヘッダの文字数だけ更新'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数),!. '型・矩形サイズ・色の深さを得る'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- '型・矩形サイズ・色の深さを埋めていく'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). 'コメント行は無視して、_ヘッダの文字数だけ更新'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- sub_atom(Line,0,1,_,'#'), '改行を含むコメント行の文字数を求めて_ヘッダ文字数を更新する'(Line,_ヘッダ文字数_1,_ヘッダ文字数_2), get_line(Input,Line2), '型・矩形サイズ・色の深さを得る'(Input,Line2,L1,_ヘッダの文字数_2,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). '改行を含むコメント行の文字数を求めて_ヘッダ文字数を更新する'(Line,_ヘッダ文字数_1,_ヘッダ文字数_2) :- atom_length(Line,Length), _ヘッダの文字数_2 is _ヘッダの文字数 + Length + 1. '型・矩形サイズ・色の深さを埋めていく'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- get_line(Input,Line2), atom_length(Line,Length), _ヘッダの文字数_2 is _ヘッダの文字数_1 + Length + 1, '型・矩形サイズ・色の深さを得る'(Input,Line2,_ヘッダの文字数_2,[Line|L1],_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). '型・矩形サイズ・色の深さを定義する'(_型,_矩形サイズ,_色の深さ) :- assertz(画像構造(型,_型)), assertz(画像構造(矩形サイズ,_矩形サイズ)), assertz(画像構造(色の深さ,_色の深さ)). 画像データの読み込み(_入力ファイル,_ヘッダの文字数,_画像データ) :- open(_入力ファイル,read,Input,[type(binary)]), ヘッダ部分を空読み(Input,_ヘッダの文字数), 画像データ部分の読み取り(Input,_画像データ), close(input). ヘッダ部分を空読み(Input,_ヘッダの文字数) :- between(1,_ヘッダの文字数,N), get_byte(Input,_), N = _ヘッダの文字数,!. 画像データ部分の読み取り(Input,_画像データ) :- findall(C,(repeat,get_byte(Input,C),(C = -1,!,fail;true)),_画像データ). get_line(Input,Line) :- get_char(Input,A), get_line(Input,A,L), atom_chars(Line,L). get_line(Input,'\n',[]) :- !. get_line(Input,A,[A|R]) :- get_char(Input,B), get_line(Input,B,R). % 以下のサイトは '先頭がa、末尾がzの副文字列'(_文字列,_副文字列) :- 副文字列の(_文字列,_副文字列), 先頭がa(_副文字列), 末尾がz(_副文字列). 副文字列の(_文字列,_副文字列) :- sub_atom(_文字列,_,_,_,_副文字列). 先頭がa(_副文字列) :- sub_atom(_副文字列,0,1,_,a). 末尾がz(_副文字列) :- sub_atom(_副文字列,_,1,0,z). % 以下のサイトは # 出典:: 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/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,_検索文字列). % 以下のサイトは # # データベースに在る一日分売上データを給油所別月別ファイルに追加保存する。 # 保存ファイルは例えば "志村_売上_201501.pro" のようなファイル名である。 # 給油所(志村,'300203'). 給油所(上野毛,'300206'). 給油所(横浜南,'370113'). 給油所(熊谷,'370105'). 給油所(けやき台,'370109'). 給油所(秩父21,'370111'). 給油所(狭山ヶ丘,'370112'). 売上保存(_保存月,_保存日) :- '保存日から入力年月日を得て、一日分のデータを売上保存ファイルに書き足す。'(_保存月,_保存日). '保存日から入力年月日を得て、一日分のデータを売上保存ファイルに書き足す。'(_保存月,_保存日) :- '保存日から入力年月日を得て、'(_保存日,_入力年月日), '一日分のデータを売上保存ファイルに書き足す。'(_保存月,_入力年月日). '保存日から入力時刻下限、上限を得て、'(_保存日,_入力年月日) :- '売上保存_年-_月-_日'(_保存日,_年,_月,_日), 売上保存_入力年月日(_年,_月,_日,_入力年月日). '売上保存_年-_月-_日'(_保存日,_年,_月,_日) :- sub_atom(_保存日,0,4,_,_年), sub_atom(_保存日,4,2,_,_月), sub_atom(_保存日,6,2,_,_日). 売上保存_入力年月日(_年,_月,_日,_入力年月日) :- atomic_list_concat([_年,'-',_月,'-',_日],_入力年月日). '一日分のデータを売上保存ファイルに書き足す。'(_保存月,_入力年月日) :- forall(売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ), 売上保存の一日分データを書き出す(_出力,_一日分データ)). 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ) :- 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力), データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ). 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力) :- 給油所(_給油所,_出荷場所), atomic_list_concat([_給油所,'_売上_',_保存月,'.pro'],_保存ファイル名), open(_保存ファイル名,append,_出力). データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ) :- findall([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20],( 売上(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20), 出荷場所と入力時刻が指定と一致する(_16,_出荷場所,_20,_入力年月日)),_一日分データ). 出荷場所と入力時刻が指定と一致する(_出荷場所,_出荷場所,_入力時刻,_入力年月日) :- sub_atom(_入力時刻,0,10,_,_入力年月日). 売上保存の一日分データを書き出す(_出力,[]) :- close(_出力). 売上保存の一日分データを書き出す(_出力,[]) :- 売上保存の一日分データを書き出して行く(_出力,_一日分データ). 売上保存の一日分データを書き出して行く(_出力,_一日分データ) :- 売上保存一行表示(_出力,_組), 売上保存の一日分データを書き出す(_出力,_残り). 売上保存一行表示(_出力,_組) :- _売上 =.. [売上|_組], format(_出力,'~w.\n',[_売上]). % 以下のサイトは # # データベースに在る一日分売上データを給油所別月別ファイルに追加保存する。 # 保存ファイルは例えば "志村_売上_201501.pro" のようなファイル名である。 # 売上保存(_保存月,_保存日) :- '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日), 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ,_残り), 売上保存の一日分データを書き出す(_出力,_一日分データ), _残り = []. '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日) :- '売上保存_年-_月-_日'(_保存日,_年,_月,_日), 売上保存_入力年月日(_年,_月,_日,_入力年月日). '売上保存_年-_月-_日'(_保存日,_年,_月,_日) :- sub_atom(_保存日,0,4,_,_年), sub_atom(_保存日,4,2,_,_月), sub_atom(_保存日,6,2,_,_日). 売上保存_入力年月日(_年,_月,_日,_入力年月日) :- atomic_list_concat([_年,'-',_月,'-',_日],_入力年月日). 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ,_残り) :- 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力,_残り), データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ). 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力,_残り) :- append(_,[[_給油所,_出荷場所]|_残り],[[志村,'300203'],[上野毛,'300206'],[熊谷,'370105'],[けやき台,'370109'],[秩父21,'370111'],[狭山ヶ丘,'370112'],[横浜南,'370113']]), atomic_list_concat([_給油所,'_売上_',_保存月,'.pro'],_保存ファイル名), open(_保存ファイル名,append,_出力). データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ) :- findall([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20],( 売上(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20), 出荷場所と入力時刻から組を得る(_16,_出荷場所,_20,_入力年月日)),_一日データ). 出荷場所と入力時刻から組を得る(_出荷場所,_出荷場所,_入力時刻,_入力年月日,_組) :- sub_atom(_入力時刻,0,10,_,_入力年月日). 売上保存の一日分データを書き出す(_出力,_一日分データ) :- append(_,[_組|_残り],_一日分データ), 売上保存一行表示(_出力,_組), 売上保存の一日分書き出しを完了する(_出力,_残り). 売上保存一行表示(_出力,_組) :- _売上 =.. [売上|_組], writeq(_出力,_売上), write(_出力,'.\n'). 売上保存の一日分書き出しを完了する(_出力,[]) :- close(_出力). % 以下のサイトは # 出典 :: twitter_by_@a_hisame_20150219 # # "aがn回以上続いた直後にbがn回続く"ことを(拡張)正規表現で有限長で表現できるんでしたっけ? (nは0以上の任意の整数) # 'aがn回以上続いた直後にbがn回続く(nは0以上の任意の整数)'(_文字列,_n,_前文字列,_適合文字列,_後文字列) :- 'aがn回以上続いた'(_n,_文字列,_前文字列,_適合文字列_1,_後文字列_1), '直後にbがn回続く'(_n,_適合文字列_1,_後文字列,_適合文字列,_後文字列). aがn回以上続いた(_n,_a,_文字列,_前文字列,_適合文字列,_後文字列) :- aがn回以上続いた(_n,_a,_文字列,_前文字列,_適合文字列,_後文字列,_), その連続部分では最長である(_a,_前文字列,_後文字列). aがn回以上続いた(_n,_a,_文字列,_前文字列,_適合文字列,_後文字列,_文字列長) :- sub_atom(_文字列,S,_文字列長,R,_適合文字列), _文字列長 >= _n, forall(sub_atom(_適合文字列,_,1,_,_文字),_a = _文字), 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列). 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). その連続部分では最長である(_或る文字,_前文字列,_後文字列) :- \+(sub_atom(_前文字列,_,1,0,_或る文字)), \+(sub_atom(_後文字列,0,1,_,_或る文字)). '直後にbがn回続く'(_n,_適合文字列_1,_後文字列_1,_適合文字列,_後文字列) :- bがn回続く(_n,_後文字列_1,_bがn個の文字列), atom_concat(_適合文字列_1,_bがn個の文字列,_適合文字列), sub_atom(_後文字列_1,_,R,0,_後文字列). bがn回続く(_n,_後文字列_1,_bがn個の文字列) :- sub_atom(_後文字列_1,0,_n,R,_bがn個の文字列), forall(sub_atom(_bがn個の文字列,_,1,_,_文字),_文字 = b), \+(sub_atom(_後文字列,_n,1,_,b)). % 以下のサイトは # 出典 :: twitter_by_@a_hisame_20150219 # # "aがn回以上続いた直後にbがn回続く"ことを(拡張)正規表現で有限長で表現できるんでしたっけ? (nは0以上の任意の整数) # 'aがn回以上続いた直後にbがn回続く(nは0以上の任意の整数)'(_文字列,_n,_前文字列,_適合文字列,_後文字列) :- 'aがn回以上続いた'(_n,_文字列,_前文字列,L2,L3), '直後にbがn回続く'(_n,L2,L3,L2_2,L3_2), atom_chars(_適合文字列,L2_2), atom_chars(_後文字列,L3_2). 'aがn回以上続いた'(_n,_文字列,_前文字列,L2,L3) :- sub_atom(_文字列,_前文字列,_適合文字列_1,_後文字列_1,L1,L2,L3), all(L2,a), \+(last(L1,a)), \+(L3 = [a|_]), length(L2,Len_1), Len_1 >= _n. '直後にbがn回続く'(_n,L2,L3,L2_2,L3_2) :- findall(b,between(1,_n,_),L), append(L,L3_2,L3), \+(L3_2 = [b|_]), append(L2,L,L2_2). all([],A). all([A|R],A) :- all(R,A). sub_atom(A,H,X,T,HL,XL,TL) :- atomic(X), atom_chars(A,L), atom_chars(X,XL), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,H,X,T,HL,XL,TL) :- var(X), atom_chars(A,L), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), \+(XL = []), atom_chars(T,TL). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/910 # お題:2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を # 隣り合う文字の間に挿入した文字列を返す。 # 例 # "Personal" -> "Peerrsssoonnall" # "Hello, world!" -> "Heellllooo,, wwworrrlldd!" # # '2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列を返す。'(_文字列,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- findall(_副文字列_2,( sub_atom(_文字列,_,2,_残り文字数,_副文字列), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_副文字列,_残り文字数,_副文字列_2)),L), atomic_list_concat(L,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_副文字列,_残り文字数,_副文字列_2) :- 隣り合う2文字の大きい方の文字(_副文字列,_文字_1,_文字_2,_大きい方の文字), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_残り文字数,_文字_1,_文字_2,_大きい方の文字,_副文字列_2). 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(0,_文字_1,_文字_2,_大きい方の文字,_副文字列_2) :- atomic_list_concat([_文字_1,_大きい方の文字,_文字_2],_副文字列_2),!. 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_,_文字_1,_文字_2,_大きい方の文字,_副文字列_2) :- atomic_list_concat([_文字_1,_大きい方の文字],_副文字列_2). 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字) :- sub_atom(_2文字,0,1,_,_文字_1), sub_atom(_2文字,1,1,_,_文字_2), 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_大きい方の文字). 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_1) :- _文字_1 @>= _文字_2. 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_2) :- _文字_1 @< _文字_2. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/910 # お題:2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を # 隣り合う文字の間に挿入した文字列を返す。 # 例 # "Personal" -> "Peerrsssoonnall" # "Hello, world!" -> "Heellllooo,, wwworrrlldd!" # # '2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列を返す。'(_文字列,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- findall(_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列,( sub_atom(_文字列,_,2,_,_2文字), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_2文字,_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列)),L), sub_atom(_文字列,0,1,_,_最初の文字), atomic_list_concat([_最初の文字|L],_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_2文字,_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字), atomic_list_concat([_大きい方の文字,_文字_2],_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字) :- sub_atom(_2文字,0,1,_,_文字_1), sub_atom(_2文字,1,1,_,_文字_2), 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_大きい方の文字). 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_1) :- _文字_1 @>= _文字_2. 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_2) :- _文字_1 @< _文字_2. % 以下のサイトは # # 文字列の中で或る文字がn回以上続いた部分がある # 或る文字がn回以上続いた部分がある(_n,_或る文字,_文字列) :- sub_atom(_文字列,_,_文字列長,_,_適合文字列), _文字列長 >= _n, forall(sub_atom(_適合文字列,_,1,_,_文字),_或る文字 = _文字). % 以下のサイトは # # 文字列の中で或る文字がn回以上続いた # 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列) :- 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列,_文字列長), その連続部分では最長である(_或る文字,_前文字列,_後文字列). 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列,_適合文字列長) :- sub_atom(_文字列,S,_適合文字列長,R,_適合文字列), 長さがn文字以上の或る文字だけによる文字列(_n,_或る文字,_適合文字列長,_適合文字列), 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列). 長さがn文字以上の或る文字だけによる文字列(_n,_或る文字,_文字列長,_文字列) :- 長さがn文字以上(_n,_文字列長), forall(sub_atom(_文字列,_,1,_,_文字),_文字 = _或る文字). 長さがn文字以上(_n,_文字列長) :- _n =< _文字列長. 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). その連続部分では最長である(_或る文字,_前文字列,_後文字列) :- \+(sub_atom(_前文字列,_,1,0,_或る文字)), \+(sub_atom(_後文字列,0,1,_,_或る文字)). % 以下のサイトは # # 文字列の中で或る文字がn回以上続いた # 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列) :- 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列,_), その連続部分では最長である(_或る文字,_前文字列,_後文字列). 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列,_文字列長) :- sub_atom(_文字列,S,_文字列長,R,_適合文字列), _文字列長 >= _n, forall(sub_atom(_適合文字列,_,1,_,_文字),_或る文字 = _文字), 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列). 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). その連続部分では最長である(_或る文字,_前文字列,_後文字列) :- \+(sub_atom(_前文字列,_,1,0,_或る文字)), \+(sub_atom(_後文字列,0,1,_,_或る文字)). % 以下のサイトは '日付と曜日の生成'(_年_1,_月_1,_日_1,_起点日からの日数,_年,_月,_日,_曜日) :- '日付と曜日の生成'(_年_1,_月_1,_日_1,0,_起点日からの日数,_年,_月,_日,_曜日). '日付と曜日の生成'(_年,_月,_日,_日数,_日数,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_起点日からの日数_1,_起点日からの日数,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), succ(_起点日からの日数_1,_起点日からの日数_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_起点日からの日数_2,_起点日からの日数,_年,_月,_日,_曜日). '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). '日付と曜日の生成'(_起点年月日文字列,_年月日文字列,_曜日) :- 年月日文字列から整数年月日を得る(_起点年月日文字列,_起点年,_起点月,_起点日), '日付と曜日の生成'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日), 整数から文字列(4,_年,_年文字列), 整数から文字列(2,_月,_月文字列), 整数から文字列(2,_日,_日文字列), atomic_list_concat([_年文字列,_月文字列,_日文字列],_年月日文字列). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- _翌日の月 is _月 + 1, '十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月),!. '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). 整数から文字列(_文字列桁,_整数,_定数) :- '整数・文字番号変換'(_整数,_文字番号ならび), ならびの長さ(_文字番号ならび,_ならびの長さ), _不足桁 is _文字列桁 - _ならびの長さ, 頭部に零を詰める(_不足桁,_文字番号ならび,_整形された文字番号ならび), '定数・文字番号変換'(_定数,_整形された文字番号ならび),!. 年月日文字列から整数年月日を得る(_年月日文字列,_年,_月,_日) :- sub_atom(_年月日文字列,0,4,4,_年文字列), sub_atom(_年月日文字列,2,2,2,_月文字列), sub_atom(_年月日文字列,4,2,0,_日文字列), 文字列ならびから整数ならびを得る([_年文字列,_月文字列,_日文字列],[_年,_月,_日]). 文字列ならびから整数ならびを得る([],[]). 文字列ならびから整数ならびを得る([_文字列|R1],[_整数|R2]) :- get_term_from_atom(_文字列,_整数,[]), 文字列ならびから整数ならびを得る(R1,R2). ならびの長さ(_ならび,_ならびの長さ) :- length(_ならび,_ならびの長さ). '整数・文字番号変換'(_整数,_文字番号ならび) :- number_codes(_整数,_文字番号ならび). 頭部に零を詰める(0,_文字ならび,_文字ならび) :- !. 頭部に零を詰める(_桁,[_|_未決定ならび],_文字ならび) :- _桁 < 0,!, _残り桁 is _桁 + 1, 頭部に零を詰める(_残り桁,_未決定ならび,_文字ならび). 頭部に零を詰める(_桁,_文字ならび,[48|_未決定ならび]) :- _残り桁 is _桁 - 1, 頭部に零を詰める(_残り桁,_文字ならび,_未決定ならび). '定数・文字番号変換'(_定数,_文字番号ならび) :- atom_codes(_定数,_文字番号ならび). % 以下のサイトは # 出典::プログラミングのお題スレ Part5 # 与えられた文字列を三等分にして出力しなさい # きれいに三等分できない場合は四等分にしなさい '与えられた文字列を三等分にして出力しなさい。きれいに三等分できない場合は四等分にしなさい。'(_文字列) :- '与えられた文字列を三等分にして出力しなさい。'(_文字列),!. '与えられた文字列を三等分にして出力しなさい。きれいに三等分できない場合は四等分にしなさい。'(_文字列) :- 'きれいに三等分できない場合は四等分にしなさい。'(_文字列). '与えられた文字列を三等分にして出力しなさい。'(_文字列) :- sub_atom(_文字列,N,N,N,S1,S2,S3,_,_,_), writef('%t,%t,%t\n',[S1,S2,S3]). 'きれいに三等分できない場合は四等分にしなさい。'(_文字列) :- '文字数が1:2:1になるように分割する'(_文字列,S1,S2,S3), 'さらにS2を二等分して'(S2,S2_1,S2_2), 全体が四等分されたら出力する(S1,S2_1,S2_2,S3). '文字数が1:2:1になるように分割する'(_文字列,S1,S2,S3) :- sub_atom(_文字列,N,M,N,S1,S2,S3,_,_,_), M is N * 2. 'さらにS2を二等分して'(S2,S2_1,S2_2) :- sub_atom(S2,N_1,N_1,0,S2_1,S2_2,_,_,_,_). 全体が四等分されたら出力する(S1,S2_1,S2_2,S3) :- writef('%t,%t,%t,%t\n',[S1,S2_1,S2_2,S3]). sub_atom(A,S,L,R,S1,S2,S3,HL,XL,TL) :- 'Aがアトムの場合、Aを三つの文字列に分解してそれぞれの文字ならびを得る'(A,S,L,R,S1,S2,S3). sub_atom(A,S,L,R,S1,S2,S3,HL,XL,TL) :- 'Aが変数の場合、三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる'(A,S,L,R,S1,S2,S3,HL,XL,TL). 'Aがアトムの場合、Aを三つの文字列に分解してそれぞれの文字ならびを得る'(A,S,L,R,S1,S2,S3) :- atom(A), 'Aを三つの文字列に分解する'(A,S,L,R,S1,S2,S3), 三つの文字列の文字ならびを得る(S1,S2,S3,HL,XL,TL). 'Aを三つの文字列に分解する'(A,S,L,R,S1,S2,S3) :- 'S1を得る'(A,S,S1), 'S2を得る'(A,S,L,S2), 'S3を得る'(A,S,L,R,S3). 'S1を得る'(A,S,S1) :- sub_atom(A,0,S,_,S1). 'S2を得る'(A,S,L,S2) :- sub_atom(A,S,L,_,S2). 'S3を得る'(A,S,L,R,S3) :- N is S + L, sub_atom(A,N,R,0,S3). 三つの文字列の文字ならびを得る(S1,S2,S3,HL,XL,TL) :- atom_chars(S1,HL), atom_chars(S2,XL), atom_chars(S3,TL). 'Aが変数の場合、三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる'(A,S,L,R,S1,S2,S3,HL,XL,TL) :- var(A), 三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる(A,S,L,R,S1,S2,S3,HL,XL,TL). 三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる(A,S,L,R,S1,S2,S3,HL,XL,TL) :- 三つの文字列と文字ならびの関係(S1,S2,S3,HL,XL,TL), 三つの文字ならびとその要素数の関係(HL,XL,TL,S,L,R), 'Aを定数化できたら、sub_atom/10が実行できる'(A,S,L,R,S1,S2,S3,HL,XL,TL). 三つの文字列と文字ならびの関係(S1,S2,S3,HL,XL,TL) :- atom_chars(S1,HL), atom_chars(S2,XL), atom_chars(S3,TL). 三つの文字ならびとその要素数の関係(HL,XL,TL,S,L,R) :- length(HL,S), length(XL,L), length(TL,R). 'Aを定数化できたら、sub_atom/10が実行できる'(A,S,L,R,S1,S2,S3,HL,XL,TL) :- atomic_list_concat([S1,S2,S3],A), sub_atom(A,S,L,R,S1,S2,S3,HL,XL,TL). % 以下のサイトは ならびの右回転([],[]) :- !. ならびの右回転([A|R1],[E|R2]) :- ならびの右回転(R1,A,E,R2). ならびの右回転([E],A,E,[A]) :- !. ならびの右回転([B|R1],A,E,[B|R2]) :- ならびの右回転(R1,A,E,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの右回転([],[]) :- !. ならびの右回転([A|R],_右回転したならび) :- append(R,[A],_右回転したならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 文字列の右回転 % 文字列の右回転(_文字列,_右回転した文字列) :- sub_atom(_文字列,0,1,_残り文字数,_文字), sub_atom(_文字列,1,_残り文字数,0,_残り文字列), atomic_list_concat([_残り文字列,_文字],_右回転した文字列). % 以下のサイトは ならびの右ローテイト([],[]) :- !. ならびの右ローテイト([A|R1],[E|R2]) :- ならびの右ローテイト(R1,A,E,R2). ならびの右ローテイト([E],A,E,[A]) :- !. ならびの右ローテイト([B|R1],A,E,[B|R2]) :- ならびの右ローテイト(R1,A,E,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの右ローテイト([],[]) :- !. ならびの右ローテイト([A|R],_右ローテイトしたならび) :- append(R,[A],_右ローテイトしたならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 文字列の右ローテイト % 文字列の右ローテイト(_文字列,_右ローテイトした文字列) :- sub_atom(_文字列,0,1,_残り文字数,_文字), sub_atom(_文字列,1,_残り文字数,0,_残り文字列), atomic_list_concat([_残り文字列,_文字],_右ローテイトした文字列). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/178 # お題 # "この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" # の□をそれぞれ適切な数字に置き換え、正しい文章として完成させるコードを書け。 # # 元ネタ:https://www.facebook.com/NewtonScience/photos/a.314504251971427.78296.285001398255046/716155815139600/ # # '"この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" という文章がある。□をそれぞれ適切な数字に置き換え、正しい文章として完成させるコードを書け。'(_正しい文章) :- '1が□個,2が□個,3が□個,1から3以外の数字が□個'(_n1,_n2,_n3,_n4,_1,_2,_3,_4), '"この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" という文章がある。□をそれぞれ適切な数字に置き換え、正しい文章として完成させる'(_1,_2,_3,_4,_正しい文章), 正しい文章である(_正しい文章,_n1,_n2,_n3,_n4). '1が□個,2が□個,3が□個,1から3以外の数字が□個'(_n1,_n2,_n3,_n4,_1,_2,_3,_4) :- '1が□個'(_n1,_1), '2が□個'(_n2,_2), '3が□個'(_n3,_3), '1から3以外の数字が□個ある'(_n4,_4). '1が□個'(_n1,_1) :- between(0,9,_n1), number_chars(_n1,[_1]). '2が□個'(_n2,_2) :- between(0,9,_n2), number_chars(_n2,[_2]). '3が□個'(_n3,_3) :- between(0,9,_n3), number_chars(_n3,[_3]). '1から3以外の数字が□個ある'(_n4,_4) :- between(0,9,_n4), number_chars(_n4,[_4]). '"この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" という文章がある。□をそれぞれ適切な数字に置き換え、正しい文章として完成させる'(_1,_2,_3,_4,_正しい文章) :- swritef(_正しい文章,'この文字列には1が%t個,2が%t個,3が%t個,1から3以外の数字が%t個ある。',[_1,_2,_3,_4]). 正しい文章である(_正しい文章,_n1,_n2,_n3,_n4) :- '1の度数は'(_正しい文章,_n1), '2の度数は'(_正しい文章,_n2), '3の度数は'(_正しい文章,_n3), '1から3以外の数字の度数'(_正しい文章,_n4). '1の度数は'(_正しい文章,_n1) :- 度数(sub_atom(_正しい文章,_,1,_,'1'),_n1). '2の度数は'(_正しい文章,_n2) :- 度数(sub_atom(_正しい文章,_,1,_,'2'),_n2). '3の度数は'(_正しい文章,_n3) :- 度数(sub_atom(_正しい文章,_,1,_,'3'),_n3). '1から3以外の数字の度数'(_正しい文章,_n4) :- 度数((sub_atom(_正しい文章,_,1,_,A),member(A,['4','5','6','7','8','9','0'])),_n4). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/89 # 0と1のみでランダムに生成した文字列Sがある # 長さは2<=S<=1000である # 11001010110100011001011011111111111111000000000010111000000 # # 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX # 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN # としたときのMXとMNを求めよ # 見当たらない場合はFALSEを出力しろ # # S=110001010100 # MX=3 (000が一番長い) # MN=2 (11または00が二番目に長い) # # S=111111 # MX=3 (111111が一番長い) # MN=FALSE (2番目に短いものが存在しない) # # S=10 # MX=FALSE (1番長いのが存在しない) # MX=FALSE (2番目に短いものが存在しない) # # '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- '0と1のみでランダムに生成した文字列Sがある'(_文字列), forall('同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列), write('S=%t\nMX=%t,MN=%t\n',[_文字列,_最長文字列,_短い方から二番目の文字列])),!. '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- write('FALSE\n'). '0と1のみでランダムに生成した文字列Sがある'(_文字列) :- R is random(999) + 2, findall(_0または1,( between(2,R,_), _0または1 is random(3341) mod 2), _0または1ならび), atomic_list_concat(_0または1ならび,_文字列). '同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列) :- 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび), 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列). 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび) :- findall([_連続した文字列,_文字数],( 連続した文字列と文字数(_文字列,_連続した文字列,_文字数)), _連続した文字列_文字数ならび). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '0の連続したの文字列'(_文字列,_連続した文字列,_文字数). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '1の連続したの文字列と文字数'(_文字列,_連続した文字列,_文字数). '0の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='0'). '1の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='1'). 前後に0の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'0')), \+(sub_atom(_文字列,_開始点_2,1,_,'0')). 前後に1の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'1')), \+(sub_atom(_文字列,_開始点_2,1,_,'1')). 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列) :- 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数), 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列). 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数) :- 文字列長ならび(_連続した文字列と文字数ならび,_文字列長ならび), sort(_文字列長ならび,_整列した文字列長ならび), nth1(2,_整列した文字列長ならび,_短い方から二番目に短い文字数), append(_,[_最長文字数],_整列した文字列長ならび). 文字数ならび(_連続した文字列と文字数ならび,_文字数ならび) :- findall(_文字数,( member([_,_文字数],_連続した文字列と文字列数ならび)), _文字数ならび). 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列) :- member([_最長文字列,_最長文字数],_連続した文字列と文字数ならび), member([_短い方から二番目に短い文字列,_短い方から二番目に短い文字数],_連続した文字列と文字数ならび). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1387257592/898 # ●Regular Expressionの使用環境 # 2ちゃんねる専ブラ「JaneView」 または 「php」 # # ●検索か置換か? # 検索 # # ●説明 # ・「季節」「まだ寒い」「もうすぐ」「今は」「もうすぐ」のいずれかの文字列と「春」または「冬」の文字が入った文章を検出したい。 # ・「春」または「冬」という文字は「季節」「まだ寒い」「今は」「もうすぐ」という文字列の前にあっても後ろにあっても良い。 # #   ((春|冬).*(季節|まだ寒い|もうすぐ|今は|もうすぐ)|(季節|まだ寒い|もうすぐ|今は|もうすぐ).*(春|冬)) # ということがしたいのですが短くなりませんか? # # 同じ単語がそれぞれ2つずつ必要だと正規表現が長くなりがちなので (季節|まだ寒い|もうすぐ|今は|もうすぐ) # は1回で済ませるのが希望です。 # #   (春|冬(注:後ろあれば不要))(季節|まだ寒い|もうすぐ|今は|もうすぐ)(春|冬(注:前にあれば不要)) # ↑こんな感じが希望です # # ●対象データ ●希望する結果 # 1 まもなく「季節」は「春」ですね   結果:検出 (季節 & 春) # 2 「春」はよい「季節」ですね     結果:検出 (春 & もうすぐ) # 3 「春」よこい             結果:非検出 # # '・「季節」「まだ寒い」「もうすぐ」「今は」「もうすぐ」のいずれかの文字列と「春」または「冬」の文字が入った文章を検出したい。 ・「春」または「冬」という文字は「季節」「まだ寒い」「今は」「もうすぐ」という文字列の前にあっても後ろにあっても良い。'(_文章) :- '「季節」「まだ寒い」「もうすぐ」「今は」「もうすぐ」のいずれかの文字列と'(_文章,_前文字列,_後文字列), '「春」または「冬」の文字が入った文章を検出したい。 ・「春」または「冬」という文字は「季節」「まだ寒い」「今は」「もうすぐ」という文字列の前にあっても後ろにあっても良い。'(_前文字列,_後文字列). '「季節」「まだ寒い」「もうすぐ」「今は」「もうすぐ」のいずれかの文字列と'(_文章,_前文字列,_後文字列) :- sub_atom(_文章,_前文字列,_文字列,_後文字列), member(_文字列,[季節,まだ寒い,もうすぐ,今は,もうすぐ]). '「春」または「冬」の文字が入った文章を検出したい。 ・「春」または「冬」という文字は「季節」「まだ寒い」「今は」「もうすぐ」という文字列の前にあっても後ろにあっても良い。'(_前文字列,_) :- '「春」または「冬」の文字が入った文章を検出したい。'(_前文字列),!. '「春」または「冬」の文字が入った文章を検出したい。 ・「春」または「冬」という文字は「季節」「まだ寒い」「今は」「もうすぐ」という文字列の前にあっても後ろにあっても良い。'(_,_後文字列) :- '「春」または「冬」の文字が入った文章を検出したい。'(_後文字列). '「春」または「冬」の文字が入った文章を検出したい。'(_文字列) :- sub_atom(_前文字列,_,1,_,_文字), member(_文字,[春,冬]). sub_atom(_文章,_前文字列,_文字列,_後文字列) :- sub_atom(_文章,S,_,R,_文字列), sub_atom(_文章,0,S,_,_前文字列), sub_atom(_文章,_,R,0,_後文字列). % 以下のサイトは # # 9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ # '9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ' :- '9―3÷1/3+1=?', 尾崎さんならPrologで解きそうだ. '9―3÷1/3+1=?' :- '全角文字を半角文字にしながら/をrdivに÷を/に置換する'('9―3÷1/3+1',_置換された半角式文字列), '/(実は÷)の演算子結合度をrdiv(実は/)の400より強くする', 置換された半角式文字列を解釈実行する(_置換された半角式文字列,_はてな), 式を復元して表示する('9―3÷1/3+1=',_はてな). '全角文字を半角文字にしながら/をrdivに÷を/に置換する'('9―3÷1/3+1',_置換された半角式文字列) :- 'ここだけの文字列置換(=?は除去される)'('9―3÷1/3+1=?',_置換された半角式文字列). '/(実は÷)の演算子結合度をrdiv(実は/)の400より強くする' :- op(401,yfx,(/)). 置換された半角式文字列を解釈実行する(_置換された半角式文字列,_はてな) :- read_term_from_atom(_置換された半角式文字列,_式,[]), _はてな is _式. 'ここだけの文字列置換(=?は除去される)'(_文字列,_置換された文字列) :- findall(_置換された文字,( sub_atom(_文字列,_,1,_,_文字), ここだけの置換(_文字,_置換された文字)),_置換された文字ならび), atomic_list_concat(_置換された文字ならび,_置換された文字列). ここだけの置換('9','9'). ここだけの置換('―','-'). ここだけの置換('3','3'). ここだけの置換('÷','/'). ここだけの置換('/',' rdiv '). ここだけの置換('+','+'). ここだけの置換('1','1'). ここだけの置換('=',''). ここだけの置換('?',''). ここだけの置換('2','2'). ここだけの置換('4','4'). ここだけの置換('5','5'). ここだけの置換('6','6'). ここだけの置換('7','7'). ここだけの置換('8','8'). ここだけの置換('0','0'). 式を復元して表示する(_表示文字列_1,_はてな) :- '_はてなを全角数字に置換する'(_はてな,_はてな全角文字列), writef('%t%t\n',[_表示文字列_1,_はてな全角文字列]). '_はてなを全角数字に置換する'(_はてな,_はてな全角数字文字列) :- number_chars(_はてな,_はてな数字ならび), 半角文字ならびを全角文字ならびに変換する(_はてな数字ならび,_はてな全角数字ならび), atomic_list_concat(_はてな全角数字ならび,_はてな全角数字文字列). 半角文字ならびを全角文字ならびに変換する(_はてな数字ならび,_はてな全角数字ならび) :- findall(_全角数字,( member(_半角数字,_はてな数字ならび), ここだけの置換(_全角数字,_半角数字)),_はてな全角数字ならび). 尾崎さんならPrologで解きそうだ. % 以下のサイトは # 9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ '9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ' :- '9―3÷1/3+1=?', 尾崎さんならPrologで解きそうだ. '9―3÷1/3+1=?' :- op(401,yfx,(/)), ここだけの文字列置換('9―3÷1/3+1=?',_置換された文字列), read_term_from_atom(_置換された文字列,_式 = ?,[]), X is _式, '?を全角数字の解に置換して表示する'('9―3÷1/3+1=%t\n',X). ここだけの文字列置換(_文字列,_置換された文字列) :- findall(_置換された文字,( sub_atom(_文字列,_,1,_,_文字), ここだけの文字置換(_文字,_置換された文字)),_置換された文字ならび), atomic_list_concat(_置換された文字ならび,_置換された文字列). ここだけの文字置換('9','9'). ここだけの文字置換('―','-'). ここだけの文字置換('3','3'). ここだけの文字置換('÷','/'). ここだけの文字置換('/',' rdiv '). ここだけの文字置換('+','+'). ここだけの文字置換('1','1'). ここだけの文字置換('=','='). ここだけの文字置換('?',' ? '). ここだけの文字置換('2','2'). ここだけの文字置換('4','4'). ここだけの文字置換('5','5'). ここだけの文字置換('6','6'). ここだけの文字置換('7','7'). ここだけの文字置換('8','8'). ここだけの文字置換('0','0'). '?を全角数字の解に置換して表示する'(_表示パターン,X) :- '?を全角数字の解に置換して'(X,_解文字列), writef(_表示パターン,[_解文字列]). '?を全角数字の解に置換して'(X,_解文字列) :- number_chars(X,Chars), findall(_全角数字,( member(_数字,Chars), ここだけの文字置換(_全角数字,_数字)),_解文字ならび), atomic_list_concat(_解文字ならび,_解文字列). 尾崎さんならPrologで解きそうだ. % 以下のサイトは # 9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ '9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ'(X) :- '9―3÷1/3+1=?'(X), 尾崎さんならPrologで解きそうだ. '9―3÷1/3+1=?'(X) :- op(401,yfx,(/)), ここだけの文字列置換('9―3÷1/3+1=?',_置換された文字列), read_term_from_atom(_置換された文字列,_式,[]), X is _式. ここだけの文字列置換(_文字列,_置換された文字列) :- findall(_置換された文字,( sub_atom(_文字列,_,1,_,_文字), ここだけの文字置換(_文字,_置換された文字)),_置換された文字ならび), atomic_list_concat(_置換された文字ならび,_置換された文字列). ここだけの文字置換('9','9'). ここだけの文字置換('―','-'). ここだけの文字置換('3','3'). ここだけの文字置換('÷','/'). ここだけの文字置換('/',' rdiv '). ここだけの文字置換('+','+'). ここだけの文字置換('1','1'). 尾崎さんならPrologで解きそうだ. % 以下のサイトは 挟区間文字列(_文字列,_副文字列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)). % 以下のサイトは # # あなたは既に読んでしまった札を記憶していることにします。 # まだ読まれていない、読み札も分かっていることとします。 # 読み札/2、既に読んでしまった札/2、自陣/1、敵陣/1がそれぞれ # 述語としして定義済みだとして、自陣、敵陣、あるいはその両方の札の # 決まり字を示すプログラムを定義してください。 # :- dynamic(読み札/1). :- dynamic(既に読んでしまった札/1). :- dynamic(自陣/1). :- dynamic(敵陣/1). 自陣または敵陣の全ての札の決まり字(_下の句,_上の句,_決まり字) :- 自陣または敵陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 自陣の札の決まり字(_下の句,_上の句,_決まり字) :- 自陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 敵陣の札の決まり字(_下の句,_上の句,_決まり字) :- 敵陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 決まり字(_上の句,_決まり字) :- 最長共通文字数(_上の句,_最長共通文字数), succ(_最長共通文字数,_決まり字の位置), sub_atom(_上の句,0,_決まり時の位置,_,_決まり字). 最長共通文字数(_上の句,_最長共通文字数) :- findmax(_先頭から最長共通文字数,( 対象としている上の句とは別の上の句を読み札から得る(_上の句,_別の上の句), '先頭から最長共通文字数(0オリジン)'(_上の句,別の上の句,_先頭からの最長共通文字数)),_最長共通文字数). 対象としている上の句とは別の上の句を読み札から得る(_上の句,_別の上の句) :- 読み札(_別の上の句,_), \+(_上の句 = _別の上の句). '先頭から最長共通文字数(0オリジン)'(_上の句,_別の上の句,_文字数) :- nth0(_文字数,_,_), sub_atom(_上の句,_文字数,1,_,_文字_1), sub_atom(_別の上の句,_文字数,1,_,_文字_2), \+(_文字_1=_文字_2),!. 下の句から決まり字を得る(_下の句,_決まり字) :- 自陣または敵陣(_下の句), '下の句から上の句を得る'(_下の句,_上の句), 決まり字(_上の句,_決まり字). 自陣または敵陣(_下の句) :- 自陣(_下の句). 自陣または敵陣(_下の句) :- 敵陣(_下の句). 下の句から上の句を得る(_下の句,_上の句) :- 読み札(_上の句,_下の句). findmax(_値,_目標,_最大値) :- findall(_値,_目標,_値ならび), 最大値(_値ならび,_最大値). 最大値(_標本ならび,_最大値) :- select(_最大値,_標本ならび,_残り標本ならび), forall(member(_標本_1,_残り標本ならび),_標本_1 @=< _最大値),!. /* 読み札('あきのたのかりほのいほのとまをあらみ,わがころもではつゆにぬれつつ'). 読み札('はるすぎてなつきにけらししろたへの,ころもほすてふあまのかぐやま'). 読み札('あしびきのやまどりのをのしだりをの,ながながしよをひとりかもねむ'). 読み札('たごのうらにうちいでてみればしろたへの,ふじのたかねにゆきはふりつつ'). 読み札('おくやまにもみぢふみわけなくしかの,こゑきくときぞあきはかなしき'). 読み札('かささぎのわたせるはしにおくしもの,しろきをみればよぞふけにける'). 読み札('あまのはらふりさけみればかすがなる,みかさのやまにいでしつきかも'). 読み札('わがいほはみやこのたつみしかぞすむ,よをうぢやまとひとはいふなり'). 読み札('はなのいろはうつりにけりないたづらに,わがみよにふるながめせしまに'). 読み札('これやこのゆくもかへるもわかれては,しるもしらぬもあふさかのせき'). 読み札('わたのはらやそしまかけてこぎいでぬと,ひとにはつげよあまのつりぶね'). 読み札('あまつかぜくものかよひぢふきとぢよ,をとめのすがたしばしとどめむ'). 読み札('つくばねのみねよりおつるみなのがは,こひぞつもりてふちとなりぬる'). 読み札('みちのくのしのぶもぢずりたれゆゑに,みだれそめにしわれならなくに'). 読み札('きみがためはるののにいでてわかなつむ,わがころもでにゆきはふりつつ'). 読み札('たちわかれいなばのやまのみねにおふる,まつとしきかばいまかへりこむ'). 読み札('ちはやぶるかみよもきかずたつたがは,からくれなゐにみづくくるとは'). 読み札('すみのえのきしによるなみよるさへや,ゆめのかよひぢひとめよくらむ'). 読み札('なにはがたみじかきあしのふしのまも,あはでこのよをすぐしてよとや'). 読み札('わびぬればいまはたおなじなにはなる,みをつくしてもあはむとぞおもふ'). 読み札('いまこむといひしばかりにながつきの,ありあけのつきをまちいでつるかな'). 読み札('ふくからにあきのくさきのしをるれば,むべやまかぜをあらしといふらむ'). 読み札('つきみればちぢにものこそかなしけれ,わがみひとつのあきにはあらねど'). 読み札('このたびはぬさもとりあへずたむけやま,もみぢのにしきかみのまにまに'). 読み札('なにしおはばあふさかやまのさねかづら,ひとにしられでくるよしもがな'). 読み札('をぐらやまみねのもみぢばこころあらば,いまひとたびのみゆきまたなむ'). 読み札('みかのはらわきてながるるいづみがは,つみきとてかこひしかるらむ'). 読み札('やまざとはふゆぞさびしさまさりける,ひとめもくさもかれぬとおもへば'). 読み札('こころあてにをらばやをらむはつしもの,おきまどはせるしらぎくのはな'). 読み札('ありあけのつれなくみえしわかれより,あかつきばかりうきものはなし'). 読み札('あさぼらけありあけのつきとみるまでに,よしののさとにふれるしらゆき'). 読み札('やまがはにかぜのかけたるしがらみは,ながれもあへぬもみぢなりけり'). 読み札('ひさかたのひかりのどけきはるのひに,しづごころなくはなのちるらむ'). 読み札('たれをかもしるひとにせむたかさごの,まつもむかしのともならなくに'). 読み札('ひとはいさこころもしらずふるさとは,はなぞむかしのかににほひける'). 読み札('なつのよはまだよひながらあけぬるを,くものいづこにつきやどるらむ'). 読み札('しらつゆにかぜのふきしくあきののは,つらぬきとめぬたまぞちりける'). 読み札('わすらるるみをばおもはずちかひてし,ひとのいのちのをしくもあるかな'). 読み札('あさぢふのをののしのはらしのぶれど,あまりてなどかひとのこひしき'). 読み札('しのぶれどいろにいでにけりわがこひは,ものやおもふとひとのとふまで'). 読み札('こひすてふわがなはまだきたちにけり,ひとしれずこそおもひそめしか'). 読み札('ちぎりきなかたみにそでをしぼりつつ,すゑのまつやまなみこさじとは'). 読み札('あひみてののちのこころにくらぶれば,むかしはものをおもはざりけり'). 読み札('あふことのたえてしなくはなかなかに,ひとをもみをもうらみざらまし'). 読み札('あはれともいふべき人はおもほえで,みのいたづらになりぬべきかな'). 読み札('ゆらのとをわたるふなびとかぢをたえ,ゆくへもしらぬこひのみちかな'). 読み札('やへむぐらしげれるやどのさびしきに,ひとこそみえねあきはきにけり'). 読み札('かぜをいたみいはうつなみのおのれのみ,くだけてものをおもふころかな'). 読み札('みかきもりゑじのたくひのよるはもえ,ひるはきえつつものをこそおもへ'). 読み札('きみがためをしからざりしいのちさへ,ながくもがなとおもひけるかな'). 読み札('かくとだにえやはいぶきのさしもぐさ,さしもしらじなもゆるおもひを'). 読み札('あけぬればくるるものとはしりながら,なほうらめしきあさぼらけかな'). 読み札('なげきつつひとりぬるよのあくるまは,いかにひさしきものとかはしる'). 読み札('わすれじのゆくすゑまではかたければ,けふをかぎりのいのちともがな'). 読み札('たきのおとはたえてひさしくなりぬれど,なこそながれてなほきこえけれ'). 読み札('あらざらむこのよのほかのおもひでに,いまひとたびのあふこともがな'). 読み札('めぐりあひてみしやそれともわかぬまに,くもがくれにしよはのつきかな'). 読み札('ありまやまゐなのささはらかぜふけば,いでそよひとをわすれやはする'). 読み札('やすらはでねなましものをさよふけて,かたぶくまでのつきをみしかな'). 読み札('おほえやまいくののみちのとほければ,まだふみもみずあまのはしだて'). 読み札('いにしへのならのみやこのやへざくら,けふここのへににほひぬるかな'). 読み札('よをこめてとりのそらねははかるとも,よにあふさかのせきはゆるさじ'). 読み札('いまはただおもひたえなむとばかりを,ひとづてならでいふよしもがな'). 読み札('あさぼらけうぢのかはぎりたえだえに,あらはれわたるせぜのあじろぎ'). 読み札('うらみわびほさぬそでだにあるものを,こひにくちなむなこそをしけれ'). 読み札('もろともにあはれとおもへやまざくら,はなよりほかにしるひともなし'). 読み札('はるのよのゆめばかりなるたまくらに,かひなくたたむなこそをしけれ'). 読み札('こころにもあらでうきよにながらへば,こひしかるべきよはのつきかな'). 読み札('あらしふくみむろのやまのもみぢばは,たつたのかはのにしきなりけり'). 読み札('さびしさにやどをたちいでてながむれば,いづこもおなじあきのゆふぐれ'). 読み札('ゆふさればかどたのいなばおとづれて,あしのまろやにあきかぜぞふく'). 読み札('おとにきくたかしのはまのあだなみは,かけじやそでのぬれもこそすれ'). 読み札('たかさごのをのへのさくらさきにけり,とやまのかすみたたずもあらなむ'). 読み札('うかりけるひとをはつせのやまおろしよ,はげしかれとはいのらぬものを'). 読み札('ちぎりおきしさせもがつゆをいのちにて,あはれことしのあきもいぬめり'). 読み札('わたのはらこぎいでてみればひさかたの,くもゐにまがふおきつしらなみ'). 読み札('せをはやみいはにせかるるたきがはの,われてもすゑにあはむとぞおもふ'). 読み札('あはぢしまかよふちどりのなくこゑに,いくよねざめぬすまのせきもり'). 読み札('あきかぜにたなびくくものたえまより,もれいづるつきのかげのさやけさ'). 読み札('ながからむこころもしらずくろかみの,みだれてけさはものをこそおもへ'). 読み札('ほととぎすなきつるかたをながむれば,ただありあけのつきぞのこれる'). 読み札('おもひわびさてもいのちはあるものを,うきにたへぬはなみだなりけり'). 読み札('よのなかよみちこそなけれおもひいる,やまのおくにもしかぞなくなる'). 読み札('ながらへばまたこのごろやしのばれむ,うしとみしよぞいまはこひしき'). 読み札('よもすがらものおもふころはあけやらで,ねやのひまさへつれなかりけり'). 読み札('なげけとてつきやはものをおもはする,かこちがほなるわがなみだかな'). 読み札('むらさめのつゆもまだひぬまきのはに,きりたちのぼるあきのゆふぐれ'). 読み札('なにはえのあしのかりねのひとよゆゑ,みをつくしてやこひわたるべき'). 読み札('たまのをよたえなばたえねながらへば,しのぶることのよわりもぞする'). 読み札('みせばやなをじまのあまのそでだにも,ぬれにぞぬれしいろはかはらず'). 読み札('きりぎりすなくやしもよのさむしろに,ころもかたしきひとりかもねむ'). 読み札('わがそではしほひにみえぬおきのいしの,ひとこそしらねかわくまもなし'). 読み札('よのなかはつねにもがもななぎさこぐ,あまのをぶねのつなでかなしも'). 読み札('みよしののやまのあきかぜさよふけて,ふるさとさむくころもうつなり'). 読み札('おほけなくうきよのたみにおほふかな,わがたつそまにすみぞめのそで'). 読み札('はなさそふあらしのにはのゆきならで,ふりゆくものはわがみなりけり'). 読み札('こぬひとをまつほのうらのゆふなぎに,やくやもしほのみもこがれつつ'). 読み札('かぜそよぐならのをがはのゆふぐれは,みそぎぞなつのしるしなりける'). 読み札('ひともをしひともうらめしあぢきなく,よをおもふゆゑにものおもふみは'). 読み札('ももしきやふるきのきばのしのぶにも,なほあまりあるむかしなりけり'). */ % 以下のサイトは # # あなたは既に読んでしまった札を記憶していることにします。 # 現在の自陣にある札のうち、一文字目が決まり字である札は何枚あるでしょうか。 # '現在の自陣にある札のうち、一文字目が決まり字である札は何枚あるでしょうか。'(_まだ読んでいない札,_既に読んでしまった札,_自陣にある札ならび,_何枚) :- 自陣の札の上の句の先頭の文字の未出の読み札数(_まだ読んでいない札,_既に読んでしまった札,_自陣にある札ならび,_度数ならび), 目標の度数(member(1,_度数ならび),_何枚). 自陣の札の上の句の先頭の文字の未出の読み札数(_,_,[],[]). 自陣の札の上の句の先頭の文字の未出の読み札数(_まだ読んでいない札,_既に読んでしまった札,[_下の句|R1],[_度数|R2]) :- 下の句から上の句の先頭の文字を得る(_下の句,_上の句の先頭文字), 上の句の先頭の文字の度数を得る(_まだ読んでいない札,_既に読んでしまった札,_上の句の先頭の文字,_度数), 自陣の札の上の句の先頭の文字の未出の読み札数(_まだ読んでいない札,_既に読んでしまった札,R1,R2). 下の句から上の句の先頭の文字を得る(_下の句,_上の句の先頭の文字) :- 百人一首(_歌), '上の句と下の句'(_歌,_上の句,_下の句), '上の句の先頭の文字、下の句の先頭の文字'(_歌,_,_,_上の句の先頭の文字,_). '上の句と下の句'(_歌,_上の句,_下の句) :- sub_atom(_歌,S,1,R,' '), sub_atom(_歌,_,R,0,_下の句), 目標の度数(sub_atom(_下の句,_,1,_,' ')),1), sub_atom(_歌,0,S,_,_上の句). '上の句の先頭の文字、下の句の先頭の文字'(_歌,_上の句,_下の句,_上の句の先頭の文字,_下の句の先頭の文字) :- '上の句と下の句'(_歌,_上の句,_下の句), sub_atom(_上の句,0,1,_,_上の句の先頭の文字), sub_atom(_下の句,0,1,_,_下の句の先頭の文字). 上の句の先頭の文字の度数を得る(_既に読んでしまった札,_上の句の先頭の文字,_度数) :- 目標の度数(上の句の先頭の文字の(_上の句の先頭の文字),_度数). 上の句の先頭の文字の(_上の句の先頭の文字) :- 百人一首(_歌), \+(member(_歌,_既に読んでしまった札)), sub_atom(_歌,0,1,_,_上の句の先頭の文字). 百人一首('あきのたの かりほのいほの とまをあらみ わがころもでは つゆにぬれつつ'). 百人一首('はるすぎて なつきにけらし しろたへの ころもほすてふ あまのかぐやま'). 百人一首('あしびきの やまどりのをの しだりをの ながながしよを ひとりかもねむ'). 百人一首('たごのうらに うちいでてみれば しろたへの ふじのたかねに ゆきはふりつつ'). 百人一首('おくやまに もみぢふみわけ なくしかの こゑきくときぞ あきはかなしき'). 百人一首('かささぎの わたせるはしに おくしもの しろきをみれば よぞふけにける'). 百人一首('あまのはら ふりさけみれば かすがなる みかさのやまに いでしつきかも'). 百人一首('わがいほは みやこのたつみ しかぞすむ よをうぢやまと ひとはいふなり'). 百人一首('はなのいろは うつりにけりな いたづらに わがみよにふる ながめせしまに'). 百人一首('これやこの ゆくもかへるも わかれては しるもしらぬも あふさかのせき'). 百人一首('わたのはら やそしまかけて こぎいでぬと ひとにはつげよ あまのつりぶね'). 百人一首('あまつかぜ くものかよひぢ ふきとぢよ をとめのすがた しばしとどめむ'). 百人一首('つくばねの みねよりおつる みなのがは こひぞつもりて ふちとなりぬる'). 百人一首('みちのくの しのぶもぢずり たれゆゑに みだれそめにし われならなくに'). 百人一首('きみがため はるののにいでて わかなつむ わがころもでに ゆきはふりつつ'). 百人一首('たちわかれ いなばのやまの みねにおふる まつとしきかば いまかへりこむ'). 百人一首('ちはやぶる かみよもきかず たつたがは からくれなゐに みづくくるとは'). 百人一首('すみのえの きしによるなみ よるさへや ゆめのかよひぢ ひとめよくらむ'). 百人一首('なにはがた みじかきあしの ふしのまも あはでこのよを すぐしてよとや'). 百人一首('わびぬれば いまはたおなじ なにはなる みをつくしても あはむとぞおもふ'). 百人一首('いまこむと いひしばかりに ながつきの ありあけのつきを まちいでつるかな'). 百人一首('ふくからに あきのくさきの しをるれば むべやまかぜを あらしといふらむ'). 百人一首('つきみれば ちぢにものこそ かなしけれ わがみひとつの あきにはあらねど'). 百人一首('このたびは ぬさもとりあへず たむけやま もみぢのにしき かみのまにまに'). 百人一首('なにしおはば あふさかやまの さねかづら ひとにしられで くるよしもがな'). 百人一首('をぐらやま みねのもみぢば こころあらば いまひとたびの みゆきまたなむ'). 百人一首('みかのはら わきてながるる いづみがは いつみきとてか こひしかるらむ'). 百人一首('やまざとは ふゆぞさびしさ まさりける ひとめもくさも かれぬとおもへば'). 百人一首('こころあてに をらばやをらむ はつしもの おきまどはせる しらぎくのはな'). 百人一首('ありあけの つれなくみえし わかれより あかつきばかり うきものはなし'). 百人一首('あさぼらけ ありあけのつきと みるまでに よしののさとに ふれるしらゆき'). 百人一首('やまがはに かぜのかけたる しがらみは ながれもあへぬ もみぢなりけり'). 百人一首('ひさかたの ひかりのどけき はるのひに しづごころなく はなのちるらむ'). 百人一首('たれをかも しるひとにせむ たかさごの まつもむかしの ともならなくに'). 百人一首('ひとはいさ こころもしらず ふるさとは はなぞむかしの かににほひける'). 百人一首('なつのよは まだよひながら あけぬるを くものいづこに つきやどるらむ'). 百人一首('しらつゆに かぜのふきしく あきののは つらぬきとめぬ たまぞちりける'). 百人一首('わすらるる みをばおもはず ちかひてし ひとのいのちの をしくもあるかな'). 百人一首('あさぢふの をののしのはら しのぶれど あまりてなどか ひとのこひしき'). 百人一首('しのぶれど いろにいでにけり わがこひは ものやおもふと ひとのとふまで'). 百人一首('こひすてふ わがなはまだき たちにけり ひとしれずこそ おもひそめしか'). 百人一首('ちぎりきな かたみにそでを しぼりつつ すゑのまつやま なみこさじとは'). 百人一首('あひみての のちのこころに くらぶれば むかしはものを おもはざりけり'). 百人一首('あふことの たえてしなくは なかなかに ひとをもみをも うらみざらまし'). 百人一首('あはれとも いふべき人は 思ほえで 身のいたづらに なりぬべきかな'). 百人一首('ゆらのとを わたるふなびと かぢをたえ ゆくへもしらぬ こひのみちかな'). 百人一首('やへむぐら しげれるやどの さびしきに ひとこそみえね あきはきにけり'). 百人一首('かぜをいたみ いはうつなみの おのれのみ くだけてものを おもふころかな'). 百人一首('みかきもり ゑじのたくひの よるはもえ ひるはきえつつ ものをこそおもへ'). 百人一首('きみがため をしからざりし いのちさへ ながくもがなと おもひけるかな'). 百人一首('かくとだに えやはいぶきの さしもぐさ さしもしらじな もゆるおもひを'). 百人一首('あけぬれば くるるものとは しりながら なほうらめしき あさぼらけかな'). 百人一首('なげきつつ ひとりぬるよの あくるまは いかにひさしき ものとかはしる'). 百人一首('わすれじの ゆくすゑまでは かたければ けふをかぎりの いのちともがな'). 百人一首('たきのおとは たえてひさしく なりぬれど なこそながれて なほきこえけれ'). 百人一首('あらざらむ このよのほかの おもひでに いまひとたびの あふこともがな'). 百人一首('めぐりあひて みしやそれとも わかぬまに くもがくれにし よはのつきかな'). 百人一首('ありまやま ゐなのささはら かぜふけば いでそよひとを わすれやはする'). 百人一首('やすらはで ねなましものを さよふけて かたぶくまでの つきをみしかな'). 百人一首('おほえやま いくののみちの とほければ まだふみもみず あまのはしだて'). 百人一首('いにしへの ならのみやこの やへざくら けふここのへに にほひぬるかな'). 百人一首('よをこめて とりのそらねは はかるとも よにあふさかの せきはゆるさじ'). 百人一首('いまはただ おもひたえなむ とばかりを ひとづてならで いふよしもがな'). 百人一首('あさぼらけ うぢのかはぎり たえだえに あらはれわたる せぜのあじろぎ'). 百人一首('うらみわび ほさぬそでだに あるものを こひにくちなむ なこそをしけれ'). 百人一首('もろともに あはれとおもへ やまざくら はなよりほかに しるひともなし'). 百人一首('はるのよの ゆめばかりなる たまくらに かひなくたたむ なこそをしけれ'). 百人一首('こころにも あらでうきよに ながらへば こひしかるべき よはのつきかな'). 百人一首('あらしふく みむろのやまの もみぢばは たつたのかはの にしきなりけり'). 百人一首('さびしさに やどをたちいでて ながむれば いづこもおなじ あきのゆふぐれ'). 百人一首('ゆふされば かどたのいなば おとづれて あしのまろやに あきかぜぞふく'). 百人一首('おとにきく たかしのはまの あだなみは かけじやそでの ぬれもこそすれ'). 百人一首('たかさごの をのへのさくら さきにけり とやまのかすみ たたずもあらなむ'). 百人一首('うかりける ひとをはつせの やまおろしよ はげしかれとは いのらぬものを'). 百人一首('ちぎりおきし させもがつゆを いのちにて あはれことしの あきもいぬめり'). 百人一首('わたのはら こぎいでてみれば ひさかたの くもゐにまがふ おきつしらなみ'). 百人一首(' せをはやみ いはにせかるる たきがはの われてもすゑに あはむとぞおもふ'). 百人一首('あはぢしま かよふちどりの なくこゑに いくよねざめぬ すまのせきもり'). 百人一首('あきかぜに たなびくくもの たえまより もれいづるつきの かげのさやけさ'). 百人一首('ながからむ こころもしらず くろかみの みだれてけさは ものをこそおもへ'). 百人一首('ほととぎす なきつるかたを ながむれば ただありあけの つきぞのこれる'). 百人一首('おもひわび さてもいのちは あるものを うきにたへぬは なみだなりけり'). 百人一首('よのなかよ みちこそなけれ おもひいる やまのおくにも しかぞなくなる'). 百人一首('ながらへば またこのごろや しのばれむ うしとみしよぞ いまはこひしき'). 百人一首('よもすがら ものおもふころは あけやらで ねやのひまさへ つれなかりけり'). 百人一首('なげけとて つきやはものを おもはする かこちがほなる わがなみだかな'). 百人一首('むらさめの つゆもまだひぬ まきのはに きりたちのぼる あきのゆふぐれ'). 百人一首('なにはえの あしのかりねの ひとよゆゑ みをつくしてや こひわたるべき'). 百人一首('たまのをよ たえなばたえね ながらへば しのぶることの よわりもぞする'). 百人一首('みせばやな をじまのあまの そでだにも ぬれにぞぬれし いろはかはらず'). 百人一首('きりぎりす なくやしもよの さむしろに ころもかたしき ひとりかもねむ'). 百人一首('わがそでは しほひにみえぬ おきのいしの ひとこそしらね かわくまもなし'). 百人一首('よのなかは つねにもがもな なぎさこぐ あまのをぶねの つなでかなしも'). 百人一首('みよしのの やまのあきかぜ さよふけて ふるさとさむく ころもうつなり'). 百人一首('おほけなく うきよのたみに おほふかな わがたつそまに すみぞめのそで'). 百人一首('はなさそふ あらしのにはの ゆきならで ふりゆくものは わがみなりけり'). 百人一首('こぬひとを まつほのうらの ゆふなぎに やくやもしほの みもこがれつつ'). 百人一首('かぜそよぐ ならのをがはの ゆふぐれは みそぎぞなつの しるしなりける'). 百人一首('ひともをし ひともうらめし あぢきなく よをおもふゆゑに ものおもふみは'). 百人一首('ももしきや ふるきのきばの しのぶにも なほあまりある むかしなりけり'). 目標の度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0.0,200.0,_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), read_term_from_atom(_身長文字列,_身長,[]), read_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重) :- 収束条件を満たす(_体重_下,_体重_上,_体重),!. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下_1,_体重_上_1,_身長,_BMI,_体重) :- '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重). 収束条件を満たす(_体重_下,_体重_上,_体重) :- (_体重_上 - _体重_下) < 0.1, _体重 is (_体重_上 + _体重_下) / 2. '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上) :- '新しい体重とその時のBMIを計算する'(_体重_下_1,_体重_上_1,_身長,_BMI_2,_体重_2), '次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_体重_2,_BMI,_BMI_2,_体重_下,_体重_上). '新しい体重とその時のBMIを計算する'(_体重_下,_体重_上,_身長,_BMI_2,_体重_2) :- _体重_2 is (_体重_下 + _体重_上) / 2, _BMI_2 is _体重_2 / ((_身長 / 100) ^ 2). '次の体重の計算区間を得る'(_体重_下,_,_体重_2,_BMI,_BMI_2,_体重_下,_体重_2) :- _BMI_2 =< _BMI,!. '次の体重の計算区間を得る'(_体重_下,_体重_上,_体重_2,_BMI,_BMI_2,_体重_2,_体重_上). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % これはsplitをわかりやすいように簡略化した定義です。 % より完全なsplit/3の定義はこちらをご覧ください % split(_文,_区切り語ならび,_区切られた語ならび) :- 区切り語ならびの変形(_区切り語ならび,SeparatersL), atom_chars(_文,_文字ならび), split_list_1(_文字ならび,SeparatersL,_区切られた語ならび). sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. 'SPLIT'(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Z), Z = X,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% split_list([],SeparatersL,[]). split_list(L1,SeparatersL,[L2|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), split_list(R2,SeparatersL,R). split_list(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list(R2,SeparatersL,X). split_list_1([],SeparatersL,[]). split_list_1(L1,SeparatersL,[A|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), atom_chars(A,L2), split_list_1(R2,SeparatersL,R). split_list_1(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list_1(R2,SeparatersL,X). split_list_2([],_,[],[]). split_list_2(L1,SeparatersL,[],R) :- member(L2,SeparatersL), append(L2,R,L1). split_list_2([A|R1],SeparatersL,[A|R2],R) :- \+((member(L2,SeparatersL),append(L2,_,[A|R1]))), split_list_2(R1,SeparatersL,R2,R). 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび), atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,NL), catch(atom_chars(C,NL),_,fail),!. split_5(B,C) :- concat_atom(B,C),!. split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42([],[],'',_,[]) :- !. numeric_list([],[]) :- !. numeric_list([A|R],[B|R1]) :- digit(A), char_code(A,B), numeric_list(R,R1),!. numeric_list(['.'|R],[46|R1]) :- numeric_list(R,R1),!. numeric_list([-|R],[45|R1]) :- numeric_list(R,R1),!. number(A,B) :- number_codes(A,B). % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), get_term_from_atom(_身長文字列,_身長,[]), get_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重) :- '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0,_身長,_BMI,_体重_BMIとの差ならび), 'BMIの計算差が最小のものの体重'(_体重_BMIとの差ならび,_体重). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(2000,_身長,_BMI,[]) :- !. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(N,_身長,_BMI,[[N,_BMI_の計算差]|R]) :- '身長、体重から、BMIの計算差を得る'(N,_身長,_BMI,N_2,_体重,_BMIの計算差), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(N_2,_身長,_BMI,R). '身長、体重から、BMIの計算差を得る'(N,_身長,_BMI,N_2,_体重,_BMIの計算差) :- _BMIの計算差 is abs((N / 10) / ((_身長 / 100) ^ 2)) - _BMI), succ(N,N_2), _体重 is N / 10. 'BMIの計算差が最小のものの体重'(_N_BMIとの差ならび,_体重) :- select([_体重,_BMIの差],_N_BMIとの差ならび,R), forall(member([_,_BMIの差_1],R),_BMIの差 =< _BMIの差_1). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), get_term_from_atom(_身長文字列,_身長,[]), get_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重) :- _体重 is _BMI * (_身長 / 100) ^ 2. 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/db/1402919549/274 # よろしくお願いいたします。 # 【DBMS名とバージョン】Oracle 11g # 【テーブルデータ】 # ID   YMD # 1  20140101 # 1  20140102 # 1  20140103 # 1  20140105 # 1  20140106 # 2  20140101 # 2  20140102 # 【欲しい結果 】 # ID START_YMD END_YMD # 1 20140101 20140103 # 1 20140105 20140106 # 2 20140101 20140102 # 【説明】 # レコード単位で一日の日付を持つデータをグループかして、 # 開始日付と終了日付に集約したいです。 # ただし、一日でも間があれば、集約データ内では別レコードとして扱いたいです。 # # どなたかいいお知恵がございましたら、よろしくお願いいたしますm(_ _)m # # 'レコード単位で一日の日付を持つデータをグループかして、 開始日付と終了日付に集約したいです。 ただし、一日でも間があれば、集約データ内では別レコードとして扱いたいです。'(_id,_START_YMD,_END_YMD) :- setof(_ID,[_ID,_YMD] ^ table(_ID,_YMD),_ID候補), member(_ID,_ID候補), setof(_YMD,[_ID,_YMD] ^ table(_ID,_YMD),_YMD候補), 連続性検査(_YMD候補,_START_YMD,_END_YMD). 連続性検査(_YMD候補,_START_YMD,_END_YMD) :- append([L1,[_START_YMD|R2],L2],_YMD候補), 連続している([_START_YMD|R2],_END_YMD), 連続していない(L1,[_START_YMD]), 連続していない([_END_YMD],L2). 連続している([_END_YMD],_END_YMD) :- !. 連続している([_YMD_1,_YMD_2|R1],_END_YMD) :- 翌日(_YMD_1,_YMD_2), 連続している([_YMD_2|R1],_END_YMD). 連続していない(L1,L2) :- \+((last(L1,_YMD_1),L2 = [_YMD_2|_],翌日(_YMD_1,_YMD_2))). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 翌日(_YMD,_翌日) :- 年月日(_YMD,_年,_月,_日), 翌日(_年,_月,_日,_翌日). 年月日(_YMD,_年,_月,_日) :- sub_atom(_YMD,0,2,_,_年), sub_atom(_YMD,2,2,_,_月), sub_atom(_YMD,4,2,_,_日). 翌日(_年,_月,_日,_翌日) :- 年月換わり(年,_月,_日,_翌日),!. 翌日(_年,_月,_日,_翌日) :- 翌日の日(_日,_翌日の日), atomic_list_concat([_年,_月,_翌日の日],_翌日). 年月換わり(_年,'02',_月末日,_翌日) :- 二月月末(_年,'02',_月末日,_翌日). 年月換わり(_年,_月,_月末日,_翌日) :- 小の月の月末日の翌日(_月,_月末日,_翌日). 年月換わり(_年,_月,_月末日,_翌日) :- 大の月の月末日の翌日(_年,_月,_月末日,_翌日). 二月月末(_年,'02','29',_翌日) :- atomic_list_concat([_年,'03','01'],_翌日). 二月月末(_年,'02','28',_翌日) :- atom_number(_年,_年整数), \+(うるう年(_年整数)), atomic_list_concat([_年,'03','01'],_翌日). 小の月の月末日の翌日(_月,'30',_翌日) :- member(_月,['04','06','09','11']), 翌月(_月,_翌月), atomic_list_concat([_年,_翌月,'01'],_翌日). 大の月の月末日の翌日(_年,_月,'31',_翌日) :- member(_月,['01','03','05','07','08','10','12']), 翌月(_月,_翌月), 年換わり(_年,_月,_年_1), atomic_list_concat([_年_1,_翌月,'01'],_翌日). 年換わり(_年,'12',_翌年) :- 翌年(_年,_翌年). 年換わり(_年,_月,_年) :- \+(_月='12'). うるう年(_うるう年) :- 0 is mod _うるう年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_うるう年) :- 0 is _うるう年 mod 4. 翌月('01','02'). 翌月('02','03'). 翌月('03','04'). 翌月('04','05'). 翌月('05','06'). 翌月('06','07'). 翌月('07','08'). 翌月('08','09'). 翌月('09','10'). 翌月('10','11'). 翌月('11','12'). 翌月('12','01'). 翌日の日('01','02'). 翌日の日('02','03'). 翌日の日('03','04'). 翌日の日('04','05'). 翌日の日('05','06'). 翌日の日('06','07'). 翌日の日('07','08'). 翌日の日('08','09'). 翌日の日('09','10'). 翌日の日('10','11'). 翌日の日('11','12'). 翌日の日('12','13'). 翌日の日('13','14'). 翌日の日('14','15'). 翌日の日('15','16'). 翌日の日('16','17'). 翌日の日('17','18'). 翌日の日('18','19'). 翌日の日('19','20'). 翌日の日('20','21'). 翌日の日('21','22'). 翌日の日('22','23'). 翌日の日('23','24'). 翌日の日('24','25'). 翌日の日('25','26'). 翌日の日('26','27'). 翌日の日('27','28'). 翌日の日('28','29'). 翌日の日('29','30'). 翌日の日('30','31'). 翌年(_年,_翌年) :- atom_number(_年,_年整数), succ(_年整数,_翌年の年整数), atom_number(_翌年,_翌年の年整数). % 以下のサイトは # 問題文 # 天下一王国では整数は辞書順比較で表します。入国したばかりのダイキ君はとりあえず 1000 までの整数を書き出すことにしました。 # # 1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力してください。 # # 辞書順比較について # 文字列 A に対して、 Ai で i 番目の文字を表し、 |A| で文字列 A の文字数を表すことにすると、文字列 A と文字列 B を辞書順比較で比較するとは、 # # Ai≠Bi となる最小の i (1?i?min(|A|, |B|))に対して # AiBi であれば、文字列 A は文字列 B より大きい # そのような i が存在しなければ、文字数が少ない方を小さいとする # として文字列 A と文字列 B の大小関係を決めることである。 # # 例えば、 1, 2, 11, 12, 21 を辞書順比較で昇順にソートすると 1, 11, 12, 2, 21 となる。 # # 入力 # この問題では入力は与えられない。 # # # 出力 # 1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力せよ。 # # なお、行の終端には改行が必要である。 '1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力してください。' :- '1 以上 1000 以下のすべての整数を十進数で表した文字列を'(_十進文字列ならび), '辞書順比較で昇順にソートして、'(_十進文字列ならび,_辞書順比較で昇順にソートされた文字列ならび), '1 行ずつ出力してください。'(_辞書順比較で昇順にソートされた文字列ならび). '1 以上 1000 以下のすべての整数を十進数で表した文字列を'(_十進文字列ならび) :- findall(_十進文字列,'1 以上 1000 以下のすべての整数を十進数で表した'(_十進数文字列),_十進文字列ならび). '1 以上 1000 以下のすべての整数を十進数で表した'(_十進数文字列) :- '1 以上 1000 以下のすべての整数を'(_整数), 十進数で表した(_整数,_十進数で表した). '1 以上 1000 以下のすべての整数を'(_整数) :- between(1,1000,_整数). 十進数で表した文字列を(_整数,_十進数で表した文字列) :- number_chars(_整数,Chars), atom_chars(_十進数で表した文字列,Chars). '辞書順比較で昇順にソートして、'([],[]). '辞書順比較で昇順にソートして、'([_軸要素|L1],L2) :- '辞書順比較で軸要素との大小で分割'(_軸要素,L1,L1_1,L1_2), '辞書順比較で昇順にソートして、'(L1_1,L1_1_2), '辞書順比較で昇順にソートして、'(L1_2,L1_2_2), append(L1_1_2,[_軸要素|L1_2_2],L2). '辞書順比較で軸要素との大小で分割'(_,[],[],[]). '辞書順比較で軸要素との大小で分割'(_軸要素,[A|R2],[A|R3],R4) :- '辞書順に小さい'(A,_軸要素),!, '辞書順比較で軸要素との大小で分割'(_軸要素,R2,R3,R4). '辞書順比較で軸要素との大小で分割'(_軸要素,[A|R2],R3,[A|R4]) :- '辞書順比較で軸要素との大小で分割'(_軸要素,R2,R3,R4). '辞書順に小さい'(_文字列_1,_文字列_2) :- '文字列_1に小さい文字が先に出現した'(_文字列_1,_文字列_2),!. '辞書順に小さい'(_文字列_1,_文字列_2) :- 文字列の差分が文字列_2にある(_文字列_1,_文字列_2). '文字列_1に小さい文字が先に出現した'(_文字列_1,_文字列_2) :- 先頭から同一位置の文字を比較して(_文字列_1,_文字列_2,_文字_1,_文字_2), \+(_文字_1 = _文字_2),!, _文字_1 @< _文字_2. 先頭から同一位置の文字を比較して(_文字列_1,_文字列_2,_文字_1,_文字_2) :- sub_atom(_文字列_1,_同一位置,1,_,_文字_1), sub_atom(_文字列_2,_同一位置,1,_,_文字_2). '文字列の差分が文字列_2にある'(_文字列_1,_文字列_2) :- sub_atom(_文字列_2,0,_文字列_1の長さ,_差分文字数,_文字列_1), _差分文字数 > 0. '1 行ずつ出力してください。'(L2) :- forall(member(M,L2),writef('%t\n',[M])). % 以下のサイトは # phpの文字置換で質問です # # 【目的】 文字列内の ab を a にする ただしabの後ろがcの場合を除く # 例 ab123 → a123 、 abcde → abcde # # という条件を正規表現で記述するにはどのように書けばよいでしょうか? # # よろしくおねがいします '文字列内の ab を a にする ただしabの後ろがcの場合を除く'(_文字列,_置換された文字列) :- '文字列内のabただしabの後ろがcの場合を除く'(_文字列,_前文字列,_後文字列), '文字列内の ab を a にする ただしabの後ろがcの場合を除く'(_後文字列,_置換された文字列_2), atomic_list_concat([_前文字列,a,_置換された文字列_2],_置換された文字列),!. '文字列内の ab を a にする ただしabの後ろがcの場合を除く'(_文字列,_文字列). '文字列内のabただしabの後ろがcの場合を除く'(_文字列,_前文字列,_後文字列) :- '文字列内のab'(_文字列,_前文字列,_後文字列), 'ただしabの後ろがcの場合を除く'(_後文字列). '文字列内のab'(_文字列,_前文字列,_後文字列) :- sub_atom(_文字列,S,2,R,ab), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 'ただしabの後ろがcの場合を除く'(_後文字列) :- \+(sub_atom(_後文字列,0,1,_,c)). % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #723 # # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 例えばある文字列の中の「体」を「體」へ、「旧」を「舊」へ…、というように変換したいときに全て書き連ねるのではなく正規表現で簡潔に表現する方法はないでしょうか # '例えばある文字列の中の「体」を「體」へ、「旧」を「舊」へ…、というように変換したいときに全て書き連ねるのではなく正規表現で簡潔に表現する方法はないでしょうか'(_文字列,_置換された文字列) :- findall(_文字,文字列中の文字を可能ならば異体字に変換する(_文字列,_文字),L), atomic_list_concat(L,_置換された文字列). 文字列中の文字を可能ならば異体字に変換する(_文字列,_文字) :- sub_atom(_文字列,_,1,_,_文字_1), 異体字変換(_文字_1,_文字). 異体字変換(_文字_1,_文字_2) :- 異体字(_文字_1,_文字_2),!. 異体字変換(_文字,_文字). % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #713 # # abcxy # abcxY # abcXy # abcXY # に一致する表現を教えてください。 # 'abcxy abcxY abcXy abcXY に一致する'(_一致する文字列) :- sub_atom(_一致する文字列,_,_,_,_副文字列), member(_副文字列,[abcxy,abcXy,abcxY,abcXY]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/754 # お題:与えられた文字列を正方形にして出力 # 縦横の字数が等しければ正方形とします # 字数が足りない場合は'*'で埋めること # 余る場合は余計な文字を捨ててかまいません # ただし与えられた字数により近い正方形にすること # 例:http://jump.2ch.net/?ideone.com/mA41q6 # 1, 2=1x1 # 3, 4, 5, 6=2x2 # 7, 8, 9, 10, 11, 12=3x3 # 13, 14, 15, 16=4x4 # 最終行が*だけにならないようにすること。 # '与えられた文字列を正方形にして出力 縦横の字数が等しければ正方形とします 字数が足りない場合は'*'で埋めること 余る場合は余計な文字を捨ててかまいません ただし与えられた字数により近い正方形にすること 例:http://jump.2ch.net/?ideone.com/mA41q6 1, 2=1x1 3, 4, 5, 6=2x2 7, 8, 9, 10, 11, 12=3x3 13, 14, 15, 16=4x4 最終行が*だけにならないようにすること。'(_与えられた文字列,_正方形の文字列) :- 縦横の字数(_与えられた文字列,_縦横の字数), '与えられた文字列を正方形にして出力 縦横の字数が等しければ正方形とします 字数が足りない場合は'*'で埋めること 余る場合は余計な文字を捨ててかまいません'(_与えられた文字列,_縦横の字数,_正方形の文字列). 縦横の字数(_文字列ならび,_縦横の字数) :- sub_atom(_与えられた文字列,0,_文字列の長さ,1,_与えられた文字列), _縦横の字数_1 is floor(sqrt(_文字列の長さ)), _縦横の字数_2 is ceiling(sqrt(_文字列の長さ)), 縦横の字数の選択(_文字列の長さ,_縦横の字数_1,_縦横の字数_2,_縦横の字数). 縦横の字数の選択(_文字列の長さ,_縦横の字数_1,_縦横の字数_2,_縦横の字数_1) :- abs(_縦横の字数_1 ^ 2 - _文字列の長さ) =< abs(_縦横の字数_2 ^ 2 - _文字列の長さ),!. 縦横の字数の選択(_文字列の長さ,_縦横の字数_1,_縦横の字数_2,_縦横の字数_2). '与えられた文字列を正方形にして出力 縦横の字数が等しければ正方形とします 字数が足りない場合は * で埋めること 余る場合は余計な文字を捨ててかまいません'(_文字列,_縦横の字数,_正方形の文字列) :- findall(_行,( sub_atom(_文字列,_変位,_縦横の字数,_残り文字数,_行), 0 is _変位 mod _縦横の字数, (_行=_行_1;_残り文字数 < _縦横の字数,'字数が足りない場合は * で埋めること'(_文字列,_縦横の字数,_残り文字数,_行),!,fail)), _正方形の文字列). '字数が足りない場合は * で埋めること'(_文字列,_縦横の字数,_残り文字数,_行) :- atom_length(_文字列,_文字数), _星の時数 is _縦横の字数 - _残り文字数, 星文字列(_星の字数,_星文字列), sub_atom(_文字列,_,_残り文字数,0,_副文字列), atom_concat(_副文字列,_星文字列,_行). 星文字列(_字数,_星文字列) :- findall(*,between(1,_字数,_),_星ならび), atomic_list_concat(_星ならび,_星文字列). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/861 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # (Run Length圧縮) # 文字列が連続した場合、ある規則で文字を置き換え、 # 文字列を短くすることができます。 # 例えば、AAAAという文字列の場合、@4Aと表現すれば # 1文字分圧縮されます。 # この規則で圧縮された文字列を入力して # もとの文字列に復元して終了するプログラムを # 作成してください。 # ただし、復元した文字列に@文字は出現しないものとします。 # # 原文の文字列は半角の英大文字、英小文字、数字、記号であり100文字以内、連続する文字は9文字以内です。 # # 実行例) # ab@5C1@8050 入力 # abCCCCC10000000050 出力 # @99+1=1@90 入力 # 999999999+1=1000000000 出力 # '文字列が連続した場合、ある規則で文字を置き換え、 文字列を短くすることができます。 例えば、AAAAという文字列の場合、@4Aと表現すれば 1文字分圧縮されます。 この規則で圧縮された文字列を入力して もとの文字列に復元して終了するプログラムを 作成してください。 ただし、復元した文字列に@文字は出現しないものとします。 原文の文字列は半角の英大文字、英小文字、数字、記号であり100文字以内、連続する文字は9文字以内です。 実行例) ab@5C1@8050 入力 abCCCCC10000000050 出力 @99+1=1@90 入力 999999999+1=1000000000 出力' :- '文字列が連続した場合、ある規則で文字を置き換え、 文字列を短くすることができます。 例えば、AAAAという文字列の場合、@4Aと表現すれば 1文字分圧縮されます。 この規則で圧縮された文字列を入力して もとの文字列に復元して終了する'. '文字列が連続した場合、ある規則で文字を置き換え、 文字列を短くすることができます。 例えば、AAAAという文字列の場合、@4Aと表現すれば 1文字分圧縮されます。 この規則で圧縮された文字列を入力して もとの文字列に復元して終了する' :- 圧縮された文字列を入力し(_圧縮された文字列), もとの文字列に復元して(_圧縮された文字列,_復元された文字列), 終了する(_復元された文字列). 圧縮された文字列を入力し(_圧縮された文字列) :- get_line(_圧縮された文字列). もとの文字列に復元して(_圧縮された文字列,_復元された文字列) :- '前文字列、圧縮部の復元された数字列,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部の復元された数字列,_後文字列), もとの文字列に復元して(_後文字列,_復元された文字列_2), atomic_list_concat([_前文字列,_数字列,_復元された文字列_2],_復元された文字列),!. もとの文字列に復元して(_文字列,_文字列). '前文字列、圧縮部の復元された数字列,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部の復元された数字列,_後文字列) :- '前文字列、圧縮部,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部,_後文字列), 圧縮部を復元する(_圧縮部,_圧縮部の復元された数字列). '前文字列、圧縮部,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部,_後文字列) :- sub_atom(_圧縮された文字列,S,3,R,_圧縮部), sub_atom(_圧縮部,0,1,2,'@'), sub_atom(_圧縮された文字列,0,S,_,_前文字列), sub_atom(_圧縮された文字列,_,R,0,_後文字列). 圧縮部を復元する(_圧縮部,_圧縮部の復元された数字列) :- sub_atom(_圧縮部,1,1,_,_繰り返し回数文字), sub_atom(_圧縮部,2,1,_,_繰り返される数文字), atom_numbers(_繰り返し回数文字,[_繰り返し回数]), findall(_繰り返される数字,between(1,_繰り返し回数数,_),_圧縮部の復元された数字列). 終了する(_復元された文字列) :- writef('%t\n',[_復元された文字列]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/833 # [1] 授業単元: プログラミング1 # [2] 問題文 # 文字列が入力され, # 次に表示したい文字の番号が入力されるので、 # その番号の文字を表示すること # 範囲を超えた場合は、NAと表示する # (番号は、1から始まる) # (文字列は50文字以内) # # 実行例 # abcdfge 入力1 # 3 入力2 # # '文字列が入力され, 次に表示したい文字の番号が入力されるので、 その番号の文字を表示すること 範囲を超えた場合は、NAと表示する (番号は、1から始まる) (文字列は50文字以内)' :- '文字列が入力され,(文字列は50文字以内)'(_文字列,_文字列長), '次に表示したい文字の番号が入力されるので、'(_文字の番号), 'その番号の文字を表示すること範囲を超えた場合は、NAと表示する(番号は、1から始まる)'(_文字列,_文字列長,_文字の番号),!. '文字列が入力され,(文字列は50文字以内)'(_文字列長,_文字列) :- get_line(_文字列), atom_length(_文字列,_文字列長), _文字列長 =< 50. '文字列が入力され,(文字列は50文字以内)'(_文字列) :- '文字列が入力され,(文字列は50文字以内)'(_文字列). '次に表示したい文字の番号が入力されるので、'(_文字の番号) :- 整数を得る(表示したい文字の番号,true,_文字の番号). 'その番号の文字を表示すること範囲を超えた場合は、NAと表示する(番号は、1から始まる)'(_文字列,_文字列長,_文字の番号) :- succ(_nth0,_文字の番号), sub_atom(_文字列,_nth0,1,_,_文字), writef('%t\n',[_文字]). 'その番号の文字を表示すること範囲を超えた場合は、NAと表示する(番号は、1から始まる)'(_文字列,_文字列長,_文字の番号) :- write('NA\n'). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/577 # コードゴルフ # # 月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ # 標準入力から以下の形式で与えられる # D W # # '月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ 標準入力から以下の形式で与えられる D W ' :- '標準入力から以下の形式で与えられる D W '(D,W), '月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ'(D,W). '標準入力から以下の形式で与えられる D W '(D,W) :- get_line(_行), split(_行,[' '],[D,W]). '月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ'(D,W) :- sub_atom(土金木水火月日,U,1,_,W), M is ((D + U - 1) mod 7) * 3, sub_atom('SatFriThrWedTueMonSun',M,3,_,X), wirte(X). % コードゴルフ参加 p(W,D):-sub_atom(土金木水火月日,U,1,_,W),M is ((D+U-1) mod 7)*3,sub_atom('SatFriThrWedTueMonSun',M,3,_,X),wirte(X). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/771 # [1] 授業単元:プログラミング # [2] 問題文 # 10人の学生の点数を読み込み、配布を図のように表示するプログラムを作成せよ # #     100: * # 90 - 99: ** # 80 - 89: *** #    (中略) # 0 -  9: * # # 点数は100点満点とし、人数分だけ * を出力すること #  [3.1] OS: Windows8 #  [3.3] 言語: C # よろしくお願いします。 # # '10人の学生の点数を読み込み、配布を図のように表示するプログラムを作成せよ     100: * 90 - 99: ** 80 - 89: ***    (中略) 0 -  9: * 点数は100点満点とし、人数分だけ * を出力すること' '点数は100点満点とし、10人の学生の点数を読み込み、'(_10人の学生の点数), '配布を図のように表示するプログラムを作成せよ     100: * 90 - 99: ** 80 - 89: ***    (中略) 0 -  9: * 点数は100点満点とし、人数分だけ * を出力すること'(_10人の学生の点数). '点数は100点満点とし、10人の学生の点数を読み込み、'(_10人の学生の点数) :- findall(_学生の点数,( between(1,10,_), 整数を得る(学生の点数,'点数は100点満点とし、'(_学生の点数),_学生の点数)), _10人の学生の点数). '点数は100点満点とし、'(_学生の点数) :- _学生の点数 >= 0, _学生の点数 =< 100. '配布を図のように表示するプログラムを作成せよ     100: * 90 - 99: ** 80 - 89: ***    (中略) 0 -  9: * 点数は100点満点とし、人数分だけ * を出力すること'(_10人の学生の点数) :- 表示は100点だけ特別(_10人の学生点数), '100点以外の10クラスの表示'(_10人の学生の点数). 表示は100点だけ特別(_10人の学生の点数) :- クラスの学生の人数(_10人の学生の点数,100,100,_100点の学生の人数), sub_atom('**********',0,_100点の学生の人数,_,_100点の学生の人数表示), writef(' 100: %t\n',[_100点の学生の人数表示]),!. '100点以外の10クラスの表示'(_10人の学生の点数) :- クラスの学生の人数(_クラス,_10人の学生の点数,_クラスの下限の点数,_クラスの上限の点数,_クラスの学生の人数), sub_atom('**********',0,_クラスの学生の人数,_,_クラスの学生の人数表示), writef('%3R-%3R: %t\n',[_クラスの下限の点数,_クラスの上限の点数,_クラスの学生の人数表示]), _クラス = 0. クラスの学生の人数(_クラス,_10人の学生の点数,_クラスの下限の点数,_クラスの上限の点数,_クラスの学生の人数) :- member(_クラス,[9,8,7,6,5,4,3,2,1,0]), 'クラスの下限の点数、上限の点数'(_クラスの下限の点数,_クラスの上限の点数), クラスの学生の人数(_10人の学生の点数,_クラスの下限の点数,_クラスの上限の点数,_クラスの学生の人数). 'クラスの下限の点数、上限の点数'(_クラスの下限の点数,_クラスの上限の点数) :- _クラスの下限の点数 is _クラス * 10, _クラスの上限の点数 is _クラス * 10 + 9. クラスの学生の人数(_10人の学生の点数,_クラスの下限の点数,_クラスの上限の点数,_クラスの学生の人数) :- finsum(1,( member(_学生の点数,_10人の学生の点数), _学生の点数 >= _クラスの下限の点数, _学生の点数 =< _クラスの上限の点数)), _クラスの学生の人数). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/549 # お題:数独の答を表す文字列が与えられたとき、'1'が各列の何行目にあるかを # いちばん左の列から順に調べて表示する。 # 入力 # 145327698 # 839654127 # 672918543 # 496185372 # 218473956 # 753296481 # 367542819 # 984761235 # 521839764 # # 出力 # 159438276 # # '数独の答を表す文字列が与えられたとき、1が各列の何行目にあるかをいちばん左の列から順に調べて表示する。'(_数独文字列,_列目,_行目) :- 数独文字列を数独に変換(_数独文字列,_数独), 転置(_数独,_転置された数独), forall('1が各列の何行目にあるかをいちばん左の列から順に調べて'(_転置された数独,_行目),write(_行目)). 数独文字列を数独に変換(_数独文字列,_数独) :- split(_数独文字列,['\n'],_数独文字列行ならび), findall(_数独行,( findall(_数,( sub_atom(_数独文字列,_,1,_,_文字), 数値に変換(_文字,_数)), _数独行)), _数独). '1が各列の何行目にあるかをいちばん左の列から順に調べて'(_転置された数独,_行目) :- nth1(_列目,_転置された数独,_列), nth1(_行目,_列,'1'). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/741 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成すること # 英文の回文判定 # 回文とは、どちらから読んでも # 同じ並びになる文章。 # 1つの英文字列(100文字以内)が入力されるので、 # 回文であれば、GOODと表示 # 回文でなければ、NGと表示 # *大文字小文字を区別しない # *「?!,. 」を無視する # # 実行例) # apple 入力 # NG 出力 # Borrow or rob? 入力 # GOOD 出力 # Kodak ad? OK! 入力 # GOOD 出力 # What time is it? 入力 # NG 出力 # Was it a bar or a bat I saw? 入力 # GOOD 出力 # '英文の回文判定 回文とは、どちらから読んでも 同じ並びになる文章。 1つの英文字列(100文字以内)が入力されるので、 回文であれば、GOODと表示 回文でなければ、NGと表示 *大文字小文字を区別しない *「?!,. 」を無視する' :- '1つの英文字列(100文字以内)が入力されるので、'(_文字列), '回文であれば、GOODと表示 回文でなければ、NGと表示 *大文字小文字を区別しない *「?!,. 」を無視する'(_文字列). '1つの英文字列(100文字以内)が入力されるので、'(_文字列) :- get_line(_文字列), atom_length(_文字列,_文字列の長さ), _文字列の長さ =< 100,!. '1つの英文字列(100文字以内)が入力されるので、'(_文字列) :- '1つの英文字列(100文字以内)が入力されるので、'(_文字列). '回文であれば、GOODと表示 回文でなければ、NGと表示 *大文字小文字を区別しない *「?!,. 」を無視する'(_文字列) :- '*大文字小文字を区別しない *「?!,. 」を無視する'(_文字列,_回文判定文字列), '回文であれば、GOODと表示 回文でなければ、NGと表示'(_回文判定文字列). '*大文字小文字を区別しない *「?!,. 」を無視する'('',''). '*大文字小文字を区別しない *「?!,. 」を無視する'(_文字列_1,_文字列) :- 最初の文字と残り文字列(_文字列_1,_文字,_残り文字列), '大文字を小文字に変換し、「?!,. 」を無視する'(_文字,_文字_2), '*大文字小文字を区別しない *「?!,. 」を無視する'(_残り文字列,_文字列_2), atom_concat(_文字_2,_文字列_2,_文字列). '大文字を小文字に変換し、「?!,. 」を無視する'(_文字,_文字_2) :- '大文字を小文字に変換し'(_文字,_文字_1), '*「?!,. 」を無視する'(_文字_1,_文字_2). 大文字を小文字に変換(_文字,_小文字) :- 英大文字英小文字(_文字,_小文字),!. 大文字を小文字に変換(_文字,_文字). 英大文字英小文字('A',a). 英大文字英小文字('B',b). 英大文字英小文字('C',c). 英大文字英小文字('D',d). 英大文字英小文字('E',e). 英大文字英小文字('F',f). 英大文字英小文字('G',g). 英大文字英小文字('H',h). 英大文字英小文字('I',i). 英大文字英小文字('J',j). 英大文字英小文字('K',k). 英大文字英小文字('L',l). 英大文字英小文字('M',m). 英大文字英小文字('N',n). 英大文字英小文字('O',o). 英大文字英小文字('P',p). 英大文字英小文字('Q',q). 英大文字英小文字('R',r). 英大文字英小文字('S',s). 英大文字英小文字('T',t). 英大文字英小文字('U',u). 英大文字英小文字('V',v). 英大文字英小文字('W',w). 英大文字英小文字('X',x). 英大文字英小文字('Y',y). 英大文字英小文字('Z',z). '*「?!,. 」を無視する'(_文字,'') :- member(_文字,['?','!','.',' ']),!. '*「?!,. 」を無視する'(_文字,_文字). '回文であれば、GOODと表示 回文でなければ、NGと表示'(_文字列) :- '回文であれば、'(_文字列), 'GOODと表示'. '回文であれば、GOODと表示 回文でなければ、NGと表示'(_) :- '回文でなければ、'(_文字列), 'NGと表示'. '回文であれば、'(_文字列) :- forall((sub_atom(_文字列,S,1,R,_文字),S =< R),sub_atom(_文字列,R,1,S,_文字)). '回文でなければ、'(_文字列) :- \+('回文であれば、'(_文字列)). 'GOODと表示' :- write('Good\n'). 'NGと表示' :- write('NG\n'). % 以下のサイトは " 出典: このディレクトリの索引 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # ?以下のプログラムを作成しなさい. # 文字列を入力して、 # その文字列が数字であるかどうか調べる # (符号も対応すること) # (数字は、intの範囲内で) # (0023は、数字として扱う) # 実行例) # 1234 入力 # number 出力 # 1234abncdef 入力 # string 出力 # ab^d34x 入力 # string 出力 # -92837 入力 # number 出力 # +37 入力 # number 出力 # [3] 環境 . #  [3.1] Windows 8.1 #  [3.2] Visual studio 2013 #  [3.3] C # [4] 期限:2014年7月14日0:00 '文字列を入力して、その文字列が数字であるかどうか調べる(符号も対応すること)(数字は、intの範囲内で)(0023は、数字として扱う)' :- get_line(_文字列), '文字列を入力して、その文字列が数字であるかどうか調べる(符号も対応すること)(数字は、intの範囲内で)(0023は、数字として扱う)'(_文字列). '文字列を入力して、その文字列が数字であるかどうか調べる(符号も対応すること)(数字は、intの範囲内で)(0023は、数字として扱う)'(_文字列) :- その文字列が数字であるかどうか調べる(_文字列). その文字列が数字であるかどうか調べる(_文字列) :- その文字列は数字を構成する(_文字列). その文字列は数字を構成する(_文字列) :- 数字文字列(_文字列), write('number\n'). その文字列は数字を構成する(_文字列) :- \+(数字文字列(_文字列)), write('string\n'). 数字文字列(_文字列) :- '先頭文字が+または-である'(_文字列,_残り文字列), '記号を除く数字ならび。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_残り文字列),!. 数字文字列(_文字列) :- '記号を除く数字文字列。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_文字列). '先頭文字が+または-である'(_文字列,_残り文字列) :- 先頭文字と残り文字列を得る(_文字列,_先頭文字,_残り文字列), '+または-である'(_先頭文字). '+または-である'('+'). '+または-である'('-'). '記号を除く数字文字列。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_文字列) :- 先頭文字と最終文字にピリオドが来ている(_文字列),!,fail. '記号を除く数字文字列。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_文字列) :- 記号を除く数字文字列(_文字列), 先頭文字と最終文字にピリオドが来ている(_文字列) :- sub_atom(_文字列,0,1,_,'.'). 先頭文字と最終文字にピリオドが来ている(_文字列) :- sub_atom(_文字列,_,1,0,'.'). 記号を除く数字文字列('') :- !. 記号を除く数字文字列(_文字列) :- 先頭文字の数字記号検査(_文字列,_残り文字列). 記号を除く数字文字列(_残り文字列). 先頭文字の数字記号検査(_文字列,_残り文字列) :- 先頭文字と残り文字列を得る(_文字列,_先頭文字,_残り文字列), 先頭文字の数字記号検査(_先頭文字,_文字列,_残り文字列). 先頭文字の数字記号検査('.',_残り文字列) :- \+(sub_atom(_残り文字列,_,1,_,'.')),!. 先頭文字の数字記号検査(A,_残り文字列) :- sub_atom('0123456789',_,1,_,A),!. 先頭文字と残り文字列を得る(_文字列,_先頭文字,_残り文字列) :- sub_atom(_文字列,0,1,R,_先頭文字), sub_atom(_文字列,1,R,0,_残り文字列). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #393 # 文字列A(2≦N≦100000)が与えられる # どうしていするかな # うしていするかなど # していするかなどう # ていするかなどうし # いするかなどうして # するかなどうしてい # るかなどうしていす # かなどうしていする # などうしていするか 例('どうしていするかな うしていするかなど していするかなどう ていするかなどうし いするかなどうして するかなどうしてい るかなどうしていす かなどうしていする などうしていするか'). '文字列A(2≦N≦100000)が与えられる どうしていするかな うしていするかなど していするかなどう ていするかなどうし いするかなどうして するかなどうしてい るかなどうしていす かなどうしていする などうしていするか'(_文字列,_一文字づつ回転した文字列ならび) :- '文字列A(2≦N≦100000)が与えられる。全文を回転して、例と一致するか調べる。 一致した場合の題意は 「文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)」 であると考えられる', '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(_文字列,_一文字づつ回転した文字列ならび). '文字列A(2≦N≦100000)が与えられる。全文を回転して、例と一致するか調べる。 一致した場合の題意は 「文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)」 であると考えられる' :- 例(_回転する例文), '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(どうしていするかな,_一文字づつ回転した文字列ならび), atomic_list_concat(_一文字づつ回転した文字列ならび,'\n',_回転する例文). '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(_文字列,_一文字づつ回転した文字列ならび) :- findall(_一文字づつ回転して文字列,( 文字列を一文字づつ回転する(_文字列,_一文字づつ回転した文字列,R), ただし最終行は元に戻らない(R)), _一文字づつ回転した文字列ならび). 文字列を一文字づつ回転する(_文字列,_一文字づつ回転した文字列,R) :- sub_atom(_文字列,0,N,R,_副文字列_1), sub_atom(_文字列,N,R,0,_副文字列_2), atom_concat(_副文字列_2,_副文字列_1,_一文字づつ回転した文字列). ただし最終行は元に戻らない(R) :- \+(R = 0). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(_文字列,_文字列長,_回転する例文) :- atom_concat(_文字列,_文字列,_連結した文字列), findall(_副文字列,( sub_atom(_連結した文字列,_,_文字列長,_残り文字数,_副文字列), \+(_残り文字数 = 0)), _位置文字づつ回転した文字列ならび), atomic_list_concat(_位置文字づつ回転した文字列ならび,'\n',_回転する例文). % 以下のサイトは # プログラミングのお題スレ Part4 #197 # アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 # 例に沿って連続する文字をカウントするプログラムを作成せよ。 # # 出力の最後に改行を挿入すること。 # 標準入力から以下の形式で与えられる。 # S # # 例) # In: # aaaaaaaaaabbbbbbbbbbbbcccccccddddddddddeeeeeeefffffffffghiiiiiiiii # # Out: # a10b12c7d10e7f9ghi9 # # In: # # Out: # 0 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 例に沿って連続する文字をカウントするプログラムを作成せよ。 出力の最後に改行を挿入すること。 標準入力から以下の形式で与えられる。' :- 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字列), 連続する文字をカウントする(_文字列,_出力文字列), writef('Out:\n%t\n',[_出力文字列]). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字列) :- write('In: '), read(_文字列). 連続する文字をカウントする('','') :- !. 連続する文字をカウントする(_文字列,_出力文字列) :- 文字列の先頭から同一文字を切り取る(_文字列,_連続文字,_連続文字数,_残り文字列), 連続する文字をカウントする(_残り文字列,_残り出力文字列), atomic_list_concat([_連続文字,_連続文字数,_残り出力文字列],_出力文字列). 文字列の先頭から同一文字を切り取る(_文字列,_連続文字,_連続文字数,_残り文字列) :- sub_atom(_文字列,0,1,_,_連続文字), 連続文字数と残り文字列を得る(_文字列,_連続文字,_連続文字数,_残り文字列). 連続文字数と残り文字列を得る(_文字列,_連続文字,_連続文字数,_残り文字列) :- sub_atom(_文字列,_連続文字数,1,_,_文字), \+(_連続文字 = _文字), sub_atom(_文字列,_連続文字数,_,0,_残り文字列),!. 連続文字数と残り文字列を得る(_文字列,_連続文字,_連続文字数,'') :- atom_length(_文字列,_連続文字数). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #132 # お題:ふたつの自然数が与えられたとき、数字が一致している桁の個数を求める。 # 例 # 110, 119 -> 2 # 1234, 214 -> 2 # 567, 23 -> 0 # 'ふたつの自然数が与えられたとき、数字が一致している桁の個数を求める'(_自然数_1,_自然数_2,_数字が一致している桁の個数) :- ふたつの自然数をふたつの数字文字列に変換(_自然数_1,_自然数_2,_数字文字列_1,_数字文字列_2), 数字が一致している桁の個数を求める(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数). ふたつの自然数をふたつの数字文字列に変換(_自然数_1,_自然数_2,_数字文字列_1,_数字文字列_2) :- atom_number(_数字文字列_1,_自然数_1), atom_number(_数字文字列_2,_自然数_2). 数字が一致している桁の個数を求める(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数) :- 個数を求める(数字が一致している桁の(_数字文字列_1,_数字文字列_2),_数字が一致している桁の個数). 数字が一致している桁の(_数字文字列_1,_数字文字列_2) :- sub_atom(_数字文字列_1,_,1,_残り文字数,_数字), sub_atom(_数字文字列_2,_,1,_残り文字数,_数字). 個数を求める(_実行項,_個数) :- findall(1,_実行項,L), length(L,_個数). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #132 # お題:ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。 # 例 # 110, 119 -> 2 # 1234, 214 -> 2 # 567, 23 -> 0 # :- op(600,xfx,'個数を求める。'). 'ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。'(_数_1,_数_2,_数字が一致している桁の個数) :- ふたつの整数をふたつの数字文字列に変換(_数_1,_数_2,_数字文字列_1,_数字文字列_2), '数字が一致している桁の個数を求める。'(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数). ふたつの整数をふたつの数字文字列に変換(_数_1,_数_2,_数字文字列_1,_数字文字列_2) :- atom_number(_数字文字列_1,_数_1), atom_number(_数字文字列_2,_数_2). '数字が一致している桁の個数を求める。'(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数) :- 数字が一致している桁の(_数字文字列_1,_数字文字列_2) '個数を求める。' _数字が一致している桁の個数. '数字が一致している桁の'(_数字文字列_1,_数字文字列_2) :- sub_atom(_数字文字列_1,_,1,_残り文字数,_数字), sub_atom(_数字文字列_2,_,1,_残り文字数,_数字), \+(_数字 = '-'). '個数を求める。'(P,_個数). findall(1,P,L), length(L,_個数). % 以下のサイトは # 出典: C/C++の宿題片付けます 167代目 #526 # [1] 授業単元: プログラミング? # [2] 問題文(含コード&リンク): テキストファイルの読みこみ、行頭文字が小文字の場合 # http://pastebin.com/RKHNpMwy # 大文字に置き換え、変換してファイル出力 # [3] 環境: Xcode 5.1.1 #  [3.1] OS: OSX 10.9 #  [3.2] コンパイラ名とバージョン: gcc49 #  [3.3] 言語: C++ # [4] 期限: 無期限 # [5] その他の制限: # よろしくお願いします。 'テキストファイルの読みこみ、行頭文字が小文字の場合大文字に置き換え、変換してファイル出力'(_ファイル) :- see(_ファイル), 'テキストファイルの読みこみ、'(_行), '行頭文字が小文字の場合大文字に置き換え、変換して出力'(_行), seen. 'テキストファイルの読みこみ、'(_行) :- get_line(_行). '行頭文字が小文字の場合大文字に置き換え、変換して出力'(end_of_file) :- !. '行頭文字が小文字の場合大文字に置き換え、変換して出力'(_行) :- '行頭文字が小文字の場合大文字に置き換え、'(_行,_行_2), writef('%t\n',[_行_2]), 'テキストファイルの読みこみ、'(_次の行), '行頭文字が小文字の場合大文字に置き換え、変換して出力'(_次の行). '行頭文字が小文字の場合大文字に置き換え、'(_行,_行_2) :- 行頭文字が小文字の場合(_行), '大文字に置き換え、'(_行,_行_2),!. '行頭文字が小文字の場合大文字に置き換え、'(_行,_行). 行頭文字が小文字の場合(_行) :- sub_atom(_行,0,1,_,A), A @>= 'a', A @=< 'z'. '大文字に置き換え、'(_行,_行_2) :- sub_atom(_行,0,1,R,_小文字), 小文字大文字(_小文字,_大文字), sub_atom(_行,_,R,0,_残り文字列), atom_concat(_大文字,_残り文字列,_行_2). 小文字大文字(a,'A'). 小文字大文字(b,'B'). 小文字大文字(c,'C'). 小文字大文字(d,'D'). 小文字大文字(e,'E'). 小文字大文字(f,'F'). 小文字大文字(g,'G'). 小文字大文字(h,'H'). 小文字大文字(i,'I'). 小文字大文字(j,'J'). 小文字大文字(k,'K'). 小文字大文字(l,'L'). 小文字大文字(m,'M'). 小文字大文字(n,'N'). 小文字大文字(o,'O'). 小文字大文字(p,'P'). 小文字大文字(q,'Q'). 小文字大文字(r,'R'). 小文字大文字(s,'S'). 小文字大文字(t,'T'). 小文字大文字(u,'U'). 小文字大文字(v,'V'). 小文字大文字(w,'W'). 小文字大文字(x,'X'). 小文字大文字(y,'Y'). 小文字大文字(z,'Z'). % 以下のサイトは # プログラミングのお題スレ Part4 #114 # # お題:文字列Aを1回以上繰り返した文字列Bが与えられたとき # 文字列Aを求める。ただしAの候補が複数ある場合は最短のものとする。 # 例 # aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -> a # 123412312341231234123123412312341231234123 -> 1234123 # oxoxoxoxoxoxoxoxxoxoxoxoxoxoxoxoxx -> oxoxoxoxoxoxoxoxx # '文字列Aを1回以上繰り返した文字列Bが与えられたとき文字列Aを求める。 ただしAの候補が複数ある場合は最短のものとする。'('',_) :- !. '文字列Aを1回以上繰り返した文字列Bが与えられたとき文字列Aを求める。 ただしAの候補が複数ある場合は最短のものとする。'(_文字列B,_文字列A) :- 文字列A(_文字列B,_文字列A,_文字列Bの残り文字列), '文字列Aを1回以上繰り返した文字列Bが与えられたとき文字列Aを求める。 ただしAの候補が複数ある場合は最短のものとする。'(_文字列Bの残り文字列,_文字列A),!. 文字列A(_文字列B,_文字列A,_文字列Bの残り文字列) :- sub_atom(_文字列B,0,_文字列Aの文字数,_残り文字数,_文字列A), _文字列Aの文字数 > 0, sub_atom(_文字列B,_,_残り文字数,0,_文字列Bの残り文字列). % 以下のサイトは # 出典: Regular Expression(正規表現)Part12 #561 # ●Regular Expressionの使用環境 # Perl # # ●検索か置換か? # 検索 # # ●説明 # 前に指定したデータを含まない、「スケート」だけマッチさせたい # # # ●対象データ # アイススケート # ローラースケート # スケート # '前に指定したデータを含まない、「スケート」だけマッチさせたい'(_文,_指定したデータならび,_前データ,スケート,_後データ) :- sub_atom(_文,_前データ,スケート,_後データ), 前に指定したデータを含まない(_前データ,_指定したデータならび). 前に指定したデータを含まない(_前データ,_指定したデータならび) :- \+(前に指定したデータを含む(_前データ,_指定したデータならび)). 前に指定したデータを含む(_前データ,_指定したデータならび) :- member(_指定したデータ,_指定したデータならび), sub_atom(_前データ,_,_,0,_指定したデータ). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 出典: twitter_by_@warazo_20140611 # #     RT #    RTRT #   RTRTRT #  RTRTRTRT # RTRTRTRTRT #  RTRTRTRT #   RTRTRT #    RTRT #     RT # '     RT    RTRT   RTRTRT  RTRTRTRT RTRTRTRTRT  RTRTRTRT   RTRTRT    RTRT     RT ' :- 'RT文字列描画'(2). 'RT文字列描画'(10) :- writef('%w\n',['RTRTRTRTRT']),!. 'RT文字列描画'(_n) :- sub_atom('RTRTRTRTRT',0,_n,_r,_RT副文字列), _m is _r // 2, 'M個の空白文字列'(_m,_m個の空白文字列), 'RT文字列を上下対称に描画する'(_n,_m個の空白文字列,_RT副文字列). 'RT文字列を上下対称に描画する'(_n,_m個の空白文字列,_RT副文字列) :- writef('%w%w%w\n',[_m個の空白文字列,_RT副文字列,_m個の空白文字列]), _n_2 is _n + 2, 'RT文字列描画'(_n_2), writef('%w%w%w\n',[_m個の空白文字列,_RT副文字列,_m個の空白文字列]). 'M個の空白文字列'(_m,_m個の空白文字列) :- length(L,_m), all(L,' '), atomic_list_concat(L,_m個の空白文字列). all([],_). all([A|R],A) :- all(R,A). ?- nojiri('twitter_by_warazo_20140611_2.html'). yes. ?- swiprolog yes. ?- % 以下のサイトは # 出典: twitter_by_@warazo_20140611 # #     RT #    RTRT #   RTRTRT #  RTRTRTRT # RTRTRTRTRT #  RTRTRTRT #   RTRTRT #    RTRT #     RT # '     RT    RTRT   RTRTRT  RTRTRTRT RTRTRTRTRT  RTRTRTRT   RTRTRT    RTRT     RT ' :- 'RT文字列'. 'RT文字列' :- 'RT文字列描画前半部', 'RT文字列描画後半部'. 'RT文字列描画前半部' :- char_code(' ',_全角空白文字コード), 'RT文字列描画前半部'(_RT副文字列,_表示制御文字列), format(_表示制御文字,[_全角空白文字コード,_RT副文字列,_全角空白文字コード]), _RT副文字列 = 'RTRTRTRT'. 'RT文字列描画前半部'(_RT副文字列,_表示制御文字列) :- sub_atom('RTRTRTRTRT',S,Len,R,_RT副文字列), Len > 0, 0 is S mod 2, _m is R // 2, 表示制御文字列の生成(_m,_表示制御文字列). 'RT文字列描画後半部' :- char_code(' ',_全角空白文字コード), 'RT文字列描画後半部'(_RT副文字列,_表示制御文字列), format(_表示制御文字,[_全角空白文字コード,_RT副文字列,_全角空白文字コード]), _RT副文字列 = 'RT'. 'RT文字列描画後半部'(_RT副文字列,_表示制御文字列) :- sub_atom('RTRTRTRTRT',S,_,0,_RT副文字列), 0 is S mod 2, _m is S // 2, 表示制御文字列の生成(_m,_表示制御文字列). 表示制御文字の生成(_m,_表示制御文字列) :- atomic_list_concat(['~',_m,c,'%q','~'_m,c~n],_表示制御文字列). % 以下のサイトは # 出典: 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,_比較回数). % 以下のサイトは # 出題: プログラミングのお題スレ Part3 #902 # # お題:文字列sにあるn個の文字からなる集合を # 要素とする集合をつくる # # 例1:以下n=2 # "today"-> {to td ta ty od oa oy da dy ay} # "book" -> {bo bk ok} # "ababab" -> {ab} # "ab" -> {ab} # "aa" -> {} # "a" -> {} # "" -> {} # # 例2:以下n=3 # "today"-> {tod toa toy oda ody day dat ayt ayo} # "book" -> {boo bok okb} # "abc" -> {abc} # "ababab" ->{} # "ab" -> {} # "a" -> {} # "" -> {} 文字列にあるn個の文字からなる集合を要素とする集合をつくる(_文字列,_n,_文字列集合要素) :- 文字列の重複文字を取り除く(_文字列,_重複を取り除いた文字列), 文字列組合せ(_重複を取り除いた文字列,_n,_文字列集合要素). 文字列の重複文字を取り除く(_文字列,_重複を取り除いた文字列) :- findall(_文字,( 既に採用されていない文字(_文字列,_文字)), _重複を取り除いた文字ならび), atom_chars(_重複を取り除いた文字列,_重複を取り除いた文字ならび). 既に採用されていない文字(_文字列,_文字) :- sub_atom(_文字列,S,1,_,_文字), sub_atom(_文字列,0,S,_,_前文字列), \+(sub_atom(_前文字列,_,1,_,_文字)). 文字列組合せ(_文字列,1,_文字) :- sub_atom(_文字列,_,1,_,_文字). 文字列組合せ(_文字列_1,N,_文字列) :- 先頭文字と残り文字列(_文字列,N,M,_先頭文字,_残り文字列), 文字列組合せ(_残り文字列,M,_残り文字列_2), atom_concat(_先頭文字,_残り文字列_2,_文字列). 文字列組合せ(_文字列_1,N,_文字列) :- 先頭文字を除く残り文字列(_文字列,1,_,0,_残り文字列), 文字列組合せ(_残り文字列,N,_文字列). 先頭文字と残り文字列(_文字列,N,M,_先頭文字,_残り文字列) :- N > 1, M is N - 1, sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,1,_,0,_残り文字列). 先頭文字を除く残り文字列(_文字列,1,_,0,_残り文字列) :- N > 1, sub_atom(_文字列,1,_,0,_残り文字列). % 以下のサイトは # 出典: 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,_後文字列),!. % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #877 # # お題:長さが3文字以上の文字列が与えられたとき、2文字の組合せを求める。 # 例 # today -> to td ta ty od oa oy da dy ay # '長さが3文字以上の文字列が与えられたとき、2文字の組合せを求める。'(_文字列,_文字組合せ) :- sub_atom(_文字列,0,1,_,_文字_1), sub_atom(_文字列,1,_,0,_文字列_2), '長さが3文字以上の文字列が与えられたとき、2文字の組合せ'(_文字列_2,_文字_1,_文字組合せ). '長さが3文字以上の文字列が与えられたとき、2文字の組合せ'(_文字列_2,_文字_1,_文字組合せ) :- sub_atom(_文字列_2,_,1,_,_文字_2), atom_concat(_文字_1,_文字_2,_文字組合せ). '長さが3文字以上の文字列が与えられたとき、2文字の組合せ'(_文字列_2,_,_文字組合せ) :- '長さが3文字以上の文字列が与えられたとき、2文字の組合せを求める。'(_文字列_2,_文字組合せ). % 以下のサイトは #出典: Regular Expression(正規表現) Part12 #507 #●Regular Expressionの使用環境 #秀丸 # #●検索か置換か? #置換 # #●説明 #行の一番最後の全角文字から後を削除したい。 # #●対象データ # #東京 abc 大阪静岡 123 名古屋 apple orange # # #●希望する結果 # #東京 abc 大阪静岡 123 名古屋 # # #宜しくお願いします。 '行の一番最後の全角文字から後を削除したい。'(_行文字列,_行の一番最後の全角文字から後を削除した文字列) :- 行の一番最後の全角文字から(_行文字列,_全角文字から後の長さ), '後を削除したい。'(_行文字列,_全角文字から後の長さ,_行の一番最後の全角文字から後を削除した文字列),!. 行の一番最後の全角文字から(_行文字列,_全角文字から後の長さ) :- 行の一番最後の(_行文字列,_全角文字から後の長さ,_文字), 全角文字から(_文字). 行の一番最後の(_行文字列,_全角文字から後の長さ,_文字) :- sub_atom(_行文字列,_全角文字から後の長さ,1,_最後の全角文字の開始位置,_), sub_atom(_行文字列,_最後の全角文字の開始位置,1,_全角文字から後の長さ,_文字). 全角文字から(_全角文字) :- char_code(_全角文字,_文字コード), _文字コード > 255. '後を削除したい。'(_行文字列,_全角文字から後の長さ,_行の一番最後の全角文字から後を削除した文字列) :- sub_atom(_行文字列,0,_,_全角文字から後の長さ,_行の一番最後の全角文字から後を削除した文字列). % 以下のサイトは # # 鎮 静 剤 #               マリー・ローランサン #                   堀口大學 訳 # # # 退屈な女より もっと哀れなのは 悲しい女です。 # # 悲しい女より もっと哀れなのは 不幸な女です。 # # 不幸な女より もっと哀れなのは 病気の女です。 # # 病気の女より もっと哀れなのは 捨てられた女です。 # # 捨てられた女より もっと哀れなのは よるべない女です。 # # よるべない女より もっと哀れなのは 追われた女です。 # # 追われた女より もっと哀れなのは 死んだ女です。 # # 死んだ女より もっと哀れなのは 忘れられた女です。 # # :-op(500,xfx,もっと哀れなのは). 鎮静剤(_どんな女,_もっと哀れなのは) :- atom_concat(_どんな女,より,_どんな女より), _どんな女より もっと哀れなのは _こんな女です, sub_atom(_こんな女です,0,_,2,_こんな女), 鎮静剤(_どんな女,_こんな女,_もっと哀れなのは). 鎮静剤(_どんな女,_こんな女,_もっと哀れなのは) :- atomic_list_concat([_どんな女,より,' もっと哀れなのは ',_こんな女,'です。'],_もっと哀れなのは). 鎮静剤(_,_こんな女,_もっと哀れなのは) :- 鎮静剤(_こんな女,_もっと哀れなのは). よるべない女より もっと哀れなのは 追われた女です. 退屈な女より もっと哀れなのは 悲しい女です. 忘れられた女より もっと哀れなのは 退屈な女です. 追われた女より もっと哀れなのは 死んだ女です. 不幸な女より もっと哀れなのは 病気の女です. 捨てられた女より もっと哀れなのは よるべない女です. 病気の女より もっと哀れなのは 捨てられた女です. 悲しい女より もっと哀れなのは 不幸な女です. 死んだ女より もっと哀れなのは 忘れられた女です. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?- 鎮静剤(退屈な女,_節). _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' ; _節 = 'よるべない女より もっと哀れなのは 追われた女です。' ; _節 = '追われた女より もっと哀れなのは 死んだ女です。' ; _節 = '死んだ女より もっと哀れなのは 忘れられた女です。' ; _節 = '忘れられた女より もっと哀れなのは 退屈な女です。' ; _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' . ?- % 以下のサイトは 副文字列(_文字列,_開始位置,_副文字列の長さ,_残り文字数,_副文字列) :- sub_atom(_文字列,_開始位置,_副文字列の長さ,_残り文字数,_副文字列). 副文字列(_文字列,_副文字列) :- sub_atom(_文字列,_,_,_,_副文字列). 副文字列(_文字列,_前文字列,_中間文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,S,_,R,_中間文字列), sub_atom(_文字列,_,R,0,_後文字列). 副文字列(_文字列,_前文字列,_中間文字列,_後文字列,L1,L2,L3) :- 前文字列(_文字列,S,_前文字列,L1), 中間文字列(_文字列,S,R,_中間文字列,L2), 後文字列(_文字列,R,_後文字列,L3). 前文字列(_文字列,S,_前文字列,L1) :- sub_atom(_文字列,0,S,_,_前文字列), length(L1,S), atom_chars(_前文字列,L1). 中間文字列(_文字列,S,R,_中間文字列,L2) :- sub_atom(_文字列,S,Len,R,_中間文字列), length(L2,Len), atom_chars(_中間文字列,L2). 後文字列(_文字列,R,_後文字列,L3) :- sub_atom(_文字列,_,R,0,_後文字列), length(L3,R), atom_chars(_後文字列,L3). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #729 # # お題:○×ゲームで○が勝つ局面までの手順を深さ優先探索ですべて探し出して出力。手順の重複は認めない。 # # 列者臨 # 在皆兵 # 前陣闘 # 勝ち(列者臨). 勝ち(在皆兵). 勝ち(前陣闘). 勝ち(列在前). 勝ち(者皆陣). 勝ち(臨兵闘). 勝ち(列皆闘). 勝ち(臨皆前). '○×ゲームで○が勝つ局面までの手順を深さ優先探索ですべて探し出して出力。手順の重複は認めない。' :- すべて('○×ゲームで○が勝つ局面までの手順を深さ優先探索で探し出して'(_手順),出力(_手順)). '○×ゲームで○が勝つ局面までの手順を深さ優先探索で探し出して'(_手順) :- 交互着手(臨兵闘者皆陣列在前,○,×,[],[],_勝ち,_手順). 交互着手(_,_,_手番,_,_手番の着手点ならび,_手番,[]) :- 勝ち(_手番の着手点ならび),!. 交互着手(_着手可能点文字列,_手番,_次の手番,_手番の着手点ならび,_次の手番の着手点ならび,_勝ち,[_着手|_着手ならび]) :- 選択(_着手可能点文字列,_着手,_残り着手可能点文字列), 交互着手(_残り着手可能点文字列,_次の手番,_手番,_次の手番の着手点ならび,[_着手|_手番の着手点ならび],_勝ち,_着手ならび). 選択(_着手可能点文字列,_着手,_残り着手可能点文字列) :- 副文字列(_着手可能点文字列,_開始位置,1,_残り文字数,_着手), 着手以外の文字列を残り着手可能点とする(_着手可能点文字列,_開始位置,_残り文字数,_残り着手可能点文字列). 着手以外の文字列を残り着手可能点文字列とする(_着手可能点文字列,_前文字列長,_後文字列長,_残り着手可能点文字列) :- 副文字列(_着手可能点文字列,0,_前文字列長,_,_前文字列), 副文字列(_着手可能点文字列,_,_後文字列長,0,_後文字列), 二つの文字列の結合(_前文字列,_後文字列,_残り着手可能点文字列). 勝ち(_着手ならび) :- 勝ち(_文字列), 全ての文字列の構成文字は着手ならびに含まれる(_文字列,_着手ならび). 全ての文字列の構成文字は着手ならびに含まれる(_文字列,_着手ならび) :- すべて(副文字列(_文字列,_,1,_,文字),含まれる(_文字,_着手ならび)). 出力(_手順) :- 文字列ならびを結合して出力し改行する(_手順). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 副文字列(_文字列,_副文字列の開始位置,_文字列長,_残り文字列長,_副文字列) :- sub_atom(_文字列,_副文字列の開始位置,_文字列長,_残り文字列長,_副文字列). 文字列ならびを結合する(_文字列ならび,_結合した文字列) :- atomic_list_concat(_文字列ならび,_結合した文字列). 二つの文字列の結合(_文字列_1,_文字列_2,_結合した文字列) :- atom_concat(_文字列_1,_文字列_2,_結合した文字列). 含まれる(_要素,_ならび) :- member(_要素,_ならび). すべて(P,Q) :- forall(P,Q). 文字列ならびを結合して出力し改行する(_文字列ならび) :- atomic_list_concat(_文字列ならび,_結合した文字列), writef('%t\n',[_結合した文字列]). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #729 # # お題:○×ゲームで○が勝つ局面までの手順を深さ優先探索ですべて探し出して出力。手順の重複は認めない。 # # 列者臨 # 在皆兵 # 前陣闘 # 勝ち(列者臨). 勝ち(在皆兵). 勝ち(前陣闘). 勝ち(列在前). 勝ち(者皆陣). 勝ち(臨兵闘). 勝ち(列皆闘). 勝ち(臨皆前). '○×ゲーム'(_勝ち,_着手ならび) :- 交互着手(臨兵闘者皆陣列在前,○,×,[],[],_勝ち,_着手ならび). 交互着手(_,_,_手番,_,_手番の着手点ならび,_手番,[]) :- 勝ち(_手番の着手点ならび),!. 交互着手(_着手可能点文字列,_手番,_次の手番,_手番の着手点ならび,_次の手番の着手点ならび,_勝ち,[_着手|_着手ならび]) :- 選択(_着手可能点文字列,_着手,_残り着手可能点文字列), 交互着手(_残り着手可能点文字列,_次の手番,_手番,_次の手番の着手点ならび,[_着手|_手番の着手点ならび],_勝ち,_着手ならび). 選択(_着手可能点文字列,_着手,_残り着手可能点文字列) :- 副文字列(_着手可能点文字列,_開始位置,1,_残り文字数,_着手), 着手以外の文字列を残り着手可能点とする(_着手可能点文字列,_開始位置,_残り文字数,_残り着手可能点文字列). 着手以外の文字列を残り着手可能点文字列とする(_着手可能点文字列,_前文字列長,_後文字列長,_残り着手可能点文字列) :- 副文字列(_着手可能点文字列,0,_前文字列長,_,_前文字列), 副文字列(_着手可能点文字列,_,_後文字列長,0,_後文字列), 二つの文字列の結合(_前文字列,_後文字列,_残り着手可能点文字列). 勝ち(_着手ならび) :- 勝ち(_文字列), 全ての文字列の構成文字は着手ならびに含まれる(_文字列,_着手ならび). 全ての文字列の構成文字は着手ならびに含まれる(_文字列,_着手ならび) :- 全ての第一引数の実行に対して第二引数の実行が必ず成立する(副文字列(_文字列,_,1,_,文字),含まれる(_文字,_着手ならび)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 副文字列(_文字列,_副文字列の開始位置,_文字列長,_残り文字列長,_副文字列) :- sub_atom(_文字列,_副文字列の開始位置,_文字列長,_残り文字列長,_副文字列). 二つの文字列の結合(_文字列_1,_文字列_2,_結合した文字列) :- atom_concat(_文字列_1,_文字列_2,_結合した文字列). 含まれる(_要素,_ならび) :- member(_要素,_ならび). 全ての第一引数の実行に対して第二引数の実行が必ず成立する(_第一引数,_第二引数) :- forall(_第一引数,_第二引数). % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #468 # # ●Regular Expressionの使用環境 # sed、grep # ●検索か置換か? # 置換 # ●説明 # マッチした結果をそのまま置き換えるでなく、 # 1つ前に改行を入れたい。 # # ●対象データ # 0ABC1DEF2GHI3JKL4MNO # # ●希望する結果 # 0ABC # 1DEF # 2GHI # 3JKL # 4MNO # # よろしくお願いします。 置換規則('0','0'). 置換規則('1','1'). 置換規則('2','2'). 置換規則('3','3'). 置換規則('4','4'). 置換規則('5','5'). 置換規則('6','6'). 置換規則('7','7'). 置換規則('8','8'). 置換規則('9','9'). 'マッチした結果をそのまま置き換えるでなく、1つ前に改行を入れたい。'(_文字列,_置換された文字列) :- 検索文字列を置換する(_文字列,_前文字列,_置換文字列,_後文字列), 後文字列も置換して置換された文字列を生成する(_前文字列,_置換文字列,_後文字列,_置換された文字列),!. 'マッチした結果をそのまま置き換えるでなく、1つ前に改行を入れたい。'(_文字列,_文字列). 後文字列も置換して置換された文字列を生成する(_前文字列,_置換文字列,_後文字列,_置換された文字列) :- 'マッチした結果をそのまま置き換えるでなく、1つ前に改行を入れたい。'(_後文字列,_置換された文字列_2), atomic_list_concat([_前文字列,'\n',_置換文字列,_置換された文字列_2],_置換された文字列). 検索文字列を置換する(_文字列,_前文字列,_置換文字列_1,_後文字列) :- 検索文字列を得る(_文字列,_前文字列,_検索文字列,_後文字列), 置換規則(_検索文字列,_置換文字列_1). 検索文字列を得る(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 出典 :: C言語の宿題片付けます 167代目 #324 # [1] 授業単元:プログラミング基礎 # [2] 問題文 # text.txtというファイルに以下のような個人情報が保存されているとする。これを読み込み、 # 実行例のように画面に出力するプログラムを作成しなさい。 # ヒント: 氏名の読み込みでは"name: %s\n"のような変換仕様を用いると良い。 # ▼text.txtの内容 # name: Ichiro # age: 20 # weight: 65.5 # e-mail: ichiro@foo.bar # ▼実行例 # 氏名: Ichiro # 年齢: 20 # 体重: 65.5 # Eメール: ichiro@foo.bar # # ご教示願います 'text.txtというファイルに ▼text.txtの内容 name: Ichiro age: 20 weight: 65.5 e-mail: ichiro@foo.bar のような個人情報が保存されているとする。これを読み込み、 実行例のように表示する ▼実行例 氏名: Ichiro 年齢: 20 体重: 65.5 Eメール: ichiro@foo.bar' :- 'text.txtというファイルに ▼text.txtの内容 name: Ichiro age: 20 weight: 65.5 e-mail: ichiro@foo.bar のような個人情報が保存されているとする。これを読み込み、'(Lines), '実行例のように表示する ▼実行例 氏名: Ichiro 年齢: 20 体重: 65.5 Eメール: ichiro@foo.bar'(Lines). 'text.txtというファイルに ▼text.txtの内容 name: Ichiro age: 20 weight: 65.5 e-mail: ichiro@foo.bar のような個人情報が保存されているとする。これを読み込み、'(_行ならび) :- get_lines('text.txt',_行ならび). '実行例のように表示する ▼実行例 氏名: Ichiro 年齢: 20 体重: 65.5 Eメール: ichiro@foo.bar'(_行ならび) :- append(_,[_行|_残り行ならび],_行ならび), 実行例のように(_行,_変換された行), 表示する(_変換された行), _残り行ならび = []. 実行例のように(_行,_変換された行) :- 文字列変換候補(_変換対象文字列,_変換文字列), sub_atom(_行,_前文字列の長さ,_,_後文字列の長さ,_変換対象文字列), 変換された文字列を構成する(_行,_変換文字列,_前文字列の長さ,_後文字列の長さ,_変換された文字列),!. 実行例のように(_行,_行). 変換された文字列を構成する(_行,_変換文字列,_前文字列の長さ,_後文字列の長さ,_変換された文字列) :- sub_atom(_行,0,_前文字列の長さ,_,_前文字列), sub_atom(_行,_,_後文字列の長さ,0,_後文字列), atomic_list_concat([_前文字列,_変換文字列,_後文字列],_変換された行),!. 文字列変換候補(name,氏名). 文字列変換候補(age,年齢). 文字列変換候補(weight,体重). 文字列変換候補('e-mail','Eメール'). 表示する(_変換された行) :- writef('%t\n',[_変換された行]). % 以下のサイトは 文字列の反転(_文字列,_反転した文字列) :- 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字列,_反転した文字列). 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字列,_反転した文字列) :- '最初と最後の文字、中間の文字列を得る'(_文字列,_最初の文字,_最後の文字,_中間の文字列), 最初の文字と最後の文字を入れ換えながら文字列を反転する(_中間の文字列,_反転した中間の文字列), atomic_list_concat([_最後の文字,_反転した中間の文字列,_最初の文字],_反転した文字列),!. 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字,_文字). '最初と最後の文字、中間の文字列を得る'(_文字列,_最初の文字,_最後の文字,_中間の文字列) :- sub_atom(_文字列,0,1,_,_最初の文字), sub_atom(_文字列,_,1,0,_最後の文字), sub_atom(_文字列,1,_,1,_中間の文字列). % 以下のサイトは 文字列の反転(_文字列,_反転した文字列) :- 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字列,_反転した文字列). 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字列,_反転した文字列) :- '最初と最後の文字、中間の文字列を得る'(_文字列,_最初の文字,_最後の文字,_中間の文字列), 文字列の反転(_中間の文字列,_反転した中間の文字列), atomic_list_concat([_最後の文字,_反転した中間の文字列,_最初の文字],_反転した文字列). 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字,_文字). '最初と最後の文字、中間の文字列を得る'(_文字列,_最初の文字,_最後の文字,_中間の文字列) :- sub_atom(_文字列,0,1,_,_最初の文字), sub_atom(_文字列,_,1,0,_最後の文字), sub_atom(_文字列,1,_,1,_中間の文字列). % 以下のサイトは 文字列の反転(_文字列,_反転した文字列) :- 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字列,_反転した文字列),!. 文字列の反転(_文字,_文字). 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字列,_反転した文字列) :- '最初と最後の文字、中間の文字列を得る'(_文字列,_最初の文字,_最後の文字,_中間の文字列), 文字列の反転(_中間の文字列,_反転した中間の文字列), atomic_list_concat([_最後の文字,_反転した中間の文字列,_最初の文字],_反転した文字列). '最初と最後の文字、中間の文字列を得る'(_文字列,_最初の文字,_最後の文字,_中間の文字列) :- sub_atom(_文字列,0,1,_,_最初の文字), sub_atom(_文字列,_,1,0,_最後の文字), sub_atom(_文字列,1,_,1,_中間の文字列). % 以下のサイトは # このディレクトリの索引 # 出典 :: スレ立てるまでもない質問はここで135代目 #755 # **--* # ***-* # *---* # **-** # **-** # # var a=[ # "**--*", # "***-*", # "*---*", # "**-**", # "**-**", # ]; # ハイフンの位置を取得して連想配列に入れる方法おしえてください # var ithi = [ # [2,3], # [3], # [1,2,3], # [2], # [2], # ] ハイフンの位置を取得して連想配列に入れる方法おしえてください(_文字列,_行ならび,_ハイフンの位置ならび) :- ハイフンの位置を取得して連想配列に入れる(_文字列,_行ならび,_ハイフンの位置ならび). ハイフンの位置を取得して連想配列に入れる(_文字列,_行ならび,_ハイフンの位置ならび) :- 行ならびを得る(_文字列,_行ならび), findall(_各行のハイフン位置ならび,( member(_各行,_行ならび), ハイフンの位置を取得して(_各行,_各行のハイフン位置ならび)),_ハイフンの位置ならび). ハイフンの位置を取得して(_副文字列,_ハイフンの位置ならび) :- findall(_位置0オリジン,( sub_atom(_副文字列,_位置0オリジン,1,_,'-')),_ハイフンの位置ならび). 行ならびを得る(_文字列,L) :- 停止条件は文字列が空となるか改行を含まない場合(_文字列,L),!. 行ならびを得る(_文字列,[_改行までの文字列|R]) :- 改行までの文字列を切り取りながら行ならびを得る(_文字列,_改行までの文字列,R). 停止条件は文字列が空となるか改行を含まない場合('',[]) :- !. 停止条件は文字列が空となるか改行を含まない場合(_文字列,[_文字列]) :- 改行を含まない(_文字列). 改行を含まない(_文字列) :- \+(sub_atom(_文字列,_,1,_,'\n')). 改行までの文字列を切り取りながら行ならびを得る(_文字列,_改行までの文字列,R) :- 改行までの文字列を得る(_文字列,_改行までの文字列,_後文字列), 行ならびを得る(_後文字列,R). 改行までの文字列を得る(_文字列,_改行までの文字列,_後文字列) :- sub_atom(_文字列,S,1,R,'\n'), sub_atom(_文字列,0,S,_,_改行までの文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # # 先頭の連続した文字を別の文字列に置換した文字列 # 先頭の連続した文字を別の文字列に置換した文字列(_文字列,_別の文字列,_置換した文字列) :- 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数), 別の文字列に置換した文字列(_文字列,_先頭の連続した文字数,_別の文字列,_置換した文字列). 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_先頭の連続した文字数,1,_,_先頭文字とは異なる文字), \+(_先頭文字 = _先頭文字とは異なる文字),!. 別の文字列に置換した文字列(_文字列,_先頭の連続した文字数,_別の文字列,_置換した文字列) :- sub_atom(_文字列,_先頭の連続した文字数,_,0,_残り文字列), atomic_list_concat([_別の文字列,_残り文字列],_置換した文字列),!. % 以下のサイトは # # 先頭の連続した文字を一文字に置換した文字列 # 先頭の連続した文字を一文字に置換した文字列(_文字列,_置換した文字列) :- 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数), 一文字に置換した文字列(_文字列,_先頭文字,_先頭の連続した文字数,_置換した文字列). 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_先頭の連続した文字数,1,_,_先頭文字とは異なる文字), \+(_先頭文字 = _先頭文字とは異なる文字),!. 一文字に置換した文字列(_文字列,_先頭文字,_先頭の連続した文字数,_置換した文字列) :- sub_atom(_文字列,_先頭の連続した文字数,_,0,_残り文字列), atomic_list_concat([_先頭文字,_残り文字列],_置換した文字列),!. % 以下のサイトは # # 全て同じ文字からなる文字列だ # 全て同じ文字からなる文字列だ(_文字列) :- 全て同じ文字からなる文字列だ(_文字列,_同じ文字). 全て同じ文字からなる文字列だ('',_). 全て同じ文字からなる文字列だ(_文字列,_同じの文字) :- sub_atom(_文字列,0,1,_,_同じの文字), sub_atom(_文字列,1,_,0,_残り文字列), 全て同じ文字からなる文字列だ(_残り文字列,_同じの文字). % 以下のサイトは # ●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 = ' ')). % 以下のサイトは # 問題 # # 「mldsg」のうち3文字からなる英小文字の文字列を # 英大文字に変換して標準出力してください。 # 同じ文字を複数回使っても構いません。 # 言語はideoneで選択可能な言語を利用可能です。 # '「mldsg」のうち3文字からなる英小文字の文字列を 英大文字に変換して標準出力してください。 同じ文字を複数回使っても構いません。 言語はideoneで選択可能な言語を利用可能です。' :- forall( '「mldsg」のうち3文字からなる英小文字の文字列を'(_3文字からなる英小文字の文字列), '英大文字に変換して標準出力してください。'(_3文字からなる英小文字の文字列)). '「mldsg」のうち3文字からなる英小文字の文字列を'(_3文字からなる英小文字の文字列) :- '3文字からなる英小文字の文字列を'(mldsg,[],_3文字からなる英小文字の文字列). '3文字からなる英小文字の文字列を'(_,[_1,_2,_3],_3文字の文字列) :- atom_chars(_3文字の文字列,[_1,_2,_3]),!. '3文字からなる英小文字の文字列を'(_文字列,L,_3文字の文字列) :- sub_atom(_文字列,_,1,_,_文字), '3文字からなる英小文字の文字列を'(_文字列,[_文字|L],_3文字の文字列). '英大文字に変換して標準出力してください。'(_3文字からなる英小文字の文字列) :- 英大文字に変換して(_3文字からなる英小文字の文字列,_3文字からなる英大文字の文字列), '標準出力してください。'(_3文字からなる英大文字の文字列). 英大文字に変換して(_3文字からなる英小文字の文字列,_3文字からなる英大文字の文字列) :- findall(_大文字,( sub_atom(_3文字からなる英小文字の文字列,_,1,_,_小文字), 英小文字大文字(_小文字,_大文字)), _3文字からなる英大文字のならび), atom_chars(_3文字からなる英大文字の文字列,_3文字からなる英大文字のならび). 英小文字大文字(a,'A'). 英小文字大文字(b,'B'). 英小文字大文字(c,'C'). 英小文字大文字(d,'D'). 英小文字大文字(e,'E'). 英小文字大文字(f,'F'). 英小文字大文字(g,'G'). 英小文字大文字(h,'H'). 英小文字大文字(i,'I'). 英小文字大文字(j,'J'). 英小文字大文字(k,'K'). 英小文字大文字(l,'L'). 英小文字大文字(m,'M'). 英小文字大文字(n,'N'). 英小文字大文字(o,'O'). 英小文字大文字(p,'P'). 英小文字大文字(q,'Q'). 英小文字大文字(r,'R'). 英小文字大文字(s,'S'). 英小文字大文字(t,'T'). 英小文字大文字(u,'U'). 英小文字大文字(v,'V'). 英小文字大文字(w,'W'). 英小文字大文字(x,'X'). 英小文字大文字(y,'Y'). 英小文字大文字(z,'Z'). '標準出力してください。'(_3文字からなる英大文字の文字列) :- writef('%t\n',[_3文字からなる英大文字の文字列]). :- '「mldsg」のうち3文字からなる英小文字の文字列を 英大文字に変換して標準出力してください。 同じ文字を複数回使っても構いません。 言語はideoneで選択可能な言語を利用可能です。'. % 以下のサイトは 行は前半の文字列と後半の数値で構成される(_行,_前半の文字列,_後半の数値) :- sub_atom(_行,0,Len,_,_前半の文字列), 文字列は数字とピリオドを含まない(_前半文字列), sub_atom(_行,Len,_,0,_後半の数字文字列), 文字列は数字かピリオドだけで構成されている(_後半の数字文字列), read_term_from_atom(_後半の数字文字列,_後半の数値,[]). 文字列は数字とピリオドを含まない(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),\+(数字かピリオド(_文字))). 文字列は数字かピリオドだけで構成されている(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),数字かピリオド(_文字)). 数字かピリオド('0'). 数字かピリオド('1'). 数字かピリオド('2'). 数字かピリオド('3'). 数字かピリオド('4'). 数字かピリオド('5'). 数字かピリオド('6'). 数字かピリオド('7'). 数字かピリオド('8'). 数字かピリオド('9'). 数字かピリオド('0'). 数字かピリオド('.'). % 以下のサイトは # 出題 :: プログラミングのお題スレ Part3 #482 # # お題:二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。 # 例 # aabaabbab -> a '二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_多数派の文字) :- 二種類の文字からなる(_二種類の文字からなる長さが奇数の文字列,_文字_1,_文字_2), '長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_文字_1,_文字_2,_多数派の文字). 二種類の文字からなる(_二種類の文字からなる長さが奇数の文字列,_文字_1,_文字_2) :- setof(_文字,[_文字,S,E] ^ sub_atom(_二種類の文字からなる長さが奇数の文字列,S,1,E,_文字),[_文字_1,_文字_2]). '長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_文字_1,_文字_2,_多数派の文字) :- 二種類の文字の数を数える(_二種類の文字からなる長さが奇数の文字列,_文字_1,_文字_2,L1,L2), 多数派の文字(L1,L2,_文字_1,_文字_2,_多数派の文字). 二種類の文字の数を数える(_二種類の文字からなる長さが奇数の文字列,_文字_1,_文字_2,L1,L2) :- 文字列中のある文字の文字数を形象化してならびとする(_二種類の文字からなる長さが奇数の文字列,_文字_1,L1), 文字列中のある文字の文字数を形象化してならびとする(_二種類の文字からなる長さが奇数の文字列,_文字_2,L2). 文字列中のある文字の文字数を形象化してならびとする(_文字列,_文字,_文字数を形象化したならび) :- findall(_,sub_atom(_文字列,_,1,_,_文字),_文字数を形象化したならび). 多数派の文字(L1,L2,_多数派の文字,_,_多数派の文字) :- append(L2,[_|_],L1). 多数派の文字(L1,L2,_,_多数派の文字,_多数派の文字) :- append(L1,[_|_],L2). % 以下のサイトは '1' :- '2'(_1),'3'(_1),'11'. '1'. '2'(_1) :- '12'(mldsg,_2),'4'(_2,3,_4),'12'(_1,_4). '3'(_1) :- '5'(_1,_2),'7'(_2). '4'(_,0,[]). '4'(_1,_2,[_3|_4]) :- '13'(_2,0),'14'(_3,_1),'15'(_5,_2 - 1),'4'(_1,_5,_4). '5'(_1,_2) :- '16'(_3,('17'(_1,_,1,_,_4),'6'(_4,_3)),_5),'12'(_2,_5). '6'(_1,_2) :- '18'(_1,_3),'15'(_4,_3 - 32),'18'(_2,_4). '7'(_1) :- '19'(_1),'20'. '11' :- fail. '12'(_1,_2) :- atom_chars(_1,_2). '13'(_1,_2) :- _1 > _2. '14'(_1,_2) :- member(_1,_2). '15'(_1,_2) :- _1 is _2. '16'(_1,_2,_3) :- findall(_1,_2,_3). '17'(_1,_2,_3,_4,_5) :- sub_atom(_1,_2,_3,_4,_5). '18'(_1,_2) :- char_code(_1,_2). '19'(_1) :- write(_1). '20' :- nl. :- initialization('1'). % 以下のサイトは '1' :- '2'(_1),'3'(_1),'11'. '1'. '2'(_1) :- '12'(mldsg,_2),'4'(_2,3,_4),'12'(_1,_4). '3'(_1) :- '5'(_1,_2),'7'(_2). '4'(_,0,[]). '4'(_1,_2,[_3|_4]) :- _2 > 0,'13'(_3,_1),_5 is _2 - 1,'4'(_1,_5,_4). '5'(_1,_2) :- '14'(_3,('15'(_1,_,1,_,_4),'6'(_4,_3)),_5),'12'(_2,_5). '6'(_1,_2) :- '16'(_1,_3),_4 is _3 -32,'16'(_2,_4). '7'(_1) :- '17'(_1),'18'. '11' :- fail. '12'(_1,_2) :- atom_chars(_1,_2). '13'(_1,_2) :- member(_1,_2). '14'(_1,_2,_3) :- findall(_1,_2,_3). '15'(_1,_2,_3,_4,_5) :- sub_atom(_1,_2,_3,_4,_5). '16'(_1,_2) :- char_code(_1,_2). '17'(_1) :- write(_1). '18' :- nl. '19'(_1) :- initialization(_1). :- '19'('1'). % 以下のサイトは '1' :- '2'(_1),'3'(_1),fail. '1'. '2'(_1) :- atom_chars(mldsg,_2),'4'(_2,3,_4),atom_chars(_1,_4). '3'(_1) :- '5'(_1,_2),'7'(_2). '4'(_,0,[]). '4'(_1,_2,[_3|_4]) :- _2 > 0,member(_3,_1),_5 is _2 - 1,'4'(_1,_5,_4). '5'(_1,_2) :- findall(_3,(sub_atom(_1,_,1,_,_4),'6'(_4,_3)),_5),atom_chars(_2,_5). '6'(_1,_2) :- char_code(_1,_3),_4 is _3 -32,char_code(_2,_4). '7'(_1) :- write(_1),nl. :- initialization('1'). % 以下のサイトは mecab(文,_文,LL) :- tmpnam(TMPNAM), tell(TMPNAM), writef('%t\n',[_文]), told, mecab(TMPNAM,LL). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,_,_,_,S1,'\t',S3,_,_,_)), LL). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,S1,'\t',S3)), LL). sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y), split(V,[' ',','],U)), X). split(_文字列,_区切り文字ならび,L) :- atom_chars(_文字列,_文字ならび), split_list(_文字ならび,_区切り文字ならび,L). split_list([],_,[]). split_list(L1,_区切り文字ならび,[_文字列|R]) :- split_list_2(_区切り文字ならび,L1,_文字列), split_list(L3,_区切り文字ならび,R),!. split_list(L1,_区切り文字ならび,[_文字列]) :- atom_chars(_文字列,L1). split_list_2(_区切り文字ならび,L,_文字列,L3) :- append(L1,L2,L3,L), member(_区切り文字,_区切り文字ならび), split_list_3(_区切り文字,L1,L2,L3), atom_chars(_文字列,L1),!. split_list_3(_区切り文字,L1,L2,L3) :- all(L2,_区切り文字), \+(append(_,[_区切り文字],L1)), \+(L3 = [_区切り文字|_]),!. tmpnam(TMPNAM) :- 'TMPNAM'(TMPNAM), \+(exist_file(TMPNAM)),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). 'TMPNAM'(TMPNAM) :- '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび), atomic_list_concat(['/tmp/file'|_6要素の文字ならび],TMPNAM). '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび) :- findall(_任意の文字,( between(1,6,_), '英小文字大文字数字から任意の文字'(_任意の文字)), _6要素の文字ならび). '英小文字大文字数字から任意の文字'(_任意の文字) :- _文字コード is random(75) + 48, '文字コード48-122の範囲で記号のコードではない'(_文字コード), char_code(_任意の文字,_文字コード),!. '英小文字大文字数字から任意の文字'(_任意の文字) :- '英小文字大文字数字から任意の文字'(_任意の文字). '文字コード48-122の範囲で記号のコードではない'(_文字コード) :- '文字コード範囲58-64ではない'(_文字コード), '文字コード範囲91-96ではない'(_文字コード). '文字コード範囲58-64ではない'(_文字コード) :- \+((_文字コード>=58,_文字コード=<64)). '文字コード範囲91-96ではない'(_文字コード) :- \+((_文字コード>=91,_文字コード=<96)). sub_atom(A,H,X,T) :- atom(A), sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), sub_atom(A,_,R,0,T). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # # かたやん印刷所では、いまの時代においてもグーテンベルグ印刷にこだわって印刷をしています。 # グーテンベルグ印刷とは、活版(活字を組み合わせて作った版)で印刷する方法です。(Wikipedia) # # かたやん印刷所の所長かたやんは、使った活字を元の場所に戻さないので、 # いつも活字を入れているボックスはぐちゃぐちゃで、 # ほしい活字をすぐに見つけ出すことができません。 # # そこで見かねた印刷所の副所長エミーは、活字を入れているボックスビデオで撮影し、 # 画像解析し、ボックスのどこにどの活字があるかを解析し、 # ほしい文字列の活字がどこにあるか瞬時にみつけだすプログラミングを作ることにしました。 # # 現状の状態のボックスは以下のようになっています。 # # # 6×6のボックスの中から"PRO, PROGRAMMER"という活字を探し出したいです。 # カンマやスペースは1つの活字としてカウントします。 # ですので、今回は文字13個、カンマ1個、スペース1個の合計15個の活字が必要です。 # 一度使った活字は2回使うことはできません。 # # 活字の場所は、(縦番号,横番号)で表すと以下のような順番で活字を取り出すことができます。 # 縦番号は上から下の方向に、横番号は左から右の方向に、1から数えます。 # 1,4 = P # 2,1 = R # 1,6 = O # 5,2 = , # 5,4 = space # 2,2 = P # 3,4 = R # 4,5 = O # 5,1 = G # 4,3 = R # 1,1 = A # 2,5 = M # 6,1 = M # 2,4 = E # 6,6 = R # # # 上記の例では、例えば"P"という文字が2回でてきますが、(1,4)と(2,2)にある"P"はどちらを先につかってもかまいません。 # また場所の特定は1つのみ記述すればよいです。すべての場所番号を書く必要はありません。 # # 画像解析したボックスのデータはCSVで出力されます。 # ボックスのデータを使ってほしい文字列を作るための活字の在り処を探しだしてください。 # # ■資料 # gutenberg.zip # zipファイルを解凍すると以下のファイルが入っています。 # # gutenberg.csv # このボックスから"STAY HUNGRY, STAY FOOLISH"という活字を取り出してください。 # 文字21個、カンマ1個、スペース3個で、合計25個の活字が必要です。 # # answer.txt # 解答用テキストファイルです。 # # ■解答方法 # 解答用テキストファイル(answer.txt)を完成させ、アップロードしてください。 # ※解答用テキストファイル(answer.txt)以外のファイル形式(zipなど)をアップロードした場合は評価対象外となります。 # '20×20のボックスの生成' :- open('gutenberg.csv',read,Instream), '20×20のボックスの生成'(Instream,_20掛ける20のボックス), close(Instream), assertz('20×20のボックス'(_20掛ける20のボックス)). '20×20のボックスの生成'(Instream,[]) :- at_end_of_stream(Instream),!. '20×20のボックスの生成'(Instream,[L|R]) :- get_line(Instream,Line), split(Line,['\t'],L), '20×20のボックスの生成'(Instream,R). '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス) :- atom_chars(_ある文字列,_文字ならび), '20×20のボックスの中からある文字列を取り出す'(_文字ならび,_20掛ける20のボックス,L), 解の表示(L). '20×20のボックスの中からある文字列を取り出す'([],_20掛ける20のボックス,[]) :- !. '20×20のボックスの中からある文字列を取り出す'([_文字|_残り文字ならび],_20掛ける20のボックス_1,[[_文字,_行目,_列目]|R]) :- ある文字を取り出す(_文字,_20掛ける20のボックス_1,1,_列目,_20掛ける20のボックス_2), '20×20のボックスの中からある文字列を取り出す'(_残り文字ならび,_20掛ける20のボックス_2,R). ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行_2|R_1]) :- nth1(_列目,_行,_文字), 行を更新する(_行,_列目,_行_2),!. ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行|R_2]) :- _行目_2 is _行目 + 1, ある文字を取り出す(_文字,R_1,_行目_2,_列目,R_2). 行を更新する(_行,_列目,_行_2) :- length([_|L1],_列目), append(L1,[_|R],_行), append(L1,[''|R],_行_2),!. 解の表示(L) :- tell('ans.txt'), forall(member([_文字,_行目,_列目],L),writef('%t,%t,%t\n',[_文字,_行目,_列目])), told. get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). split('',_,[],[]) :- !. split(_文字列,_区切り文字列ならび,[_区切り文字列|R3],[_副文字列|R4]) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R3,R4). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), atom_length(_区切り文字列,_長さ), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). :- '20×20のボックスの生成'(_CSVファイル). :- '20×20のボックス'(_20掛ける20のボックス), '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス). % 以下のサイトは % スケルトン 文字列の要素文字から重複を許しN文字の文字列を作る(_文字列,N,_N文字の文字列) :- length(L,N), 文字列の要素文字から重複を許しN文字の文字列を作る(_文字列,[],L,_N文字の文字列). 文字列の要素文字から重複を許しN文字の文字列を作る(_文字列,L,L,_N文字の文字列) :- atom_chars(_N文字の文字列,L),!. 文字列の要素文字から重複を許しN文字の文字列を作る(_文字列,L1,L,_N文字の文字列) :- sub_atom(_文字列,_,1,_,_文字), 文字列の要素文字から重複を許しN文字の文字列を作る(_文字列,[_文字|L1],L,_N文字の文字列). % 以下のサイトは # 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,_,_文字). % 以下のサイトは # # 文字列の先頭から連続文字を切り出す # 連続文字列を切り出す(_文字列,_前文字列,_連続文字列,_後文字列) :- sub_atom(_文字列,_前文字列,_連続文字列,_後文字列), '前後には文字がないか、あるいは異なった文字がある連続文字列'(_前文字列,_後文字列,_文字). '前後には文字がないか、あるいは異なった文字がある連続文字列'(_前文字列,_後文字列,_文字) :- 連続文字列(_同じ文字の文字列,_文字), '前後には文字がないか、あるいは異なった文字がある'(_前文字列,_後文字列,_文字). '前後には文字がないか、あるいは異なった文字がある'(_前文字列,_後文字列,_文字) :- '前文字列が空であるか、前文字列の最後の文字は異なった文字である'(_前文字列,_文字), '後文字列が空であるか、後文字列の最初の文字は異なった文字である'(_後文字列,_文字). '前文字列が空であるか、前文字列の最後の文字は異なった文字である'(_前文字列,_文字) :- \+(sub_atom(_前文字列,_,1,0,_文字)). '後文字列が空であるか、後文字列の最初の文字は異なった文字である'(_後文字列,_文字) :- \+(sub_atom(_後文字列,0,1,_,文字)). 連続文字列(_文字列,_文字) :- 先頭文字(_文字列,_先頭文字), 全て同一文字の文字列(_文字列,_文字,_残り文字列). 先頭文字(_文字列,_先頭文字) :- sub_atom(_文字列,0,1,_,_先頭文字). 全て同一文字の文字列(_文字列,_文字,_残り文字列) :- forall(( sub_atom(_文字列,_,1,_,_文字_1),_文字=_文字_1). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # # 文字列の先頭から連続文字を切り出す # 文字列の先頭から同じ文字による文字列を切り出す(_文字列,_同じ文字の文字列,_残り文字列) :- sub_atom(_文字列,0,1,_,_文字), 同じ文字による文字列の文字数を得る(_文字列,_文字,_文字数), sub_atom(_文字列,0,_文字数,R,_同じ文字の文字列), sub_atom(_文字列,_,R,0,_残り文字列). 同じ文字による文字列の文字数を得る(_文字列,_文字,_文字数) :- findall(_,( sub_atom(_文字列,_,1,_,_文字_1), ( \+(_文字_1 = _文字),!,fail;true)), L), length(L,_文字数). % 以下のサイトは # # 文字列の先頭から連続文字を切り出す # 文字列の先頭から同じ文字による文字列を切り出す(_文字列,_同じ文字の文字列,_残り文字列) :- sub_atom(_文字列,0,1,_,_文字), 文字列から同じ文字による文字列を切り出す(_文字列,_文字,1,_同じ文字の文字列,_残り文字列). 文字列から同じ文字による文字列を切り出す(_文字列,_文字,_開始位置_1,_同じ文字の文字列,_残り文字列) :- sub_atom(_文字列,_開始位置_1,1,_,_文字), 文字列から同じ文字による文字列を切り出す(_文字列,_文字,_開始位置_1,_,_同じ文字の文字列,_残り文字列). 文字列から同じ文字による文字列を切り出す(_文字列,_文字,_開始位置_1,_開始位置,_同じ文字の文字列,_残り文字列) :- 文字列の先頭文字が指定文字の時は指定文字以外に出会うまで切り出しを続ける(_文字列,_文字,_開始位置_1,_開始位置,_同じ文字の文字列,_残り文字列),!. 文字列から同じ文字を切り出す(_文字列,_,_開始位置,_開始位置,_同じ文字の文字列,_残り文字列) :- 同じ文字による文字列と残り文字列に切り分ける(_文字列,_開始位置,_同じ文字の文字列,_残り文字列). 文字列の先頭文字が指定文字の時は指定文字以外に出会うまで切り出しを続ける(_文字列,_文字,_開始位置_1,_開始位置,_同じ文字の文字列,_残り文字列) :- sub_atom(_文字列,_開始位置_1,1,_,_文字), _開始位置_2 is _開始位置_1 + 1, 文字列から同じ文字による文字列を切り出す(_文字列,_文字,_開始位置_2,_開始位置,_同じ文字の文字列,_残り文字列). 同じ文字による文字列と残り文字列に切り分ける(_文字列,_開始位置,_同じ文字の文字列,_残り文字列) :- sub_atom(_文字列,0,_開始位置,_残り文字数,_同じ文字の文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列). % 以下のサイトは # # 文字列の先頭から連続文字を切り出す # 文字列の先頭から連続文字を切り出す(_文字列,_連続文字の文字列,_残り文字列) :- sub_atom(_文字列,0,1,_,_文字), 文字列から連続文字を切り出す(_文字列,_文字,1,_連続文字の文字列,_残り文字列). 文字列から連続文字を切り出す(_文字列,_文字,_開始位置_1,_連続文字の文字列,_残り文字列) :- sub_atom(_文字列,_開始位置_1,1,_,_文字), 文字列から連続文字を切り出す(_文字列,_文字,_開始位置_1,_,_連続文字の文字列,_残り文字列). 文字列から連続文字を切り出す(_文字列,_文字,_開始位置_1,_開始位置,_連続文字の文字列,_残り文字列) :- sub_atom(_文字列,_開始位置_1,1,_,_文字), _開始位置_2 is _開始位置_1 + 1, 文字列から連続文字を切り出す(_文字列,_文字,_開始位置_2,_開始位置,_連続文字の文字列,_残り文字列),!. 文字列から連続文字を切り出す(_文字列,_,_開始位置,_開始位置,_連続文字の文字列,_残り文字列) :- sub_atom(_文字列,0,_開始位置,_残り文字数,_連続文字の文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列). % 以下のサイトは # 出典: http://toro.2ch.net/test/read.cgi/tech/1392388003/167 # 文字列(string型)の先頭から数字として有効な文字数を返す関数ってどうやって作れば良いですか? # 例 # "126AB"→3 # "-(1+2)"→0 # "-9.25ABC"→5 '文字列の先頭から数字として有効な文字列・文字数・数値を切り出す'(_文字列,_文字数,_先頭から数字として有効な文字列,_数値) :- atom_length(_文字列,_長さ), '文字列の先頭から数字として有効な文字列・文字数・数値を切り出す'(_文字列,_長さ,_文字数,_先頭から数字として有効な文字列,_数値). '文字列の先頭から数字として有効な文字列・文字数・数値を切り出す'(_文字列,_文字数,_文字数,_先頭から数字として有効な文字列,_数値) :- '文字列の先頭から数字として有効な文字列・文字数・数値'(_文字列,_文字数,_先頭から数字として有効な文字列,_数値),!. '文字列の先頭から数字として有効な文字列・文字数・数値を切り出す'(_文字列,_文字数,_先頭から数字として有効な文字列) :- _文字数 > 0, _文字数_1 is _文字数 - 1, '文字列の先頭から数字として有効な文字列・文字数・数値を切り出す'(_文字列,_文字数_1,_先頭から数字として有効な文字列). '文字列の先頭から数字として有効な文字列・文字数・数値'(_文字列,_文字数,_先頭から数字として有効な文字列,_数値) :- _文字数 > 0, sub_atom(_文字列,0,_文字数,_,_先頭から数字として有効な文字列), catch(read_term_from_atom(_先頭から数字として有効な文字列,_数値,[]),_,fail), number(_数値),!. % 以下のサイトは # 出典: http://toro.2ch.net/test/read.cgi/tech/1392388003/167 # 文字列(string型)の先頭から数字として有効な文字数を返す関数ってどうやって作れば良いですか? # 例 # "126AB"→3 # "-(1+2)"→0 # "-9.25ABC"→5 文字列の先頭から数字として有効な文字数を得る(_文字列,_先頭から数字として有効な文字数) :- atom_length(_文字列,_長さ), 文字列の先頭から数字として有効な文字数を得る(_文字列,_長さ,_先頭から数字として有効な文字数). 文字列の先頭から数字として有効な文字数を得る(_文字列,_先頭から数字として有効な文字数,_先頭から数字として有効な文字数) :- 文字列の先頭から数字として有効な文字数(_文字列,_先頭から数字として有効な文字数),!. 文字列の先頭から数字として有効な文字数を得る(_文字列,_文字数,_先頭から数字として有効な文字数) :- _文字数 > 0, _文字数_1 is _文字数 - 1, 文字列の先頭から数字として有効な文字数を得る(_文字列,_文字数_1,_先頭から数字として有効な文字数). 文字列の先頭から数字として有効な文字数(_文字列,_先頭から数字として有効な文字数) :- _先頭から数字として有効な文字数 > 0, sub_atom(_文字列,0,_先頭から数字として有効な文字数,_,_副文字列), catch(read_term_from_atom(_副文字列,_項,[]),_,fail), number(_項),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列の先頭から数字として有効な文字列を切り出す(_文字列,_先頭から数字として有効な文字列) :- sub_atom(_文字列,0,Len,R,_先頭から数字として有効な文字列), (catch(read_term_from_atom(_先頭から数字として有効な文字列,_項,[]),_,fail),number(_項)), succ(Len,Len2), \+((sub_atom(_文字列(0,Len2,_,_副文字列2),catch(read_term_from_atom(_副文字列2,_項,[]),_,fail)),!. % 以下のサイトは # 出題場所 :: 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,_残り文字列),!. 改行記号を含む行を得る(_文字列,_文字列,''). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/885 # 夜分遅くに申し訳ございません… # 本日9時提出の課題を今になって気づいたのですが、私の頭ではさっぱりわからないのでお助け下さい… # # [1]プログラミングC # [2] 問題文(含コード&リンク): # 問1:以下の実行結果に示すような、3つの実数を入力した後、最大値と最小値の差を求めるプログラムを作成せよ。 # ※例 # 3つの整数を入力してください。 # na=12 # nb=65 # nc=44 # 65と12の差は53です。 # # 問2:以下の文字列(programming_jissyu)が配列に格納されているとする。 # この文字列を任意の位置で2つ分割して表示するプログラムを作成せよ。 # ※例 # 難文字目で分割しますか:11 # 文字列の前半 # programming # 文字列の後半 # _jissyu # '問2:以下の文字列(programming_jissyu)が配列に格納されているとする。 この文字列を任意の位置で2つに分割して表示するプログラムを作成せよ。 ※例 何文字目で分割しますか:11 文字列の前半 programming 文字列の後半 _jissyu' :- _文字列 = programming_jissyu, 文字列を任意の位置で2つに分割して表示する(_文字列). 文字列を任意の位置で2つに分割して表示する(_文字列) :- 任意の位置で(_任意の位置), sub_atom(_文字列,0,_任意の位置,_,_文字列の前半), sub_atom(_文字列,_任意の位置,_,0,_文字列の後半), writef('文字列の前半\n%t\n文字列の後半\n%t\n',[_文字列の前半,_文字列の後半]). 任意の位置で(_文字列,_任意の位置) :- atom_length(_文字列,_文字列の長さ), 整数を得る(何文字目で分割しますか,_任意の位置 < _文字列の長さ,_任意の位置). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/910 # お題:2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を # 隣り合う文字の間に挿入した文字列を返す。 # 例 # "Personal" -> "Peerrsssoonnall" # "Hello, world!" -> "Heellllooo,, wwworrrlldd!" # % このブログラムは間違っている。最後の一文字が削られてしまう。 % この問題を解消したプログラム '2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列を返す。'(_文字列,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- findall(_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列,( sub_atom(_文字列,_,2,_,_2文字), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_2文字,_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列)),L), atomic_list_concat(L,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_2文字,_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字), atomic_list_concat([_文字_1,_大きい方の文字],_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字) :- sub_atom(_2文字,0,1,_,_文字_1), sub_atom(_2文字,1,1,_,_文字_2), 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_大きい方の文字). 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_1) :- _文字_1 @>= _文字_2. 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_2) :- _文字_1 @< _文字_2. % 以下のサイトは # 出題場所 :: 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/1357191974/896 # お題:単語データファイル「words.txt」から英単語リストを読み取り、アルファベットでしりとりを行い、 # 一番長いしりとりの単語列を出力せよ。同じ単語は二度使わない。 # # '一番長いしりとりの単語列を出力せよ。同じ単語は二度使わない。'(_単語列,_一番長いしりとりの単語列) :- '同じ単語は二度使わない。'(_単語列,_整列した重複のない単語列), forall(一番長いしりとり単語列を(_整列した重複のない単語列,_一番長いしりとりの単語列),'出力せよ。'(_一番長いしりとりの単語列)). 一番長いしりとり単語列を(_整列した重複のない単語列,_一番長いしりとりの単語列) :- しりとり単語列を(_整列した重複のない単語列,_長さを鍵に持つしりとり単語列), 一番長い(_長さを鍵に持つしりとり単語列,_一番長いしりとりの単語列). しりとり単語列を(_整列した重複のない単語列,_長さを鍵に持つしりとり単語列) :- findall([_長さ,_しりとりの単語列],しりとりの単語列(_整列した重複のない単語列,_しりとりの単語列,_長さ),_長さを鍵に持つしりとり単語列). '同じ単語は二度使わない。'(_単語列,_整列した重複のない単語列) :- sort(_単語列,_整列した重複のない単語列). しりとりの単語列(_単語列,_しりとりの単語列,_長さ) :- select(_単語,_単語列,_残り単語列), しりとり(_単語,_残り単語列,[_単語],_しりとりの単語列), length(_しりとりの単語列,_長さ). しりとり(_単語,_単語列,L1,_しりとりの単語列) :- 単語列の中から単語の末尾文字と同じ先頭文字を持つ単語を捜す(_単語,_単語列,_次の単語候補,_残り単語列), しりとり(_次の単語候補,_残り単語列,[_次の単語候補|L1],_しりとりの単語列). しりとり(_,_,_しりとりの単語列,_しりとりの単語列). 単語列の中から単語の末尾文字と同じ先頭文字を持つ単語を捜す(_単語,_単語列,_単語_2,_残り単語列) :- sub_atom(_単語,_,1,0,_文字), select(_単語_2,_単語列,_残り単語列), sub_atom(_単語_2,0,1,_,_文字). 一番長い(LL,_一番長いしりとりの単語列) :- 最大値を捜す(_長さ,member([_長さ,_],LL),_一番長い), member([_一番長い,_一番長いしりとりの単語列],LL). 最大値を捜す(A,B,C) :- findall(A,B,L), 最大値(L,C). 最大値(L,C) :- select(C,L,R), forall(member(A,R),A @=< C),!. '出力せよ。'(_一番長い逆順のしりとりの単語列) :- reverse(_一番長い逆順のしりとりの単語列,_一番長いしりとりの単語列), atomic_list_concat(_一番長いしりとりの単語列,' ',_一番長いしりとりの単語列表現), writef('%t\n',[_一番長いしりとりの単語列表現]). % 以下のサイトは タブ区切り(_文字列,_列ならび) :- findall(_列,( 先頭からタブ区切り(_文字列,_,_列)), _列ならび). 先頭からタブ区切り(_文字列,_列目,_副文字列) :- 先頭からタブ区切り(_文字列,_列目,_,_副文字列,_). 先頭からタブ区切り(_文字列,_列目,_区切り文字,_前文字列,_副文字列,_後文字列) :- 先頭からタブ区切り(_文字列,'',1,_列目,_区切り文字,_前文字列,_副文字列,_後文字列). 先頭からタブ区切り('',_,_,_,_,_,_,_) :- !,fail. 先頭からタブ区切り(_文字列,_前文字列_1,_列目_1,_列目,_区切り文字,_前文字列,_副文字列,_後文字列) :- タブ区切りが成立する(_文字列,_区切り文字_1,_副文字列_1,_後文字列_1),!, 先頭からタブ区切り(_列目_1,_区切り文字_1,_前文字列_1,_副文字列_1,_後文字列_1,_列目,_区切り文字,_前文字列,_副文字列,_後文字列). 先頭からタブ区切り(_文字列,_前文字列,_列目,_列目,'',_前文字列,_文字列,''). 先頭からタブ区切り(_列目,_区切り文字,_前文字列,_副文字列,_後文字列,_列目,_区切り文字,_前文字列,_副文字列,_後文字列). 先頭からタブ区切り(_列目_1,_,_前文字列_1,_副文字列_1,_後文字列_1,_列目,_区切り文字,_前文字列,_副文字列,_後文字列) :- _列目_2 is _列目_1 + 1, atomic_list_concat([_前文字列_1,_副文字列_1,'\t'],_前文字列_2), 先頭からタブ区切り(_後文字列_1,_前文字列_2,_列目_2,_列目,_区切り文字,_前文字列,_副文字列,_後文字列). タブ区切りが成立する(_文字列,'\t',_副文字列_1,_後文字列_1) :- sub_atom(_文字列,S,1,R,'\t'), sub_atom(_文字列,0,S,_,_副文字列_1), sub_atom(_文字列,_,R,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). % 以下のサイトは 語候補(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). % 以下のサイトは # 出題場所 http://toro.2ch.net/test/read.cgi/tech/1363769640/325 # xyz を含まないものにマッチする正規表現 # # [regexp 60]より # # |fmcat =(retofm <<<'(x+y+z+a)*xyz(x+y+z+a)*'|fmcment) =(retofm <<<'xyz')|fmdeterm|fmmin|fmtore|perl -pe 'y/+/|/; s/a/[^xyz]/g' # |として、 # |([^xyz]|y|z)*x(z([^xyz]|y|z)*x|[^xyz]([^xyz]|y|z)*x|x|yx|y[^xyz]([^xyz]|y|z)*x|yy([^xyz]|y|z)*x)*yz # # 遷移図は # # x # <-----------+ # [^x] | x | # <----+ <----+ | # | | | | | # \/ x \/ y | z # 0 ----> 1 ----> 2 ----> 3(DEAD) # | | | # | [^xy] | | # <----------+ | # | [^xz] | # <--------------------- # # 「xyz を含まない文字列」の答は、 # # ([^x]|x(y?x)*([^xy]|y[^xz]))*(x(y?x)*x?)? # # (x(y?x)*x?)? の部分はこの場合に限り (x|y)* で代用できるかな # 後、つるかめ算の様に「勘」で書いたのが # # [^x]*(x+(y|y[^xz][^x]*|[^xy][^x]*))* # # ですがちょっと自信無し # 'xyz を含まないものにマッチする'(_文字列,_副文字列) :- sub_atom(_文字列,_,Len,_,_副文字列), Len > 0, \+(sub_atom(_副文字列,_,_,_,xyz)). % 以下のサイトは # 出題場所 :: 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,_ファーストネーム,_ミドルネーム,_ラストネーム),!. 名前の分解([_ファーストネーム,_ラストネーム],_ファーストネーム,'',_ラストネーム) :- !. 名前の分解([_ファーストネーム,_ミドルネーム,_ラストネーム],_ファーストネーム,_ミドルネーム,_ラストネーム). split(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 区切り文字で区切って行く(_文字列,_区切り文字列ならび,_区切られた文字列ならび). split(_文字列,_,[_文字列]). 区切り文字で区切って行く(_文字列,_区切り文字列ならび,[_前文字列|R]) :- 区切り文字で(_区切り文字列ならび,_区切り文字列), 区切って行く(_文字列,_区切り文字ならび,_前文字列,_区切り文字列,_後文字列,R). 区切り文字で(_区切り文字列ならび,_区切り文字列) :- member(_区切り文字列,_区切り文字列ならび). 区切って行く(_文字列,_区切り文字ならび,_前文字列,_区切り文字列,_後文字列,R) :- sub_atom(_文字列,_前文字列,_区切り文字列,_後文字列), split(_後文字列,_区切り文字列ならび,R). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/642 # お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 # "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を # 返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 # 例 # 1 # 11 # 21 # 1211 # 111221 # 312211 # 13112221 # 1113213211 # 31131211131221 # 13211311123113112211 # 11131221133112132113212221 # # '"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。"11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を返す。"1"から始めてこの操作(以下、"この操作"とする)を10回繰り返し、途中経過を表示する。' :- '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。' :- この操作([],'1',Ln,_文字列), writef('%w\n',[_文字列]), length(Ln,10),!. この操作(Ln,_文字列,Ln,_文字列). この操作(Ln_1,_文字列_1,Ln,_文字列) :- 連続数連続記号が列んだ行を生成する(Ln_1,_文字列_1,Ln,_文字列). 連続数連続記号が列んだ行を生成する(Ln_1,_文字列_1,Ln,_文字列) :- 連続記号を切り取って連続数と連続記号が交互に来るならびを生成する(_文字列_1,_文字構成ならび), atomic_list_concat(_文字構成ならび,_文字列_2), この操作([_|Ln_1],_文字列_2,Ln,_文字列). 連続記号を切り取って連続数と連続記号が交互に来るならびを生成する(_文字列,_文字構成ならび) :- findall([_連続数,_連続記号],( 連続記号を切り取る(_文字列,_連続数,_連続記号)),LL), flatten(LL,_文字構成ならび). 連続記号を切り取る(_文字列,_連続数,_連続記号) :- '前文字列・後文字列'(_文字列,_前文字列の文字数,_,_前文字列,_後文字列), 前文字列は全部同じ記号で構成され後文字列の先頭記号はこれとは異なる(_前文字列,_後文字列,_同じ記号), 連続記号を切り取る(_後文字列,_前文字列の文字数,_同じ記号,_連続数,_連続記号). 連続記号を切り取る(_後文字列,_連続数,_連続記号,_連続数,_連続記号). 連続記号を切り取る(_後文字列,_,_,_連続数,_連続記号) :- 連続記号を切り取る(_後文字列,_連続数,_連続記号). '前文字列・後文字列'(_文字列,_前文字列の長さ,_後文字列の長さ,_前文字列,_後文字列) :- sub_atom(_文字列,0,_前文字列の長さ,_後文字列の長さ,_前文字列), sub_atom(_文字列,_,_後文字列の長さ,0,_後文字列). 前文字列は全部同じ記号で構成され後文字列の先頭記号はこれとは異なる(_前文字列,_後文字列,_同じ記号) :- 前文字列は全部同じ記号で構成され(_前文字列,_同じ記号), 後文字列の先頭記号はこれとは異なる(_後文字列,_同じ記号). 前文字列は全部同じ記号で構成され(_前文字列,_同じ記号) :- sub_atom(_前文字列,0,1,_,_同じ記号), forall(sub_atom(_前文字列,_,1,_,_記号),_記号=_同じ記号). 後文字列の先頭記号はこれとは異なる(_後文字列,_同じ記号) :- \+(sub_atom(_後文字列,0,1,_,_同じ記号)). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/593 # お題:文字列のアスキーコードの平均値を求め、その整数部分を # アスキーコードとする文字を返す。 # 例 # "BASIC" -> "F" # # '文字列のアスキーコードの平均値を求め、その整数部分をアスキーコードとする文字を返す。'(_文字列,_文字列のアスキーコードの平均値を求めその整数部分をアスキーコードとする文字) :- '文字列のアスキーコードの平均値を求め、'(_文字列,_アスキーコードの平均値), 'その整数部分をアスキーコードとする文字'(_アスキーコードの平均値,_文字列のアスキーコードの平均値を求めその整数部分をアスキーコードとする文字). '文字列のアスキーコードの平均値を求め、'(_文字列,_アスキーコードの平均値) :- findavg(_アスキーコード,( sub_atom(_文字列,_,1,_,_文字), char_code(_文字,_アスキーコード)), _アスキーコードの平均値). 'その整数部分をアスキーコードとする文字'(_アスキーコードの平均値,_文字列のアスキーコードの平均値を求めその整数部分をアスキーコードとする文字) :- _文字列のアスキーコードの平均値を求めその整数部分をアスキーコードとする文字 is truncate(_アスキーコードの平均値). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/465 # お題:与えられた文字列中の各文字数をカウントして表示せよ。 # 表示順や形式は定めない。 # # 回答例およびチェック用出力例: c # #include <stdio.h> # void check(const char *cs) { # int i, counts[256] = {0}; # for (i = 0; cs[i] != '\0'; i++) counts[cs[i]] += 1; # for (i = 0; i < 256; i++) { # if (counts[i]) printf("'%c'=>%d, ", (char)i, counts[i]); # } # } # int main() { # check("We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris."); # return 0; # } # ↓ # ' '=>16, ','=>2, '.'=>1, ':'=>1, 'W'=>1, 'a'=>7, 'b'=>1, 'c'=>2, 'd'=>2, 'e'=>14 # , 'f'=>1, 'g'=>3, 'h'=>3, 'i'=>6, 'l'=>4, 'm'=>3, 'n'=>4, 'o'=>6, 'p'=>3, 'r'=>8 # , 's'=>4, 't'=>6, 'u'=>4, 'v'=>2, 'w'=>1, 'y'=>1, 'z'=>1, # # '与えられた文字列中の各文字数をカウントして表示せよ。表示順や形式は定めない。'(_文字列,_各文字数のカウント) :- findall(_文字_1,( setof(_文字_1,sub_atom(_文字列,_,1,_,_文字_1),[_文字_1])), _重複のない文字ならび), findall([_文字,_文字数のカウント],( member(_文字,_重複のない文字ならび), カウント(sub_atom(_文字列,_,1,_,_文字),_文字数のカウント)), _各文字数のカウント). カウント(P,_カウント) :- findall(1,P,L), length(L,_カウント). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/854 # ●Regular Expressionの使用環境 # Becky! Internet Mail Ver.2 # # ●検索か置換か? # 検索 # # ●説明 # +0900を含まないものを検索したい # # ●対象データ # +0900 # +0500 # +0630 # # ●希望する結果 # +0500 # +0630 # # よろしくお願いします。 # # '+0900を含まないものを検索したい'(_文字列) :- 行ならび入力(_行ならび), '+0900を含まないものを検索したい'(_行ならび,_文字列). '+0900を含まないものを検索したい'(_行ならび,_文字列) :- member(_文字列,_行ならび), '+0900を含まないものを'(_文字列). '+0900を含まないものを'(_文字列) :- \+(sub_atom(_文字列,_,_,_,'+0900')). 行ならび入力([]) :- at_end_of_stream(user_input),!. 行ならび入力(_行ならび) :- 行を入力して行く(_行ならび) :- 行を入力して行く([_行|_残り行ならび]) :- 行入力(_行), 行ならび入力(_残り行ならび). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/435 # お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は # 元のデータの順に)表示する。 '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)表示する。' :- '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(1,[],_整列した_開始位置_数値定数ならび), 表示する(_整列した_開始位置_数値定数ならび). '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_数値,L,L) :- _数値 > 100,!. '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_数値,L1,L) :- 出現順に挿入整列する(_数値,L1,L2), _数値_2 is _数値 + 1, '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_数値_2,L2,L). 出現順に挿入整列する(_数値,L1,L2) :- atom_number(_数値定数,_数値), チャンパーノウン定数に出現(_数値定数,_開始位置), 挿入整列する(_開始位置,_数値,L1,L2). チャンパーノウン定数に出現(_数値定数,_開始位置) :- チャンパーノウン定数の生成(1,'0.1',_チャンパーノウン定数), sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数),!. チャンパーノウン定数の生成(_数値,_チャンパーノウン定数,_チャンパーノウン定数). チャンパーノウン定数の生成(_数値_1,_チャンパーノウン定数_1,_チャンパーノウン定数) :- _数値_2 is _数値_1 + 1, atom_number(_数値定数,_数値_2), atom_concat(_チャンパーノウン定数_1,_数値定数,_チャンパーノウン定数_2), チャンパーノウン定数の生成(_数値_2,_チャンパーノウン定数_2,_チャンパーノウン定数). 挿入整列する(_開始位置,_数値,[],[[_開始位置,_数値]]). 挿入整列する(_開始位置,_数値,[[_開始位置_1,_数値_1]|R],[[_開始位置,_数値],[_開始位置_1,_数値_1]|R]) :- _開始位置 =< _開始位置_1,!. 挿入整列する(_開始位置,_数値,[[_開始位置_1,_数値_1]|R1],[[_開始位置_1,_数値_1]|R2]) :- 挿入整列する(_開始位置,_数値,R1,R2). 表示する(_整列した_開始位置_数値ならび) :- forall(member([_,_数値],_整列した_開始位置_数値ならび),writef('%t\n',[_数値])). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/435 # お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は # 元のデータの順に)表示する。 '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)表示する。' :- '1から100までのチャンパーノウン定数'(_チャンパーノウン定数), '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_チャンパーノウン定数,_整列した_開始位置_数値定数ならび), 表示する(_整列した_開始位置_数値定数ならび). '1から100までのチャンパーノウン定数'(_チャンパーノウン定数) :- findall(_数値定数,( between(1,100,_数値), atom_number(_数値定数,_数値)), _数値定数ならび), atomic_list_concat(['0.'|_数値定数ならび],_チャンパーノウン定数). '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_チャンパーノウン定数,_整列した_開始位置_数値ならび) :- findall([_開始位置,_数値],( between(1,100,_数値), atom_number(_数値定数,_数値), sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数)), _開始位置_数値ならび), sort(_開始位置_数値ならび,_整列した_開始位置_数値ならび). 表示する(_整列した_開始位置_数値ならび) :- forall(member(_数値,_整列した_開始位置_数値ならび),writef('%t\n',[_数値])). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/435 # お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は # 元のデータの順に)表示する。 '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)表示する。' :- '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_整列した_開始位置_数値定数ならび), 表示する(_整列した_開始位置_数値定数ならび). '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_整列した_開始位置_数値ならび) :- findall([_開始位置,_数値],( between(1,100,_数値), atom_number(_数値定数,_数値), チャンパーノウン定数に出現(_数値定数,_開始位置)), _開始位置_数値ならび), sort(_開始位置_数値ならび,_整列した_開始位置_数値ならび). チャンパーノウン定数に出現(_数値定数,_開始位置) :- チャンパーノウン定数の生成(1,'0.1',_チャンパーノウン定数), sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数),!. チャンパーノウン定数の生成(_数値,_チャンパーノウン定数,_チャンパーノウン定数). チャンパーノウン定数の生成(_数値_1,_チャンパーノウン定数_1,_チャンパーノウン定数) :- _数値_2 is _数値_1 + 1, atom_number(_数値定数,_数値_2), atom_concat(_チャンパーノウン定数_1,_数値定数,_チャンパーノウン定数_2), チャンパーノウン定数の生成(_数値_2,_チャンパーノウン定数_2,_チャンパーノウン定数). 表示する(_整列した_開始位置_数値ならび) :- forall(member([_,_数値],_整列した_開始位置_数値ならび),writef('%t\n',[_数値])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/844 # たぶんやりたいことはこうだろう。数字以外の文字が1文字でもあればエラーを出す。# # [[ "$A" =~ [^0-9] ]] && echo "not number" # 数字以外の文字が1文字でもあればエラーを出す(_文字列) :- forall(sub_atom(_文字列,_,1,_,A),member(A,['0','1','2','3','4','5','6','7','8','9'])),!. 数字以外の文字が1文字でもあればエラーを出す(_) :- write('エラー\n'). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/843 # ^[^0-9]+$ は数字以外だけの文字列の場合ヒット、数字混じりだと絶対ヒットしない '数字以外だけの文字列の場合ヒット、数字混じりだと絶対ヒットしない '(_文字列) :- forall(sub_atom(_文字列,_,1,_,A),\+(member(A,['0','1','2','3','4','5','6','7','8','9']))). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/843 # ^[^0-9]+$ は数字以外だけの文字列の場合ヒット、数字混じりだと絶対ヒットしない '数字以外だけの文字列の場合ヒット、数字混じりだと絶対ヒットしない '(_文字列) :- \+((sub_atom(_文字列,_,1,_,A),member(A,['0','1','2','3','4','5','6','7','8','9']))). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/403 # [1] プログラミング # [2] 問題文(含コード&リンク): # 文字列s、pを与えられ文字列sの中の先頭から順に調べpに一致する部分文字列が # 見つかったらその部分文字列の先頭を指すポインタを、見つからない場合NULLを返す # SEARCH関数を作る # '文字列s、pを与えられ文字列sの中の先頭から順に調べpに一致する部分文字列が見つかったらその部分文字列の先頭を指すポインタを、見つからない場合NULLを返す'(_s,_p,_先頭位置) :- sub_atom(_p,0,_pの長さ,0,_p), sub_atom(_s,_先頭位置,_pの長さ,_,_p),!. '文字列s、pを与えられ文字列sの中の先頭から順に調べpに一致する部分文字列が見_つかったらその部分文字列の先頭を指すポインタを、見つからない場合NULLを返す'(_,_,(-1)). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/403 # [1] プログラミング # [2] 問題文(含コード&リンク): # 文字列s、pを与えられ文字列sの中の先頭から順に調べpに一致する部分文字列が # 見つかったらその部分文字列の先頭を指すポインタを、見つからない場合NULLを返す # SEARCH関数を作る # '文字列s、pを与えられ文字列sの中の先頭から順に調べpに一致する部分文字列が 見つかったらその部分文字列の先頭を指すポインタを、見つからない場合NULL(-1)を返す'(_s,_p,_先頭位置) :- sub_atom(_s,_先頭位置,_,_,_p),!. '文字列s、pを与えられ文字列sの中の先頭から順に調べpに一致する部分文字列が 見_つかったらその部分文字列の先頭を指すポインタを、見つからない場合NULL(-1)を返す'(_,_,(-1)). % 以下のサイトは # 出題場所 # # ●Regular Expressionの使用環境 # Python3.3 # # ●検索か置換か? # 置換 # # ●説明 # 均等割りにしているスペースを削除したい # 一文字ずつスペースが入っている文字のスペースを削除したい # # ●対象データ # あ い う え お # かき くけ ここ # # ●希望する結果 # あいうえお # かき くけ ここ # 均等割りにしているスペースを削除したい(_文字列,_均等割文字列長さ,_スペースを削除した文字列) :- 均等割文字列(_文字列,_均等割文字列長さ,_均等割文字列ならび), atomic_list_concat(_均等割文字列ならび,_スペースを削除した文字列). 均等割文字列(_文字列,_均等割文字列長さ,[_文字列]) :- '文字列が均等割文字長さであり、構成する文字全てがスペースではない'(_文字列,_均等割文字列長さ). 均等割文字列(_文字列,_均等割文字列長さ,[_前文字列|R]) :- 均等割副文字列を得る(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ), 均等割文字列(_後文字列,_均等割文字列長さ,R). '文字列が均等割文字長さであり、構成する文字全てがスペースではない'(_文字列,_均等割文字列長さ) :- 文字列を構成する文字全てがスペースではない(_文字列), atom_length(_文字列,_均等割文字列長さ). 均等割副文字列を得る(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ) :- '前文字列・スペース文字列・後文字列候補'(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ), '前文字列は空文字でなく全て文字、スペース文字列は空文字でなく全てスペース'(_前文字列,_スペース文字列), 後文字列の先頭文字はスペースではない(_後文字列). '前文字列・スペース文字列・後文字列候補'(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ) :- sub_atom(_文字列,_均等割文字列長さ,_,R,_スペース文字列), sub_atom(_文字列,0,_均等割文字列長さ,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). '前文字列は空文字でなく全て文字、スペース文字列は空文字でなく全てスペース'(_前文字列,_スペース文字列) :- 前文字列は空文字でなく全て文字(_前文字列), スペース文字列は空文字でなく全てスペース(_スペース文字列). 前文字列は空文字でなく全て文字(_前文字列) :- 空文字ではなく(_前文字列), 文字列を構成する文字全てがスペースではない(_前文字列). スペース文字列は空文字でなく全てスペース(_スペース文字列) :- 空文字ではなく(_スペース文字列), 文字列を構成する文字全てがスペースである(_スペース文字列). 空文字ではなく(_文字列) :- \+(_文字列=''). 後文字列の先頭文字はスペースではない(_後文字列) :- \+(sub_atom(_後文字列,0,1,_,' ')). 文字列を構成する文字全てがスペースではない(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),\+(_文字=' ')). 文字列を構成する文字全てがスペースである(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),_文字=' '). % 以下のサイトは # 出題場所 # # お題:与えられた文字列が回文かどうかチェックせよ。 # 半角アルファベット文字のみを判定の対象とする。大文字小文字の区別はしない。 # 判定対象文字列のサイズがゼロの場合の判定結果はどちらでもよい。 '与えられた文字列が回文かどうかチェックせよ。 半角アルファベット文字のみを判定の対象とする。大文字小文字の区別はしない。 判定対象文字列のサイズがゼロの場合の判定結果はどちらでもよい。'(_与えられた文字列) :- forall(文字列の最初と最後の文字の対が順に(_与えられた文字列,_最初の文字,_最後の文字),大文字小文字の区別はせず一致する(_最初の文字,_最後の文字)). 文字列の最初と最後の文字の対が順に(_文字列,_最初の文字,_最後の文字) :- sub_atom(_文字列,0,1,_,_最初の文字列_1), sub_atom(_文字列,_,1,0,_最後の文字列_1), sub_atom(_文字列,1,_,1,_間の文字列), 文字列の最初と最後の文字の対が順に(_最初の文字_1,_間の文字列,_最後の文字_1,_最初の文字,_最後の文字). 文字列の最初と最後の文字の対が順に(_最初の文字,_,_最後の文字,_最初の文字,_最後の文字). 文字列の最初と最後の文字の対が順に(_,_間の文字列,_,_最初の文字,_最後の文字) :- 文字列の最初と最後の文字の対が順に(_間の文字列,_最初の文字,_最後の文字). 大文字小文字の区別はせず一致する(_最初の文字,_最後の文字) :- to_upper(_最初の文字列,A), to_upper(_最後の文字列,A). % 以下のサイトは 先頭と末尾の空白を除いた文字列(_文字列,_先頭と末尾の空白を除いた文字列) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_,1,0,_末尾文字), 先頭と末尾の空白を除いた文字列(_文字列,_先頭文字,_末尾文字,_先頭と末尾の空白を除いた文字列),!. 先頭と末尾の空白を除いた文字列('',''). 先頭と末尾の空白を除いた文字列(_文字列,' ',' ',_先頭と末尾の空白を除いた文字列) :- sub_atom(_文字列,1,_,1,_先頭と末尾の空白を除いた文字列),!. 先頭と末尾の空白を除いた文字列(_文字列,' ',_,_先頭と末尾の空白を除いた文字列) :- sub_atom(_文字列,1,_,0,_先頭と末尾の空白を除いた文字列),!. 先頭と末尾の空白を除いた文字列(_文字列,_,' ',_先頭と末尾の空白を除いた文字列) :- sub_atom(_文字列,0,_,1,_先頭と末尾の空白を除いた文字列),!. 先頭と末尾の空白を除いた文字列(_文字列,_,_,_文字列). % 以下のサイトは # twitter_by_@102m4_20131128 'わかった、じゃあ数字をいれるとその文字数だけ寿限無を表示するプログラミングをつくる' :- 'わかった、じゃあ数字をいれると'(_数字), その文字数だけ寿限無を(_数字,_その文字数だけ寿限無を), 表示する(_その文字数だけ寿限無を). 'わかった、じゃあ数字をいれると'(_数字) :- 整数を得る('わかった、じゃあ数字をいれて ',_数字 > 0,_数字). その文字数だけ寿限無を(_文字数,_その文字数だけ寿限無を) :- 寿限無をその文字数だけ(_文字数,_その文字数だけ寿限無を). 寿限無をその文字数だけ(_文字数,_その文字数だけ寿限無を) :- 寿限無(_寿限無を), sub_atom(_寿限無を,0,_文字数,_,_その文字数だけ寿限無を). 寿限無(じゅげむじゅげむごこうのすりきれかいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつくうねるところにすむところやぶらこうじのぶらこうじぱいぽぱいぽぱいぽのしゅーりんがんしゅーりんがんのぐーりんだいぐーりんだいのぽんぽこぴーのぽんぽこなーのちょうきゅうめいのちょうすけ). 表示する(_表示対象) :- writef('%t\n',[_表示対象]). % 「数字をいれる」は引数から % 「その数詞の文字数だけ寿限無を」を変更(1) % 「その数詞の文字数だけ寿限無を」を変更(2) % 以下のサイトは # twitter_by_@102m4_20131128 'わかった、じゃあ数字をいれるとその文字数だけ寿限無を表示するプログラミングをつくる' :- 'わかった、じゃあ数字をいれると'(_数字), その文字数だけ寿限無を(_数字,_その文字数だけ寿限無を), 表示する(_その文字数だけ寿限無を). 'わかった、じゃあ数字をいれると'(_数字) :- 整数を得る('わかった、じゃあ数字をいれて ',_数字 > 0,_数字). その文字数だけ寿限無を(_文字数,_その文字数だけ寿限無を) :- freeze(_寿限無,sub_atom(_寿限無,0,_文字数,_,_その文字数だけ寿限無を)), 寿限無(_寿限無). 寿限無(じゅげむじゅげむごこうのすりきれかいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつくうねるところにすむところやぶらこうじのぶらこうじぱいぽぱいぽぱいぽのしゅーりんがんしゅーりんがんのぐーりんだいぐーりんだいのぽんぽこぴーのぽんぽこなーのちょうきゅうめいのちょうすけ). 表示する(_文字数だけ寿限無を) :- writef('%t\n',[_文字数だけ寿限無を]). % 「数字をいれる」は引数から % 「その数詞の文字数だけ寿限無を」を変更(1) % 「その数詞の文字数だけ寿限無を」を変更(2) % 以下のサイトは # twitter_by_@102m4_20131128 'わかった、じゃあ数字をいれるとその文字数だけ寿限無を表示するプログラミングをつくる' :- 'わかった、じゃあ数字をいれると'(_数字), その文字数だけ寿限無を(_数字,_その文字数だけ寿限無を), 表示する(_その文字数だけ寿限無を). 'わかった、じゃあ数字をいれると'(_数字) :- 整数を得る('わかった、じゃあ数字をいれて ',_数字 > 0,_数字). その文字数だけ寿限無を(_数字,_その文字数だけ寿限無を) :- 寿限無(_寿限無), sub_atom(_寿限無,0,数字,_,_その文字数だけ寿限無を). 寿限無(じゅげむじゅげむごこうのすりきれかいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつくうねるところにすむところやぶらこうじのぶらこうじぱいぽぱいぽぱいぽのしゅーりんがんしゅーりんがんのぐーりんだいぐーりんだいのぽんぽこぴーのぽんぽこなーのちょうきゅうめいのちょうすけ). 表示する(_文字数だけ寿限無を) :- writef('%t\n',[_文字数だけ寿限無を]). % 「数字をいれる」は引数から % 「その数詞の文字数だけ寿限無を」を変更(1) % 「その数詞の文字数だけ寿限無を」を変更(2) % 以下のサイトは # twitter_by_@102m4_20131128 'わかった、じゃあ数字をいれるとその文字数だけ寿限無を表示するプログラミングをつくる'(_数字) :- 寿限無(_寿限無), sub_atom(_寿限無,0,_数字,_,_文字数だけ寿限無を), writef('%t\n',[_文字数だけ寿限無を]). 寿限無(じゅげむじゅげむごこうのすりきれかいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつくうねるところにすむところやぶらこうじのぶらこうじぱいぽぱいぽぱいぽのしゅーりんがんしゅーりんがんのぐーりんだいぐーりんだいのぽんぽこぴーのぽんぽこなーのちょうきゅうめいのちょうすけ). % 「わかった、じゃあ数字をいれる」を変更 % 「その数詞の文字数だけ寿限無を」を変更(1) % 「その数詞の文字数だけ寿限無を」を変更(2) % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/198 # # お題:チャンパーノウン定数を表示せよ。 # 表示された文字列中に"991"を一つだけ含むこと。 'お題:チャンパーノウン定数を表示せよ。 表示された文字列中に"991"を一つだけ含むこと。' :- 'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(1,'0.'). 'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N,A) :- count(sub_atom(A,_,3,_,'991'),2),!,fail. 'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N,A) :- atom_number(B,N), atom_concat(A,B,C), '表示された文字列中に"991"を一つだけ含むこと。'(N,C). '表示された文字列中に"991"を一つだけ含むこと。'(N,_チャンパーノウン定数) :- '文字列中に"991"を一つだけ含むこと。'(_チャンパーノウン定数), writef('%t\n',[_チャンパーノウン定数]). '表示された文字列中に"991"を一つだけ含むこと。'(N,C) :- N_2 is N + 1, チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N_2,C,_チャンパーノウン定数). '文字列中に"991"を一つだけ含むこと。'(_チャンパーノウン定数) :- count(sub_atom(_チャンパーノウン定数,_,3,_,'991'),1). count(P,N) :- findall(1,P,L), length(L,Count). % 以下のサイトは # # SWI-Prolog用 sub_atom/5 の遅延評価版述語 副文字列/5 # # 第一引数の_文字列が変数であってもすぐにはエラーとならない # 副文字列(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- '選択開始位置0起源、残り長さが共に0で、かつ、文字列が変数'(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列),!. 副文字列(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- freeze(_文字列,sub_atom(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列)). '選択開始位置0起源、残り長さが共に0で、かつ、文字列が変数'(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- '選択開始位置0起源、残り長さが共に0で、'(_選択開始位置0起源,_残り長さ), 'かつ、文字列が変数'(_文字列,_副文字列,_選択長さ). '選択開始位置0起源、残り長さが共に0で、'(_選択開始位置0起源,_残り長さ) :- '選択開始位置0起源、残り長さは整数で'(_選択開始位置0起源,_残り長さ), 共に0である(_選択開始位置0起源,_残り長さ). '選択開始位置0起源、残り長さは整数で'(_選択開始位置0起源,_残り長さ) :- integer(_選択開始位置0起源), integer(_残り長さ). 共に0である(0,0). 'かつ、文字列が変数'(_文字列,_副文字列,_選択長さ) :- var(_文字列), _文字列 = _副文字列, freeze(_文字列,atom_length(_文字列,_選択長さ)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/68 # # お題:文字列をランダムに並べ替える。 # ただし、どの文字も元と同じ位置ではないこと。 '文字列をランダムに並べ替える。 ただし、どの文字も元と同じ位置ではないこと。'(_文字列,_ランダムに並べ替えた文字列) :- 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび), 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列). 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび) :- atom_length(_文字列,_文字列の長さ), length(_位置決めならび,_文字列の長さ), findall(N,between(1,_文字列の長さ,N),_整数順ならび), 位置を置換する(_整数順ならび,_文字列の置換位置ならび). 位置を置換する([],_位置決めならび) :- !. 位置を置換する([_位置1,_位置2,_位置3],_位置決めならび) :- 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび). 位置決めならび(L,_位置決めならび) :- 位置の交換(L,R,_位置決めならび), 位置を置換する(R,_位置決めならび). 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび) :- nth1(_位置1,_位置決めならび,_位置2), nth1(_位置2,_位置決めならび,_位置3), nth1(_位置3,_位置決めならび,_位置1),!. 位置の交換(L,L2,_位置決めならび) :- 位置選択(L,N1,L1), 位置選択(N2,L1,L2), nth1(N1,_位置決めならび,N2), nth1(N2,_位置決めならび,N1),!. 位置選択(L,_位置,L2) :- length(L,Len), _乱数値 is random(Len), length(L0,Len), append(L0,[_位置|R],L), append(L0,R,L2),!. 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列) :- findall(_文字,( member(_位置,_文字列の置換位置ならび), _位置_1 is _位置 - 1, sub_atom(_文字列,_位置_1,1,_,_文字)), _ランダムに並べ替えた文字ならび), atomic_list_concat(_ランダムに並べ替えた文字ならび,_ランダムに並べ替えた文字列). % 以下のサイトは # 出典:: 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,_忌避する連接した語))),!. 忌避する連接した語(料理,お肉). 忌避する連接した語(料理,お魚). % 以下のサイトは # 出典:: 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,_後文字列). 忌避する連接した語(料理,お肉). 忌避する連接した語(料理,お魚). % 以下のサイトは # @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/758 # # あるシステムにデバイスのシリアルを登録するのですが、シリアルに半角スペースが入っていると正常に登録ができません。 # 正規表現が使えるようなので、質問ですが、下記のシリアルを正規表現で表記するにはどう表記すれば良いでしょうか。 # # 上記シリアルは二つの文字列間に半角スペースが12個含んでいます。 # よろしくお願いします。 '二つの文字列間に半角スペースが12個含んでいます。'(_文字列,_一つ目の文字列,_二つ目の文字列) :- sub_atom(_文字列,_一つ目の文字列,' ',_二つ目の文字列,[A|L1],L2,[B|L3]), \+(member(' ',[A|L1])), \+(member(' ',[B|L3])). sub_atom(A,H,X,T,HL,XL,TL) :- sub_atom(A,_,_,_,H,X,T,HL,XL,TL). % 以下のサイトは # wshのjscriptで # abc123def456 # これのcと1の間とfと4の間だけに一致させる方法ないですかね? # "abc123def456".splitに投げたら["abc", "123def", "456"]が返ってくるのが理想です 'wshのjscriptで abc123def456 これのcと1の間とfと4の間だけに一致させる方法ないですかね? "abc123def456".splitに投げたら["abc", "123def", "456"]が返ってくるのが理想です'(_文字列,_区切られた文字列ならび) :- '文字列の_文字1と_文字2の間と_文字3と_文字4の間だけに一致させる方法ないですかね?'('abc123def456',c,'1',f,'4',_区切りられた文字列ならび). '文字列の_文字1と_文字2の間と_文字3と_文字4の間だけに一致させる方法ないですかね?'(_文字列,_文字1,_文字2,_文字3,_文字4,_区切られた文字列ならび) :- sub_atom(_文字列,_,_対象とする副文字列,_), findall(_区切り候補,( 対象とする副文字列_文字1と_文字2の間と_文字3と_文字4の間だけに一致させる(_対象とする副文字列,_区切り候補)), _区切り候補ならび), sPLIT(_文字列,_区切り候補ならび,_区切られた文字列ならび). 対象とする副文字列の_文字1と_文字2の間と_文字3と_文字4の間だけに一致させる(_対象とする副文字列,_文字1,_文字2,_文字3,_文字4,_区切り候補) :- 先頭文字と末尾文字の間の文字列(_対象とする副文字列,_文字1,_文字2,_区切り候補). 対象とする副文字列の_文字1と_文字2の間と_文字3と_文字4の間だけに一致させる(_対象とする副文字列,_文字1,_文字2,_文字3,_文字4,_区切り候補) :- 先頭文字と末尾文字の間の文字列(_対象とする副文字列,_文字3,_文字4,_区切り候補). 先頭文字と末尾文字の間の文字列(_対象とする副文字列,_先頭文字,_末尾文字,_先頭文字と末尾文字の間の文字列) :- sub_atom(_対象とする副文字列,0,1,_,_先頭文字), sub_atom(_対象とする副文字列,_,1,0,_末尾文字), sub_atom(_対象とする副文字列,1,_,1,_先頭文字と末尾文字の間の文字列). % 以下のサイトは # 出典:: 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). % 以下のサイトは # # ●Regular Expressionの使用環境 # Visual C# # # ●検索か置換か? # 検索 # # ●説明 # 同じ文字が5回以上繰り返されている箇所のある行を検索したい # # ●対象データ→結果 # うわあああああい → マッチ # aaaaaaaa      → マッチ # あいあいあい   → マッチせず # 同じ文字が5回以上繰り返されている箇所のある行を検索したい(_文字列,_行) :- split(_文字列,['\n'],_行ならび), 同じ文字が5回以上繰り返されている箇所のある行ならびを検索する(_行ならび,_行). 同じ文字が5回以上繰り返されている箇所のある行ならびを検索する(_行ならび,_行) :- nth1(_,_行ならび,_行), 同じ文字が5回以上繰り返されている箇所のある行(_行). 同じ文字が5回以上繰り返されている箇所のある行(_文字列) :- sub_atom(_文字列,_,5,_,_適合文字列), atom_chars(_適合文字列,[A,A,A,A,A]),!. % 以下のサイトは # "0000000000"のような文字列を用意しておいて、"123" のような # 任意の文字列を"0000000123"のように置き換えるのって簡単にできますか? # 置き換える方の文字列は3桁じゃなくて、いろんな数字があり得ます。 # # C言語でいうsprintf(%10d, 123)みたいなフォーマットを正規表現で簡単に # 再現できますか? '"0000000000"のような文字列を用意しておいて、"123" のような 任意の文字列を"0000000123"のように置き換えるのって簡単にできますか? 置き換える方の文字列は3桁じゃなくて、いろんな数字があり得ます。'(_置換対象文字列,_置換文字列,_置換された文字列) :- atom_length(_置換文字列,_文字長), sub_atom(_置換対象文字列,S1,S2,S3), atom_length(S2,_文字長), atomic_list_concat([S1,_置換文字列,S3],_置換された文字列). % *** user: sub_atom / 4 *** sub_atom(A,H,X,T) :- atomic(X), atom_chars(A,L), atom_chars(X,XL), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,H,X,T) :- var(X), atom_chars(A,L), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), \+(XL = []), atom_chars(T,TL). % 以下のサイトは # お題:数字を3桁ごとにカンマ区切りでフォーマットした文字列をふたつ取り # 合計を同じフォーマット文字列で返す。 # 例 # "18,446,744,073,709,551,616" # "1,099,511,627,776" #   ↓ # "18,446,745,173,221,179,392" # 'お題:数字を3桁ごとにカンマ区切りでフォーマットした文字列をふたつ取り合計を同じフォーマット文字列で返す。'(_文字列_1,_文字列_2,_文字列_3) :- カンマ区切り文字列を数値に戻す(_文字列_1,_数値_1), カンマ区切り文字列を数値に戻す(_文字列_2,_数値_2), _数値_3 is _数値_1 + _数値_2, 数値を3桁ごとにカンマ区切りでフォーマットした文字列とする(_数値_3,_文字列_3). カンマ区切り文字列を数値に戻す(_文字列,_数値) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(_文字=',')), _数字文字ならび), number_chars(_数値,_数字文字ならび). 数値を3桁ごとにカンマ区切りでフォーマットした文字列とする(_数値,_カンマが挿入された文字列) :- number_chars(_数値,_数字ならび), length(_数字ならび,_桁), atomic_list_concat(_数字ならび,_カンマが挿入されていない数字文字列), _剰余 is _桁 mod 3, 数字文字列にカンマを挿入(_剰余,_カンマが挿入されていない数字文字列,_カンマが挿入された文字列). 数字文字列にカンマを挿入(0,_カンマが挿入されていない数字文字列,_カンマが挿入された数字文字列) :- findall(_3字文字列,( sub_atom(_カンマが挿入されていない数字文字列,St,3,R,_3字文字列), 0 is St mod 3), L), atomic_list_concat(L,',',_カンマが挿入された数字文字列),!. 数字文字列にカンマを挿入(N,_数字文字列,_カンマが挿入された数字文字列) :- sub_atom(_数字文字列,0,N,R,_先頭文字列), sub_atom(_数字文字列,_,R,0,_残り文字列), 数字文字列にカンマを挿入(0,_残り文字列,_カンマが挿入された数字文字列_1), atomic_list_concat([_先頭文字列,',',_カンマが挿入された数字文字列_1],_カンマが挿入された数字文字列). % 以下のサイトは # いろいろな環境の中には、先読みの否定である (?! ) が # 使えない環境があります。 このような環境では、 # 「ABC」 という文字列を含まない # というような、文字列の否定をする正規表現を作るのは # とても難しい作業になります # ※ (?! ) が使える環境での作り方は こちら 。 # # では、例として、 # 以下のようなテキストにマッチする正規表現を考えてみましょう★ # ・ テキストの先頭が AA から始まる # ・ テキストの末尾が AA で終わる # ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない # '・ テキストの先頭が AA から始まる ・ テキストの末尾が AA で終わる ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト) :- sub_atom(_テキスト,'AA',S2,'AA',_,_,_), \+(sub_atom(S2,_,_,_,'AA')). %%%%%%%% sub_atom/7 %%%%%%%% sub_atom(A,H,X,T,HL,XL,TL) :- atom(A), atom_chars(A,Chars), append(HL,XL,TL,Chars), 'HL_XL_TL_H_X_T'(HL,XL,TL,H,X,T). 'HL_XL_TL_H_X_T'(HL,XL,TL,H,X,T) :- \+(XL=[]), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). %%%%%%%% append/4 %%%%%%%% append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # いろいろな環境の中には、先読みの否定である (?! ) が # 使えない環境があります。 このような環境では、 # 「ABC」 という文字列を含まない # というような、文字列の否定をする正規表現を作るのは # とても難しい作業になります # ※ (?! ) が使える環境での作り方は こちら 。 # # では、例として、 # 以下のようなテキストにマッチする正規表現を考えてみましょう★ # ・ テキストの先頭が AA から始まる # ・ テキストの末尾が AA で終わる # ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない # '・ テキストの先頭が AA から始まる ・ テキストの末尾が AA で終わる ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト) :- sub_atom(_テキスト,_,_,_,'AA',S2,'AA',_,_,_), \+(sub_atom(S2,_,_,_,'AA')). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% sub_atom(A,S,Len,R,H,X,T,HL,XL,TL) :- atomic(X), atom_chars(A,L), atom_chars(X,XL), subatom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,Len,R,H,X,T,HL,XL,TL) :- var(X), atom_chars(A,L), subatom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), \+(XL = []), atom_chars(T,TL). sub_atom_2(L,S,Len,R,L1,XL,L2) :- append(L1,XL,L2,L), length_cut(L1,S), length_cut(L2,R), length_cut(XL,Len). length_cut(L,Len) :- length(L,Len),!. % 以下のサイトは # いろいろな環境の中には、先読みの否定である (?! ) が # 使えない環境があります。 このような環境では、 # 「ABC」 という文字列を含まない # というような、文字列の否定をする正規表現を作るのは # とても難しい作業になります # ※ (?! ) が使える環境での作り方は こちら 。 # # では、例として、 # 以下のようなテキストにマッチする正規表現を考えてみましょう★ # ・ テキストの先頭が AA から始まる # ・ テキストの末尾が AA で終わる # ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない # # ちなみに、 # "AAAAA" というテキストの場合、中に挟まれた文字列が #  A の1文字だけなので、マッチするものとします # # ▽ マッチさせたいテキストの図 # # このような場合、 # まず、以下のように正規表現に使えそうなパーツを書き出します # ^AA ・・・ テキストの先頭にある AA にマッチする表現 # AA$ ・・・ テキストの末尾にある AA にマッチする表現 # A[^A] ・・・ ”A 1文字” の後ろに ”A以外の1文字” が #           あれば、この2文字にマッチする表現 # [^A]  ・・・ ”A以外の1文字” にマッチする表現 # (重要) A[^A] は 2文字 にマッチするということを忘れないで下さい # # ちなみに、 A[^A] と [^A] は以下のような関係になっています # ・ ある文字が A 以外ならば、 [^A] にマッチする # ・ ある文字が A であり、次の文字が A 以外ならば、 #  この2文字が A[^A] にマッチする # ・ ある文字が AA の A ならば、A[^A] にも [^A] にもマッチしない # # これを図にすると下のようになります # # ▽ A[^A] と [^A] の関係図 # # この図を見ると、ある文字にマッチさせるには、 # A[^A] または [^A] にマッチさせればいいことが分かります # # つまり、以下のようになります # (A[^A]|[^A]) # # そして、これを繰り返せば AA を含まない文字列となります # (A[^A]|[^A])* # # 最後に、 # テキストの先頭と末尾の AA にマッチする表現を付け足し、 # 以下のようにすれば完成・・のはずですね # ^AA(A[^A]|[^A])*AA$ # # では、試しに動かしてみましょう! # ※ テキストエディタの OtbEdit では ^ と $ が行頭、行末にも # マッチするので、1行につき1つのテキストをテストします # '・ テキストの先頭が AA から始まる ・ テキストの末尾が AA で終わる ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト) :- '・ テキストの先頭が AA から始まる'(_テキスト), '・ テキストの末尾が AA で終わる'(_テキスト), '・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト). '・ テキストの先頭が AA から始まる'(_テキスト) :- sub_atom(_テキスト,0,_,_,'AA'). '・ テキストの末尾が AA で終わる'(_テキスト) :- sub_atom(_テキスト,_,_,0,'AA'). '・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト) :- '・ 先頭の AA と、末尾の AA との間に挟まれた文字列'(_テキスト,_先頭のAAと末尾のAAとの間に挟まれた文字列), 'の中にはAA が存在しない'(_先頭のAAと末尾のAAとの間に挟まれた文字列). '・ 先頭の AA と、末尾の AA との間に挟まれた文字列'(_テキスト,_先頭のAAと末尾のAAとの間に挟まれた文字列) :- sub_atom(_テキスト,0,Len1,_,'AA'), sub_atom(_テキスト,_,Len2,0,'AA'), sub_atom(_テキスト,Len1,_,Len2,_先頭のAAと末尾のAAとの間に挟まれた文字列). 'の中にはAA が存在しない'(_先頭のAAと末尾のAAとの間に挟まれた文字列) :- \+(sub_atom(_先頭のAAと末尾のAAとの間に挟まれた文字列,_,_,_,'AA')). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/700 # # お題:重複した文字のうち最初に現れた文字だけ削除する。 # 例 # "Hello, world" -> "Hel, world" '重複した文字のうち最初に現れた文字だけ削除する。'(_文字列,_重複した文字のうち最初に現れた文字だけ削除された文字列) :- '重複した文字のうち最初に現れた文字だけ削除する。'(_文字列,[],_重複した文字のうち最初に現れた文字だけ削除された文字列). '重複した文字のうち最初に現れた文字だけ削除する。'(_文字列,_既に削除対象となった文字列ならび,_重複した文字のうち最初に現れた文字だけ削除された文字列) :- '重複した文字のうち最初に現れた文字の前後文字列'(_文字列,_削除対象文字列,_既に削除対象となった文字列ならび,_前方文字列,_後方文字列), '重複した文字のうち最初に現れた文字だけ削除する。'(_後方文字列,[_削除対象文字列|_既に削除対象となった文字列ならび],_重複した文字のうち最初に現れた文字だけ削除された後方文字列), atomic_list_concat([_前方文字列,_重複した文字のうち最初に現れた文字だけ削除された後方文字列],_重複した文字のうち最初に現れた文字だけ削除された文字列),!. '重複した文字のうち最初に現れた文字だけ削除する。'(_文字列,_,_文字列). '重複した文字のうち最初に現れた文字の前後文字列'(_文字列,_削除対象文字列,_既に削除対象となった文字列ならび,_前方文字列,_後方文字列) :- sub_atom(_文字列,_,_,_,_前方文字列,_削除対象文字列,_後方文字列,_,_,_), \+(member(_削除対象文字列,_既に削除対象となった文字列ならび)), sub_atom(_後方文字列,_,_,_,_削除対象文字列),!. % 以下のサイトは # 出典 :: Regular Expression(正規表現) Part11 #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'). 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://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)), [_,_短縮した文字列]). % 以下のサイトは # # 問題 15-2 2つの文字列がある場合、最長共通部分文字列を見つける方法を述べよ。 # '2つの文字列がある場合、最長共通部分文字列を見つける方法を述べよ。'(_文字列_1,_文字列_2,_最長共通部分) :- findall([_長さ,_共通部分],( sub_atom(_文字列_1,_,_長さ,_,_共通部分), sub_atom(_文字列_2,_,_長さ,_,_共通部分)), LL1), 最長の長さを得る(LL1,_最長の長さ), member([_最長の長さ,_最長共通部分],LL1). 最長の長さを得る(LL1,_最長の長さ) :- findall(_長さ,member([_長さ,_],LL1),L), max_list(L,_最長の長さ). % 以下のサイトは # # 問題 14-13 ある文字列から特定の文字列に含まれる文字を削除するアルゴリズムを示せ。 # # 入門「データ構造とアルゴリズム」Narasimha Karumanchi著 黒川利明/木下哲也訳 オライリージャパン刊 p385 より # 'ある文字列から特定の文字列に含まれる文字を削除する'(_ある文字列,_特定の文字列,_特定の文字列に含まれる文字を削除した文字列) :- 文字選択された文字列(_ある文字列,_文字,\+(sub_atom(_特定の文字列,_,1,_,_文字)),_特定の文字列に含まれる文字を削除した文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字選択された文字列(_文字列,_構成する文字,_文字選択条件,_文字選択された文字列) :- findall(_構成する文字,( sub_atom(_文字列,_,1,_,_構成する文字), _文字選択条件), _文字選択された文字ならび), atomic_list_concat(_文字選択された文字ならび,_文字選択された文字列). % 以下のサイトは # # 問題 14-13 ある文字列から特定の文字列に含まれる文字を削除するアルゴリズムを示せ。 # # 入門「データ構造とアルゴリズム」Narasimha Karumanchi著 黒川利明/木下哲也訳 オライリージャパン刊 p385 より # 'ある文字列から特定の文字列に含まれる文字を削除する'(_ある文字列,_特定の文字列,_特定の文字列に含まれる文字を削除した文字列) :- findall(_文字,( ある文字列から(_ある文字列,_文字), \+(特定の文字列に含まれる文字(_特定の文字列,_文字))), _特定の文字列に含まれる文字を削除した文字ならび), atomic_list_concat(_特定の文字列に含まれる文字を削除した文字ならび,_特定の文字列に含まれる文字を削除した文字列). ある文字列から(_ある文字列,_文字) :- sub_atom(_ある文字列,_,1,_,_文字). 特定の文字列に含まれる文字を(_特定の文字列,_特定の文字列に含まれる文字) :- sub_atom(_特定の文字列,_,1,_,_特定の文字列に含まれる文字). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字選択された文字列(_文字列,_文字,_文字選択条件,_文字選択された文字列) :- findall(_文字,_文字選択条件,_文字選択された文字ならび), atomic_list_concat(_文字選択された文字ならび,_文字選択された文字列). % 以下のサイトは # # 読み順というか文字コード順でソートしているからこうなるので、 # 漢数字がいい感じで並ぶ順を定義して実装して使えばいい # 漢数字文字列の並べ替え(_漢数字文字列,_並べ直された漢数字文字列) :- いい感じで並ぶ順(_いい感じで並ぶ順), findall(_選択文字,( sub_atom(_いい感じで並ぶ順,_,1,_,_選択文字), sub_atom(_漢数字文字列,_,1,_,_選択文字)), _並べ直された漢数字文字ならび), atomic_list_concat(_並べ直された漢数字文字ならび,_並べ直された漢数字文字列). いい感じで並ぶ順(一二三四五六七八九). % 以下のサイトは '多点交叉'(_親1,_親2,_交叉点の個数,_1点交叉後の親1,_1点交叉後の親2) :- '1点交叉の素直な拡張である多点交叉は,親1,親2の文字列上で交叉点"|"をランダムに複数個選び,交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する'(_親1,_親2,_交叉点の個数,_1点交叉後の親1,_1点交叉後の親2). '1点交叉の素直な拡張である多点交叉は,親1,親2の文字列上で交叉点"|"をランダムに複数個選び,交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する'(_親1,_親2,_交叉点の個数,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点をランダムに複数個選び、'(_親1,_親2,_交叉点の個数,_交叉点ならび), '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する'(_親1,_親2,_交叉点ならび,_1点交叉後の親1,_1点交叉後の親2). '交叉点をランダムに複数個選び、'(_親1,_親2,_交叉点の個数,_交叉点ならび) :- length(_親1,_長さ1), length(_親2,_長さ2), '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点の個数,_交叉点ならび). '交叉点をランダムに複数個選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点の個数,_交叉点ならび) :- _長さ1 =< _長さ2, '交差点をランダムに複数個選び、'(_長さ1,_交叉点の個数,_交叉点ならび),!. '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点の個数,_交叉点) :- '交差点をランダムに複数個選び、'(_長さ2,_交叉点の個数,_交叉点ならび),!. '交差点をランダムに複数個選び、'(_長さ1,_交叉点の個数,_交叉点ならび) :- '交差点をランダムに複数個選び、'(_長さ1,_交叉点の個数,[],_交叉点ならび). '交差点をランダムに複数個選び、'(_,0,_交叉点ならび,_交叉点ならび) :- !. '交差点をランダムに複数個選び、'(_長さ1,N,L1,_交叉点ならび) :- R is random(_長さ1), 整列を保ちつつ挿入する(R,L1,L2), N_1 is N - 1, '交差点をランダムに複数個選び、'(_長さ1,N_1,L2,_交叉点ならび),!. '交差点をランダムに複数個選び、'(_長さ1,N,L1,_交叉点ならび) :- '交差点をランダムに複数個選び、'(_長さ1,N,L1,_交叉点ならび). 整列を保ちつつ挿入する(M,[],[M]). 整列を保ちつつ挿入する(M,[N|R],[M,N|R]) :- M < N,!. 整列を保ちつつ挿入する(M,[N|R1],[N|R2]) :- M > N, 整列を保ちつつ挿入する(M,R1,R2),!. '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2をならびとして生成する'(_親1,_親2,_交叉点ならび,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,_交叉点ならび,_1点交叉後の親1の部分文字列ならび,_1点交叉後の親2の部分文字列ならび), atomic_list_concat(_1点交叉後の親1の部分文字列ならび,_1点交叉後の親1). atomic_list_concat(_1点交叉後の親2の部分文字列ならび,_1点交叉後の親2). '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,[],[],[]). '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,[_交叉点],[_親1部分文字列],[_親2部分文字列]) :- sub_atom(_親1,_交叉点,_,0,_親1部分文字列), sub_atom(_親2,_交叉点,_,0,_親2部分文字列). '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,[_交叉点1,_交叉点2|R1],[_親1部分文字列_1,_親2部分文字列_2|R2],[_親2部分文字列_1,_親1部分文字列_2|R3]) :- sub_atom(_親1,0,_交叉点1,_,_親1部分文字列_1), sub_atom(_親2,0,_交叉点2,_,_親2部分文字列_1), _交叉2の長さ is _交叉点2 - _交叉点1, sub_atom(_親1,_交叉点1,_交叉2の長さ,_,_親1部分文字列_2), sub_atom(_親2,_交叉点1,_交叉2の長さ,_,_親2部分文字列_2), '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,R1,R2,R3). % 以下のサイトは '1点交叉'(_親1,_親2,_1点交叉後の親1,_1点交叉後の親2) :- '1点交叉は,単純交叉とよばれる最も単純な交叉規則である。1点交叉では,親1,親2の文字列上で交叉点"|"をランダムに1箇所選び,交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_1点交叉後の親1,_1点交叉後の親2). '1点交叉は,単純交叉とよばれる最も単純な交叉規則である。1点交叉では,親1,親2の文字列上で交叉点"|"をランダムに1箇所選び,交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点をランダムに1箇所選び、'(_親1,_親2,_交叉点), '交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_交叉点,_1点交叉後の親1,_1点交叉後の親2). '交叉点をランダムに1箇所選び、'(_親1,_親2,_交叉点) :- length(_親1,_長さ1), length(_親2,_長さ2), '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点). '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点) :- _長さ1 =< _長さ2, _交叉点 is random(_長さ1),!. '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点) :- _交叉点 is random(_長さ2). '交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_交叉点,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点の右側の2つの親の部分文字列を'(_親1,_親2,_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列), 'そっくりそのまま交換して,子1,子2を生成する。'(_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列,_1点交叉後の親1,_1点交叉後の親2). '交叉点の右側の2つの親の部分文字列を'(_親1,_親2,_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列) :- sub_atom(_親1,0,_交叉点,_残り長さ1,_親1の前半文字列), sub_atom(_親1,_交叉点,_残り長さ1,0,_親1の後半文字列), sub_atom(_親2,0,_交叉点,_残り長さ2,_親2の前半文字列), sub_atom(_親2,_交叉点,_残り長さ2,0,_親2の後半文字列). 'そっくりそのまま交換して,子1,子2を生成する。'(_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列,_1点交叉後の親1,_1点交叉後の親2) :- atom_concat(_親1の前半文字列,_親2の後半文字列,_1点交叉後の親1), atom_concat(_親2の前半文字列,_親1の後半文字列,_1点交叉後の親2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/413 # # ああもう訳が分からない # # あいうえおあいうえおあいうえお # # という「あいうえお」の繰り返し文字があったら # 1番最後の「うえ」だけ一致させる方法と # 2番目の「うえ」だけ一致させる方法が解らない # それぞれどういう方法があるんでしょうか? # すみません教えて下さい '1番最後の「うえ」だけ一致させる方法'(_文字列,_前文字列,うえ,_後文字列) :- sub_atom(_文字列,S,2,R,うえ), 前文字列と後文字列を得る(_文字列,S,R,_前文字列,_後文字列), \+(sub_atom(_後文字列,_,2,_,うえ)). '2番目の「うえ」だけ一致させる方法'(_文字列,_前文字列,うえ,_後文字列) :- '2番目の「うえ」だけ一致させる'(_文字列,S_2,R_2), 前文字列と後文字列を得る(_文字列,S_2,R_2,_前文字列,_後文字列). '2番目の「うえ」だけ一致させる'(_文字列,S_2,R_2) :- sub_atom(_文字列,S_1,2,_,うえ), sub_atom(_文字列,S_2,2,R_2,うえ), S_2 > S_1,!. 前文字列と後文字列を得る(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは ある指定した文字数で折り返す(_文字列,_指定した文字数,_文字列) :- atom_length(_文字列,_文字数), _文字数 =< _指定した文字数,!. ある指定した文字数で折り返す(_文字列,_指定した文字数,_変換された文字列) :- sub_atom(_文字列,0,_指定した文字数,E,_副文字列_1), sub_atom(_文字列,_指定した文字数,_,0,_副文字列_2), ある指定した文字数で折り返す(_副文字列_2,_指定した文字数,_変換された文字列_2), atomic_list_concat([_副文字列_1,'\n',_変換された文字列_2],_変換された文字列). % 以下のサイトは '[1-9]?[0-9]'(_文字列,_前文字列,_適合文字列,_後文字列) :- '0から99までの数字に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列). '0から99までの数字に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), '2文字以下の数字ならび'(L2), 前後の文字は数字ではない(L1,L3). '2文字以下の数字ならび'(L2) :- length(L2,_文字数), _文字数 =< 2, forall(member(A,L2),数字(A)). 前後の文字は数字ではない(L1,L3) :- \+((last(L1,_直前の文字),数字(_直前の文字))), \+((L3=[_直後の文字|_],数字(_直後の文字))),!. 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. % 以下のサイトは # # 部分文字列が二回以上出現するかどうか調べる # 部分文字列の重複検査(_文字列) :- 部分文字列が二回以上出現するか調べる(_文字列,_二回以上出現する部分文字列),!. 部分文字列が二回以上出現するか調べる(_文字列,_二回以上出現する部分文字列) :- sub_atom(_文字列,S,Len,E,_二回以上出現する部分文字列), \+(_二回以上出現する部分文字列 = ''), 部分文字列が二回以上出現する(_文字列,S,Len,_二回以上出現する部分文字列). 部分文字列が二回以上出現する(_文字列,S,Len,_二回以上出現する部分文字列) :- S_2 is S + Len, sub_atom(_文字列,S_2,_,0,_残り文字列), sub_atom(_残り文字列,_,_,_,_二回以上出現する部分文字列),!. % 以下のサイトは # # 単純な置換 s/_a/_b/ # 's/a/b/'(_文字列,_置換された文字列) :- 's/_a/_b/'(_文字列,a,b,_置換された文字列). 's/_a/_b/'(_文字列,_a,_b,_置換された文字列) :- 単純な文字列置換(_文字列,_a,_b,_置換された文字列). 単純な文字列置換(_文字列,_a,_b,_置換された文字列) :- '_aを決定性に探索する'(_文字列,_a,_b,_前文字列,_後文字列), 単純な文字列置換(_a,_b,_前文字列,_後文字列,_置換された文字列). 単純な文字列置換(_a,_b,_前文字列,_後文字列,_置換された文字列) :- atomic_list_concat([_前文字列,_b,_後文字列],_置換された文字列). 単純な文字列置換(_a,_b,_前文字列,_後文字列,_置換された文字列) :- 単純な文字列置換(_後文字列,_a,_b,_置換された文字列_2), atomic_list_concat([_前文字列,_b,_置換された文字列_2],_置換された文字列). '_aを決定性に探索する'(_文字列,_a,_b,_前文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,_a), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 出典:: 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/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])). % 以下のサイトは # # 文字列から数字列を検索する # 数字文字列を検索してその数値を得る(_文字列,_前文字列,_数字文字列,_後文字列,_数値) :- 数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列), その数値を得る(_数字文字列,_数値). 数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列) :- 数字文字列を検索する(_文字列,_前文字列,_数字文字列,_後文字列). その数値を得る(_数字文字列,_数値) :- 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,!. % 以下のサイトは 偶数に一致させる(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,Len1,_,Len2,_適合文字列), 適合文字列は数字だけで構成される(_適合文字列), 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列), 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列), 適合文字列を数値に変換すると偶数になる(_適合文字列). 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列) :- sub_atom(_文字列,0,Len1,_,_前文字列), sub_atom(_文字列,_,Len2,0,_後文字列). 適合文字列は数字だけで構成される(_文字列) :- \+(_文字列=''), forall(sub_atom(_文字列,_,1,_,_数字),数字(_数字)). 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列) :- \+((sub_atom(_前文字列,_,1,0,A),数字(A))), \+((sub_atom(_後文字列,0,1,_,B),数字(B))). 適合文字列を数値に変換すると偶数になる(_適合文字列) :- 適合文字列を数値に変換すると(_適合文字列,_数値), 偶数になる(_数値). 適合文字列を数値に変換すると(_適合文字列,_数値) :- atom_chars(_適合文字列,Chars), number_chars(_数値,Chars). 偶数になる(N) :- 1 is N mod 2. 数字(A) :- A @>= '0', A @=< '9'. % 以下のサイトは 奇数に一致させる(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,Len1,_,Len2,_適合文字列), 適合文字列は数字だけで構成される(_適合文字列), 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列), 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列), 適合文字列を数値に変換すると奇数になる(_適合文字列). 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列) :- sub_atom(_文字列,0,Len1,_,_前文字列), sub_atom(_文字列,_,Len2,0,_後文字列). 適合文字列は数字だけで構成される(_文字列) :- \+(_文字列=''), forall(sub_atom(_文字列,_,1,_,_数字),数字(_数字)). 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列) :- \+((sub_atom(_前文字列,_,1,0,A),数字(A))), \+((sub_atom(_後文字列,0,1,_,B),数字(B))). 適合文字列を数値に変換すると奇数になる(_適合文字列) :- 適合文字列を数値に変換すると(_適合文字列,_数値), 奇数になる(_数値). 適合文字列を数値に変換すると(_適合文字列,_数値) :- atom_chars(_適合文字列,Chars), number_chars(_数値,Chars). 奇数になる(N) :- 1 is N mod 2. 数字(A) :- A @>= '0', A @=< '9'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/69 # # # 配列を使わずに printf for while if を使って3ケタカンマ区切りをすることができますか? # '配列を使わずに printf for while if を使って3ケタカンマ区切りして表示する'(0) :- write('0'). '配列を使わずに printf for while if を使って3ケタカンマ区切りして表示する'(N) :- N > 0, '3ケタカンマ区切りして表示する'(N). '配列を使わずに printf for while if を使って3ケタカンマ区切りして表示する'(N) :- '負数の場合はマイナス記号を表示して、-1を掛けて正数とする'(N,N_1), '3ケタカンマ区切りして表示する'(N_1). '負数の場合はマイナス記号を表示して、-1を掛けて正数とする'(N,N_1) :- N < 0, write('-'), N_1 is N * (-1). '3ケタカンマ区切りして表示する'(0). '3ケタカンマ区切りして表示する'(N) :- '3ケタ未満になったら数値をヘッドゼロサプレスで表示する(ただしゼロを除外)'(N). '3ケタカンマ区切りして表示する'(N) :- '3ケタ以上有る時は最後の3ケタとそれ以上に分離して'(N,N_1,N_2), '3ケタカンマ区切りして表示する'(N_2), '最後の3ケタの数値をカンマ表示後にヘッドゼロサプライで表示する'(N_1). '3ケタ未満になったら数値をヘッドゼロサプレスで表示する(ただしゼロを除外)'(N) :- between(1,999,N), writef('%t',[N]). '3ケタ以上有る時は最後の3ケタとそれ以上に分離して'(N,N_1,N_2) :- N >= 1000, N_1 is N mod 1000, N_2 is N // 1000. '最後の3ケタの数値をカンマ表示後にヘッドゼロサプライで表示する'(N) :- write(','), '3ケタの数値をヘッドゼロサプライで表示する'(N). '3ケタの数値をヘッドゼロサプライで表示する'(N) :- N_1 is N + 1000, atom_number(A,N_1), sub_atom(A,1,3,_,B), writef('%t',[B]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数,true,_個数), '1234567890を繰り返し表示する'(0,_個数,'1234567890',0). '1234567890を繰り返し表示する'(_個数,_個数,_,_) :- !. '1234567890を繰り返し表示する'(_何文字目,_個数,_文字列,_取り出し位置) :- 一文字表示(_文字列,_取り出し位置,_次の取り出し位置), _次で何文字目 is _何文字目 + 1, '1234567890を繰り返し表示する'(_次で何文字目,_個数,_文字列,_次の取り出し位置). 一文字表示(_文字列,_取り出し位置,_次の取り出し位置) :- sub_atom(_文字列,_取り出し位置,1,_,_文字), write(_文字), 取り出し位置の更新(_取り出し位置,_次の取り出し位置). 取り出し位置の更新(9,0) :- !. 取り出し位置の更新(_取り出し位置,_次の取り出し位置) :- _次の取り出し位置 is _取り出し位置 + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数,true,_個数), '1234567890を繰り返し表示する'(1,_個数,'1234567890',0). '1234567890を繰り返し表示する'(_何文字目,_個数,_,_) :- _何文字目 > _個数,!. '1234567890を繰り返し表示する'(_何文字目,_個数,_文字列,_取り出し位置) :- 一文字表示(_文字列,_取り出し位置,_次の取り出し位置), _次で何文字目 is _何文字目 + 1, '1234567890を繰り返し表示する'(_次で何文字目,_個数,_文字列,_次の取り出し位置). 一文字表示(_文字列,_取り出し位置,_次の取り出し位置) :- sub_atom(_文字列,_取り出し位置,1,_,_文字), write(_文字), 取り出し位置の更新(_取り出し位置,_次の取り出し位置). 取り出し位置の更新(9,0) :- !. 取り出し位置の更新(_取り出し位置,_次の取り出し位置) :- _次の取り出し位置 is _取り出し位置 + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数,true,_個数), length(Ln,_個数), '1234567890を繰り返し表示する'(Ln,'1234567890',0). '1234567890を繰り返し表示する'([],_,_). '1234567890を繰り返し表示する'([_|Ln],_文字列,_取り出し位置) :- sub_atom(_文字列,_取り出し位置,1,_,_文字), write(_文字), 次の取り出し位置(_取り出し位置,_次の取り出し位置), '1234567890を繰り返し表示する'(Ln,_文字列,_次の取り出し位置). 取り出し位置の更新(9,0) :- !. 取り出し位置の更新(_取り出し位置,_次の取り出し位置) :- _次の取り出し位置 is _取り出し位置 + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- '表示する数字は読み込まれた整数値の個数とする。'(_個数), length(Ln2,_個数), '1234567890を繰り返し表示する'([],_個数). '1234567890を繰り返し表示する'(Ln,Ln2) :- append(Ln,_,Ln2), 表示する([_,_,_,_,_,_,_,_,_,_],'1234567890'), '1234567890を繰り返し表示する'([_,_,_,_,_,_,_,_,_,_|Ln],Ln2). '1234567890を繰り返し表示する'(Ln,_) :- 表示する(Ln,'1234567890'). '表示する数字は読み込まれた整数値の個数とする。'(_個数) :- 整数を得る(整数値,true,_個数). 表示する(Ln,_文字列) :- length(Ln,Len), sub_atom(_文字列,0,Len,_,_副文字列), write(_副文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数値,true,_個数), length(Ln,_個数), '文字列を繰り返し表示する。'(Ln,'1234567890'). '文字列を繰り返し表示する。'([_,_,_,_,_,_,_,_,_,_|Ln],_文字列) :- write(_文字列), '文字列を繰り返し表示する。'(Ln,_文字列). '文字列を繰り返し表示する。'(Ln,_文字列) :- length(Ln,_個数), sub_atom(_文字列,0,_個数,_,_表示副文字列), write(_表示副文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数値,true,_個数), length(Ln,_個数), '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。'(Ln). '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。'([_,_,_,_,_,_,_,_,_,_|Ln]) :- write('1234567890'), '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。'(Ln). '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。'(Ln) :- length(Ln,_個数), sub_atom('1234567890',0,_個数,_,_表示文字列), writef('%t',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数,true,_個数), length(Ln,_個数), '1234567890を繰り返し表示する'(Ln,'1234567890'). '1234567890を繰り返し表示する'([],_). '1234567890を繰り返し表示する'([_|Ln],_文字列) :- 文字列の回転(_文字列,_先頭文字,_回転した文字列), write(_先頭文字), '1234567890を繰り返し表示する'(Ln,_回転した文字列). 文字列の回転(_文字列,_先頭文字,_回転した文字列) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,1,_,0,_二文字目以降文字列), atom_concat(_二文字目以降文字列,_先頭文字,_回転した文字列), % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- '表示する数字は読み込まれた整数値の個数とする。'(_個数), '1234567890を繰り返し表示する'(0,_個数_1). '表示する数字は読み込まれた整数値の個数とする。'(_個数) :- 整数を得る(整数値,true,_個数). '1234567890を繰り返し表示する'(N,N) :- !. '1234567890を繰り返し表示する'(N,_個数) :- M is N mod 10, 指定位置の数字を表示する('1234567890',M), N_2 is N + 1, '1234567890を繰り返し表示する'(N_2,_個数). 指定位置の数字を表示する(_文字列,M) :- sub_atom(_文字列,M,1,_,_数字), writef('%t',[_数字]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数値,true,_個数), _個数_1 is _個数 - 1, between(0,_個数_1,N), M is N mod 10, sub_atom('1234567890',M,1,_,A), writef('%t',[A]), N = _個数_1,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数値,true,_個数), between(1,_個数,N), M is N mod 10, 表示する(M), N = _整数値の個数. 表示する(0) :- 表示する(10). 表示する(M) :- M_1 is M - 1, sub_atom('1234567890',M_1,1,_,A), writef('%t',[A]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/852 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 「空白を挟まず、何か入力してください。」と表示した後、入力された先頭文字が英字大文字、英字小文字、数字かを判定し、 # 「先頭文字は○○です。」という表示を行うプログラムを作成しなさい。 # '「空白を挟まず、何か入力してください。」と表示した後、入力された先頭文字が英字大文字、英字小文字、数字かを判定し、「先頭文字は○○です。」という表示を行う' :- '「空白を挟まず、何か入力してください。」と表示した', '入力された'(Line), '先頭文字が英字大文字、英字小文字、数字かを判定し'(Line,_判定), '「先頭文字は○○です。」という表示を行う'(_判定). '「空白を挟まず、何か入力してください。」と表示した後' :- write('空白を挟まず、何か入力してください。\n'). '入力された'(Line) :- get_line(Line). '先頭文字が英字大文字、英字小文字、数字かを判定し'(Line,_判定) :- sub_atom(Line,0,1,_,_先頭文字), '英字大文字、英字小文字、数字かを判定し'(_先頭文字,_判定). '英字大文字、英字小文字、数字かを判定し'(_先頭文字,英字大文字) :- 英字大文字(_先頭文字),!. '英字大文字、英字小文字、数字かを判定し'(_先頭文字,英字小文字) :- 英字小文字(_先頭文字),!. '英字大文字、英字小文字、数字かを判定し'(_先頭文字,数字) :- 数字(_先頭文字). 英字大文字(_先頭文字) :- _先頭文字 @>= 'A', _先頭文字 @=< 'Z'. 英字小文字(_先頭文字) :- _先頭文字 @>= 'a', _先頭文字 @=< 'z'. 数字(_先頭文字) :- _先頭文字 @>= '0', _先頭文字 @=< '9'. '「先頭文字は○○です。」という表示を行う'(_判定) :- writef('先頭文字は%tです。\n',[_判定]). % 以下のサイトは 検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列) :- 重い検索(_検索文字列,_文字列,_前文字列_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),!. % 以下のサイトは 投機的検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列) :- 重い検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列). 投機的検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列) :- 重い検索(_検索文字列,_文字列,_前文字列_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),!. % 以下のサイトは 'Prologでジェネレータを書いてみる'(_文字列1,_文字列2,_文字列3,_生成文字列) :- sub_atom(_文字列1,_,1,_,_文字1), sub_atom(_文字列2,_,1,_,_文字2), sub_atom(_文字列3,_,1,_,_文字3), atomic_list_concat([_文字1,_文字2,_文字3],_生成文字列). % 以下のサイトは 'Prologでジェネレータを書いてみる'([_文字列1,_文字列2,_文字列3],_生成文字列) :- sub_atom(_文字列1,_,1,_,_文字1), sub_atom(_文字列2,_,1,_,_文字2), sub_atom(_文字列3,_,1,_,_文字3), atomic_list_concat([_文字1,_文字2,_文字3],_生成文字列). % 以下のサイトは 'Prologでジェネレータを書いてみる'(L,_生成文字列) :- findall(sub_atom(_文字列,_,1,_,_文字),( member(_文字列,L)), L1), ならび連言項変換(L1,P), call(P), sub_atomの解を結合する(L1,_生成文字列). ならび連言項変換([_項の一|_残りならび],_連言項) :- _連言項 =.. [',',_項の一,_連言項の二], ならび連言項変換(_残りならび,_連言項の二),!. ならび連言項変換([_項],_項) :- !. sub_atomの解を結合する(L1,_生成文字列) :- findall(A,( member(sub_atom(_,_,_,_,A),L1)), L), atomic_list_concat(L,_生成文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1367772345/105 # # 103じゃないけど、yieldを使ってジェネレータが書ける こんな感じで # # def product(xss): # if xss: # for x in xss[0]: # for y in product(xss[1:]): # yield x + y # else: # yield '' # # print(','.join(product(['abc', 'xy', '12']))) #=> ax1,ax2,ay1,ay2,bx1,bx2,by1,by2,cx1,cx2,cy1,cy2 # # 106 :デフォルトの名無しさん :sage :2013/05/07(火) 07:27:40.99 # 普通の3重ループじゃ駄目なの? # # 107 :デフォルトの名無しさん :sage :2013/05/07(火) 07:30:37.41 # # # >>106 # ループ数は引数のリストの長さで決まるから、 # 再帰を使った方が書きやすいよ # # 108 :デフォルトの名無しさん :sage :2013/05/07(火) 07:58:37.14 # >>106 # n重ループ # # 109 :デフォルトの名無しさん :sage :2013/05/07(火) 08:27:20.88 # やっぱpythonのjoinはちょっと気持ち悪いな # List.joinでいいじゃんと思ってしまう # 設計思想的にこうなんだろうけど # # 110 :デフォルトの名無しさん :sage :2013/05/07(火) 08:54:06.01 # List.joinでは手続き的すぎて古臭いって思想か # ジェネレータもそれかな # ただの軽量スレッドでは面白くないからジェネレータなのだ # # 111 :デフォルトの名無しさん :sage :2013/05/07(火) 10:25:49.03 # ジェネレータで書けるものを再帰で再現するとスタックの無駄遣いで # 再帰の方が非効率だと思う # # > % Prologでジェネレータ書いてみる。やはり再帰でしか書けない。 product([_文字列],_一文字) :-     sub_atom(_文字列,_,1,_,_一文字). product([_文字列|R1],_生成文字列) :-     sub_atom(_文字列,_,1,_,_一文字),     product(R1,_生成文字列_2),     atom_concat(_一文字,_生成文字列_2,_生成文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1367772345/105 # # 103じゃないけど、yieldを使ってジェネレータが書ける こんな感じで # # def product(xss): # if xss: # for x in xss[0]: # for y in product(xss[1:]): # yield x + y # else: # yield '' # # print(','.join(product(['abc', 'xy', '12']))) #=> ax1,ax2,ay1,ay2,bx1,bx2,by1,by2,cx1,cx2,cy1,cy2 # # 106 :デフォルトの名無しさん :sage :2013/05/07(火) 07:27:40.99 # 普通の3重ループじゃ駄目なの? # # 107 :デフォルトの名無しさん :sage :2013/05/07(火) 07:30:37.41 # # # >>106 # ループ数は引数のリストの長さで決まるから、 # 再帰を使った方が書きやすいよ # # 108 :デフォルトの名無しさん :sage :2013/05/07(火) 07:58:37.14 # >>106 # n重ループ # # 109 :デフォルトの名無しさん :sage :2013/05/07(火) 08:27:20.88 # やっぱpythonのjoinはちょっと気持ち悪いな # List.joinでいいじゃんと思ってしまう # 設計思想的にこうなんだろうけど # # 110 :デフォルトの名無しさん :sage :2013/05/07(火) 08:54:06.01 # List.joinでは手続き的すぎて古臭いって思想か # ジェネレータもそれかな # ただの軽量スレッドでは面白くないからジェネレータなのだ # # 111 :デフォルトの名無しさん :sage :2013/05/07(火) 10:25:49.03 # ジェネレータで書けるものを再帰で再現するとスタックの無駄遣いで # 再帰の方が非効率だと思う # # # yield from 使ってみたくて使ったけど不要だった # # def product(xss): # return (x + y for x in xss[0] for y in product(xss[1:])) if xss else [''] % Prologでジェネレータ書いてみる。やはり再帰でしか書けない。 'def product(xss): if xss: for x in xss[0]: for y in product(xss[1:]): yield x + y else: yield '''' '(_文字列ならび,_生成文字列) :- 'Prologでジェネレータを書いてみる'(_文字列ならび,_生成文字列). 'def product(xss): return (x + y for x in xss[0] for y in product(xss[1:])) if xss else ['''']'(_文字列ならび,_生成文字列) :- 'Prologでジェネレータを書いてみる'(_文字列ならび,_生成文字列). 'Prologでジェネレータ書いてみる'([_文字列],_一文字) :- sub_atom(_文字列,_,1,_,_一文字). 'Prologでジェネレータ書いてみる'([_文字列|R1],_生成文字列) :- sub_atom(_文字列,_,1,_,_一文字), 'Prologでジェネレータ書いてみる'(R1,_生成文字列_2), atom_concat(_一文字,_生成文字列_2,_生成文字列). % % 'def product(xss): % if xss: % for x in xss[0]: % for y in product(xss[1:]): % yield x + y % else: % yield '''' '([abc,xy,'12'],X). % % X = ax1; % X = ax2; % X = ay1; % X = ay2; % X = bx1; % X = bx2; % X = by1; % X = by2; % X = cx1; % X = cx2; % X = cy1; % X = cy2; % no % % ?- 'Prologでジェネレータ書いてみる'([abc,xy,'12'],X). % % X = ax1; % X = ax2; % X = ay1; % X = ay2; % X = bx1; % X = bx2; % X = by1; % X = by2; % X = cx1; % X = cx2; % X = cy1; % X = cy2; % no % % ?- % 以下のサイトは # phpなんですが # enarikazukiって文字列にマッチするのを作りたいんですが # testenarikazukwwww→i○ # #enarikazuki→× # enarikazukiって→○ # enarikazuki→○ # みたいに前後に何がついてもいいんですが、前に#がついた場合のみ # マッチしないようにするってのはどうすりゃいいんでしょうか? # 'enarikazukiって文字列にマッチするのを作りたいんですが testenarikazukwwww→i○ #enarikazuki→× enarikazukiって→○ enarikazuki→○ みたいに前後に何がついてもいいんですが、前に#がついた場合のみ マッチしないようにするってのはどうすりゃいいんでしょうか?'(_文字列,_前文字列,enarikazuki,_後文字列) :- sub_atom(_文字列,_開始文字位置,_長さ,_残り文字数,enarikazuki), sub_atom(_文字列,0,_開始文字位置,_,_前文字列), \+(sub_atom(_前文字列,_,1,0,#)), sub_atom(_文字列,_,_残り文字数,0,_後文字列). % 以下のサイトは # phpなんですが # enarikazukiって文字列にマッチするのを作りたいんですが # testenarikazukwwww→i○ # #enarikazuki→× # enarikazukiって→○ # enarikazuki→○ # みたいに前後に何がついてもいいんですが、前に#がついた場合のみ # マッチしないようにするってのはどうすりゃいいんでしょうか? # 'enarikazukiって文字列にマッチするのを作りたいんですが testenarikazukwwww→i○ #enarikazuki→× enarikazukiって→○ enarikazuki→○ みたいに前後に何がついてもいいんですが、前に#がついた場合のみ マッチしないようにするってのはどうすりゃいいんでしょうか?'(_文字列,_前文字列,_適合文字列,_後文字列) :- 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_文字列,_前文字列,_適合文字列,_後文字列). 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列_1,enarikazuki,_後文字列_1,L1,L2,L3), \+(last(L1,#)), 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_前文字列_1,enarikazuki,_後文字列_1,_前文字列,_適合文字列,_後文字列). 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_前文字列,enarikazuki,_後文字列,_前文字列,enarikazuki,_後文字列). 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_前文字列_1,enarikazuki,_後文字列_1,_前文字列,enarikazuki,_後文字列) :- 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_後文字列,_前文字列_2,enarikazuki,_後文字列), atomic_list_concat([_前文字列_1,erarikazuki,_前文字列_2],_前文字列). % 以下のサイトは # お題:表計算ソフトで使われる列名 A,B,C,...,Z,AA,AB,AC,...,AZ,BA,BB,BC,... # をAを1番目とした番号に変換せよ '表計算ソフトで使われる列名 A,B,C,...,Z,AA,AB,AC,...,AZ,BA,BB,BC,...をAを1番目とした番号に変換せよ'(_列名,_番号) :- '列名を文字順序番号ならびに変換'(_列名,_文字順序番号ならび), 文字順序番号ならびを連続番号に変換(_文字順序番号ならび,0,_番号). 列名を文字順序番号ならびに変換(_列名,_文字順序番号ならび) :- findall(_文字順序番号,( 列名を文字順序番号に変換(_列名,_文字順序番号)),_文字順序番号ならび). 列名を文字順序番号に変換(_列名,_文字順序番号) :- sub_atom(_列名,_,1,_,_文字), nth1(_文字順序番号,['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'],_文字). 文字順序番号ならびを連続番号に変換([],_連続番号,_連続番号). 文字順序番号ならびを連続番号に変換(_文字順序番号ならび,_番号_1,_連続番号) :- '文字順序番号ならびを連続番号に、桁上げしながら変換して行く'(_文字順序番号ならび,_番号_1,_連続番号). '文字順序番号ならびを連続番号に、桁上げしながら変換して行く'([_文字順序番号|_残り文字順序番号ならび],_番号_1,_連続番号) :- _番号_2 is _番号_1 * 26 + _文字順序番号, 文字順序番号ならびを連続番号に変換(_残り文字順序番号ならび,_番号_2,_連続番号). % 以下のサイトは # ●問題文 # <b>タグのように開始タグの部分にマッチする正規表現を最小限の階数のキャプチャを用いて書きなさい。 # タグ名は1文字以上の英単語であり、属性には「>」以外の任意の文字を使えるものとする。 # ●例文 # <b>ゴレイヌさん</b>は、えげつねぇ・・・<font color="red">ゴレイヌさん</font>は # えげつねぇ。。。<font color="blue">富樫仕事</font>しろ。 # ●マッチする例 # <b> # <font color="red"> # <font color="blue"> # # ●答え # <(?:\w+)(?:\s+[^>]*)*> # ●解説 # 「<」と「>」に囲まれた部分にマッチさせればよいのですが、属性付きのタグを考慮しなくてはいけません。 # また、最小限のキャプチャという条件があるため、グループ化のみでキャプチャを必要としない場所では「(?:)」を使います。 # この問題の場合には、1回もキャプチャを使わずに記述する事が可能です。 # # と、あるのですが # <\w+(?:\s+[^>]*)*> # でないかと思っています。 # \w+はグループ化する必要がそもそもあるのでしょうか? # '<b>タグのように開始タグの部分にマッチする'(_文字列,_前文字列,_開始タグ,_後文字列) :- 開始タグを切り出す(_文字列,_前文字列_1,_開始タグ_1,_後文字列_1), 開始タグ名は1文字以上の英単語であり(_開始タグ_1), '<b>タグのように開始タグの部分にマッチする'(_前文字列_1,_開始タグ_1,_後文字列_1,_前文字列,_開始タグ,_後文字列). '<b>タグのように開始タグの部分にマッチする'(_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). '<b>タグのように開始タグの部分にマッチする'(_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- '<b>タグのように開始タグの部分にマッチする'(_後文字列_1,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 開始タグを切り出す(_前文字列,_開始タグ,_後文字列) :- sub_atom(_文字列,St,Len,R,_開始タグ), 開始タグ(_開始タグ), sub_atom(_文字列,0,St,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. 開始タグ(_開始タグ) :- sub_atom(_開始タグ,0,1,_,<), \+(sub_atom(_開始タグ,0,2,_,'). '開始タグの情報部分は>を含まない'(_開始タグ) :- sub_atom(_開始タグ,1,_,1,_開始タグの情報部分), \+(sub_atom(_開始タグの情報部分,_,1,_,>)),!. 開始タグ名は1文字以上の英単語であり(_開始タグ) :- 開始タグ名は(_開始タグ,_開始タグ名), '1文字以上の英単語である'(_開始タグ名),!. 開始タグ名は(_開始タグ,_開始タグ名) :- sub_atom(_開始タグ,1,_,1,_開始タグの情報部分), 開始タグ名を切り出す(_開始タグの情報部分,_開始タグ名),!. 開始タグ名を切り出す(_開始タグの情報部分,_開始タグ名) :- sub_atom(_開始タグの情報部分,St,1,_,' '), sub_atom(_開始タグの情報部分,0,St,_,_開始タグ名),!. 開始タグ名を切り出す(_開始タグ名,_開始タグ名). '1文字以上の英単語である'(_タグ名の文字ならび) :- forall(sub_atom(_開始タグ名,_,1,_,A),英文字か数字(A)). 英文字か数字(A) :- 英文字(A). 英文字か数字(A) :- 数字(A). 英文字(A) :- A @>= 'a', A @=< 'z',!. 英文字(A) :- A @>= 'A', A @=< 'Z',!. 数字(A) :- A @>= '0', A @=< '9',!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/764 # # 【質問テンプレ】 # ・DBMS名とバージョン # SQLiteバージョン3 # # ・テーブルデータ # ドメインID,ドメイン名 # ------------ # 1,test1.co.jp # 2,test2.co.jp # # ・欲しい結果 # "server1.test1.co.jp"という入力に対し # "test1.co.jp"のドメインIDである1 # # ・説明 # 自分のサイトへのアクセスを行うドメインを管理しています。 # "server1.test1.co.jp"や、"server2.test1.co.jp"等、第4レベルだけが違う同じ業者からのアクセスがあります。 # それらを"test1.co.jp"からのアクセスであると判断し、ドメインIDである1を取得したいのです。 # # 以上、宜しくお願いします。 '・DBMS名とバージョン SQLiteバージョン3 ・テーブルデータ ドメインID,ドメイン名 ------------ 1,test1.co.jp 2,test2.co.jp ・欲しい結果 "server1.test1.co.jp"という入力に対し "test1.co.jp"のドメインIDである1 ・説明 自分のサイトへのアクセスを行うドメインを管理しています。 "server1.test1.co.jp"や、"server2.test1.co.jp"等、第4レベルだけが違う同じ業者からのアクセスがあります。 それらを"test1.co.jp"からのアクセスであると判断し、ドメインIDである1を取得したいのです。'(_URL,_第三レベルドメイン名,_ドメインID) :- 第三ドメイン名を取得する(_URL,_第三レベルドメイン名), ドメインIDを取り出す(_第三レベルドメイン名,_ドメインID). 第三ドメイン名を取得する(_URL,_第三レベルドメイン名) :- split(_URL,['/','ftp://','file:///','http://','mailto://'],[A|_]), '第二・第一レベルドメインを切り捨てる'(A,C), split(C,['.'],L). last(L,_第三レベルドメイン名),!. '第二・第一レベルドメインを切り捨てる'(A,C) :- '第二・第一レベルドメイン'(A), sub_atom(A,St,Len,0,B), sub_atom(A,0,St,Len,C),!. ドメインIDを取り出す(_第三レベルドメイン名,_ドメインID) :- atom_chars(_第三レベルドメイン名,Chars), append(L1,L2,Chars), forall(member(E,L2),数字(E)), atomic_list_concat(L2,_ドメインID),!. 数字(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']). '第二・第一レベルドメイン'(a). '第二・第一レベルドメイン'(ab). '第二・第一レベルドメイン'(abo). '第二・第一レベルドメイン'(abog). '第二・第一レベルドメイン'(aboga). '第二・第一レベルドメイン'(abogad). '第二・第一レベルドメイン'(abogado). '第二・第一レベルドメイン'(ac). '第二・第一レベルドメイン'(ad). '第二・第一レベルドメイン'(adu). '第二・第一レベルドメイン'(adul). '第二・第一レベルドメイン'(adult). '第二・第一レベルドメイン'(ae). '第二・第一レベルドメイン'(aer). '第二・第一レベルドメイン'(aero). '第二・第一レベルドメイン'(af). '第二・第一レベルドメイン'(afr). '第二・第一レベルドメイン'(afri). '第二・第一レベルドメイン'(afric). '第二・第一レベルドメイン'(africa). '第二・第一レベルドメイン'(ag). '第二・第一レベルドメイン'(ai). '第二・第一レベルドメイン'(al). '第二・第一レベルドメイン'(am). '第二・第一レベルドメイン'(ams). '第二・第一レベルドメイン'(amst). '第二・第一レベルドメイン'(amste). '第二・第一レベルドメイン'(amster). '第二・第一レベルドメイン'(amsterd). '第二・第一レベルドメイン'(amsterda). '第二・第一レベルドメイン'(amsterdam). '第二・第一レベルドメイン'(ap). '第二・第一レベルドメイン'(app). '第二・第一レベルドメイン'(as). '第二・第一レベルドメイン'(asi). '第二・第一レベルドメイン'(asia). '第二・第一レベルドメイン'(at). '第二・第一レベルドメイン'(au). '第二・第一レベルドメイン'(auc). '第二・第一レベルドメイン'(auct). '第二・第一レベルドメイン'(aucti). '第二・第一レベルドメイン'(auctio). '第二・第一レベルドメイン'(auction). '第二・第一レベルドメイン'(ax). '第二・第一レベルドメイン'(az). '第二・第一レベルドメイン'(b). '第二・第一レベルドメイン'(ba). '第二・第一レベルドメイン'(bab). '第二・第一レベルドメイン'(baby). '第二・第一レベルドメイン'(ban). '第二・第一レベルドメイン'(bank). '第二・第一レベルドメイン'(bar). '第二・第一レベルドメイン'(barc). '第二・第一レベルドメイン'(barce). '第二・第一レベルドメイン'(barcel). '第二・第一レベルドメイン'(barcelo). '第二・第一レベルドメイン'(barcelon). '第二・第一レベルドメイン'(barcelona). '第二・第一レベルドメイン'(bb). '第二・第一レベルドメイン'(be). '第二・第一レベルドメイン'(bee). '第二・第一レベルドメイン'(beer). '第二・第一レベルドメイン'(ber). '第二・第一レベルドメイン'(berl). '第二・第一レベルドメイン'(berli). '第二・第一レベルドメイン'(berlin). '第二・第一レベルドメイン'(bg). '第二・第一レベルドメイン'(bi). '第二・第一レベルドメイン'(bik). '第二・第一レベルドメイン'(bike). '第二・第一レベルドメイン'(biz). '第二・第一レベルドメイン'(bj). '第二・第一レベルドメイン'(bl). '第二・第一レベルドメイン'(blo). '第二・第一レベルドメイン'(blog). '第二・第一レベルドメイン'(bm). '第二・第一レベルドメイン'(bo). '第二・第一レベルドメイン'(boo). '第二・第一レベルドメイン'(book). '第二・第一レベルドメイン'(booki). '第二・第一レベルドメイン'(bookin). '第二・第一レベルドメイン'(booking). '第二・第一レベルドメイン'(bos). '第二・第一レベルドメイン'(bost). '第二・第一レベルドメイン'(bosto). '第二・第一レベルドメイン'(boston). '第二・第一レベルドメイン'(br). '第二・第一レベルドメイン'(bru). '第二・第一レベルドメイン'(brus). '第二・第一レベルドメイン'(bruss). '第二・第一レベルドメイン'(brusse). '第二・第一レベルドメイン'(brussel). '第二・第一レベルドメイン'(brussels). '第二・第一レベルドメイン'(bs). '第二・第一レベルドメイン'(bu). '第二・第一レベルドメイン'(bud). '第二・第一レベルドメイン'(buda). '第二・第一レベルドメイン'(budap). '第二・第一レベルドメイン'(budape). '第二・第一レベルドメイン'(budapes). '第二・第一レベルドメイン'(budapest). '第二・第一レベルドメイン'(by). '第二・第一レベルドメイン'(bz). '第二・第一レベルドメイン'(c). '第二・第一レベルドメイン'(ca). '第二・第一レベルドメイン'(cap). '第二・第一レベルドメイン'(cape). '第二・第一レベルドメイン'(capet). '第二・第一レベルドメイン'(capeto). '第二・第一レベルドメイン'(capetow). '第二・第一レベルドメイン'(capetown). '第二・第一レベルドメイン'(car). '第二・第一レベルドメイン'(care). '第二・第一レベルドメイン'(caree). '第二・第一レベルドメイン'(career). '第二・第一レベルドメイン'(cas). '第二・第一レベルドメイン'(cash). '第二・第一レベルドメイン'(cat). '第二・第一レベルドメイン'(cc). '第二・第一レベルドメイン'(cd). '第二・第一レベルドメイン'(cf). '第二・第一レベルドメイン'(cg). '第二・第一レベルドメイン'(ch). '第二・第一レベルドメイン'(chr). '第二・第一レベルドメイン'(chri). '第二・第一レベルドメイン'(chris). '第二・第一レベルドメイン'(christ). '第二・第一レベルドメイン'(christm). '第二・第一レベルドメイン'(christma). '第二・第一レベルドメイン'(christmas). '第二・第一レベルドメイン'(ci). '第二・第一レベルドメイン'(cl). '第二・第一レベルドメイン'(cli). '第二・第一レベルドメイン'(clic). '第二・第一レベルドメイン'(click). '第二・第一レベルドメイン'(cm). '第二・第一レベルドメイン'(cn). '第二・第一レベルドメイン'(co). '第二・第一レベルドメイン'('co.'). '第二・第一レベルドメイン'('co.a'). '第二・第一レベルドメイン'('co.ao'). '第二・第一レベルドメイン'('co.at'). '第二・第一レベルドメイン'('co.b'). '第二・第一レベルドメイン'('co.bw'). '第二・第一レベルドメイン'('co.c'). '第二・第一レベルドメイン'('co.ck'). '第二・第一レベルドメイン'('co.cm'). '第二・第一レベルドメイン'('co.cr'). '第二・第一レベルドメイン'('co.f'). '第二・第一レベルドメイン'('co.fk'). '第二・第一レベルドメイン'('co.h'). '第二・第一レベルドメイン'('co.hu'). '第二・第一レベルドメイン'('co.i'). '第二・第一レベルドメイン'('co.id'). '第二・第一レベルドメイン'('co.il'). '第二・第一レベルドメイン'('co.in'). '第二・第一レベルドメイン'('co.ir'). '第二・第一レベルドメイン'('co.j'). '第二・第一レベルドメイン'('co.jp'). '第二・第一レベルドメイン'('co.k'). '第二・第一レベルドメイン'('co.ke'). '第二・第一レベルドメイン'('co.kr'). '第二・第一レベルドメイン'('co.l'). '第二・第一レベルドメイン'('co.ls'). '第二・第一レベルドメイン'('co.m'). '第二・第一レベルドメイン'('co.mz'). '第二・第一レベルドメイン'('co.n'). '第二・第一レベルドメイン'('co.nl'). '第二・第一レベルドメイン'('co.no'). '第二・第一レベルドメイン'('co.nz'). '第二・第一レベルドメイン'('co.r'). '第二・第一レベルドメイン'('co.rs'). '第二・第一レベルドメイン'('co.t'). '第二・第一レベルドメイン'('co.th'). '第二・第一レベルドメイン'('co.tt'). '第二・第一レベルドメイン'('co.tz'). '第二・第一レベルドメイン'('co.u'). '第二・第一レベルドメイン'('co.ug'). '第二・第一レベルドメイン'('co.uk'). '第二・第一レベルドメイン'('co.z'). '第二・第一レベルドメイン'('co.za'). '第二・第一レベルドメイン'('co.zw'). '第二・第一レベルドメイン'(cof). '第二・第一レベルドメイン'(coff). '第二・第一レベルドメイン'(coffe). '第二・第一レベルドメイン'(coffee). '第二・第一レベルドメイン'(com). '第二・第一レベルドメイン'('com.'). '第二・第一レベルドメイン'('com.a'). '第二・第一レベルドメイン'('com.ag'). '第二・第一レベルドメイン'('com.ai'). '第二・第一レベルドメイン'('com.al'). '第二・第一レベルドメイン'('com.an'). '第二・第一レベルドメイン'('com.ar'). '第二・第一レベルドメイン'('com.au'). '第二・第一レベルドメイン'('com.aw'). '第二・第一レベルドメイン'('com.az'). '第二・第一レベルドメイン'('com.b'). '第二・第一レベルドメイン'('com.bd'). '第二・第一レベルドメイン'('com.bh'). '第二・第一レベルドメイン'('com.bn'). '第二・第一レベルドメイン'('com.bo'). '第二・第一レベルドメイン'('com.br'). '第二・第一レベルドメイン'('com.bs'). '第二・第一レベルドメイン'('com.bt'). '第二・第一レベルドメイン'('com.c'). '第二・第一レベルドメイン'('com.cm'). '第二・第一レベルドメイン'('com.cn'). '第二・第一レベルドメイン'('com.co'). '第二・第一レベルドメイン'('com.cy'). '第二・第一レベルドメイン'('com.d'). '第二・第一レベルドメイン'('com.de'). '第二・第一レベルドメイン'('com.dz'). '第二・第一レベルドメイン'('com.e'). '第二・第一レベルドメイン'('com.ec'). '第二・第一レベルドメイン'('com.eg'). '第二・第一レベルドメイン'('com.es'). '第二・第一レベルドメイン'('com.et'). '第二・第一レベルドメイン'('com.f'). '第二・第一レベルドメイン'('com.fj'). '第二・第一レベルドメイン'('com.g'). '第二・第一レベルドメイン'('com.ge'). '第二・第一レベルドメイン'('com.gh'). '第二・第一レベルドメイン'('com.gi'). '第二・第一レベルドメイン'('com.gl'). '第二・第一レベルドメイン'('com.gn'). '第二・第一レベルドメイン'('com.gr'). '第二・第一レベルドメイン'('com.gt'). '第二・第一レベルドメイン'('com.gu'). '第二・第一レベルドメイン'('com.h'). '第二・第一レベルドメイン'('com.hk'). '第二・第一レベルドメイン'('com.hr'). '第二・第一レベルドメイン'('com.j'). '第二・第一レベルドメイン'('com.jm'). '第二・第一レベルドメイン'('com.jo'). '第二・第一レベルドメイン'('com.k'). '第二・第一レベルドメイン'('com.kh'). '第二・第一レベルドメイン'('com.kw'). '第二・第一レベルドメイン'('com.l'). '第二・第一レベルドメイン'('com.lb'). '第二・第一レベルドメイン'('com.lr'). '第二・第一レベルドメイン'('com.lv'). '第二・第一レベルドメイン'('com.ly'). '第二・第一レベルドメイン'('com.m'). '第二・第一レベルドメイン'('com.mg'). '第二・第一レベルドメイン'('com.mk'). '第二・第一レベルドメイン'('com.mo'). '第二・第一レベルドメイン'('com.mt'). '第二・第一レベルドメイン'('com.mx'). '第二・第一レベルドメイン'('com.my'). '第二・第一レベルドメイン'('com.n'). '第二・第一レベルドメイン'('com.na'). '第二・第一レベルドメイン'('com.ng'). '第二・第一レベルドメイン'('com.ni'). '第二・第一レベルドメイン'('com.np'). '第二・第一レベルドメイン'('com.o'). '第二・第一レベルドメイン'('com.om'). '第二・第一レベルドメイン'('com.p'). '第二・第一レベルドメイン'('com.pa'). '第二・第一レベルドメイン'('com.pe'). '第二・第一レベルドメイン'('com.ph'). '第二・第一レベルドメイン'('com.pk'). '第二・第一レベルドメイン'('com.pl'). '第二・第一レベルドメイン'('com.pr'). '第二・第一レベルドメイン'('com.pt'). '第二・第一レベルドメイン'('com.py'). '第二・第一レベルドメイン'('com.q'). '第二・第一レベルドメイン'('com.qa'). '第二・第一レベルドメイン'('com.r'). '第二・第一レベルドメイン'('com.ro'). '第二・第一レベルドメイン'('com.s'). '第二・第一レベルドメイン'('com.sg'). '第二・第一レベルドメイン'('com.sn'). '第二・第一レベルドメイン'('com.sv'). '第二・第一レベルドメイン'('com.sy'). '第二・第一レベルドメイン'('com.t'). '第二・第一レベルドメイン'('com.tn'). '第二・第一レベルドメイン'('com.tr'). '第二・第一レベルドメイン'('com.tw'). '第二・第一レベルドメイン'('com.u'). '第二・第一レベルドメイン'('com.ua'). '第二・第一レベルドメイン'('com.uy'). '第二・第一レベルドメイン'('com.v'). '第二・第一レベルドメイン'('com.ve'). '第二・第一レベルドメイン'('com.vn'). '第二・第一レベルドメイン'(con). '第二・第一レベルドメイン'(cond). '第二・第一レベルドメイン'(condo). '第二・第一レベルドメイン'(condos). '第二・第一レベルドメイン'(cons). '第二・第一レベルドメイン'(consu). '第二・第一レベルドメイン'(consul). '第二・第一レベルドメイン'(consult). '第二・第一レベルドメイン'(consulti). '第二・第一レベルドメイン'(consultin). '第二・第一レベルドメイン'(consulting). '第二・第一レベルドメイン'(coo). '第二・第一レベルドメイン'(coop). '第二・第一レベルドメイン'(cor). '第二・第一レベルドメイン'(cors). '第二・第一レベルドメイン'(corsi). '第二・第一レベルドメイン'(corsic). '第二・第一レベルドメイン'(corsica). '第二・第一レベルドメイン'(cr). '第二・第一レベルドメイン'(cre). '第二・第一レベルドメイン'(cred). '第二・第一レベルドメイン'(credi). '第二・第一レベルドメイン'(credit). '第二・第一レベルドメイン'(cu). '第二・第一レベルドメイン'(cv). '第二・第一レベルドメイン'(cw). '第二・第一レベルドメイン'(cx). '第二・第一レベルドメイン'(cy). '第二・第一レベルドメイン'(cym). '第二・第一レベルドメイン'(cymr). '第二・第一レベルドメイン'(cymru). '第二・第一レベルドメイン'(cz). '第二・第一レベルドメイン'(d). '第二・第一レベルドメイン'(de). '第二・第一レベルドメイン'('de.'). '第二・第一レベルドメイン'('de.c'). '第二・第一レベルドメイン'('de.co'). '第二・第一レベルドメイン'('de.com'). '第二・第一レベルドメイン'(den). '第二・第一レベルドメイン'(dent). '第二・第一レベルドメイン'(denta). '第二・第一レベルドメイン'(dental). '第二・第一レベルドメイン'(dj). '第二・第一レベルドメイン'(dk). '第二・第一レベルドメイン'(dm). '第二・第一レベルドメイン'(do). '第二・第一レベルドメイン'(dow). '第二・第一レベルドメイン'(down). '第二・第一レベルドメイン'(downl). '第二・第一レベルドメイン'(downlo). '第二・第一レベルドメイン'(downloa). '第二・第一レベルドメイン'(download). '第二・第一レベルドメイン'(du). '第二・第一レベルドメイン'(dub). '第二・第一レベルドメイン'(duba). '第二・第一レベルドメイン'(dubai). '第二・第一レベルドメイン'(dz). '第二・第一レベルドメイン'(e). '第二・第一レベルドメイン'(ec). '第二・第一レベルドメイン'(eco). '第二・第一レベルドメイン'(ed). '第二・第一レベルドメイン'(edu). '第二・第一レベルドメイン'(ee). '第二・第一レベルドメイン'(eg). '第二・第一レベルドメイン'(em). '第二・第一レベルドメイン'(ema). '第二・第一レベルドメイン'(emar). '第二・第一レベルドメイン'(emara). '第二・第一レベルドメイン'(emarat). '第二・第一レベルドメイン'(es). '第二・第一レベルドメイン'(eu). '第二・第一レベルドメイン'('eu.'). '第二・第一レベルドメイン'('eu.c'). '第二・第一レベルドメイン'('eu.co'). '第二・第一レベルドメイン'('eu.com'). '第二・第一レベルドメイン'(ev). '第二・第一レベルドメイン'(eve). '第二・第一レベルドメイン'(even). '第二・第一レベルドメイン'(event). '第二・第一レベルドメイン'(events). '第二・第一レベルドメイン'(f). '第二・第一レベルドメイン'(fi). '第二・第一レベルドメイン'(fil). '第二・第一レベルドメイン'(film). '第二・第一レベルドメイン'(fl). '第二・第一レベルドメイン'(fli). '第二・第一レベルドメイン'(flig). '第二・第一レベルドメイン'(fligh). '第二・第一レベルドメイン'(flight). '第二・第一レベルドメイン'(flights). '第二・第一レベルドメイン'(fly). '第二・第一レベルドメイン'(fm). '第二・第一レベルドメイン'(fo). '第二・第一レベルドメイン'(foo). '第二・第一レベルドメイン'(food). '第二・第一レベルドメイン'(foot). '第二・第一レベルドメイン'(footb). '第二・第一レベルドメイン'(footba). '第二・第一レベルドメイン'(footbal). '第二・第一レベルドメイン'(football). '第二・第一レベルドメイン'(for). '第二・第一レベルドメイン'(foru). '第二・第一レベルドメイン'(forum). '第二・第一レベルドメイン'(fr). '第二・第一レベルドメイン'(fre). '第二・第一レベルドメイン'(free). '第二・第一レベルドメイン'(fri). '第二・第一レベルドメイン'(frie). '第二・第一レベルドメイン'(frien). '第二・第一レベルドメイン'(friend). '第二・第一レベルドメイン'(friends). '第二・第一レベルドメイン'(fu). '第二・第一レベルドメイン'(fun). '第二・第一レベルドメイン'(fund). '第二・第一レベルドメイン'(fut). '第二・第一レベルドメイン'(futb). '第二・第一レベルドメイン'(futbo). '第二・第一レベルドメイン'(futbol). '第二・第一レベルドメイン'(g). '第二・第一レベルドメイン'(ga). '第二・第一レベルドメイン'(gam). '第二・第一レベルドメイン'(game). '第二・第一レベルドメイン'(gay). '第二・第一レベルドメイン'(gd). '第二・第一レベルドメイン'(ge). '第二・第一レベルドメイン'(gen). '第二・第一レベルドメイン'(gent). '第二・第一レベルドメイン'(gf). '第二・第一レベルドメイン'(gg). '第二・第一レベルドメイン'(gl). '第二・第一レベルドメイン'(gm). '第二・第一レベルドメイン'(gmb). '第二・第一レベルドメイン'(gmbh). '第二・第一レベルドメイン'(go). '第二・第一レベルドメイン'(gol). '第二・第一レベルドメイン'(gold). '第二・第一レベルドメイン'(gov). '第二・第一レベルドメイン'(gp). '第二・第一レベルドメイン'(gr). '第二・第一レベルドメイン'('gr.'). '第二・第一レベルドメイン'('gr.c'). '第二・第一レベルドメイン'('gr.co'). '第二・第一レベルドメイン'('gr.com'). '第二・第一レベルドメイン'(gs). '第二・第一レベルドメイン'(gt). '第二・第一レベルドメイン'(gy). '第二・第一レベルドメイン'(h). '第二・第一レベルドメイン'(he). '第二・第一レベルドメイン'(hel). '第二・第一レベルドメイン'(hels). '第二・第一レベルドメイン'(helsi). '第二・第一レベルドメイン'(helsin). '第二・第一レベルドメイン'(helsink). '第二・第一レベルドメイン'(helsinki). '第二・第一レベルドメイン'(hi). '第二・第一レベルドメイン'(hiv). '第二・第一レベルドメイン'(hk). '第二・第一レベルドメイン'(hn). '第二・第一レベルドメイン'(ho). '第二・第一レベルドメイン'(hoc). '第二・第一レベルドメイン'(hock). '第二・第一レベルドメイン'(hocke). '第二・第一レベルドメイン'(hockey). '第二・第一レベルドメイン'(hol). '第二・第一レベルドメイン'(holi). '第二・第一レベルドメイン'(holid). '第二・第一レベルドメイン'(holida). '第二・第一レベルドメイン'(holiday). '第二・第一レベルドメイン'(hor). '第二・第一レベルドメイン'(hors). '第二・第一レベルドメイン'(horse). '第二・第一レベルドメイン'(hos). '第二・第一レベルドメイン'(hosp). '第二・第一レベルドメイン'(hospi). '第二・第一レベルドメイン'(hospit). '第二・第一レベルドメイン'(hospita). '第二・第一レベルドメイン'(hospital). '第二・第一レベルドメイン'(hot). '第二・第一レベルドメイン'(hote). '第二・第一レベルドメイン'(hotel). '第二・第一レベルドメイン'(hou). '第二・第一レベルドメイン'(hous). '第二・第一レベルドメイン'(house). '第二・第一レベルドメイン'(hr). '第二・第一レベルドメイン'(ht). '第二・第一レベルドメイン'(hu). '第二・第一レベルドメイン'(i). '第二・第一レベルドメイン'(ie). '第二・第一レベルドメイン'(im). '第二・第一レベルドメイン'(in). '第二・第一レベルドメイン'(inc). '第二・第一レベルドメイン'(inf). '第二・第一レベルドメイン'(info). '第二・第一レベルドメイン'(ins). '第二・第一レベルドメイン'(insu). '第二・第一レベルドメイン'(insur). '第二・第一レベルドメイン'(insure). '第二・第一レベルドメイン'(io). '第二・第一レベルドメイン'(iq). '第二・第一レベルドメイン'(ir). '第二・第一レベルドメイン'(iri). '第二・第一レベルドメイン'(iris). '第二・第一レベルドメイン'(irish). '第二・第一レベルドメイン'(is). '第二・第一レベルドメイン'(isl). '第二・第一レベルドメイン'(isla). '第二・第一レベルドメイン'(islam). '第二・第一レベルドメイン'(ist). '第二・第一レベルドメイン'(ista). '第二・第一レベルドメイン'(istan). '第二・第一レベルドメイン'(istanb). '第二・第一レベルドメイン'(istanbu). '第二・第一レベルドメイン'(istanbul). '第二・第一レベルドメイン'(it). '第二・第一レベルドメイン'(j). '第二・第一レベルドメイン'(je). '第二・第一レベルドメイン'(jo). '第二・第一レベルドメイン'(job). '第二・第一レベルドメイン'(jobs). '第二・第一レベルドメイン'(jp). '第二・第一レベルドメイン'(k). '第二・第一レベルドメイン'(kg). '第二・第一レベルドメイン'(ki). '第二・第一レベルドメイン'(kit). '第二・第一レベルドメイン'(kitc). '第二・第一レベルドメイン'(kitch). '第二・第一レベルドメイン'(kitche). '第二・第一レベルドメイン'(kitchen). '第二・第一レベルドメイン'(kn). '第二・第一レベルドメイン'(ko). '第二・第一レベルドメイン'(koe). '第二・第一レベルドメイン'(koel). '第二・第一レベルドメイン'(koeln). '第二・第一レベルドメイン'(kr). '第二・第一レベルドメイン'(ky). '第二・第一レベルドメイン'(kz). '第二・第一レベルドメイン'(l). '第二・第一レベルドメイン'(la). '第二・第一レベルドメイン'(lat). '第二・第一レベルドメイン'(law). '第二・第一レベルドメイン'(lc). '第二・第一レベルドメイン'(li). '第二・第一レベルドメイン'(lim). '第二・第一レベルドメイン'(limi). '第二・第一レベルドメイン'(limit). '第二・第一レベルドメイン'(limite). '第二・第一レベルドメイン'(limited). '第二・第一レベルドメイン'(lk). '第二・第一レベルドメイン'(lo). '第二・第一レベルドメイン'(lon). '第二・第一レベルドメイン'(lond). '第二・第一レベルドメイン'(londo). '第二・第一レベルドメイン'(london). '第二・第一レベルドメイン'(lot). '第二・第一レベルドメイン'(lott). '第二・第一レベルドメイン'(lotto). '第二・第一レベルドメイン'(lt). '第二・第一レベルドメイン'(lu). '第二・第一レベルドメイン'(lv). '第二・第一レベルドメイン'(ly). '第二・第一レベルドメイン'(m). '第二・第一レベルドメイン'(ma). '第二・第一レベルドメイン'(mc). '第二・第一レベルドメイン'(md). '第二・第一レベルドメイン'(me). '第二・第一レベルドメイン'(med). '第二・第一レベルドメイン'(medi). '第二・第一レベルドメイン'(medic). '第二・第一レベルドメイン'(medica). '第二・第一レベルドメイン'(medical). '第二・第一レベルドメイン'(mel). '第二・第一レベルドメイン'(melb). '第二・第一レベルドメイン'(melbo). '第二・第一レベルドメイン'(melbou). '第二・第一レベルドメイン'(melbour). '第二・第一レベルドメイン'(melbourn). '第二・第一レベルドメイン'(melbourne). '第二・第一レベルドメイン'(men). '第二・第一レベルドメイン'(menu). '第二・第一レベルドメイン'(mg). '第二・第一レベルドメイン'(mi). '第二・第一レベルドメイン'(mia). '第二・第一レベルドメイン'(miam). '第二・第一レベルドメイン'(miami). '第二・第一レベルドメイン'(mk). '第二・第一レベルドメイン'(mn). '第二・第一レベルドメイン'(mo). '第二・第一レベルドメイン'(mob). '第二・第一レベルドメイン'(mobi). '第二・第一レベルドメイン'(mos). '第二・第一レベルドメイン'(mosc). '第二・第一レベルドメイン'(mosco). '第二・第一レベルドメイン'(moscow). '第二・第一レベルドメイン'(mp). '第二・第一レベルドメイン'(ms). '第二・第一レベルドメイン'(mu). '第二・第一レベルドメイン'(mus). '第二・第一レベルドメイン'(musi). '第二・第一レベルドメイン'(music). '第二・第一レベルドメイン'(mv). '第二・第一レベルドメイン'(mw). '第二・第一レベルドメイン'(mx). '第二・第一レベルドメイン'(my). '第二・第一レベルドメイン'(n). '第二・第一レベルドメイン'(na). '第二・第一レベルドメイン'(nam). '第二・第一レベルドメイン'(name). '第二・第一レベルドメイン'(ne). '第二・第一レベルドメイン'(net). '第二・第一レベルドメイン'('net.'). '第二・第一レベルドメイン'('net.a'). '第二・第一レベルドメイン'('net.au'). '第二・第一レベルドメイン'('net.b'). '第二・第一レベルドメイン'('net.bn'). '第二・第一レベルドメイン'('net.br'). '第二・第一レベルドメイン'('net.c'). '第二・第一レベルドメイン'('net.cm'). '第二・第一レベルドメイン'('net.cn'). '第二・第一レベルドメイン'('net.g'). '第二・第一レベルドメイン'('net.gt'). '第二・第一レベルドメイン'('net.h'). '第二・第一レベルドメイン'('net.hk'). '第二・第一レベルドメイン'('net.i'). '第二・第一レベルドメイン'('net.il'). '第二・第一レベルドメイン'('net.m'). '第二・第一レベルドメイン'('net.mx'). '第二・第一レベルドメイン'('net.n'). '第二・第一レベルドメイン'('net.nz'). '第二・第一レベルドメイン'('net.p'). '第二・第一レベルドメイン'('net.ph'). '第二・第一レベルドメイン'('net.u'). '第二・第一レベルドメイン'('net.uk'). '第二・第一レベルドメイン'(new). '第二・第一レベルドメイン'(news). '第二・第一レベルドメイン'(nl). '第二・第一レベルドメイン'(no). '第二・第一レベルドメイン'(nom). '第二・第一レベルドメイン'('nom.'). '第二・第一レベルドメイン'('nom.e'). '第二・第一レベルドメイン'('nom.es'). '第二・第一レベルドメイン'(nr). '第二・第一レベルドメイン'(nu). '第二・第一レベルドメイン'(o). '第二・第一レベルドメイン'(or). '第二・第一レベルドメイン'(org). '第二・第一レベルドメイン'('org.'). '第二・第一レベルドメイン'('org.b'). '第二・第一レベルドメイン'('org.bn'). '第二・第一レベルドメイン'('org.c'). '第二・第一レベルドメイン'('org.cn'). '第二・第一レベルドメイン'('org.e'). '第二・第一レベルドメイン'('org.es'). '第二・第一レベルドメイン'('org.i'). '第二・第一レベルドメイン'('org.il'). '第二・第一レベルドメイン'('org.l'). '第二・第一レベルドメイン'('org.lv'). '第二・第一レベルドメイン'('org.n'). '第二・第一レベルドメイン'('org.nz'). '第二・第一レベルドメイン'('org.p'). '第二・第一レベルドメイン'('org.ph'). '第二・第一レベルドメイン'('org.pl'). '第二・第一レベルドメイン'('org.u'). '第二・第一レベルドメイン'('org.uk'). '第二・第一レベルドメイン'(orga). '第二・第一レベルドメイン'(organ). '第二・第一レベルドメイン'(organi). '第二・第一レベルドメイン'(organic). '第二・第一レベルドメイン'(p). '第二・第一レベルドメイン'(pa). '第二・第一レベルドメイン'(par). '第二・第一レベルドメイン'(pari). '第二・第一レベルドメイン'(paris). '第二・第一レベルドメイン'(pe). '第二・第一レベルドメイン'(ph). '第二・第一レベルドメイン'(pho). '第二・第一レベルドメイン'(phot). '第二・第一レベルドメイン'(photo). '第二・第一レベルドメイン'(pi). '第二・第一レベルドメイン'(pin). '第二・第一レベルドメイン'(pink). '第二・第一レベルドメイン'(piz). '第二・第一レベルドメイン'(pizz). '第二・第一レベルドメイン'(pizza). '第二・第一レベルドメイン'(pk). '第二・第一レベルドメイン'(pl). '第二・第一レベルドメイン'(pm). '第二・第一レベルドメイン'(pn). '第二・第一レベルドメイン'(po). '第二・第一レベルドメイン'(pok). '第二・第一レベルドメイン'(poke). '第二・第一レベルドメイン'(poker). '第二・第一レベルドメイン'(por). '第二・第一レベルドメイン'(porn). '第二・第一レベルドメイン'(pr). '第二・第一レベルドメイン'(pro). '第二・第一レベルドメイン'(ps). '第二・第一レベルドメイン'(pt). '第二・第一レベルドメイン'(pu). '第二・第一レベルドメイン'(pub). '第二・第一レベルドメイン'(pw). '第二・第一レベルドメイン'(q). '第二・第一レベルドメイン'(qa). '第二・第一レベルドメイン'(qu). '第二・第一レベルドメイン'(que). '第二・第一レベルドメイン'(queb). '第二・第一レベルドメイン'(quebe). '第二・第一レベルドメイン'(quebec). '第二・第一レベルドメイン'(r). '第二・第一レベルドメイン'(re). '第二・第一レベルドメイン'(rei). '第二・第一レベルドメイン'(reis). '第二・第一レベルドメイン'(reise). '第二・第一レベルドメイン'(rep). '第二・第一レベルドメイン'(repo). '第二・第一レベルドメイン'(repor). '第二・第一レベルドメイン'(report). '第二・第一レベルドメイン'(res). '第二・第一レベルドメイン'(rest). '第二・第一レベルドメイン'(resta). '第二・第一レベルドメイン'(restau). '第二・第一レベルドメイン'(restaur). '第二・第一レベルドメイン'(restaura). '第二・第一レベルドメイン'(restauran). '第二・第一レベルドメイン'(restaurant). '第二・第一レベルドメイン'(ro). '第二・第一レベルドメイン'(rom). '第二・第一レベルドメイン'(roma). '第二・第一レベルドメイン'(rs). '第二・第一レベルドメイン'(ru). '第二・第一レベルドメイン'(rug). '第二・第一レベルドメイン'(rugb). '第二・第一レベルドメイン'(rugby). '第二・第一レベルドメイン'(ruh). '第二・第一レベルドメイン'(ruhr). '第二・第一レベルドメイン'(rw). '第二・第一レベルドメイン'(s). '第二・第一レベルドメイン'(sa). '第二・第一レベルドメイン'(sc). '第二・第一レベルドメイン'(sco). '第二・第一レベルドメイン'(scot). '第二・第一レベルドメイン'(sd). '第二・第一レベルドメイン'(se). '第二・第一レベルドメイン'(sec). '第二・第一レベルドメイン'(secu). '第二・第一レベルドメイン'(secur). '第二・第一レベルドメイン'(secure). '第二・第一レベルドメイン'(sg). '第二・第一レベルドメイン'(sh). '第二・第一レベルドメイン'(sho). '第二・第一レベルドメイン'(shoe). '第二・第一レベルドメイン'(shoes). '第二・第一レベルドメイン'(shop). '第二・第一レベルドメイン'(si). '第二・第一レベルドメイン'(sk). '第二・第一レベルドメイン'(ska). '第二・第一レベルドメイン'(skat). '第二・第一レベルドメイン'(skate). '第二・第一レベルドメイン'(ski). '第二・第一レベルドメイン'(sl). '第二・第一レベルドメイン'(sm). '第二・第一レベルドメイン'(sn). '第二・第一レベルドメイン'(so). '第二・第一レベルドメイン'(sp). '第二・第一レベルドメイン'(spa). '第二・第一レベルドメイン'(spac). '第二・第一レベルドメイン'(space). '第二・第一レベルドメイン'(spo). '第二・第一レベルドメイン'(spor). '第二・第一レベルドメイン'(sport). '第二・第一レベルドメイン'(sr). '第二・第一レベルドメイン'(st). '第二・第一レベルドメイン'(sto). '第二・第一レベルドメイン'(stoc). '第二・第一レベルドメイン'(stock). '第二・第一レベルドメイン'(stockh). '第二・第一レベルドメイン'(stockho). '第二・第一レベルドメイン'(stockhol). '第二・第一レベルドメイン'(stockholm). '第二・第一レベルドメイン'(su). '第二・第一レベルドメイン'(sup). '第二・第一レベルドメイン'(supp). '第二・第一レベルドメイン'(suppo). '第二・第一レベルドメイン'(suppor). '第二・第一レベルドメイン'(support). '第二・第一レベルドメイン'(sur). '第二・第一レベルドメイン'(surf). '第二・第一レベルドメイン'(sv). '第二・第一レベルドメイン'(sx). '第二・第一レベルドメイン'(sy). '第二・第一レベルドメイン'(syd). '第二・第一レベルドメイン'(sydn). '第二・第一レベルドメイン'(sydne). '第二・第一レベルドメイン'(sydney). '第二・第一レベルドメイン'(t). '第二・第一レベルドメイン'(ta). '第二・第一レベルドメイン'(tat). '第二・第一レベルドメイン'(tatt). '第二・第一レベルドメイン'(tatto). '第二・第一レベルドメイン'(tattoo). '第二・第一レベルドメイン'(tc). '第二・第一レベルドメイン'(td). '第二・第一レベルドメイン'(te). '第二・第一レベルドメイン'(tel). '第二・第一レベルドメイン'(ten). '第二・第一レベルドメイン'(tenn). '第二・第一レベルドメイン'(tenni). '第二・第一レベルドメイン'(tennis). '第二・第一レベルドメイン'(tf). '第二・第一レベルドメイン'(tg). '第二・第一レベルドメイン'(th). '第二・第一レベルドメイン'(tha). '第二・第一レベルドメイン'(thai). '第二・第一レベルドメイン'(ti). '第二・第一レベルドメイン'(tir). '第二・第一レベルドメイン'(tiro). '第二・第一レベルドメイン'(tirol). '第二・第一レベルドメイン'(tj). '第二・第一レベルドメイン'(tk). '第二・第一レベルドメイン'(tl). '第二・第一レベルドメイン'(tm). '第二・第一レベルドメイン'(tn). '第二・第一レベルドメイン'(to). '第二・第一レベルドメイン'(tok). '第二・第一レベルドメイン'(toky). '第二・第一レベルドメイン'(tokyo). '第二・第一レベルドメイン'(tr). '第二・第一レベルドメイン'(tra). '第二・第一レベルドメイン'(trai). '第二・第一レベルドメイン'(train). '第二・第一レベルドメイン'(traini). '第二・第一レベルドメイン'(trainin). '第二・第一レベルドメイン'(training). '第二・第一レベルドメイン'(trav). '第二・第一レベルドメイン'(trave). '第二・第一レベルドメイン'(travel). '第二・第一レベルドメイン'(tv). '第二・第一レベルドメイン'(tw). '第二・第一レベルドメイン'(u). '第二・第一レベルドメイン'(ua). '第二・第一レベルドメイン'(ug). '第二・第一レベルドメイン'(uk). '第二・第一レベルドメイン'('uk.'). '第二・第一レベルドメイン'('uk.c'). '第二・第一レベルドメイン'('uk.co'). '第二・第一レベルドメイン'('uk.com'). '第二・第一レベルドメイン'(us). '第二・第一レベルドメイン'('us.'). '第二・第一レベルドメイン'('us.c'). '第二・第一レベルドメイン'('us.co'). '第二・第一レベルドメイン'('us.com'). '第二・第一レベルドメイン'('us.o'). '第二・第一レベルドメイン'('us.or'). '第二・第一レベルドメイン'('us.org'). '第二・第一レベルドメイン'(uy). '第二・第一レベルドメイン'(uz). '第二・第一レベルドメイン'(v). '第二・第一レベルドメイン'(vc). '第二・第一レベルドメイン'(vg). '第二・第一レベルドメイン'(vi). '第二・第一レベルドメイン'(via). '第二・第一レベルドメイン'(viaj). '第二・第一レベルドメイン'(viaje). '第二・第一レベルドメイン'(viajes). '第二・第一レベルドメイン'(vn). '第二・第一レベルドメイン'(vo). '第二・第一レベルドメイン'(voy). '第二・第一レベルドメイン'(voya). '第二・第一レベルドメイン'(voyag). '第二・第一レベルドメイン'(voyage). '第二・第一レベルドメイン'(w). '第二・第一レベルドメイン'(wa). '第二・第一レベルドメイン'(wal). '第二・第一レベルドメイン'(wale). '第二・第一レベルドメイン'(wales). '第二・第一レベルドメイン'(we). '第二・第一レベルドメイン'(web). '第二・第一レベルドメイン'('web.'). '第二・第一レベルドメイン'('web.d'). '第二・第一レベルドメイン'('web.do'). '第二・第一レベルドメイン'(wf). '第二・第一レベルドメイン'(wi). '第二・第一レベルドメイン'(wie). '第二・第一レベルドメイン'(wien). '第二・第一レベルドメイン'(win). '第二・第一レベルドメイン'(wine). '第二・第一レベルドメイン'(ws). '第二・第一レベルドメイン'(x). '第二・第一レベルドメイン'(xx). '第二・第一レベルドメイン'(xxx). '第二・第一レベルドメイン'(y). '第二・第一レベルドメイン'(yt). '第二・第一レベルドメイン'('м'). '第二・第一レベルドメイン'('мо'). '第二・第一レベルドメイン'('мос'). '第二・第一レベルドメイン'('моск'). '第二・第一レベルドメイン'('москв'). '第二・第一レベルドメイン'('москва'). '第二・第一レベルドメイン'('р'). '第二・第一レベルドメイン'('рф'). '第二・第一レベルドメイン'('с'). '第二・第一レベルドメイン'('ср'). '第二・第一レベルドメイン'('срб'). '第二・第一レベルドメイン'('香'). '第二・第一レベルドメイン'('香港'). '第二・第一レベルドメイン'('中'). '第二・第一レベルドメイン'('中国'). % 以下のサイトは # ^.*\d{2}[a-zA-Z]?\.gif # という表現がマッチする文字列があるとします。 # 例えば、img01A.gifです。 # この文字列から、頭のゼロを外した数字を抜き出したいです。 # 上の例では、「1」を抜き出したいです。 # 「01」を抜き出すのでよければ、 # ^.*(\d{2})[a-zA-Z]?\.gif # として、「$1」で受ければいいですが、 # 頭のゼロをスマートに取り除く方法を模索しています。 # よろしくお願いします。有難うございます。 '^.*\d{2}[a-zA-Z]?\.gif という表現がマッチする文字列があるとします。 例えば、img01A.gifです。 この文字列から、頭のゼロを外した数字を抜き出したいです。 上の例では、「1」を抜き出したいです。 「01」を抜き出すのでよければ、 ^.*(\d{2})[a-zA-Z]?\.gif として、「$1」で受ければいいですが、 頭のゼロをスマートに取り除く方法を模索しています。 よろしくお願いします。有難うございます。'(_文字列,_頭部のゼロを取り除いた数字文字列) :- '文字列から、頭のゼロを外した数字を抜き出したいです。'(_文字列,_頭のゼロを取り除いた数字文字列). '文字列から、頭のゼロを外した数字を抜き出したいです。'(_文字列,_頭のゼロを取り除いた数字文字列) :- 数字文字ならびを切り取る(_文字列,_数字文字ならび), 頭のゼロを取り除く(_数字文字ならび,_頭のゼロを取り除いた数字文字ならび), atom_chars(_頭のゼロを取り除いた数字文字列,_頭のゼロを取り除いた数字文字ならび). 数字文字ならびを切り取る(_文字列,_数字文字ならび) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,_数字文字ならび,L3), '_数字文字ならびは数字のみで構成され、L1に数字は含まず、L3の先頭文字は数字ではない'(L1,_数字文字ならび,L3). '_数字文字ならびは数字のみで構成され、L1に数字は含まず、L3の先頭文字は数字ではない'(L1,_数字文字ならび,L3) :- forall(member(_数字文字,_数字文字ならび),数字(_数字文字)), forall(member(_文字,L1),\+(数字(_文字))), \+((L3 = [_文字|_],数字(_文字))),!. 頭のゼロを取り除く([],[]). 頭のゼロを取り除く([A|R],[A|R]) :- \+(A='0'),!. 頭のゼロを取り除く(['0'|R1],R2) :- 頭のゼロを取り除く(R1,R2). 頭のゼロを取り除く([A|R1],[A|R2]) :- 頭のゼロを取り除く(R1,R2). % 以下のサイトは タブ区切りのn列のm字目からn字目までを切り出す(_n列,_m字目,_n字目,_文字列,_副文字列) :- nth1_split(_n列,_文字列,['\t'],_副文字列_1), _n_1 is _n - 1, sub_atom(_副文字列_1,_m字目,_n_1,_,_副文字列). タブ区切りのn列を切り出す(_n列,_m字目,_n字目,_文字列,_副文字列) :- nth1_split(_n列,_文字列,['\t'],_副文字列),!. nth1_split(_nth1,_文字列,_区切り文字ならび,_副文字列) :- split(_文字列,_区切り文字ならび,1,_nth1,_区切り文字列,_副文字列,_残り文字列). split('',_,_,_,_,_,_) :- !,fail. split(_文字列,_区切り文字列ならび,_nth1_1,_nth1,_区切り文字列,_副文字列,_残り文字列) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列_1,_副文字列_1,_残り文字列_1), split_1(_区切り文字列ならび,_nth1_1,_区切り文字列_1,_副文字列_1,_残り文字列_1,_nth1,_区切り文字列,_副文字列,_残り文字列). split_1(_区切り文字列ならび,_nth1,_区切り文字列,_副文字列,_残り文字列,_nth1,_区切り文字列,_副文字列,_残り文字列). split_1(_区切り文字列ならび,_nth1_1,_,_,_残り文字列_1,_nth1,_区切り文字列,_副文字列,_残り文字列) :- _nth1_2 is _nth1_1 + 1, split(_残り文字列_1,_区切り文字列ならび,_nth1_2,_nth1,_区切り文字列,_副文字列,_残り文字列). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), sub_atom(_区切り文字列,_,_長さ,_,_区切り文字列), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). % 以下のサイトは nth1_split(_nth1,_文字列,_区切り文字,_副文字列) :- split(_文字列,[_区切り文字],_,L2), nth1(_nth1,L2,_副文字列). split('',_,[],[]) :- !. split(_文字列,_区切り文字列ならび,[_区切り文字列|R3],[_副文字列|R4]) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R3,R4). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), atom_length(_区切り文字列,_長さ), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). % 以下のサイトは split(_文字列,_区切り文字列ならび,[_区切り文字までの文字列|R2]) :- 区切り文字までの文字列を得る(_文字列,_区切り文字列ならび,_区切り文字までの文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R2). split(_文字列,_区切り文字列ならび,[_文字列]) :- 区切り文字までの文字列に区切り文字を含まない(_文字列,_区切り文字列ならび). 区切り文字までの文字列を得る(_文字列,_区切り文字列ならび,_区切り文字までの文字列,_残り文字列) :- 先頭から区切り文字を捕まえる(_文字列,_区切り文字列ならび,_区切り文字列までの文字列,_残り文字列), 区切り文字までの文字列に区切り文字を含まない(_区切り文字までの文字列,_区切り文字列ならび). 先頭から区切り文字を捕まえる(_文字列,_区切り文字列ならび,_区切り文字列までの文字列,_残り文字列) :- sub_atom(_文字列,_発見した位置,_,_残り文字数,_区切り文字列), member(_区切り文字列,_区切り文字列ならび), sub_atom(_文字列,0,_発見した位置,_,_区切り文字列までの文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列). 区切り文字までの文字列に区切り文字を含まない(_区切り文字までの文字列,_区切り文字列ならび) :- member(_区切り文字列,_区切り文字列ならび), sub_atom(_区切り文字までの文字列,_,_,_,_区切り文字列), !, fail. 区切り文字までの文字列に区切り文字を含まない(_,_). % 以下のサイトは # 出題場所 :: 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,!. % 以下のサイトは # # 特定の文字が含まれる行のみ消す場合の正規表現教えて下さい. # 特定の文字が含まれる行のみ消す(_文字列,_特定の文字列,_特定の文字を含む行を除いて結合し直した文字列) :- sPLIT(_文字列,['\n'],L), 特定の文字が含まれる行のみ消す(L,_特定の文字列,_特定の文字を含む行を除いた文字列ならび), atomic_list_concat(_特定の文字を含む行を除いた文字列ならび,_特定の文字を含む行を除いて結合し直した文字列). 特定の文字が含まれる行のみ消す([_文字列,'\n'|R1],_特定の文字列,L) :- 特定の文字が含まれる(_文字列,_特定の文字列), 特定の文字が含まれる行のみ消す(R1,_特定の文字列,L2),!. 特定の文字が含まれる行のみ消す([_文字列,'\n'|R1],_特定の文字列,[_文字列,'\n'|R2]) :- 特定の文字が含まれる行のみ消す(R1,_特定の文字列,R2),!. 特定の文字が含まれる行のみ消す(L,_,L). 特定の文字が含まれる(_文字列,_特定の文字列) :- sub_atom(_文字列,_,_,_,_特定の文字列),!. % 以下のサイトは # # 特定の文字が含まれる行のみ消す場合の正規表現教えて下さい. # 特定の文字が含まれる行のみ消す(_文字列,_特定の文字列,_特定の文字を含む行を除いて結合し直した文字列) :- sPLIT(_文字列,['\n'],L), 特定の文字が含まれる行のみ消す(L,_特定の文字列,_特定の文字を含む行を除いた文字列ならび), atomic_list_concat(_特定の文字を含む行を除いた文字列ならび,_特定の文字を含む行を除いて結合し直した文字列). 特定の文字が含まれる行のみ消す([_文字列,'\n'|R1],_特定の文字列,L) :- 特定の文字が含まれる(_文字列,_特定の文字列), 特定の文字が含まれる行のみ消す(R1,_特定の文字列,L2),!. 特定の文字が含まれる行のみ消す([_文字列,'\n'|R1],_特定の文字列,[_文字列,'\n'|R2]) :- 特定の文字が含まれる行のみ消す(R1,_特定の文字列,R2),!. 特定の文字が含まれる行のみ消す(L,_,L). 特定の文字が含まれる(_文字列,_特定の文字列) :- sub_atom(_文字列,_,_,_,_特定の文字列),!. % 以下のサイトは # [1] 授業単元:Python # [2] 問題文(含コード&リンク): 課題2 # http://pc12.2ch.net/test/read.cgi/tech/1153585095/789 [1] 授業単元:Python [2] 問題文(含コード&リンク): 下の例参照 与えられた数字のみからなる文字列から各桁の数字に分割し、 隣り合う数字の合計の下一桁の値を並べたものを次の文字列とし、 結果が一桁になるまで繰り返しそれぞれの過程の文字列を出力する。 [3] 環境:特になし [4] 期限: 明日まで [5] その他の制限: 例 # 525123214112431 # 77635535523674 # 4398088075931 # 727886872424 # 99564459666 # 8410894522 # 251873974 # 76950261 # 3545287 # 899705 # 78675 # 5432 # 95 # 4 # # 上から2段目から最後の段までに現れる0から9数字の # 総出現数と各数字毎の出現比率を出力する。 # [3] 環境:特になし # [4] 期限: 明日まで # [5] その他の制限: # # 129個 # 0: 10回 3% # 1: 43回 20% # 2: 8回 2% # ... # 9: 18回 6% # のように出力してください。 対象となる文字列('525123214112431'). 対象となる文字列('77635535523674'). 対象となる文字列('4398088075931'). 対象となる文字列('727886872424'). 対象となる文字列('99564459666'). 対象となる文字列('8410894522'). 対象となる文字列('251873974'). 対象となる文字列('76950261'). 対象となる文字列('3545287'). 対象となる文字列('899705'). 対象となる文字列('78675'). 対象となる文字列('5432'). 対象となる文字列('95'). 対象となる文字列('4'). '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を出力する。' :- findall(_文字列,( 対象となる文字列(_対象となる文字列), _行ならび), '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率), 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率). '上から2段目から最後の段までに現れる0から9数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率) :- '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで), '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数), '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率). '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで) :- _行ならび = [_|_上から2段目から最後の段まで]. '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数) :- atomic_list_concat(_上から2段目から最後の段まで,_文字列), findall(_度数,( member(_数字文字,['0','1','2','3','4','5','6','7','8','9']), count(sub_atom(_文字列,_,1,_,_数字文字),_度数)), _0から9までの数字の出現ならび), sum(_0から9までの数字の出現ならび,_総出現数). '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率) :- findall(_出現比率,( member(_度数,_0から9までの数字の出現数ならび), _出現比率 is _度数 / _総出現数 * 100.0)), _各数字毎の出現比率). 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率) :- write('数: 出現数 出現比率\n'), '数字の出現数・出現比率を一行で出力する'(_0から9までの数字の出現数ならび,_各数字毎の出現比率,N), N = 9. '数字の出現数・出現比率を一行で出力する'(N,_0から9までの数字の出現数ならび,_各数字毎の出現比率,N) :- nth0(N,_0から9までの数字の出現数ならび,_出現数), nth0(N,_各数字毎の出現比率,_出現比率), writef(' %t: %t回 ',[N,_出現数]), format('~1f%\n',[_出現比率]). % 以下のサイトは # [1] 授業単元:Python # [2] 問題文(含コード&リンク): 課題2 # http://pc12.2ch.net/test/read.cgi/tech/1153585095/789 [1] 授業単元:Python [2] 問題文(含コード&リンク): 下の例参照 与えられた数字のみからなる文字列から各桁の数字に分割し、 隣り合う数字の合計の下一桁の値を並べたものを次の文字列とし、 結果が一桁になるまで繰り返しそれぞれの過程の文字列を出力する。 [3] 環境:特になし [4] 期限: 明日まで [5] その他の制限: 例 # 525123214112431 # 77635535523674 # 4398088075931 # 727886872424 # 99564459666 # 8410894522 # 251873974 # 76950261 # 3545287 # 899705 # 78675 # 5432 # 95 # 4 # # 上から2段目から最後の段までに現れる0から9数字の # 総出現数と各数字毎の出現比率を出力する。 # [3] 環境:特になし # [4] 期限: 明日まで # [5] その他の制限: # # 129個 # 0: 10回 3% # 1: 43回 20% # 2: 8回 2% # ... # 9: 18回 6% # のように出力してください。 対象となる文字列('525123214112431 77635535523674 4398088075931 727886872424 99564459666 8410894522 251873974 76950261 3545287 899705 78675 5432 95 4'). '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を出力する。' :- 対象となる文字列(_対象となる文字列), split(_対象となる文字列,['\n'],_行ならび), '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率), 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率). '上から2段目から最後の段までに現れる0から9数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率) :- '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで), '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数), '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率). '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで) :- _行ならび = [_|_上から2段目から最後の段まで]. '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数) :- atomic_list_concat(_上から2段目から最後の段まで,_文字列), findall(_度数,( member(_数字文字,['0','1','2','3','4','5','6','7','8','9']), count(sub_atom(_文字列,_,1,_,_数字文字),_度数)), _0から9までの数字の出現ならび), sum(_0から9までの数字の出現ならび,_総出現数). '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率) :- findall(_出現比率,( member(_度数,_0から9までの数字の出現数ならび), _出現比率 is _度数 / _総出現数 * 100.0)), _各数字毎の出現比率). 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率) :- write('数: 出現数 出現比率\n'), '数字の出現数・出現比率を一行で出力する'(_0から9までの数字の出現数ならび,_各数字毎の出現比率,N), N = 9. '数字の出現数・出現比率を一行で出力する'(N,_0から9までの数字の出現数ならび,_各数字毎の出現比率,N) :- nth0(N,_0から9までの数字の出現数ならび,_出現数), nth0(N,_各数字毎の出現比率,_出現比率), writef(' %t: %t回 ',[N,_出現数]), format('~1f%\n',[_出現比率]). % 以下のサイトは # p=1231, q=4567を選びます。 # eに65537 # e^-1=d mod φ(n) のdを計算して求めます。 #     d=3988493 # となります。 # # 暗号化と複合化の手順 # 公開鍵:N = 1231 * 4567 # E = 65537 # d = 3988493 # 文字コード:「a〜z」=01〜26、「A〜Z」=27〜52、空白=53 # 文書:This Anser p(1231). q(4567). 'E'(65537). d(3988493). n(5621977). 'RSA暗号化'(_文書,_暗号文字コードならび) :- 文書を文字コードで数値化します(_文書,_文字コードならび), 'RSA方式によるコード暗号化'(_文字コードならび,_暗号文字コードならび). 'RSA復号化'(_暗号文字コードならび,_文書) :- 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび), 文字コードならびから文書を復元します(_文字コードならび,_文書). 'RSA方式によるコード暗号化'(_文字コードならび,_暗号コードならび) :- 'E'(_E), n(_n), findall(_暗号コード,( member(_文字コード,_文字コードならび), _暗号コード is _文字コード ^ _E mod _n), _暗号コードならび). 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび) :- d(_d), n(_n), findall(_複合コード,( member(_暗号文字コード,_暗号文字コードならび), _複合コード is _暗号文字コード ^ _d mod _n), _文字コードならび). 文書を文字コードで数値化します(_文書,_文字コードならび) :- findall(_文字コード,( sub_atom(_文書,_,1,_,_文字), 文字コード(_文字,_文字コード)), _文字コードならび). 暗号コードを暗号文に変換(_暗号コードならび,_暗号文) :- findall(_暗号文字,( member(_暗号コード,_暗号コードならび), 文字コード(_暗号文字,_暗号コード)), _暗号文字ならび), atom_chars(_暗号文,_暗号文字ならび). 文字コードならびから文書を復元します(_文字コードならび,_文書) :- findall(_文字,( member(_文字コード,_文字コードならび), 文字コード(_文字,_文字コード)), _文字ならび), atom_chars(_文書,_文字ならび). 文字コード(_文字,_コード) :- char_code(_文字,_コード). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/117 # # コメント内の任意の文字を全て半角スペースに置き換える正規表現は可能でしょうか? # aaaは固定ではなく、長さや文字も任意です。 # 文字数分スペースに置き換える必要があります。 # # 変換前 # /*aaa*/ # # 変換後 # /* */ # # 'コメント内の任意の文字を全て半角スペースに置き換える正規表現は可能でしょうか? aaaは固定ではなく、長さや文字も任意です。 文字数分スペースに置き換える必要があります。 変換前 /*aaa*/ 変換後 /* */'(_文字列,_置換された文字列) :- コメント内の任意の文字を全て半角スペースに置き換える(_文字列,_置換された文字列). コメント内の任意の文字を全て半角スペースに置き換える(_文字列,_置換された文字列) :- sub_atom(_文字列,'/*','*/',_,_,_,S1,S2,S3,L1,L2,L3), sub_atom(S2,2,Len,2,_), length(L0,Len), all(L0,' '), atomic_list_concat([S1,'/*',L0,'*/',S3],_置換された文字列). % 以下のサイトは # このディレクトリの索引 # ●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,_文字列). % 以下のサイトは % ユーティリティ述語 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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/103 # # # 無理だろうね # バカバカしいはOKでバカはNGみたいなのは正規表現では無理 # バカバカしいはOKでバカはNG(_文字列,'NG') :- sub_atom(_文字列,S,2,_,バカ), \+(sub_atom(_文字列,S,6,_,バカバカしい)),!. バカバカしいはOKでバカはNG(_文字列,'OK'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/103 # # # 無理だろうね # バカバカしいはOKでバカはNGみたいなのは正規表現では無理 # バカバカしいはOKでバカはNG('') :- !. バカバカしいはOKでバカはNG(_文字列) :- sub_atom(_文字列,0,2,_,バカ), \+(sub_atom(_文字列,0,6,_,バカバカしい)),!, fail. バカバカしいはOKでバカはNG(_文字列) :- sub_atom(_文字列,0,6,R,バカバカしい), sub_atom(_文字列,_,R,0,_副文字列), バカバカしいはOKでバカはNG(_副文字列),!. バカバカしいはOKでバカはNG(_文字列) :- sub_atom(_文字列,1,_,0,_副文字列), バカバカしいはOKでバカはNG(_副文字列). % 以下のサイトは # # 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). % 以下のサイトは # 出典:: 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)). % 以下のサイトは # 出典:: 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/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/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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/610 # # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # program :- '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA配列,0,0,0,0). '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする' :- 入力したDNA塩基配列(_DNA配列), '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA配列,0,0,0,0). 入力したDNA塩基配列(_DNA配列) :- write('DNA塩基配列を入力してください : '), get_line(_DNA配列). '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'('',_t,_c,_a,_g) :- 塩基カウント出力([[t,_t],[c,_c],[a,_a],[g,_g]]),!. '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA配列,_t_1,_c_1,_a_1,_g_1) :- sub_atom(_DNA配列,0,1,R,_塩基), カウントする(_塩基,_t_1,_c_1,_a_1,_g_1,_t_2,_c_2,_a_2,_g_2), sub_atom(_DNA配列,1,R,0,_DNA半列_2), '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'(_DNA配列_2,_t_2,_c_2,_a_2,_g_2). カウントする(t,_t,_c,_a,_g,_t_2,_c,_a,_g) :- _t_2 is _t + 1,!. カウントする(c,_t,_c,_a,_g,_t,_c_2,_a,_g) :- _c_2 is _c + 1,!. カウントする(a,_t,_c,_a,_g,_t,_c,_a_2,_g) :- _a_2 is _a + 1,!. カウントする(g,_t,_c,_a,_g,_t,_c,_a,_g_2) :- _g_2 is _g + 1,!. 塩基カウント出力(LL) :- append(_,[[_塩基記号,_個数]|R],LL), 塩基(_塩基名,_塩基記号), writef('%t (%t) : %t\n',[_塩基名,_塩基記号,_個数]), R = []. 塩基('Thymine',t). 塩基('Cytosine',c). 塩基('Adenine',a). 塩基('Guanine',g). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/610 # # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # program :- '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'. '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする' :- 入力したDNA塩基配列(_DNA配列), forall(( 塩基(_塩基名,_塩基記号), count(sub_atom(_DNA配列,_,1,_,_塩基記号),_個数)), writef('%t (%t) : %t\n',[_塩基名,_塩基記号,_個数])). 入力したDNA塩基配列(_DNA配列) :- write('DNA塩基配列を入力してください : '), get_line(_DNA配列). 塩基('Thymine',t). 塩基('Cytosine',c). 塩基('Adenine',a). 塩基('Guanine',g). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/612 # # [1] 授業単元:(文字列) # [2] 問題文(含コード&リンク):文字列st の中に含まれる文字ch の個数(含まれて # いなければ0 とする)を返す関数 # int str_chnum(const char st[], int ch) # を作成せよ.以下の実行例のように,関数の動作を確認 # できるmain 関数も作成すること. # 【注意】scanf で文字列を入力させた後にgetchar 関 # 数で文字を入力させたい場合,getchar で文字を入力 # させる前に # scanf("%*c"); # などとして,バッファに残った改行コードを読み捨て # ておく必要がある. # # のように動作するプログラムを作成せよ # '文字列stの中に含まれる文字chの個数(含まれていなければ0 とする)を返す関数'(_st,_ch,_文字列stの中に含まれるchの個数) :- count(sub_atom(_st,_,1,_,_ch),_文字列stの中に含まれるchの個数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/186 # # [1] 授業単元: プログラミングB # [2] 問題文(含コード&リンク):入力された文字列を2進数の文字列として #               解釈し、10進数に変換し画面出力しなさい。 #               入力にはライブラリ関数putcharを使用すること。 #               Enterキーのみが押された場合、エラーを表示し、再入力する。 #               0,1以外の文字が入力された場合、エラーを表示し、再入力する。   # # [3] 環境 #  [3.1] OS:Windows7 #  [3.2] コンパイラ名とバージョン: Borland C++ 5.5.1 #  [3.3] 言語:C言語 # [4] 期限: 2013/01/23 '入力された文字列を2進数の文字列として解釈し、10進数に変換し画面出力しなさい。 入力にはライブラリ関数putcharを使用すること。 Enterキーのみが押された場合、エラーを表示し、再入力する。 0,1以外の文字が入力された場合、エラーを表示し、再入力する。' :- '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)' (_入力された文字列), '2進数の文字列として解釈し、10進数に変換し'(_入力された文字列,_10進数), 画面に出力する(_入力された文字列,_10進数). '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)'(_入力された文字列) :- write('2進数文字列を入力してください : '), get_line(_入力された文字列), '診断 :: 入力された文字列を'(_入力された文字列),!. '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)'(_入力された文字列) :- '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)'(_入力された文字列). '診断 :: 入力された文字列を'('') :- 'Enterキーのみが押された場合、エラーを表示し、再入力する。',!,fail. '診断 :: 入力された文字列を'(_入力された文字列) :- '0,1以外の文字が入力された場合、エラーを表示し、再入力する。'(_入力された文字列), !,fail. '診断 :: 入力された文字列を'(_). 'Enterキーのみが押された場合、エラーを表示し、再入力する。' :- write('エラー :: 文字列が入力されていません\n'). '0,1以外の文字が入力された場合、エラーを表示し、再入力する。'(_入力された文字列) :- sub_atom(_入力された文字列,_,1,_,_文字), \+(_文字 = '0'), \+(_文字 = '1'), write('エラー :: 0,1以外の文字が入力されました\n'), !,fail. '2進数の文字列として解釈し、10進数に変換し'(_入力された文字列,_10進数) :- atomic_list_concat(['0b',_入力された文字列],_2進数を表す文字列), atom_number(_2進数を表す文字列,_10進数). 画面に出力する(_入力された文字列,_10進数) :- writef('入力された文字列: %t 変換された10進数: %t\n',[_入力された文字列,_10進数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/153 # # [1] 授業単元:データ構造アルゴリズム # [2] 問題文(含コード&リンク):文字列から任意の文字を探索するプログラムを作成しなさい。 # # [3] 環境 #  [3.1] OS: (UNIX) #  [3.2] コンパイラ名とバージョン: (gcc ) #  [3.3] 言語: (C) # [4] 期限: ([年1月19日まで] ) # [5] その他の制限: なし # よろしくおねがいします。 文字列から任意の文字を探索する(_文字列,_前文字列,_任意の文字,_後文字列) :- sub_atom(_文字列,S,1,R,_任意の文字), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 出典:: 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). % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/829 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # 1行最大80文字の空白を挟まない英字文字列を入力し、 # 10文字続けて表示するごとに改行を挿入して表示するプログラムを作成しなさい # '1行最大80文字の空白を挟まない英字文字列を入力し、10文字続けて表示するごとに改行を挿入して表示する' :- '1行最大80文字の空白を挟まない英字文字列を入力し'(_英字文字列), '10文字続けて表示するごとに改行を挿入して表示する'(_英字文字列). '1行最大80文字の空白を挟まない英字文字列を入力し'(_英字文字列) :- length(Ln,80), get_char(_文字), '1行最大80文字の空白を挟まない英字ならびを入力し'(Ln,_文字,_英字ならび), atom_chars(_英字文字列,_英字ならび). '1行最大80文字の空白を挟まない英字ならびを入力し'([],_英字,[_英字]) :- !. '1行最大80文字の空白を挟まない英字ならびを入力し'(_,'\n',[]) :- !. '1行最大80文字の空白を挟まない英字ならびを入力し'([_|Ln],_文字,[A|R]) :- 英字(_文字), get_char(_次の文字), '1行最大80文字の空白を挟まない英字ならびを入力し'(Ln,_次の文字,R),!. '1行最大80文字の空白を挟まない英字ならびを入力し'([_|Ln],_,_英字ならび) :- get_char(_文字), '1行最大80文字の空白を挟まない英字ならびを入力し'([_|Ln],_文字,_英字ならび),!. 英字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z',!. 英字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. '10文字続けて表示するごとに改行を挿入して表示する'('') :- !. '10文字続けて表示するごとに改行を挿入して表示する'(_英字文字列) :- '10文字続けて表示するごとに改行を挿入して'(_英字文字列,_残り文字列), '10文字続けて表示するごとに改行を挿入して表示する'(_残り文字列),!. '10文字続けて表示するごとに改行を挿入して表示する'(_英字文字列) :- writef('%t\n',[_英字文字列]). '10文字続けて表示するごとに改行を挿入して'(_英字文字列,_残り文字列) :- sub_atom(_英字文字列,0,10,R,_10文字), sub_atom(_英字文字列,10,R,0,_残り文字列), writef('%t',[_10文字]), write('\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/496 # # [1] C言語プログラミング2 # [2] 問題1・入力した文字列から文字を一文字ずつ交互に読み取り、文字列1、文字列2として結果を出力するプログラムを作成せよ。 # 問題2・また、文字列1、文字列2を入力し、それぞれから一文字ずつ交互に読み取った結果を文字列として出力するプログラムを作成せよ。 # 条件1・500文字前後の文字列を扱えるようにせよ。 # 条件2・問題1の文字列が奇数の場合は文字列1の側に奇数で余った一文字を入れること。(問題2の文字列1が一文字多い場合読み取りを忘れないように) # 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。 # 問題1・例 # 文字列・abcdefghijklm # ↓ # 文字列1・acegikm # 文字列2・bdfhjl # # 問題2・例 # 文字列1・acegikm # 文字列2・bdfhjl # ↓ # 文字列・abcdefghijklm # 'また、文字列1、文字列2を入力し、それぞれから一文字ずつ交互に読み取った結果を文字列として出力するプログラムを作成せよ。 条件1・500文字前後の文字列を扱えるようにせよ。 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。 問題2・例 文字列1・acegikm 文字列2・bdfhjl ↓ 文字列・abcdefghijklm' :- '文字列1、文字列2を入力し 条件1・500文字前後の文字列を扱えるようにせよ。 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。'(_文字列1,_文字列2), それぞれから一文字ずつ交互に読み取った結果を(_文字列1,_文字列2,_読み取った結果ならび), 文字列として出力する(_読み取った結果ならび). '文字列1、文字列2を入力し 条件1・500文字前後の文字列を扱えるようにせよ。 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。'(_文字列1,_文字列2) :- write('文字列1(半角英数記号のみからなる)を入力してください : '), get_line(_文字列1), write('文字列2(半角英数記号のみからなる)を入力してください : '), get_line(_文字列2). それぞれから一文字ずつ交互に読み取った結果を('','',[]) :- !. それぞれから一文字ずつ交互に読み取った結果を('',_文字列2,L) :- それぞれから一文字ずつ交互に読み取った結果を(_文字列2,'',L). それぞれから一文字ずつ交互に読み取った結果を(_文字列1,_文字列2,[_文字|R]) :- 一文字ずつ読み取った(_文字列1,_文字,_文字列3), それぞれから一文字ずつ交互に読み取った結果を(_文字列2,_文字列3,R). 一文字ずつ読み取った(_文字列1,_文字,_文字列3) :- sub_atom(_文字列1,S_1,1,R_1,_文字), S_2 is S_1 + 1, sub_atom(_文字列1,S_2,R_1,0,_文字列3),!. 文字列として出力する(_読み取った結果ならび) :- atomic_list_concat(_読み取った結果ならび,_読み取った結果文字列), writef('%t\n',[_読み取った結果文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/496 # # [1] C言語プログラミング2 # [2] 問題1・入力した文字列から文字を一文字ずつ交互に読み取り、文字列1、文字列2として結果を出力するプログラムを作成せよ。 # 問題2・また、文字列1、文字列2を入力し、それぞれから一文字ずつ交互に読み取った結果を文字列として出力するプログラムを作成せよ。 # 条件1・500文字前後の文字列を扱えるようにせよ。 # 条件2・問題1の文字列が奇数の場合は文字列1の側に奇数で余った一文字を入れること。(問題2の文字列1が一文字多い場合読み取りを忘れないように) # 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。 # 問題1・例 # 文字列・abcdefghijklm # ↓ # 文字列1・acegikm # 文字列2・bdfhjl # # 問題2・例 # 文字列1・acegikm # 文字列2・bdfhjl # ↓ # 文字列・abcdefghijklm # '入力した文字列から文字を一文字ずつ交互に読み取り、文字列1、文字列2として結果を出力するプログラムを作成せよ。 条件1・500文字前後の文字列を扱えるようにせよ。 条件2・問題1の文字列が奇数の場合は文字列1の側に奇数で余った一文字を入れること。(問題2の文字列1が一文字多い場合読み取りを忘れないように) 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。 問題1・例 文字列・abcdefghijklm ↓ 文字列1・acegikm 文字列2・bdfhjl' :- '入力した文字列から'(_入力した文字列), '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'(_入力した文字列,_文字列1,_文字列2), 結果を出力する(_入力した文字列,_文字列1,_文字列_2). 入力した文字列から(_入力した文字列) :- write('文字列を入力してください : '), get_line(_入力した文字列). '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'('','',''). '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'(_文字列,_文字列1,_文字列2) :- sub_atom(_文字列,0,1,R,_文字), sub_atom(_文字列,1,R,0,_文字列3), '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'(_文字列3,_文字列2,_文字列4), atom_concat(_文字,_文字列4,_文字列1). get_line(_文字列) :- read_line_to_codes(user_input,Codes), atom_codes(_文字列,Codes). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/434 # # [1] C言語 # [2] 1) codepad.org/u1WNoZPtの関数と反対の動作をする関数、 #     及び二つの関数の動作確認が出来るmain関数を作成せよ。 #   2) キーボードから入力されたアルファベット及び数字の数を数えて、 #     少ないほうを消去するプログラムを作成せよ。 #     ただし、同数の場合は両方とも消去する。 # [3.1] Windows7 # [3.3] C言語 # [4] 12/19 19時まで # [5] 特になし # # 'キーボードから入力されたアルファベット及び数字の数を数えて、少ないほうを消去するプログラムを作成せよ。ただし、同数の場合は両方とも消去する。'(_残った文字列) :- 'キーボードから入力された'(_文字列), 'アルファベット及び数字の数を数えて'(_文字列,_アルファベットの数,_数字の数), '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列). 'キーボードから入力された'(_文字列) :- write('アルファベットと数字だけからなる文字列を入力してください : '), get_line(_文字列). 'アルファベット及び数字の数を数えて'(_文字列,_アルファベットの数,_数字の数) :- count((sub_atom(_文字列,_,1,_,_文字),アルファベット(_文字)),_アルファベットの数), count((sub_atom(_文字列,_,1,_,_文字),数字(_文字)),_アルファベットの数). アルファベット(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. アルファベット(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 数字(_文字) :- _文字 @>= '0', _文字 @=< '9'. '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- 少ないほうを消去する。(_文字列,_アルファベットの数,_数字の数,_残った文字列). '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- 'ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列). '少ないほうを消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット < _数字の数, アルファベットを消去する(_文字列,_残った文字列). '少ないほうを消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット > _数字の数, 数字を消去する(_文字列,_残った文字列). 'ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット = _数字の数, 両方とも消去する(_文字列,_残った文字列). アルファベットを消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(アルファベット(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). 数字を消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(数字(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). 両方とも消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(数字(_文字)), \+(アルファベット(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). count(P,Count) :- findall(1,P,L), length(L,Count). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/188 # # [1]C言語 # [2]hashについて # 問題文 http://ime.nu/www.dotup.org/uploda/www.dotup.org3723526.jpg # [3]Linux # [3.1]gcc C言語 # [4]木曜日6:00まで # [5]宜しくお願いします… # # # 問題1. 整数データに対してハッシュ探索を行うことを考える。 # (1) 1~50までの値の乱数を20回呼び出し、テーブル長が23のハッシュテーブル # にチェイン法によってデータを格納せよ。ここでハッシュ関数は(mod23)と # する。 # (2) hash表の内容をすべて画面表示する関数print_hashを定義して、確認しな # さい。 # (3) (2)によって格納されたデータに対して各i(1=% 以下のサイトは # 出典:: 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/1337692704/456 # # 【 課題 】http://ime.nu/ideone.com/hRQD87 # try catch # 【 Ver 】1.7.0_07 # 【 形態 】Javaアプリケーション # 【 期限 】27日 11:00まで # よろしくお願いします # # # 問題2:ある文字列が標準入力されたとき,次のような変換を行うプログラムKadai02.java を作成せ # よ.String クラスの,charAt メソッド,length メソッド,valueOf メソッドなどを使うとよい. #  ’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える. #  空白は空白のままとする. #  ”ab Adaf”という文字列であれば,”xo ooxo”に変換される. # 'ある文字列が標準入力されたとき,次のような変換を行う. ’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える. 空白は空白のままとする. "ab Adaf"という文字列であれば,"xo ooxo"に変換される.' :- ある文字列が標準入力されたとき(_ある文字列), '’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(_ある文字列,_変換された文字列), writef('%t',[_変換された文字列]). ある文字列が標準入力されたとき(_ある文字列) :- get_line(_ある文字列). '’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(_ある文字列,_変換された文字列) :- findall(_変換された文字,( sub_atom(_ある文字列,_,1,_,_文字), '文字が’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(_文字,_変換された文字)), L), atomic_list_concat(L,_変換された文字列). '文字が’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(a,x) :- !. '文字が’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(' ',' ') :- !. '文字が’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(_,o). % 以下のサイトは # 出典:: 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) :- setof([_電話番号,_携帯番号,_FAX],[_電話番号,_携帯番号,_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/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 文字列を逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 文字列を逆順に出力する(_文字列) :- findall(_,( 文字列を逆順に(_文字列,_文字), write(_文字)), _), write('\n'). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,1,_,0,_残り文字列), 文字列を逆順に(_残り文字列,_文字). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,0,1,_,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 文字列を逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 文字列を逆順に出力する(_文字列) :- findall(_文字,( 文字列を逆順に(_文字列,_文字)), _逆順文字ならび), atomic_list_concat(_逆順文字ならび,_逆順文字列), writef('%t\n',[_逆順文字列]). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,1,_,0,_残り文字列), 文字列を逆順に(_残り文字列,_文字). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,0,1,_,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 文字列を逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 文字列を逆順に出力する(_文字列) :- 文字列を逆順に(_文字列,_文字), write(_文字), fail. 文字列を逆順に出力する(_) :- write('\n'). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,1,_,0,_残り文字列), 文字列を逆順に(_残り文字列,_文字). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,0,1,_,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 逆順に出力する('') :- write('\n'). 逆順に出力する(_入力した文字列) :- sub_atom(_入力した文字列,0,1,_,_文字), sub_atom(_入力した文字列,1,_,0,_残り文字列), 逆順に出力する(_残り文字列), write(_文字). % 以下のサイトは # # 文字列の先頭と末尾から順に対にして取り出す # # ならびの先頭と末尾から順に対にして取り出す # 文字列の先頭と末尾から順に対にして取り出す(_文字列,C1,C2) :- sub_atom(_文字列,S,1,R,C1), sub_atom(_文字列,R,1,_,C2). ならびの先頭と末尾から順に対にして取り出す(_ならび,C1,C2) :- append(L0,[C1|L1],_ならび), length(L0,Len), length(R,Len), append(_,[C2|R],_ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/189 # # [1] 授業単元:C言語 文字列 # [2] 問題文 # http://ime.nu/s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/img/382.txt # # 文字列処理 キーボードからアルファベット小文字で入力し、イニシャルで表示する # プログラムを作成しなさい。 # 入力できる文字数は姓、名、最大20文字、配列を宣言すること。 # 文字変換関数を使用すること。 # (実行結果) 氏名をアルファベット小文字で入力して下さい # tanaka # hanako # tanaka hanako さんのイニシャルはH,Tです # # キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、 # その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントするプログラムを作成しなさい。 # ただし、入力する文字数は最大30文字とする。 # 文字列操作関数を必ず用いること # # (実行結果) 文字列を入力して下さい. # TanakaHanako1234          # 入力文字列は TanakaHanako1234 で          小文字は10文字,大文字は2文字,数字は4文字です. 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)、その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする' :- 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数). 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列) :- write('文字列を入力してください\n'), get_line(Line), 最大30文字(Line,_入力文字列). 最大30文字(Line,_入力文字列) :- atom_length(Line,_長さ), _長さ > 30, sub_atom(Line,0,30,_,_入力文字列),!. 最大30文字(_入力文字列,_入力文字列). 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数) :- count((sub_atom(_入力文字列,_,1,_,_文字),_文字 @>= 'a',_文字 @=< 'z'),_小文字の数), count((sub_atom(_入力文字列,_,1,_,_文字),_文字 @>= 'A',_文字 @=< 'Z'),_大文字の数), count((sub_atom(_入力文字列,_,1,_,_文字),_文字 @>= '0',_文字 @=< '9'),_数字の数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/189 # # [1] 授業単元:C言語 文字列 # [2] 問題文 # http://ime.nu/s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/img/382.txt # # 文字列処理 キーボードからアルファベット小文字で入力し、イニシャルで表示する # プログラムを作成しなさい。 # 入力できる文字数は姓、名、最大20文字、配列を宣言すること。 # 文字変換関数を使用すること。 # (実行結果) 氏名をアルファベット小文字で入力して下さい # tanaka # hanako # tanaka hanako さんのイニシャルはH,Tです # # キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、 # その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントするプログラムを作成しなさい。 # ただし、入力する文字数は最大30文字とする。 # 文字列操作関数を必ず用いること # # (実行結果) 文字列を入力して下さい. # TanakaHanako1234          # 入力文字列は TanakaHanako1234 で          小文字は10文字,大文字は2文字,数字は4文字です. 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)、その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする' :- 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数). 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列) :- write('文字列を入力してください\n'), get_line(Line), 最大30文字(Line,_入力文字列). 最大30文字(Line,_入力文字列) :- atom_length(Line,_長さ), _長さ > 30, sub_atom(Line,0,30,_,_入力文字列),!. 最大30文字(_入力文字列,_入力文字列). 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数) :- atom_chars(_入力文字列,_文字ならび), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_文字ならび,0,0,0,_小文字の数,_大文字の数,_数字の数). 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'([],_小文字の数,_大文字の数,_数字の数,_小文字の数,_大文字の数,_数字の数) :- !. 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'([_文字|R],_小文字の数_1,_大文字の数_1,_数字の数_1,_小文字の数,_大文字の数,_数字の数) :- '一文字単位のカウント'(_文字,_小文字の数_1,_大文字の数_1,_数字の数_1,_小文字の数_2,_大文字の数_2,_数字の数_2), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(R,_小文字の数_2,_大文字の数_2,_数字の数_2,_小文字の数,_大文字の数,_数字の数). '一文字単位のカウント'(_文字,_小文字の数_1,_大文字の数,_数字の数,_小文字の数_2,_大文字の数,_数字の数) :- _文字 @>= 'a', _文字 @=< 'z', _小文字の数 is _小文字の数_1 + 1. '一文字単位のカウント'(_文字,_小文字の数,_大文字の数_1,_数字の数,_小文字の数,_大文字の数,_数字の数) :- _文字 @>= 'A', _文字 @=< 'Z', _大文字の数 is _大文字の数_1 + 1. '一文字単位のカウント'(_文字,_小文字の数,_大文字の数,_数字の数_1,_小文字の数,_大文字の数,_数字の数) :- _文字 @>= '0', _文字 @=< '9', _数字の数 is _数字の数_1 + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/189 # # [1] 授業単元:C言語 文字列 # [2] 問題文 # http://ime.nu/s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/img/382.txt # # 文字列処理 キーボードからアルファベット小文字で入力し、イニシャルで表示する # プログラムを作成しなさい。 # 入力できる文字数は姓、名、最大20文字、配列を宣言すること。 # 文字変換関数を使用すること。 # (実行結果) 氏名をアルファベット小文字で入力して下さい # tanaka # hanako # tanaka hanako さんのイニシャルはH,Tです # # キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、 # その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントするプログラムを作成しなさい。 # ただし、入力する文字数は最大30文字とする。 # 文字列操作関数を必ず用いること # # (実行結果) 文字列を入力して下さい. # TanakaHanako1234          # 入力文字列は TanakaHanako1234 で          小文字は10文字,大文字は2文字,数字は4文字です. '文字列処理 キーボードから姓名をアルファベット小文字で入力し(入力できる文字数は姓、名、最大20文字)、イニシャルで表示する。' :- '文字列処理 キーボードから姓名をアルファベット小文字で入力し(入力できる文字数は姓、名、最大20文字)'(_姓名), 'イニシャルで表示する。'(_姓名,_イニシャル). '文字列処理 キーボードから姓名をアルファベット小文字で入力し(入力できる文字数は姓、名、最大20文字)'(_姓,_名) :- '姓を入力(入力できる文字数は姓、名、最大20文字)'(_姓), '名を入力(入力できる文字数は姓、名、最大20文字)'(_名). '姓を入力(入力できる文字数は姓、名、最大20文字)'(_姓) :- write('姓を入力してください : '), get_line(Line_1), '入力できる文字数は姓、名、最大20文字'(Line_1,_姓). '名を入力(入力できる文字数は姓、名、最大20文字)'(_名) :- write('名を入力してください : '), get_line(Line_2), '入力できる文字数は姓、名、最大20文字'(Line_2,_名). '入力できる文字数は姓、名、最大20文字'(Line,Line) :- atom_length(Line,_長さ), _長さ_1 =< 20,!. '入力できる文字数は姓、名、最大20文字'(_文字列,_20文字以内の文字列) :- sub_atom(_文字列,0,20,_,_20文字以内の文字列). 'イニシャルで表示する。'(_姓,_名) :- イニシャルで(_姓,_名,_イニシャル), writef('%t %t さんのイニシャルは %t です\n',[_イニシャル]). イニシャルで(_姓,_名,_イニシャル) :- sub_atom(_姓,0,1,_,_姓の第一文字), to_upper(_姓の第一文字,_イニシャル_1), sub_atom(_名,0,1,_,_名の第一文字), to_upper(_名の第一文字,_イニシャル_2), atomic_list_concat([_イニシャル_1,',',_イニシャル_2],_イニシャル). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/161 # # [1] 授業単元:プログラミング言語 # [2] 問題文 # 1.空白、タブ、改行を数えるプログラムを書け。 # 2.二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーするプログラムを書け。 # '空白、タブ、改行を数える'(_文字列,_空白数,_タブ数,_改行数) :- findall(L,( sub_atom(_文字列,_,1,_,_文字), 数える(_文字,L1)), _集計行列), '集計行列から空白、タブ、改行を数える'(_集計行列,_空白数,_タブ数,_改行数). 数える(' ',[1,0,0]) :- !. 数える('\t',[0,1,0]) :- !. 数える('\n',[0,0,1]). '集計行列から空白、タブ、改行を数える'(_集計行列,_空白数,_タブ数,_改行数) :- 転置(_集計ならび,[L1,L2,L3]), sum(L1,_空白数), sum(L2,_タブ数), sum(L3,_改行数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/161 # # [1] 授業単元:プログラミング言語 # [2] 問題文 # 1.空白、タブ、改行を数えるプログラムを書け。 # 2.二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーするプログラムを書け。 # '空白、タブ、改行を数える'(_文字列,_空白数,_タブ数,_改行数) :- 空白を数える(_文字列,_空白数), タブを数える(_文字列,_タブ数), 改行を数える(_文字列,_改行数). 空白を数える(_文字列,_空白数) :- count(sub_atom(_文字列,_,1,_,' '),_空白数). 空白を数える(_文字列,_タブ数) :- count(sub_atom(_文字列,_,1,_,'\t'),_タブ数). 改行を数える(_文字列,_改行数) :- count(sub_atom(_文字列,_,1,_,'\n'),_改行数). % 以下のサイトは # 出典:: 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/1349527750/79 # # [1] 授業単元:C言語 文字列 # [2] 問題文 # http://ime.nu/codepad.org/kqhMSJiH # # /* # # ・問題文 # 名字と名前(null文字を除き10文字以内)を入力し、実行例のように氏名を表示する。 # なお、 # # 氏名は名前の次に1文字あけて名字を表示する # 名前は最初の文字を大文字に、2文字以降を小文字に変換して表示する。 # 名字はすべて大文字に変換して表示する # # とし、文字列関数を用いて行う。 # # ・実行例 # # 名字と名前を入力してください # yamada taro # 出力: Taro YAMADA # 名字と名前を入力してください # kawada hanako # 出力: Hanako KAWADA # .... # # */ '名字と名前(null文字を除き10文字以内)を入力し、実行例のように氏名を表示する。なお、氏名は名前の次に1文字あけて名字を表示する。名前は最初の文字を大文字に、2文字以降を小文字に変換して表示する。名字はすべて大文字に変換して表示する' :- '名字と名前(null文字を除き10文字以内)を入力し'(_名字,_名前), '名前は最初の文字を大文字に、2文字以降を小文字に変換して'(_名前,_変換後の名前), '名字はすべて大文字に変換して'(_名字,_大文字に変換された名字), '実行例のように氏名を表示する。なお、氏名は名前の次に1文字あけて名字を表示する'(_変換後の名前,_大文字に変換されたの名字). '名字と名前(null文字を除き10文字以内)を入力し'(_名字,_名前) :- write('名字と名前を入力してください\n'), 一行読み込む(_入力された名字), 一行読み込む(_入力された名前), 名字はnull文字をのぞき10文字以内(_入力された名字,_名字), 名前はnull文字をのぞき10文字以内(_入力された名前,_名前). 名字はnull文字をのぞき10文字以内(_入力された名字,_名字) :- null文字をのぞき10文字以内(_入力された名字,_名字). 名前はnull文字をのぞき10文字以内(_入力された名前,_名前) :- null文字をのぞき10文字以内(_入力された名前,_名前). null文字をのぞき10文字以内(_文字列,_null文字をのぞき10文字以内に制限された文字列) :- null文字をのぞき(_文字列,_null文字を除いた文字列), '10文字以内'(_null文字を除いた文字列,_null文字をのぞき10文字以内に制限された文字列). null文字をのぞき(_文字列,_null文字を除いた文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(_文字 = '')), _文字ならび), atom_chars(_null文字を除いた文字列,_文字ならび). '10文字以内'(_文字列,_10文字以内に制限された文字列) :- sub_atom(_文字列,0,10,_,_10文字以内に制限された文字列),!. '10文字以内'(_文字列,_文字列). '名前は最初の文字を大文字に、2文字以降を小文字に変換して'(_名前,_変換後の名前) :- 名前は最初の文字を大文字に(_名前,_大文字化された最初の文字), '2文字以降を小文字に変換して'(_名前,_小文字化された2文字以降), atomic_list_concat([_大文字化された最初の文字,_小文字化された2文字以降],_変換後の名前). 名前は最初の文字を大文字に(_名前,_大文字化された最初の文字) :- sub_atom(_名前,0,1,R,_最初の文字), to_upper(_最初の文字,_大文字化された最初の文字). '2文字以降を小文字に変換して'(_名前,_小文字化された2文字以降) :- sub_atom(_名前,1,_,0,_2文字以降), to_lower(_2文字以降,_小文字化された2文字以降). '名字はすべて大文字に変換して'(_名字,_大文字に変換された名字) :- to_upper(_名字,_大文字に変換された名字). '実行例のように氏名を表示する。なお、氏名は名前の次に1文字あけて名字を表示する'(_変換後の名前,_大文字に変換された名字) :- writef('出力: %t %t\n',[_変換後の名前,_変換後の名字]). % ・実行例 % % 名字と名前を入力してください % yamada taro % 出力: Taro YAMADA % 名字と名前を入力してください % kawada hanako % 出力: Hanako KAWADA % .... % 以下のサイトは # 出典 :: 正規表現 Part10 #311 # ●正規表現の使用環境 # 練馬、nemery等のリネームソフト # 可能なソフトに乗り換えようと思ってます # # ●検索か置換か? # 置換 # # ●説明 # 1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま #  ファイル名途中の数字はスルーさせたい # 2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい # # ●対象データ # キリン#◯☓動物園-10月1 # しろくま#△☓◯動物園-5月12 # 猫(2匹目)#我が家-11月5 # # ●希望する結果 # キリン-10月01 # しろくま-5月12 # 猫(2匹目)-11月05 # # よろしくお願いします # # 'ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_ファイル名) :- '2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名),!. 'ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_置換されたファイル名) :- 'ファイル名末尾の数字が1桁の場合、0をつける。'(_ファイル名,_置換されたファイル名). '2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名) :- sub_atom(_ファイル名,S,2,0,_末尾文字2桁), atom_number(_末尾文字2桁,_). 'ファイル名末尾の数字が1桁の場合、0をつける。'(_ファイル名,_置換されたファイル名) :- 'ファイル名末尾の数字が1桁の場合、'(_ファイル名,S,_末尾文字1桁), '0をつける。'(_ファイル名,S,_末尾文字1桁,_置換されたファイル名). 'ファイル名末尾の数字が1桁の場合、'(_ファイル名,S,_末尾文字1桁) :- sub_atom(_ファイル名,S,1,0,_末尾文字1桁), atom_number(_末尾文字1桁,_). '0をつける。'(_ファイル名,S,_末尾文字1桁,_置換されたファイル名) :- sub_atom(_ファイル名,0,S,1,_前文字列), atomic_list_concat([_前文字列,'0',_末尾文字1桁],_置換されたファイル名). % 以下のサイトは # 出典 :: 正規表現 Part10 #311 # ●正規表現の使用環境 # 練馬、nemery等のリネームソフト # 可能なソフトに乗り換えようと思ってます # # ●検索か置換か? # 置換 # # ●説明 # 1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま #  ファイル名途中の数字はスルーさせたい # 2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい # # ●対象データ # キリン#◯☓動物園-10月1 # しろくま#△☓◯動物園-5月12 # 猫(2匹目)#我が家-11月5 # # ●希望する結果 # キリン-10月01 # しろくま-5月12 # 猫(2匹目)-11月05 # # よろしくお願いします # # '1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのままファイル名途中の数字はスルーさせたい 2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_ファイル名,_削除開始文字,_削除終了の次の文字,_置換されたファイル名) :- 'ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_置換されたファイル名_1), '特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_置換されたファイル名_1,_削除開始文字,_削除終了の次の文字,_置換されたファイル名). 'ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_ファイル名) :- '2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名),!. 'ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_置換されたファイル名) :- 'ファイル名末尾の数字が1桁の場合、0をつける。'(_ファイル名,_置換されたファイル名). '2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名) :- sub_atom(_ファイル名,S,2,0,_末尾文字2桁), atom_number(_末尾文字2桁,_). 'ファイル名末尾の数字が1桁の場合、0をつける。'(_ファイル名,_置換されたファイル名) :- 'ファイル名末尾の数字が1桁の場合、'(_ファイル名,S,_末尾文字1桁), '0をつける。'(_ファイル名,S,_末尾文字1桁,_置換されたファイル名). 'ファイル名末尾の数字が1桁の場合、'(_ファイル名,S,_末尾文字1桁) :- sub_atom(_ファイル名,S,1,0,_末尾文字1桁), atom_number(_末尾文字1桁,_). '0をつける。'(_ファイル名,S,_末尾文字1桁,_置換されたファイル名) :- sub_atom(_ファイル名,0,S,1,_前文字列), atomic_list_concat([_前文字列,'0',_末尾文字1桁],_置換されたファイル名). '特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_文字列,_削除開始文字,_削除終了の次の文字,_削除された文字列) :- '削除開始文字と終了の次の文字で指定された範囲を削除する'(_文字列,_削除開始文字,_削除終了の次の文字,_前文字列,_後文字列),!. '特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_文字列,_,_,_文字列). '削除開始文字と終了の次の文字で指定された範囲を削除する'(_文字列,_削除開始文字,_削除終了の次の文字,_削除された文字列) :- '削除開始文字と終了の次の文字で指定された範囲を'(_文字列,_削除開始文字,_削除終了の次の文字,_前文字列,_後文字列), 削除する(_前文字列,_後文字列,_削除された文字列). '削除開始文字と終了の次の文字で指定された範囲を'(_文字列,_削除開始文字,_削除終了の次の文字,_前文字列,_後文字列) :- sub_atom(_文字列,_前文字列,_削除される文字列,_後文字列), sub_atom(_削除される文字列,0,1,_,_削除開始文字), sub_atom(_後文字列,0,1,_,削除終了の次の文字). sub_atom(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 削除する(_前文字列,_後文字列,_削除された文字列) :- atom_concat(_前文字列,_後文字列,_削除された文字列). % 以下のサイトは # 出典::正規表現 Part10 #301 # よろしくお願いします。 # # ●正規表現の使用環境 # サクラエディタ bregonig.dll Ver.3.02 # # ●検索か置換か? # 検索 # # ●説明 # "START"から"END"に囲まれた"HOGE"を最短一致(というのか?)で含まれる行を検索したい # # ●対象データ # 1.xxxxxxxSTARTyyyyyyyyHOGEzzzzzzzzzzzENDaaaaaaa # 2.xxxxxxxSTARTyyyyyyyyENDbbbbbbbHOGEzzzzzzzzzzzENDaaaaaaa # # ●希望する結果 # 1.だけマッチ # 2.は"END"が"HOGE"の前に入ってるのでマッチ対象外 # # '"START"から"END"に囲まれた"HOGE"を最短一致(というのか?)で含まれる行を検索したい '(_文字列) :- sub_atom(_文字列,_,_STARTからENDに囲まれた文字列,_), sub_atom(_STARTからENDに囲まれた文字列,'START',_HOGEを含む文字列,'END'), sub_atom(_HOGEを含む文字列,_HOGEの前文字列,'HOGE',_HOGEの後文字列), '文字列の中にENDが存在しない'(_HOGEの前文字列), '文字列の中にSTARTが存在しない'(_HOGEの前文字列), '文字列の中にENDが存在しない'(_HOGEの後文字列), '文字列の中にSTARTが存在しない'(_HOGEの後文字列),!. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). '文字列の中にSTARTが存在しない'(_文字列) :- \+(sub_atom(_文字列,_,_,_,'START')). '文字列の中にENDが存在しない'(_文字列) :- \+(sub_atom(_文字列,_,_,_,'END')). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/641 # # [1] C言語 # [2] http://ime.nu/ideone.com/m8dZRの関数を利用して、 #   キーボードから日付を読み込んで、その次の日を求める #   プログラムを作成しなさい。 # # 実行例 # --------------------- # 年月日:20120913 # # 次の日は:2012/09/14 # --------------------- # # [3.1] Windows7 # [3.3] C言語 # [4] 9/13 19:00まで # # 'キーボードから日付を読み込んで、その次の日を求める' :- 'キーボードから日付を読み込んで'(_日付文字列), その次の日を求める(_日付文字列,_次の日文字列), writef('次の日は:%t\n',[_次の日文字列]). 'キーボードから日付を読み込んで'(_日付文字列) :- write('日付を文字列8桁で入力してください : '), get_line(_日付文字列), atom(_日付文字列), atom_length(_日付文字列,8),!. 'キーボードから日付を読み込んで'(_日付文字列) :- 'キーボードから日付を読み込んで'(_日付文字列). その次の日を求める(_日付文字列,_次の日文字列) :- sub_atom(_日付文字列,0,4,_,_年), sub_atom(_日付文字列,4,2,_,_月), sub_atom(_日付文字列,6,2,_,_日), その次の日を求める(_年,_月,_日,_次の日文字列). その次の日を求める(_年,'12','31',_次の日文字列) :- 翌年の一月一日(_年,_次の日文字列),!. その次の日を求める(_年,'02','29',_次の日文字列) :- 同年の三月一日(_年,_次の日文字列),!. その次の日を求める(_年,'02','28',_次の日文字列) :- \+(うるう年(_年)), 同年の三月一日(_年,_次の日文字列),!. その次の日を求める(_年,_月,'31',_次の日文字列) :- 大の月(_月), ここでは12月は除外する(_月), 翌月の一日(_年,_月,_次の文字列),!. その次の日を求める(_年,_月,'30',_次の日文字列) :- 小の月(_月), ここでは2月は除外する(_月), 翌月の一日(_年,_月,_次の日文字列),!. その次の日を求める(_年,_月,_日,_次の日文字列) :- 同年同月の次の日(_年,_月,_日,_次の日文字列). 翌年の一月一日(_年,_翌年の一月一日) :- 翌年(_年,_翌年), atomic_list_concat([_翌年,'0101'],_翌年の一月一日). 同年の三月一日(_年,_同年の三月一日) :- atomic_list_concat([_年,'0301'],_同年の三月一日). 翌月の一日(_年,_月,_翌月の一日) :- 翌月(_月,_翌月), atomic_list_concat([_年,_翌月,'01'],_翌月の一日). 同年同月の次の日(_年,_月,_日,_同年同月の次の日) :- 翌日(_日,_翌日), atomic_list_concat([_年,_月,_翌日],_同年同月の次の日). 大の月(_月) :- member(_月,['01','03','05','07','08','10','12']). 小の月(_月) :- member(_月,['02','04','06','09','11']). ここでは12月は除外する(_月) :- \+(_月 == '12'). ここでは2月は除外する(_月) :- \+(_月 == '02'). うるう年(_年文字列) :- atom(_年文字列), atom_number(_年文字列,_年整数), !, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 翌年(_年,_翌年) :- atom_number(_年,_年整数), _翌年整数 is _年整数 + 1, 頭部零文字列に変換(4,_翌年整数,_翌年). 翌月('01','02'). 翌月('02','03'). 翌月('03','04'). 翌月('04','05'). 翌月('05','06'). 翌月('06','07'). 翌月('07','08'). 翌月('08','09'). 翌月('09','10'). 翌月('10','11'). 翌月('11','12'). 翌月('12','01'). 翌日('01','02'). 翌日('02','03'). 翌日('03','04'). 翌日('04','05'). 翌日('05','06'). 翌日('06','07'). 翌日('07','08'). 翌日('08','09'). 翌日('09','10'). 翌日('10','11'). 翌日('11','12'). 翌日('12','13'). 翌日('13','14'). 翌日('14','15'). 翌日('15','16'). 翌日('16','17'). 翌日('17','18'). 翌日('18','19'). 翌日('19','20'). 翌日('20','21'). 翌日('21','22'). 翌日('22','23'). 翌日('23','24'). 翌日('24','25'). 翌日('25','26'). 翌日('26','27'). 翌日('27','28'). 翌日('28','29'). 翌日('29','30'). 翌日('30','31'). 翌日('31','01'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/641 # # [1] C言語 # [2] http://ime.nu/ideone.com/m8dZRの関数を利用して、 #   キーボードから日付を読み込んで、その次の日を求める #   プログラムを作成しなさい。 # # 実行例 # --------------------- # 年月日:20120913 # # 次の日は:2012/09/14 # --------------------- # # [3.1] Windows7 # [3.3] C言語 # [4] 9/13 19:00まで # # 'キーボードから日付を読み込んで、その次の日を求める' :- 'キーボードから日付を読み込んで'(_日付文字列), その次の日(_日付文字列,_次の日文字列), writef('次の日は:%t\n',[_次の日文字列]). 'キーボードから日付を読み込んで'(_日付文字列) :- write('日付を文字列8桁で入力してください : '), get_line(_日付文字列), atom(_日付文字列), atom_length(_日付文字列,8),!. 'キーボードから日付を読み込んで'(_日付文字列) :- 'キーボードから日付を読み込んで'(_日付文字列). その次の日(_日付文字列,_次の日文字列) :- sub_atom(_日付文字列,4,4,0,'1231'), 翌年の一月一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 二月(_日付文字列), うるう年(_日付文字列), 二十九日(_日付文字列), 同年の三月一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 二月(_日付文字列), \+(うるう年(_日付文字列)), 二十八日(_日付文字列), 同年の三月一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 大の月(_日付文字列), 三十一日(_日付文字列), 翌月の一日(_日付文字列,_次の文字列). その次の日(_日付文字列,_次の日文字列) :- 小の月(_日付文字列), 三十日(_日付文字列), 翌月の一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 同年同月の次の日(_日付文字列,_次の日文字列). 翌年の一月一日(_日付文字列,_翌年の一月一日) :- sub_atom(_日付文字列,0,4,_,_年), 翌年(_年,_翌年), atomic_list_concat([_翌年,'0101'],_翌年の一月一日). 同年の三月一日(_日付文字列,_同年の三月一日) :- sub_atom(_日付文字列,0,4,_,_年), atomic_list_concat([_年,'0301'],_同年の三月一日). 翌月の一日(_日付文字列,_翌月の一日) :- sub_atom(_日付文字列,0,4,_,_年), sub_atom(_日付文字列,4,2,_,_月), 翌月(_月,_翌月), atomic_list_concat([_年,_翌月,'01'],_翌月の一日). 同年同月の次の日(_日付文字列,_同年同月の次の日) :- sub_atom(_日付文字列,0,6,_年月), sub_atom(_日付文字列,6,2,_日), 翌日(_日,_翌日), atomic_list_concat([_年月,_翌日],_同年同月の次の日). 二月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,'02'). 十二月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,'12'). 三十一日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'31'). 三十日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'30'). 二十九日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'29'). 二十八日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'28'). 大の月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,_月), member(_月,['01','03','05','07','08','10','12']), ここでは12月は除外する(_月). 小の月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,_月), member(_月,['02','04','06','09','11']), ここでは2月は除外する(_月). ここでは12月は除外する(_月) :- \+(_月 == '12'). ここでは2月は除外する(_月) :- \+(_月 == '02'). うるう年(_年) :- atom(_年), atom_length(_年,4), atom_number(_年,_年整数), うるう年(_年整数) . うるう年(_日付文字列) :- atom(_日付文字列), atom_length(_日付文字列,8), sub_atom(_日付文字列,0,4,_,_年), atom_number(_年,_年整数), うるう年(_年整数) . うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 翌年(_年,_翌年) :- atom_number(_年,_年整数), _翌年整数 is _年整数 + 1, atom_number(_翌年,_翌年整数). 翌月('01','02'). 翌月('02','03'). 翌月('03','04'). 翌月('04','05'). 翌月('05','06'). 翌月('06','07'). 翌月('07','08'). 翌月('08','09'). 翌月('09','10'). 翌月('10','11'). 翌月('11','12'). 翌月('12','01'). 翌日('01','02'). 翌日('02','03'). 翌日('03','04'). 翌日('04','05'). 翌日('05','06'). 翌日('06','07'). 翌日('07','08'). 翌日('08','09'). 翌日('09','10'). 翌日('10','11'). 翌日('11','12'). 翌日('12','13'). 翌日('13','14'). 翌日('14','15'). 翌日('15','16'). 翌日('16','17'). 翌日('17','18'). 翌日('18','19'). 翌日('19','20'). 翌日('20','21'). 翌日('21','22'). 翌日('22','23'). 翌日('23','24'). 翌日('24','25'). 翌日('25','26'). 翌日('26','27'). 翌日('27','28'). 翌日('28','29'). 翌日('29','30'). 翌日('30','31'). 翌日('31','01'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/463 # # 休み中の課題なのですが、わからないので教えて頂きたいです。 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/vb7pZ # # 飲食店の6月分の帳簿データbook-6.datがテキストで書かれてあり、中身を見てみると #  左端から、日付 支出(1)/収入(0) 商品名 単価 数量 #  20120601 1 meat 125 10000 #  20120602 1 rice 2000 10 #  20120603 0 uriage 500 100 #  20120603 1 beer 140 24 # となっているものとする。  ただし、支出は1、収入は0とする。 # このようなデータを読み取って残高を計算するプログラムを作りたい。以下のプログラムをコンパイルが通り、 # 目的の動作をするように直接書き込んで補いなさい。(どこを補うべきかも考えること) # ただし、商品名は空白を含まない文字列とし、繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、 # 入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。 '飲食店の6月分の帳簿データbook-6.datからテキストデータを読み取って残高を計算する。ただし、商品名は空白を含まない文字列とし、繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_残高表,_残高) :- '飲食店の6月分の帳簿データbook-6.datからテキストデータを読み取って'(LL), '繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金), 繰越金を付加して残高を計算する(LL,_繰越金,_残高表,_残高). '飲食店の6月分の帳簿データbook-6.datからテキストデータを読み取って'(LL) :- get_split_lines('book-6.dat',[' ',','],LL). '繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金) :- 整数を得る(繰越金,_繰越金候補), '入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金候補,_繰越金),!. '入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金候補,_繰越金) :- writef('入力された繰越金 %t で間違いありませんか?\n間違いがなければ改行\n間違っていたら 正しい繰越金を入力してください : ',[_繰越金候補]), get_line(Line), 間違いがあるならば何度でも入力しなおす(Line,_繰越金候補,_繰越金),!. 間違いがあるならば何度でも入力しなおす('',_繰越金,_繰越金) :- !. 間違いがあるならば何度でも入力しなおす(Line,_,_繰越金) :- 間違いがある, atom_to_term(Line,_繰越金候補,_), integer(_繰越金候補), '入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金候補,_繰越金). 間違いがある. 繰越金を付加して残高を計算する(LL,_繰越金,[[_日付,0,繰越金,0,0,_繰越金]|_残高表],_残高) :- LL = [[_日付|_]|_], 残高を計算する(LL,_繰越金,_残高表,_残高). 残高を計算する([],_残高,[],_残高). 残高を計算する([[_日付,_支出または収入区分,_商品名,_単価,_数量]|R1],_残高_1,[[_日付,_支出または収入区分,_商品名,_単価,_数量,_残高_2]|R2],_残高) :- 支出または収入区分に従って行の計算(_残高_1,_支出または収入区分,_単価,_数量,_残高_2), 残高を計算する(R1,_残高_2,R2,_残高). 支出または収入区分に従って行の計算(_残高_1,1,_単価,_数量,_残高_2) :- _残高_2 is _残高_1 - _単価 * _数量. 支出または収入区分に従って行の計算(_残高_1,0,_単価,_数量,_残高_2) :- _残高_2 is _残高_1 + _単価 * _数量. get_split_lines(File,_区切り文字列ならび,LL) :- get_lines(File,_行ならび), findall(L,( member(_行,_行ならび), split(_行,_区切り文字列ならび,L)),LL) . get_lines(File,_行ならび) :- open(File,read,Instream), 行入力(Instream,_行), 行入力ならび(Instream,_行ならび), close(Instream). 行入力ならび(Instream,[]) :- at_end_of_stream(Instream),!. 行入力ならび(Instream,[_行|R]) :- 行入力(Instream,_行), 行入力ならび(Instream,R). get_split_line(_区切り文字列ならび,_語彙ならび) :- 行入力(_行), split(_行,_区切り文字列ならび,_語彙ならび). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 行入力(Instream,_行) :- read_line_to_codes(Instream,Codes), atom_codes(_行,Codes). split('',_,[]) :- !. split(_文字列,_区切り文字列ならび,[_前文字列|R]) :- member(_区切り文字列,_区切り文字列ならび), sub_atom(_文字列,_前文字列,_区切り文字列,_後文字列), split(_後文字列,_区切り文字列ならび,R),!. split(_文字列,_区切り文字ならび,[_文字列]) :- \+(member(_文字列,_区切り文字ならび)),!. split(_,_,[]). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/829 # # 問題 # 数独の解答が9行9列の文字列で与えられたとき正しいかどうか判定せよ。 # # '数独の解答が9行9列の文字列で与えられたとき正しいかどうか'(_文字列) :- '数独の解答が9行9列の文字列で与えられたとき'(_文字列,LL), 数独の回答が正しい(LL). '数独の解答が9行9列の文字列で与えられたとき'(_9行9列の文字列,LL) :- split(9行9列の文字列,['\n'],_行ならび), '9行9列の行ならびを行列に変換'(_行ならび,LL). '9行9列の行ならびを行列に変換'([],[]). '9行9列の行ならびを行列に変換'([_行|R1],[L|R2]) :- findall(N,( sub_atom(_行,_,1,_,A), atom_number(A,N)), L), '9行9列の行ならびを行列に変換'(R1,R2). 数独の回答が正しい(LL) :- '行・列要素の数独の解答は正しい'(LL), 矩形要素の数独の解答も正しい(LL). '行・列要素の数独の解答は正しい'(LL) :- 行要素の数独診断(LL), 転置(LL,LL2), 行要素の数独診断(LL2). 行要素の数独診断([]). 行要素の数独診断([L1|R]) :- 一意の数が9個(L1), 行要素の数独診断(R). 矩形要素の数独の解答も正しい([]). 矩形要素の数独の解答も正しい([L1,L2,L3|R1],L) :- 転置([L1,L2,L3],LL1), 矩形要素診断(LL1), 矩形要素の数独の解答も正しい(R1,R2). 矩形要素診断([]). 矩形要素診断([L1,L2,L3|R]) :- append(L1,L2,L3,L), 一意の数が9個(L), 矩形要素診断(R). 一意の数が9個(L1) :- sort(L1,L2), length(L2,9). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/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)). % 以下のサイトは % % 文字列置換には、 % 1) 一ヶ所書き換えたらそれで終わり % 2) 複数置換可能の箇所かあれば、全部書き換える % 3) 先頭から書き換え可能の部分を順にさらに次の書き換え候補を置換しに行くか % 問い合わせながら置換する % 4) 先頭から書き換え可能の部分を書き換えてみるが、外部からtrueの指示が % ない場合は、元に戻して次の候補に進む。 % の三方式が考えられる。ここではその 3)の「非決定的に順に置換する」を定義する。 % 文字列を非決定的に順に置換する(_文字列,_置換対象副文字列,_置換文字列,_置換された文字列) :- sub_atom(_文字列,S,Len,R,_置換対象文字列), sub_atom(_文字列,0,S,_前文字列), sub_atom(_文字列,_,R,0,_後文字列), 文字列を非決定的に順に置換する(_文字列,_置換対象文字列,_置換文字列,_前文字列,_後文字列,_置換された文字列). 文字列を非決定的に順に置換する(_文字列,_,_,_文字列). 文字列を非決定的に順に置換する(_文字列,_置換対象文字列,_置換文字列,_前文字列,_後文字列,_置換された文字列) :- atomic_list_concat([_前文字列,_置換文字列,_後文字列],_置換された文字列). 文字列を非決定的に順に置換する(_文字列,_置換対象文字列,_置換文字列,_前文字列,_後文字列,_置換された文字列) :- 文字列を非決定的に順に置換する(_後文字列,_置換対象副文字列,_置換文字列,_置換された後文字列), atomic_list_concat([_前文字列,_置換文字列,_置換された文字列_2],_置換された後文字列). % 以下のサイトは # 出典 :: SQL質疑応答スレ 12問目 #984 # ・SQL Server2008R2Express # テーブルデータ # ・2012-08-01 11:35:00, りんご, 1 # ・2012-08-01 16:22:00, みかん, 2 # ・2012-08-02 13:54:00, りんご, 2 # ・2012-08-02 14:32:00, りんご, 1 # ・2012-08-04 16:22:00, みかん, 3 # # ・欲しい結果 # 2012-08-01 # 2012-08-02 # 2012-08-04 # # ・説明 # 件数に関係なく売り上げがあった日だけのリストが欲しいのですが # うまい方法あるでしょうか # # 売上('2012-08-01 11:35:00', りんご, 1 ). 売上('2012-08-01 16:22:00', みかん, 2 ). 売上('2012-08-02 13:54:00', りんご, 2 ). 売上('2012-08-02 14:32:00', りんご, 1 ). 売上('2012-08-04 16:22:00', みかん, 3 ). 件数に関係なく売り上げがあった日(_売上のあった日) :- 件数に関係なく売り上げがあった日だけのリスト(_売上のあった日だけのリスト), member(_売上のあった日,_売上のあった日だけのリスト). 件数に関係なく売り上げがあった日だけのリスト(_売上のあった日だけのリスト) :- setof(_年月日,[_年月日] ^ 売上のあった日(_年月日),_売上のあった日だけのリスト). 売上のあった日(_年月日) :- 売上(_日付時刻,_品名,_件数), _件数 > 0, 日付時刻から年月日を切り取る(_日付時刻,_年月日). 日付時刻から年月日を切り取る(_日付時刻,_年月日) :- sub_atom(_日付時刻,0,10,_,_年月日). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/278 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク) : 起動するとローマ字で姓と名を入力、 # 姓と名の合計ポイントが基本のポイント、姓と名の合計が7の倍数なら最終ポイントは1.5倍、 # 姓と名にl,u,c,k,yが含まれていたら追加で、lとcは1ポイント、他は1ポイント、 # tとbが文字に含まれていた場合3ポイント追加するプログラムの作成 # '起動するとローマ字で姓と名を入力、姓と名の合計ポイントが基本のポイント、姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する。合計点が7の倍数なら最終ポイントは1.5倍にする。' :- 起動するとローマ字で姓と名を入力(_姓,_名), '姓と名の合計ポイントが基本のポイント、姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する。'(_姓,_名,_合計点), '姓と名の合計が7の倍数なら最終ポイントは1.5倍'(_合計点,_最終ポイント), writef('最終ポイントは %t 点です。',[_最終ポイント]). 起動するとローマ字で姓と名を入力(_姓,_名) :- write('ローマ字で姓を入力してください : '), get_line(_姓), write('ローマ字で名を入力してください : '), get_line(_名). '姓と名の合計ポイントが基本のポイント、姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する。'(_姓,_名,_合計点) :- 姓と名の合計ポイントが基本のポイント(_姓,_名,_基本ポイント), '姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する'(_姓,_名,_追加点), _合計点 is _基本ポイント + _追加点. 姓と名の合計ポイントが基本のポイント(_姓,_名,_基本ポイント) :- atomic_list_concat([_姓,_名],_姓名), char_codes(_姓名,Codes), 標準偏差(Codes,_基本ポイント_1), _基本ポイント is truncate(_基本ポイント_1). '姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する'(_姓,_名,_追加点) :- 姓と名にlが含まれていたら1ポイント追加する(_姓,_名,_追加点_1), 姓と名にcが含まれていたら1ポイント追加する(_姓,_名,_追加点_2), 他はどれかが入っていたら1ポイント追加する(_姓,_名,_追加点_3), 姓と名にtとgが含まれていたら3ポイント追加する(_姓,_名,_追加点_4), _追加点 is _追加点_1 + _追加点_2 + _追加点_3 + _追加点_4. 姓と名にlが含まれていたら1ポイント追加する(_姓,_名,1) :- sub_atom(_姓,_,1,_,'l'), sub_atom(_名,_,1,_,'l'),!. 姓と名にlが含まれていたら1ポイント追加する(_,_,0). 姓と名にcが含まれていたら1ポイント追加する(_姓,_名,1) :- sub_atom(_姓,_,1,_,'c'), sub_atom(_名,_,1,_,'c'),!. 姓と名にcが含まれていたら1ポイント追加する(_,_,0). 他はどれかが入っていたら1ポイント追加する(_姓,_名,1) :- member(A,[u,k,y]), sub_atom(_姓,_,1,_,A), sub_atom(_名,_,1,_,A),!. 他はどれかが入っていたら1ポイント追加する(_,_,0). 姓と名にtとgが含まれていたら3ポイント追加する(_姓,_名,3) :- sub_atom(_姓,_,1,_,t), sub_atom(_名,_,1,_,g), sub_atom(_姓,_,1,_,t), sub_atom(_名,_,1,_,g),!. 姓と名にtとgが含まれていたら3ポイント追加する(_,_,0). '姓と名の合計が7の倍数なら最終ポイントは1.5倍'(_点数,_最終ポイント) :- 0 is _点数 mod 7, _最終ポイント is truncate(_点数 * 1.5),!. '姓と名の合計が7の倍数なら最終ポイントは1.5倍'(_点数,_点数). 標準偏差(L,V) :- length(L,N), 相加平均(L,M), 標準偏差(L,N,M,0.0,V). 標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!. 標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 標準偏差(R,N,M,S2,V). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0,M). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). % 以下のサイトは # 出典:: 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/110 # # '([\x8E\xA1-\xFE][\xA1-\xFE])' で、euc の2バイト文字にマッチするかと思いますが、 # このうち、「×」(\xA1DF)のみマッチさせたくないのですが、 # どのように書けばよいでしょうか? # '([0x8E0xA1-0xFE][0xA1-0xFE]) で、euc の2バイト文字にマッチするかと思いますが、このうち、「×」x0xA1DF)のみマッチさせたくないのですが、どのように書けばよいでしょうか? '(_文字列,_前文字列,_適合文字,_後文字列) :- sub_atom(_文字列,S,1,R,_適合文字), char_code(_適合文字,_文字コード), 'euc の2バイト文字にマッチするかと思いますが、このうち、「×」(0xA1DF)のみマッチさせたくない'(_文字コード), aub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,S+1,_,0,_後文字列). 'euc の2バイト文字にマッチするかと思いますが、このうち、「×」(0xA1DF)のみマッチさせたくない'(_文字コード) :- _文字コード >= 0x8ea1, _文字コード =< 0xa1fe, \+(_文字コード==0xa1df). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/915 # # [1] 授業単元:C言語 # [2] 問題文: # ある地域の書数言語を調べたところ、その言語では数が五進法で表されており # また我々が使う数字の0〜4に対応する記号としてアルファベットのr,h,f,m,yによく似た形の文字が使われていることが分かった。 # この表記法で表された五進数をキーボードから文字列として受け取り、我々のの十進法表記に変換して表示するプログラムを作成せよ # 例えばキーボードから「rfym」という文字列(我々の表記では0423という五進数)を受け取った場合、 # これを「73」という十進法に変換し、画面に表示できればよい。ただし、受け取る五進数は4桁以下の非負正数(十進法の0〜624)であると仮定する。 # なお、この問題では以下のquin2dec()を作成しそれを用いて前記の処理を行うこと。 # ・4つの文字を因数として受けとる # ・受け取った4文字中r,h,f,m,y以外の文字が一文字でも含まれた場合エラーメッセージを出してプログラムを終了する。 # ・4文字をそれぞれ五進数の各桁の値と考え、それから定まる4桁の五進数を十進法整数値に変換する。 # ・前記の十進法整数値を戻り値として返す # ただし変換結果の画面表示はquin2dec()関数中ではなくmain()関数中で行うこと # # ある地域の書数表記文字(r,0). ある地域の書数表記文字(h,1). ある地域の書数表記文字(f,2). ある地域の書数表記文字(m,3). ある地域の書数表記文字(y,4). 'ある地域の書数表記法で表された五進数をキーボードから文字列として受け取り、我々の十進法表記に変換して表示する' :- 'ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(_五進数表記文字列), ある地域の書数表記法による五進数表記文字列を我々の十進数表記文字列に変換(_五進数表記文字列,_十進数表記文字列), writef('%五進数表記 = %t, 我々の十進数表記 = %t\n',[_五進数表記文字列,_十進数表記文字列]). 'ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(_五進数表記文字列) :- write('ある地域の書数言語表記法で表された五進数を入力してください : '), get_line(Line), '診断: ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(Line,_五進数表記文字列),!. 'ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(_五進数表記文字列) :- 'ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(_五進数表記文字列). '診断: ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(Line,_五進数表記文字列) :- sub_atom(Line,_,1,_,_文字), \+(ある地域の書数表記文字(_文字,_)),!, fail. '診断: ある地域の書数言語表記法で表された五進数をキーボードから文字列として受け取り'(_五進数表記文字列,_五進数表記文字列). ある地域の書数表記法による五進数表記文字列を我々の十進数表記文字列に変換(_五進数表記文字ならび,0,_十進数表記文字列) :- 五進数表記文字列を文字ならびに変換(_五進数表記文字列,_五進数表記文字ならび), ある地域の書数表記法による五進数文字ならびを十進数に変換(_五進数表記文字ならび,[],_十進数), 十進数を十進数表記文字列に変換(_十進数表記文字列,_十進数). 五進数表記文字列を文字ならびに変換(_五進数表記文字列,_五進数表記文字ならび) :- atom_chars(_五進数表記,_五進数表記文字ならび). ある地域の書数表記法による五進数文字ならびを十進数に変換([],_十進数,_十進数). ある地域の書数表記法による五進数文字ならびを十進数に変換([A|R1],Y_1,X) :- ある地域の書数表記文字(A,N), Y_2 is Y_1 * 5 + N, ある地域の書数表記法による五進数文字ならびを十進数に変換(R1,Y_2,X). 十進数を十進数表記文字列に変換(_十進数表記文字列,_十進数) :- atom_number(_十進数表記文字列,_十進数). % 以下のサイトは # 出典:: 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/1339338438/872 # # [1] 授業単元: C言語 # [2] 問題文: # 簡単な暗号化関数の作成 # 英文字を第1引数、正整数値のシフト幅nを第2引数として受け取り、第一 # 引数をASC競魁璽匹韮遒蘯分先に進めた文字を返す関数を作成せよ。 # たとえば第1引数が'b'(十進数の98)、第2引数6であった場合は戻り値は'h'(十進数の104)となる。 #  ただし、大文字を進めた場合に'z'より大きくなる場合には'A'に折り返す。たとえば、'W'を指定し # た場合は'C'が戻り値となる。小文字についても同様に、'z'を超える場合は'a'に折り返す。また、英大 # 文字・小文字以外が第一引数に与えられた場合は、第1引数をそのまま戻り値とする。 #  このような関数をcharshift()という名前で作成した上で、この関数を用いて以下の機能を持つプログ # ラムを作成せよ。 # # 「最初にキーボードから80文字以内の英文を1行入力し、次に正整数のシフト幅を入力する。 # そして、英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を1行に # 出力する」 # # このプログラムでは以下のような結果が得られる # Input English words. # UDU was established in 1907. (←キーボードからの入力) # Input shift number. # 6 (←キーボードからの入力) # AJA cgy kyzghroynkj ot 1907. # '英文字を第1引数、正整数値のシフト幅nを第2引数として受け取り、第一引数をASCIIコードでn進めた文字を返す'(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字) :- charsshift(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字). charsshift(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字) :- member(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','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']]), nth0(_nth0,L,_文字), _シフト is 26 + _シフト幅n - _nth0, ならびの回転(左方向,_シフト,L,_第一引数をASCIIコードでn進めた文字),!. '最初にキーボードから80文字以内の英文を1行入力し、次に正整数のシフト幅を入力する。そして、英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を1行に出力する' '最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文), '次に正整数のシフト幅を入力する'(_シフト幅), '英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を'(_80文字以内の文字列,_シフト幅,_変換された文字列), 一行で出力する(_変換された文字列). '最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文) :- get_line(_文字列), '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_文字列,_80文字以内の英文),!. '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_文字列,_80文字以内の英文) :- sub_atom(_文字列,0,80,_,_80文字以内の英文),!. '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文,_80文字以内の英文). '次に正整数のシフト幅を入力する'(_シフト幅) :- 整数を得る(正整数のシフト幅,_シフト幅). '英文字のすべての文字を指定されたシフト幅だけcharsshiftで変換した文字列を'(_80文字以内の文字列,_シフト幅,_変換された文字列) :- findall(_変換された文字,( sub_atom(_80文字以内の英文,_,1,_,_英文字), charsshift(_英文字,_シフト幅,_変換された文字)), _変換された文字ならび), atomic_list_concat(_変換された文字ならび,_変換された文字列). 一行で出力する(_変換された文字列) :- writef('%t\n',[_変換された文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/855 # # [1] 授業単元:C言語 # [2] 問題文: # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ。 # <実行例> # 文字列を入力せよ:one-two-three-four # three-four # # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ :- 入力された文字列で(_文字列), '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列), 表示せよ(_2つ目のハイフン以降の文字列),!. 入力された文字列で(_文字列) :- get_line(_文字列). '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列) :- '2つ目のハイフン'(_文字列,_2つ目のハイフンの位置), 以降の文字列だけを(_文字列,_2つ目のハイフン以降の文字列). '2つ目のハイフン'(_文字列,_2つ目のハイフンの位置) :- sub_atom(_文字列,0,_2つ目のハイフンの位置,_,_副文字列), count(sub_atom(_副文字列,_,1,_,'-'),2),!. 以降の文字列だけを(_文字列,_2つ目のハイフンの位置,_2つ目のハイフン以降の文字列) :- _2つ目のハイフンの次の位置 is _2つ目のハイフンの位置 + 1, sub_atom(_文字列,_2つ目のハイフンの次の位置,_,0,_2つ目のハイフン以降の文字列),!. 表示せよ(_2つ目のハイフン以降の文字列) :- writef('%t\n',[_2つ目のハイフン以降の文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/855 # # [1] 授業単元:C言語 # [2] 問題文: # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ。 # <実行例> # 文字列を入力せよ:one-two-three-four # three-four # # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ :- 入力された文字列で(_文字列), '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列), 表示せよ(_2つ目のハイフン以降の文字列),!. 入力された文字列で(_文字列) :- get_line(_文字列). '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列) :- '2つ目のハイフン'(_文字列,_2つ目のハイフンの位置), 以降の文字列だけを(_文字列,_2つ目のハイフンの位置,_2つ目のハイフン以降の文字列). '2つ目のハイフン'(_文字列,_2つ目のハイフンの位置) :- sub_atom(_文字列,_1つ目のハイフンの位置,1,_,'-'), sub_atom(_文字列,_2つ目のハイフンの位置,1,_,'-'), _2つ目のハイフンの位置 > _1つ目のハイフンの位置,!. 以降の文字列だけを(_文字列,_2つ目のハイフンの位置,_2つ目のハイフン以降の文字列) :- sub_atom(_文字列,_2つ目のハイフンの位置+1,_,0,_2つ目のハイフン以降の文字列). 表示せよ(_2つ目のハイフン以降の文字列) :- writef('%t\n',[_2つ目のハイフン以降の文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/849 # # [1] 授業単元: プログラミング # [2] 問題文: # 1文字を引数として受け取り、AならばZ,BならばY,aならばz,bならばy,0ならば9,1ならば8 # というように入れ替えた文字を戻り値とする関数をsymmetry()という名前で作成する。 # キーボードから80文字以内の英文を1行入力し、1行の全ての文字をsymmetry()で変換した # 文字列を1行に表示する。同じ操作を更にもう一度繰り返し、結果的に入力された英文と # 同じ文字列が表示されるようにする。 # 例:I was born in 1956.と打ち込んだ場合、R dzh ylim rm 8043.と表示されるようにする。 # 'キーボードから80文字以内の英文を1行入力し、1行の全ての文字をsymmetry述語で変換した文字列を1行に表示する。' :- 'キーボードから80文字以内の英文を1行入力し、'(_80文字以内の文字列), '1行の全ての文字をsymmetry述語で変換した文字列を'(_80文字以内の文字列,_変換した文字列), 表示する(_変換した文字列). 'キーボードから80文字以内の英文を1行入力し、'(_80文字以内の文字列) :- get_line(_文字列), '80文字以内の'(_文字列,_80文字以内の文字列). '80文字以内の'(_文字列,_80文字以内の文字列) :- sub_atom(_文字列,0,80,_,_80文字以内の文字列),!. '80文字以内の'(_文字列,_文字列). '1行の全ての文字をsymmetry述語で変換した文字列を'(_80文字以内の文字列,_変換した文字列) :- findall(_暗号文字,( sub_atom(_80文字以内の文字列,_,1,_,_文字), symmetry(_文字,_暗号文字)), _変換した文字ならび), atom_chars(_変換した文字列,_変換した文字ならび). 表示する(_変換した文字列) :- writef('%t\n',[_変換した文字列]). symmetry(_文字,_暗号文字) :- 暗号文字へずらす(_文字,_暗号文字),!. summetry(_文字,_文字). 暗号文字へずらす(_文字,_暗号文字) :- 文字種(_,_文字コード下限,_文字コード上限,L), nth0(_nth0,L,_文字), _シフト数 is _nth0 + (_文字コード上限 - _文字コード下限 + 1) // 2, ならびの回転(左方向,_シフト数,L,[_暗号文字|_]),!. 文字種(英小文字,97,122,[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]). 文字種(英大文字,65,90,['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']). 文字種(数字,48,57,['0','1','2','3','4','5','6','7','8','9']). % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/836 # # 【質問テンプレ】 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 文字列の操作 # キーボードから複数(50以内)の文字列(20文字以内)を入力する。 # 入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。 # 次に、入力した文字列の第1文字のアルファベット('a'〜'z','A'〜'Z')を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。 # なお、アルファベット以外の文字は変換しないこと。 # 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。' :- '文字列(20文字いない)を入力する'(_文字列), 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(_文字列,_文字列ならび), '次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'(_文字列ならび). 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(_文字列,[]) :- sub_atom(_文字列,0,1,_,'0'),!. 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(50,_文字列,[_文字列]) :- !. 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(N,_文字列,[_文字列|R]) :- '文字列(20文字いない)を入力する'(_次の文字列), N_2 is N + 1, 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(N_2,_次の文字列,R). '文字列(20文字いない)を入力する'(_文字列) :- get_char(_最初の文字), '文字列(20文字いない)を入力する'(_最初の文字,_文字ならび), '20文字いない'(_文字ならび,_文字列). '文字列(20文字いない)'(_文字ならび,_文字列) :- length(_文字ならび,_要素数), '20文字いないに補正'(_要素数,_文字ならび,_文字列). '20文字いないに補正'(_要素数,_文字ならび,_文字列) :- _要素数 > 20, atom_chars(_文字列_1,_文字ならび), sub_atom(_文字列_1,0,20,_,_文字列). '20文字いないに補正'(_要素数,_文字ならび,_文字列) :- _要素数 =< 20, atom_chars(_文字列,_文字ならび). '文字列(20文字いない)を入力する'('\n',[]) :- !. '文字列(20文字いない)を入力する'(_文字,[_文字]) :- get_char(_次の文字), '文字列(20文字いない)を入力する'(N,_文字,[_文字]). '次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'([],[]). '次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'([_文字列|R1],[_変換された文字列|R2]) :- '入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して'(_文字列,_変換された文字列), 表示する(_変換された文字列), '次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'(R1,R2). '入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して'(_文字列,_変換された文字列) :- sub_atom(_文字列,0,1,_残り文字数,_第1文字), sub_atom(_文字列,1,_残り文字列,_,_残りの文字列), to_upper(_第一文字,_大文字化した文字), to_lower(_残り文字列,_小文字化した文字), atomic_list_concat([_大文字化した文字,_小文字化した文字],_変換された文字列). 表示する(_変換された文字列) :- writef('%t\n',[_変換された文字列]). % 最初、文字列を20文字まで読み取る部分はきっちり、20文字を越えたら述語を % 終了させていた。これだと、20文字以上の部分がキーボードバッファ上に残って % しまい、次の入力機会に、この文字列から入力されてしまう可能性がある。 % それで、文字数がオーバーしても、改行まで読み取りオーバーしている場合は % 切り取る方針にした。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/784 # # [1] 授業単元:C 言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/JrW6n1Q3 # 上記プログラムで作成したファイルを読み込んで中身を次のフォーマットで表示する関数 # void display_b(FILE *in_fp); # を作成し、その動作を確認するプログラムkadai11-2.cを作りなさい。 # ただし、ファイル名はプロトタイプ宣言で指定すること。 # また、出力は以下の出力例に示すフォーマットで画面出力されるものとする。 # # gcc kadai11-2.c # ./a.out # 1.000000 1.292166 # 1.010000 1.294241 # 1.020000 1.293094 # 1.030000 1.294946 # 1.040000 1.305628 # 1.050000 1.329642 # 1.060000 1.368... # 'ファイルを読み込んで中身を整形したフォーマットで表示する' :- フォーマットを推測する(' 1.000000 1.292166',_表示フォーマット), ファイルを読み込んで(LL), get_split_lines('test_bin.dat',LL), 整形したフォーマットで表示する(_表示フォーマット,LL). ファイルを読み込んで(LL) :- get_split_lines('test_bin.dat',[' '],LL). 整形したフォーマットで表示する(_表示フォーマット,[]). 整形したフォーマットで表示する(_表示フォーマット,[_要素ならび|R]) :- writef(_表示フォーマット,_要素ならび), 整形したフォーマットで表示する(_表示フォーマット,R). フォーマットを推測する(_文字列,_表示フォーマット) :- 要素ならびとして取り出す(_文字列,_要素ならび), フォーマット要素を推測する(_要素ならび,_表示フォーマットならび), atomic_list_concat(_表示フォーマットならび,_表示フォーマット). フォーマット要素を推測する([],['\n']) :- !. フォーマット要素を推測する([''|R1],R2) :- フォーマット要素を推測する(R1,R2),!. フォーマット要素を推測する([_要素|R1],[F|R2]) :- 要素は浮動小数点数(_要素,F), フォーマット要素を推測する(R1,R2),!. フォーマット要素を推測する([S|R1],[S|R2]) :- sub_atom(S,0,1,_,' '), フォーマットを推測する(R1,R2),!. フォーマット要素を推測する([S|R1],['%t'|R2]) :- フォーマットを推測する(R1,R2). 要素は浮動小数点数(_要素,F) :- sub_atom(_要素,S,1,_残り文字数,'.'), sub_atom(_要素,0,S,_,_小数点以上文字列), atomic_list_concat(['~',_残り文字数,f],F),!. 要素ならびとして取り出す(_文字列,[S1,S2|R1]) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 'S2は空白に挟まれている'(L1,L2,L3), 要素ならびとして取り出す(S3,R1),!. 要素ならびとして取り出す(_,[]) :- !. 'S2は空白に挟まれている'(L1,L2,L3) :- all(L1,' '), \+(member(' ',L2)), \+((L3 = [A|_],\+(A=' '))),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/97 # # 最後に○○がつくけどマッチング文字列に含めないってどうすればいいんでしったっけ # # 末尾に指定要素があるがそれを除いた文字列(_文字列,_末尾の指定要素,_末尾の指定要素を除いた文字列) :- sub_atom(_文字列,_開始位置,_文字列長,0,_末尾の指定文字列), sub_atom(_文字列,0,_開始位置,_,_末尾の指定要素を除いた文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/771 # # 【 課題 】迷路の最短経路を与えるプログラムを考えよ. # 壁は#, 通路は.で表されている. # また迷路の外側は全て壁(即ち#)となっている. # スタート地点はS, ゴール地点はGである. # スタートからゴールまでの道のりを表わせ. # 上へ移動する場合にはu, 同様に下はd, 右はr, 左はlとせよ. # 最短経路が複数ある場合は, それらのうちどれかひとつを出力せよ。 # # 例1) # ####### # #..S..# # #.....# # #..G..# # ####### # 答え) # dd # # 例2) # ####### # #.....# # #.G.#.# # #..#..# # #.#.S.# # #.....# # ####### # 答え) # ldlluuru # 最短経路(_迷路文字列ならび,_最短経路) :- 迷路の定義(_迷路文字列ならび), 出発点(Y0,X0), findmin([_距離,_経路],( 道に迷う([[Y0,X0]],Y0,X0,_方向ならび), length(_方向ならび,_距離), atom_chars(_経路,_方向ならび)), [_,_最短経路]). 道に迷う(_,Y,X,[]) :- 終着点(Y,X). 道に迷う(_既に通過した点ならび,Y_1,X_1,[_方向|R]) :- 隣接点を得る(_既に通過した点ならび,Y_1,X_1,Y_2,X_2,_方向), 道に迷う([[Y_2,X_2]|_既に通過した点ならび],Y_2,X_2,R). 隣接点を得る(_既に通過した点ならび,Y_1,X_1,Y_2,X_2,_方向) :- member([_方向,A,B],[[r,1,0],[l,-1,0],[d,0,1],[u,0,-1]]), Y_2 is Y_1 + B, X_2 is X_1 + A, 道(Y_2,X_2), \+(member([Y_2,X_2],_既に通過した点ならび)). 迷路の定義(_行文字列ならび) :- append(L0,[_行文字列|R],_行文字列ならび), length(L0,Y), sub_atom(_行文字列,X,1,_,_点), 迷路の道部分の点定義(_点,Y,X), R = []. 迷路の道部分の定義(_点,Y,X) :- '道ならば位置を定義'(_点,Y,X), '出発点・終着点ならば位置を定義'(_点,Y,X),!. 迷路の道部分の定義(_,_,_). '出発点・終着点ならば位置を定義'('S',Y,X) :- assertz(出発点(Y,X)),!. '出発点・終着点ならば位置を定義'('G',Y,X) :- assertz(終着点(Y,X)),!. 道ならば位置を定義(A,Y,X) :- \+(A = '#'), assertz(道(Y,X)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/768 # # 数字が並んだテキストファイルからいくつかの数字だけを取り出して # 表示したいです. # 例:hoge.txt # 78 3 44 89 # 22 31 44 88 99 53 # 3 4 7 9 9 7 6 # 例えば上記のテキストデータですと, # 各行の最初の2つの数字以降の数字を取り出して # 表示したいです. # なお,読み込むテキストデータは行も列も不定になっています. # 上記のテキストデータは1行目は4列ですが,他の行は4列とは限りません. # なるべく簡単な関数で書けるとありがたいです. # 環境はvisual studio2010で書いてます. # # 初心者ですみません.よろしくお願いします. # '数値が並んだテキストファイルからいくつかの数値だけを削り残り文字列を取り出して表示する。各行の最初の2つの数値以降の文字列を表示したい'(_テキストファイル) :- 数値が並んだテキストファイルから(_テキストファイル,Lines), 各行の最初の2つの数値以降の文字列を(Lines,Line), 表示したい(Line,_残り行ならび), _残り行ならび = []. 数値が並んだテキストファイルから(_テキストファイル,Lines) :- get_lines(_テキストファイル,Lines). 各行の最初の2つの数値以降の文字列を取り出して(Lines,Line,_残り行ならび) :- append(_,[Line_1|_残り行ならび],Lines), 最初の2つの数値以降の文字列を取り出して(Line_1,Line). 最初の2つの数値以降の数値を取り出して(_文字列,_残り文字列) :- 最初の数値を除く残り文字列(_文字列,_残り文字列_1), 最初の数値を除く残り文字列(_残り文字列_1,_残り文字列),!. 最初の数値を除く残り文字列(_文字列,_残り文字列) :- sub_atom(_文字列,_,_,_,S1,_残り文字列,S3,L1,L2,L3), すべて数字(L2), \+((sub_atom(S3,0,1,_,A),数字(A))),!. 数字(A) :- A @>= '0', A @=< '9'. すべて数字([]). すべて数字([A|R]) :- 数字(A), すべて数字(R). 表示したい(Line) :- writef('%t\n',[Line]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/881 # # 入庫、出庫、締め用のテーブルがあるとし、それぞれ、HEADER、DETAILがあり # HEADERには、入出庫、締め番号、日付、ACTIVE(該当月Y/N)など # DETAILには、アイテムと数量が入っているとします # そこでDAILY MOVEMENTを作成したいのですが、 # 1~31のように固定ではなく、トランザクションがあった日のみ、つまり # SELECT TRANS_DATE FROM # (SELECT TRANS_DATE FROM INCOMING WHERE ACTIVE='Y' # UNION ALL # SELECT TRANS_DATE FROM OUTGOING WHERE ACTIVE='Y') T_DATE # group by TRANS_DATE ORDER BY 1 # でTRANS_DATE抽出しておきます # 結果をREPORT WRITEとかWEBを用いずに # TRANS_DATEが横方向に1行目に表され、 # 2行目1カラムは、アイテム、2カラム目はOPENING数量で、 # 3カラム以降はIN又はOUTの数量を表記したいのですが # JUL/8はトランザクションがありませんので表記されていません # 最後のカラムは、その月の現在までのSUMMARY # #   JUL/7  JUL/9           JUL # IN OUT IN OUT IN OUT CLOSE #    3 5   3 3 8  15 # # みなさんなら、どうSQLを書きますか、教えてください # # % % 入庫(_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量). % % 出庫(_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量). % % 締め用(_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量). % みなさんならどう書きますか :- 重複のない入出庫日付ならび(_重複のない入出庫日付ならび), 表を作成する(_重複のない入出庫日付ならび,_表), '入庫・出庫・締め用数量合計'(_入庫数量合計,_出庫数量合計,_締め用数量合計), 転置(_表,_転置された表), 表を出力する(_転置された表,_入庫数量合計,_出庫数量合計,_締め用数量合計). 重複のない入出庫日付ならび(_重複のない入出庫日付ならび) :- setof(_日付_1,[_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量] ^ ( 入庫(_入出庫,_締め番号,_日付_1,'Y',_アイテム,_数量)),_入庫日付ならび), setof(_日付_2,[_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量] ^ ( 出庫(_入出庫,_締め番号,_日付_2,'Y',_アイテム,_数量)),_出庫日付ならび), append(_入庫日付ならび,_出庫日付ならび,_入出庫日付ならび), setof(_日付,member(_日付,_入出庫日付ならび),_重複のない入出庫日付ならび). 表を作成する(_重複のない入出庫日付ならび,_表) :- findall([_日付,_入庫数量,_出庫数量],( member(_日付,_重複のない入出庫日付ならぴ), 入庫数量を得る(_日付,_入庫数量), 出庫数量を得る(_日付,_出庫数量), 表示パターン(_入庫数量,_出庫数量,_表示パターン)), _表). 入庫数量を得る(_日付,_入庫数量) :- 入庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_入庫数量),!. 入庫数量を得る(_日付,0.0). 出庫数量を得る(_日付,_出庫数量) :- 入庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_出庫数量),!. 出庫数量を得る(_日付,0.0). '入庫・出庫・締め用数量合計'(_入庫数量合計,_出庫数量合計,_締め用数量合計) :- findsum(_数量,( 入庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_数量)), _入庫数量合計), findsum(_数量,( 出庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_数量)), _出庫数量合計), findsum(_数量,( 締め用(_入出庫,_締め番号,_日付,'Y',_アイテム,_数量)), _締め用数量合計). 表示パターン(_入庫数量,0.0,1) :- \+(_入庫数量 = 0.0),!. 表示パターン(0.0,_出庫数量,2) :- \+(_出庫数量 = 0.0),!. 表示パターン(_,_,3). 表を出力する([_日付ならび,_パターンならび,_入庫数量ならび,_出庫数量ならび],_入庫数量合計,_出庫数量合計,_締め用数量合計) :- 日付を表示する(_日付ならび), '入庫・出庫・合計見出し'(_パターンならび), 数量ならびを表示する(_入庫数量ならび,_出庫数量ならび), '入庫数量合計・出庫数量合計・締め用数量合計表示'(_入庫数量合計,_出庫数量合計,_締め用数量合計). 日付を表示する([]) :- write('\n'). 日付を表示する([_日付|R]) :- 日付表示文字列(_日付,_日付表示文字列), write('%12c',[_日付表示文字列]), 日付を表示する(R). 日付表示文字列(_日付,_日付表示文字列) :- sub_atom(_日付,4,2,_月), sub_atom(_日付,6,2,_日), atomic_list_concat([_月,'/',_日],_日付表示文字列). '入庫・出庫・合計見出し'([]) :- writef(' 入庫 出庫 締め用 \n'). '入庫・出庫・合計見出し'([_パターン|R]) :- '入庫・出庫・合計見出し表示文字列'(_パターン,_表示文字列), writef('%t',[_表示文字列]), '入庫・出庫・合計見出し'(R). '入庫・出庫・合計見出し表示文字列'(1,' 入庫 '). '入庫・出庫・合計見出し表示文字列'(2,' 出庫 '). '入庫・出庫・合計見出し表示文字列'(3,' 入庫 出庫 '). 数量ならびの表示([]) :- 数量ならびを表示する([_入庫|R1],[_出庫|R2]) :- 数量表示文字列(_入庫数量,_出庫数量,_入庫表示文字列,_出庫表示文字列), writef(' %t %t ',[_入庫表示文字列,_出庫表示文字列]), 数量ならびを表示する(R1,R2). 数量表示文字列(0.0,_出庫数量,' ',_出庫表示文字列) :- swritef(_出荷表示文字列,' %4r ',[_出庫数量]),!. 数量表示文字列(0.0,_入庫数量,_入庫表示文字列,' ') :- swritef(_入庫表示文字列,' %4r ',[_入庫数量]),!. 数量表示文字列(_入荷数量,_出庫数量,_入庫数量文字列,_出庫表示文字列) :- swritef(_入庫表示文字列,' %4r ',[_入庫数量]), swritef(_出庫表示文字列,' %4r ',[_出庫数量]),!. '入庫数量合計・出庫数量合計・締め用数量合計表示'(_入庫数量合計,_出庫数量合計,_締め用数量合計) :- writef(' %4r %4r %4r\n',[_入庫数量合計,_出庫数量合計,_締め用数量合計]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/600 # # [1] 授業単元:C++ # [2] 問題文(含コード&リンク):文字列を入力し含まれる数字の数を調べるcount_num, # 含まれる大文字の数を調べるcount_up,含まれる小文字を調べるcount_lowをポインタを使って作れ # http://ime.nu/ideone.com/9YNeC # count_num(_文字列,_文字列に含まれる数字の数) :- 文字列を入力し含まれる数字の数を調べる(_文字列,_文字列に含まれる数字の数). 文字列を入力し含まれる数字の数を調べる(_文字列,_文字列に含まれる数字の数) :- count(( sub_atom(文字列,_,1,_,_文字), 数字(_文字)), _文字列に含まれる漢字の数). 数字(_文字) :- _文字 @>= '0', _文字 @=< '9'. count_up(_文字列,_文字列に含まれる大文字の数) :- 文字列を入力し含まれる大文字の数を調べる(_文字列,_文字列に含まれる大文字の数). 文字列を入力し含まれる大文字の数を調べる(_文字列,_文字列に含まれる大文字の数) :- count(( sub_atom(_文字列,_1,_,_文字), 大文字(_文字)), _文字列に含まれる大文字の数). 大文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. count_low(_文字列,_文字列に含まれる大文字の数) :- 文字列を入力し含まれる小文字の数を調べる(_文字列,_文字列に含まれる小文字の数). 文字列を入力し含まれる小文字の数を調べる(_文字列,_文字列に含まれる小文字の数) :- count(( sub_atom(_文字列,_1,_,_文字), 小文字(_文字)), _文字列に含まれる大文字の数). 小文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. % count/2 % % 私のように具体的な述語名を選択する場合、それなら抽象とはどう向き合うのかという % 課題を背負うことになる。たとえばここでは、 % % count_low(_文字列,_文字列に含まれる大文字の数) :- % 文字列を入力し含まれる小文字の数を調べる(_文字列,_文字列に含まれる小文字の数). % % 意味: count_lowとは、文字列を入力し含まれる小文字の数を調べる、ことだ。 % % としたが、 % % 文字列を入力し含まれる小文字の数を調べる(_文字列,_文字列に含まれる小文字の数) :- % count_low(_文字列,_文字列に含まれる小文字の数). % % 意味: 文字列を入力し含まれる小文字の数を調べるには、実は、count_lowすればよい。 % もあり得るに違いない。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/573 # # [1] 授業単元: STL # [2] 問題文(含コード&リンク): # 問 二つの値xとyを使用して差を返す関数形式マクロdiff(x,y)を使用し, # キーボードからint型の2つの数値n1とn2を入力した場合に、入力した2つの数値とその差を出力するmain関数のプログラムを作成しなさい。 # 問 四季を表す列挙体seasonを定義し、キーボードから0,1,2,3を入力した場合に、 # それぞれ"Spring", "Summer", "Fall", "Winter"と表示するプログラムを作成しなさい。ただし、enum season {Spring, Summer, Fall, Winter};を使用し、キーボードから0,1,2,3以外の数字が入力された場合には、入力し直す処理を含めなさい。 # 問 数字文字の出現回数の百分率を小数点以下1桁まで求め、 # '*'のグラフと共に表示するmain関数のプログラムを作成しなさい。 # 問 キーボードから入力した行数と空白以外の文字数を求め, # 行数と文字数を表示するmain関数のプログラムを作成しなさい。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。 # 'キーボードから入力した行数と空白以外の文字数を求め,行数と文字数を表示する。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。' :- 'キーボードから入力した'(Lines), '行数と空白以外の文字数を求め'(Lines,_行数,_空白以外の文字数), '行数と文字数を表示する'(_行数,_空白以外の文字数). キーボードから入力した([]) :- at_end_of_stream(user_input). キーボードから入力した([Line|R]) :- get_line(Line), キーボードから入力した(R). 行数と空白以外の文字数を求め(Lines,_行数,_空白以外の文字数) :- length(Lines,_行数), findsum(_一行の中にある空白以外の文字数,( member(_行,Lines), 一行の中にある空白以外の文字数(_行,_一行の中にある空白以外の文字数)), _空白以外の文字数). 一行の中にある空白以外の文字数(Line,_一行の中にある空白以外の文字数) :- count(( sub_atom(Line,_,1,_,_文字), \+(_文字 = ' ')), _一行の中にある空白以外の文字数). '行数と文字数を表示する'(_行数,_空白以外の文字数) :- writef('%t %t\n',[_行数,_空白以外の文字数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/646 # # 問題 # 与えられた文字列を先頭と末尾から削除していき二文字以下にせよ。 # 例 # world => r # konokodokonokodokonokokonoko => od # # % 題意からは外れるが。 与えられた文字列を先頭と末尾から削除していき二文字以下にする(_与えられた文字列,_二文字以下の文字列) :- sub_atom(_与えられた文字列,N,_文字列の文字数,N,_二文字以下の文字列), _文字列の文字数 =< 2,!. % それでよいものかどうかということ。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/646 # # 問題 # 与えられた文字列を先頭と末尾から削除していき二文字以下にせよ。 # 例 # world => r # konokodokonokodokonokokonoko => od # # 与えられた文字列を先頭と末尾から削除していき二文字以下にする(_文字列_1,_文字列) :- sub_atom(_文字列_1,1,_文字列の文字数,1,_文字列_2), _文字列の文字数 >= 1, 与えられた文字列を先頭と末尾から削除していき二文字以下にする(_文字列_2,_文字列). 与えられた文字列を先頭と末尾から削除していき二文字以下にする(_文字列,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/478 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 下記の実行結果のように、入力された文字列を構成している個々の文字が # (1) 小文字の英字であるのか # (2) 大文字の英字であるのか # (3) 英字以外であるのか # を判定するプログラムを作成せよ。 # 文字列 input を構成する文字 input[loop] が文字列の終わりで無い事を検証するために、 # while(input[loop] != '\0') を用いてください。 # '入力された文字列を構成している個々の文字が (1) 小文字の英字であるのか (2) 大文字の英字であるのか (3) 英字以外であるのかを判定する'(_文字列,_個々の文字,_判定) :- '入力された文字列を構成している個々の文字が(_文字列,_個々の文字), '(1) 小文字の英字であるのか (2) 大文字の英字であるのか (3) 英字以外であるのかを判定する'(_個々の文字,_判定). 入力された文字列を構成している個々の文字が(_文字列,_個々の文字) :- 入力された文字列を(_文字列), 構成している個々の文字が(_文字列,_個々の文字). 入力された文字列を(_文字列) :- write('文字列を入力してください : '), get_line(_文字列). 構成している個々の文字が(_文字列,_個々の文字) :- sub_atom(_文字列,_,1,_,_個々の文字). '(1) 小文字の英字であるのか (2) 大文字の英字であるのか (3) 英字以外であるのかを判定する'(_個々の文字,小文字の英字) :- 小文字の英字である(_個々の文字),!. '(1) 小文字の英字であるのか (2) 大文字の英字であるのか (3) 英字以外であるのかを判定する'(_個々の文字,大文字の英字) :- 大文字の英字である(_個々の文字),!. '(1) 小文字の英字であるのか (2) 大文字の英字であるのか (3) 英字以外であるのかを判定する'(_個々の文字,英字以外) :- 英字以外である(_文字). 小文字の英字である(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 大文字の英字である(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. 英字以外である(_文字) :- \+(小文字の英字である(_文字)), \+(大文字の英字である(_文字)). % 以下のサイトは atom_numbers(Atom,Numbers) :- atom(Atom), findall(N,( sub_atom(Atom,_,1,_,A), atom_number(A,N)), Numbers),!. atom_numbers(Var,Numbers) :- var(Var), list(Numbers), atomic_list_concat(Numbers,Var). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/633 # # 問題 # 13桁のISBNコードを検査せよ。 # 例 # 9784062772211 => OK # 9784150315684 => NG # # '13桁のISBNコードを検査せよ。'(_13桁のISBNコード) :- sub_atom(_13桁のISBNコード,0,12,1,_12桁の文字列), sub_atom(_13桁のISBNコード,12,1,0,_冗長符号), atom_chars(_12桁の文字列,_12要素の数字ならび), モジュラス10ウェイト3(_12要素の数字ならび,[1,3,1,3,1,3,1,3,1,3,1,3],0,_冗長符号). モジュラス10ウェイト3([],[],S,_冗長符号) :- _冗長符号整数 is 10 - (S mod 10), atom_number(_冗長符号,_冗長符号整数). モジュラス10ウェイト3([_数字|R1],[M|R2],S1,_冗長符号) :- atom_number(_数字,N), S2 is S1 + N * M, モジュラス10ウェイト3(R1,R2,S2,_冗長符号),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/366 # # # [1] プログラミング入門 # [2] 問題文 # 画面に my name is ******と表示する # プログラムを作成する。 # 一文字ずつゆっくりと表示するには # 表示ごとにfor文で無駄なループを入れるとよい # '画面に my name is ******と表示するプログラムを作成する。一文字ずつゆっくりと表示するには表示ごとにfor文で無駄なループを入れるとよい'(_名前) :- '画面に my name is と表示する'(_名前). '画面に名前を ******と一文字ずつゆっくりと表示する'(_名前). '画面に my name is と表示する' :- write('my name is '). '画面に名前を ******と一文字ずつゆっくりと表示する'(_名前) :- 画面に名前を一文字ずつ(_名前,_文字,_残り文字数), ゆっくりと, 表示する(_文字), _残り文字数 = 0. 画面に名前を一文字ずつ(_名前,_文字,_残り文字数) :- sub_atom(_名前,_,1,_残り文字数,_文字). ゆっくりと :- sleep(0.3). 表示する(_文字) :- writef('%t',[_文字]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/633 # # 問題 # 13桁のISBNコードを検査せよ。 # 例 # 9784062772211 => OK # 9784150315684 => NG # # '13桁のISBNコードを検査せよ。'(_13桁のISBNコード) :- sub_atom(_13桁のISBNコード,0,12,1,S1), sub_atom(_13桁のISBNコード,12,1,0,_冗長符号), モジュラス10ウェイト3(S1,_冗長符号),!. % モジュラス10ウェイト3/2 % 以下のサイトは # 出典:: 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/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/1276873238/611 # # 問題 # 与えられた文字列の奇数番目を大文字に偶数番目を小文字にせよ。 # 例 # Hello => HeLlO # end => EnD # # '与えられた文字列の奇数番目を大文字に偶数番目を小文字にせよ。'(_与えられた文字列,_奇数番目を大文字に偶数番目を小文字にした文字列) :- findall(_変換した文字,( sub_atom(_文字列,_0起点位置,1,_,_文字), 奇数番目を大文字に偶数番目を小文字に(_0起点位置,_文字,_変換した文字)), _奇数番目を大文字に偶数番目を小文字にした文字ならび), atom_chars(_奇数番目を大文字に偶数番目を小文字にした文字列,_奇数番目を大文字に偶数番目を小文字にした文字ならび). 奇数番目を大文字に偶数番目を小文字に(_0起点位置,_文字,_小文字) :- 奇数番目を(_0起点位置), 小文字に(_文字,_小文字). 奇数番目を大文字に偶数番目を小文字に(_0起点位置,_文字,_大文字) :- 偶数番目を(_0起点位置), 大文字に(_文字,_大文字). 奇数番目を(_0起点位置) :- 1 is (_0起点位置 + 1) mod 2. 偶数番目を(_0起点位置) :- 0 is (_0起点位置 + 1) mod 2. 小文字に(_文字,_小文字) :- to_lower(_文字,_小文字). 大文字に(_文字,_大文字) :- to_upper(_文字,_大文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/930 # # ((角|丸)ゴシック|明朝) # # こういった入れ子?を書くと例えば丸ゴシックにマッチしますが丸にもマッチします # どのように書けばよいのでしょう '((角|丸)ゴシック|明朝)の内、角ゴシック|丸ゴシック|明朝に適合する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,_適合文字列_1), '診断: 適合'(_適合文字列_1), sub_atom(_文字列,0,S,_,_前文字列_1), S_2 is S + Len, sub_atom(_文字列,S_2,R,0,_後文字列_1), '((角|丸)ゴシック|明朝)の内、角ゴシック|丸ゴシック|明朝に適合する'(_文字列,S,Len,R,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列). '((角|丸)ゴシック|明朝)の内、角ゴシック|丸ゴシック|明朝に適合する'(_文字列,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). '((角|丸)ゴシック|明朝)の内、角ゴシック|丸ゴシック|明朝に適合する'(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- '((角|丸)ゴシック|明朝)の内、角ゴシック|丸ゴシック|明朝に適合する'(_後文字列_1,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). '診断: 適合'(_文字列) :- 接頭候補(_接頭候補), atomic_list_concat([_接頭候補,ゴシック],_文字列). '診断: 適合'(明朝). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/136 # # [1] 授業単元: 情報B # [2] 問題文: アルファベット1文字目は1文字、2文字目は2文字、n文字目は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,n,o,p,q,r,s,t,u,v,w,x,y,z]). 'アルファベット1文字目は1文字、2文字目は2文字、n文字目はn文字…分ずれるシーザー暗号を暗号化する'(_文字列,_暗号化した文字列) :- findall(_暗号化した文字,( sub_atom(_文字列,S,1,_,_文字), S_2 is S + 1, 文字の暗号化(S_2,_文字,_暗号化した文字)), _暗号化した文字ならび), atomic_list_concat(_暗号化した文字ならび,_暗号化した文字列). 'アルファベット1文字目は1文字、2文字目は2文字、n文字目はn文字…分ずれるシーザー暗号を復号化する'(_文字列,_復号化した文字列) :- findall(_暗号化した文字,( sub_atom(_文字列,S,1,_,_文字), S_2 is S + 1, 文字の復号化(S_2,_文字,_暗号化した文字)), _暗号化した文字ならび), atomic_list_concat(_暗号化した文字ならび,_暗号化した文字列). 文字の暗号化(S,_文字,_暗号化した文字) :- アルファベット(L), nth1(Nth,L,_文字), ならびの回転(左方向,S_2,L,L1), nth1(Nth,L1,_暗号化した文字),!. 文字の復号化(S,_文字,_復号化した文字) :- アルファベット(L), nth1(Nth,L,_文字), ならびの回転(右方向,S_2,L,L1), nth1(Nth,L1,_復号化した文字),!. % ならびの回転/4 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/134 # # 内容: # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/t5qL2 # # 名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し, # BMI指数の小さい順に並べた線形リストを作成した上で, # BMI指数の小さい順にBMI指数,身長,体重,名前を出力するプログラムを作成せよ。 # ただし,入力件数は不定とし,名前の1文字目に'0'を入れることでデータ入力を終了するものとする。 # # BMI指数は以下の式で算出できる。 # BMI = 体重[kg]/(身長[m])^2 '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,BMI指数の小さい順に並べた線形リストを作成した上で,BMI指数の小さい順にBMI指数,身長,体重,名前を出力する。ただし,入力件数は不定とし,名前の1文字目に"0"を入れることでデータ入力を終了するものとする' :- '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト), 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(_BMI指数の小さい順並べた線形リスト). '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト) :- findall([_BMI指数,_名前,_身長,_体重],( 名前を得る(_名前), ( sub_atom(_名前,0,1,_,'0'),!,fail; '身長[cm],体重[kg]を入力'(_身長,_体重), 'BMI指数を算出する'(_身長,_体重,_BMI指数))), _BMI指数を鍵とした線形リスト). 名前を得る(_名前) :- write('名前(半角英字によるローマ字表記)を入力してください : '), get_line(_名前), 半角英字によるローマ字表記(_名前). 名前を得る(_名前) :- 名前を得る(_名前). '身長[cm],体重[kg]を入力'(_身長,_体重) :- 数を得る('身長[cm]',_身長), 数を得る('体重[kg]',_体重),!. 'BMI指数を算出する'(_身長,_体重,_BMI指数) :- _BMI指数 is _体重 / (_身長 ^ 2). 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト) :- sort(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([]). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([[_BMI指数,_氏名,_身長,_体重]|R]) :- writef('%t,%t,%t,%t\n',[_BMI指数,_身長,_体重,_名前]), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(R). 半角英字によるローマ字表記(_名前) :- findall(_文字,( sub_atom(_名前,_,1,_,_文字), 空白または半角英字の文字(_文字)), _空白または半角英字であった文字ならび), atomic_list_concat(_空白または半角英字であった文字ならび,_名前). 空白または半角英字の文字(' '). 空白または半角英字の文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. 空白または半角英字の文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. % 数を得る/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/134 # # 内容: # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/t5qL2 # # 名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し, # BMI指数の小さい順に並べた線形リストを作成した上で, # BMI指数の小さい順にBMI指数,身長,体重,名前を出力するプログラムを作成せよ。 # ただし,入力件数は不定とし,名前の1文字目に'0'を入れることでデータ入力を終了するものとする。 # # BMI指数は以下の式で算出できる。 # BMI = 体重[kg]/(身長[m])^2 '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,BMI指数の小さい順に並べた線形リストを作成した上で,BMI指数の小さい順にBMI指数,身長,体重,名前を出力する。ただし,入力件数は不定とし,名前の1文字目に"0"を入れることでデータ入力を終了するものとする' :- '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト), 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(_BMI指数の小さい順並べた線形リスト). '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト) :- findall([_BMI指数,_名前,_身長,_体重],( 名前を得る(_名前), ( sub_atom(_名前,0,1,_,'0'),!,fail; '身長[cm],体重[kg]を入力'(_身長,_体重), 'BMI指数を算出する'(_身長,_体重,_BMI指数))), _BMI指数を鍵とした線形リスト). 名前を得る(_名前) :- write('名前(半角英字によるローマ字表記)を入力してください : '), get_line(_名前), 半角英字によるローマ字表記(_名前). 名前を得る(_名前) :- 名前を得る(_名前). '身長[cm],体重[kg]を入力'(_身長,_体重) :- 数を得る('身長[cm]',_身長), 数を得る('体重[kg]',_体重),!. 'BMI指数を算出する'(_身長,_体重,_BMI指数) :- _BMI指数 is _体重 / (_身長 ^ 2). 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト) :- sort(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([]). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([[_BMI指数,_氏名,_身長,_体重]|R]) :- writef('%t,%t,%t,%t\n',[_BMI指数,_身長,_体重,_名前]), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(R). 半角英字によるローマ字表記(_名前) :- findall(_文字,( sub_atom(_名前,_,1,_,_文字), 空白または半角英字の文字(_文字)), _空白または半角英字であった文字ならび), atomic_list_concat(_空白または半角英字であった文字ならび,_名前). 空白または半角英字の文字(' '). 空白または半角英字の文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. 空白または半角英字の文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. % 数を得る/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/61 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク):違うPCからテキストファイルをダウンロードするプログラムを作れ。 #               サーバでファイルを一行ずつ読み込み送信する。クライアントでは受信をしてファイルに書き込む。 # server :- open_server(Socket,NewSocket), open_server_stream(NewSocket,Instream,Outstream), server_to_client(Insteam,Outstream,Instream_2), close_server_stream(Instream,Outstream), close_server_socket(Socket,NewSocket). open_server(Port,Socket,NewSocket) :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket). open_server_stream(Newsocket,Instream,Outstream) :- open(NewSocket,read,Instream), open(NewSocket,write,Outstream). server_to_client(Insteam,Outstream,Instream_2) :- get_file_name(Instream,File), open(File,read,Instream_2), server_to_client(Instream_2,Outstream), close(Instream_2). get_file_name(Instream,File,Outstream) :- get_line(Instream,Line), sub_atom(Line,0,4,_,'GET '), split(Line,['"'],[_,File|_]), write(Outstream,'OK filename\n\n'). server_to_client(Instream_2,Outstream) :- at_end_of_stream(Instream_2),!. server_to_client(Instream_2,Outstream) :- get_char(Instream_2,Char), put_char(Outstream,Char), server_to_client(Instream_2,Outstream). close_server_stream(Instream,Outstream) :- close(Instream), close(Outstream). close_server_socket(Socket,NewSocket) :- socket_shutdown(Socket), socket_shutdown(NewSocket). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% client(Host,Port,File) :- open_client(Host,Port,Socket), client_server_to_client(Socket,File), close_client(Socket,Instream,Outstream). open_client(Host,Port,Socket,Instream,Outstream) :- socket(internet,stream,Socket), socket_connect(Socket, Host : Port), open(Socket,read,Instream), open(Socket,write,Outstream). client_server_to_clieint(Socket,File,Instream,Outstream) :- writef(Outstream,'%t\n',[File]), clieint_server_to_client(Instream,Outstream,Outstream_2). client_server_to_client(Instream,Outstream,File,Outstream_2) :- open(File,write,Outstream_2), client_セッション_1(Instream,Outstream), client_セッション_2(Instream,Outstream,Outstream_2), close(Outstream_2). client_セッション_2(Instream,Outstream_2) :- at_end_of_stream(Instream),!. client_セッション_2(Instream,Outstream_2) :- get_line(Instream,Line), writef(Outstream_2'%t\n',[Line]), client_セッション_2(Instream,Outstream_2). clieint_セッション_1(Instream,Outstream) :- writef('GET %t\n\n',[File]), get_line(Instream,Line_1), get_line(Instream,''), sub_atom(Line_1,0,4,_,'GET '). close_client(Socket,Instream,Outstream) :- close(Instream), close(Outstream), socket_shutdown(Socket). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/61 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク):違うPCからテキストファイルをダウンロードするプログラムを作れ。 #               サーバでファイルを一行ずつ読み込み送信する。クライアントでは受信をしてファイルに書き込む。 # server :- open_server(Socket,NewSocket), open_server_stream(NewSocket,Instream,Outstream), server_to_client(Insteam,Outstream,Instream_2), close_server_stream(Instream,Outstream), close_server_socket(Socket,NewSocket). open_server(Port,Socket,NewSocket) :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket). open_server_stream(Newsocket,Instream,Outstream) :- open(NewSocket,read,Instream), open(NewSocket,write,Outstream). server_to_client(Insteam,Outstream,Instream_2) :- get_file_name(Instream,File), open(File,read,Instream_2), server_to_client(Instream_2,Outstream), close(Instream_2). get_file_name(Instream,File,Outstream) :- get_line(Instream,Line), sub_atom(Line,0,4,_,'GET '), split(Line,['"'],[_,File|_]), write(Outstream,'OK filename\n\n'). server_to_client(Instream_2,Outstream) :- at_end_of_stream(Instream_2),!. server_to_client(Instream_2,Outstream) :- get_char(Instream_2,Char), put_char(Outstream,Char), server_to_client(Instream_2,Outstream). close_server_stream(Instream,Outstream) :- close(Instream), close(Outstream). close_server_socket(Socket,NewSocket) :- socket_shutdown(Socket), socket_shutdown(NewSocket). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% client(Host,Port,File) :- open_client(Host,Port,Socket), client_server_to_client(Socket,File), close_client(Socket,Instream,Outstream). open_client(Host,Port,Socket,Instream,Outstream) :- socket(internet,stream,Socket), socket_connect(Socket, Host : Port), open(Socket,read,Instream), open(Socket,write,Outstream). client_server_to_clieint(Socket,File,Instream,Outstream) :- writef(Outstream,'%t\n',[File]), clieint_server_to_client(Instream,Outstream,Outstream_2). client_server_to_client(Instream,Outstream,File,Outstream_2) :- open(File,write,Outstream_2), client_セッション_1(Instream,Outstream), client_セッション_2(Instream,Outstream,Outstream_2), close(Outstream_2). client_セッション_2(Instream,Outstream_2) :- at_end_of_stream(Instream),!. client_セッション_2(Instream,Outstream_2) :- get_line(Instream,Line), writef(Outstream_2'%t\n',[Line]), client_セッション_2(Instream,Outstream_2). clieint_セッション_1(Instream,Outstream) :- writef('GET %t\n\n',[File]), get_line(Instream,Line_1), get_line(Instream,''), sub_atom(Line_1,0,4,_,'GET '). close_client(Socket,Instream,Outstream) :- close(Instream), close(Outstream), socket_shutdown(Socket). % 以下のサイトは # 出典:: 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/1335517816/978 # # [1] 授業単元:2次元配列 # [2] 問題文(含コード&リンク): # 新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。 # 出発駅と到着駅をそれぞれ駅番号で入力し,料金を表示するプログラムを作成しなさい。 # なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする。 # 但し、料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了するものとする。 #       新大阪  京都 名古屋 新横浜  # 東京 14,920 14,390 11,540 3,180 # 新横浜 14,600 13,660 10,910 # 名古屋 6,840 6,100 # 京都 3,240 # # 'のぞみ料金表を"http://nojiriko.asia/prolog/nozomi_ryoukinhyo.txt"から読み取り、述語 料金表/1 を定義する' :- get_lines('http://nojiriko.asia/prolog/nozomi_ryoukinhyo.txt',Lines), カンマを取り除く(Lines,_カンマを取り除いたLines), '述語 料金表/1 を定義する'(_カンマを取り除いたLines,_料金表), assertz(料金表(_料金表)). カンマを取り除く([],[]). カンマを取り除く([_行|R1],[_行_2|R2]) :- findall(_文字,( sub_atom(_行,_,1,_,_文字), \+(_文字=',')), L), atom_chars(_行_2,L), カンマを取り除く(R1,R2). '述語 料金表/1 を定義する'(_カンマを取り除いたLines,_料金表) :- findall(L,( member(Line,Lines), split(Line,[' '],L)), LL), LL = [L1|R], _料金表 = [[''|L1]|R]. % split/3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 料金表([['',新大阪,京都,名古屋,新横浜], [東京,14920,14390,11540,3180], [新横浜,14600,13660,10910], [名古屋,6840,6100], [京都,3240]]). 料金表からのぞみ料金述語を定義する :- 料金表(_料金表), 料金表からのぞみ料金述語を定義する(_料金表). 料金表からのぞみ料金述語を定義する([[_|_行き先ならび]|_出発点付き料金表]) :- 新幹線のぞみ料金述語の定義する(_行き先ならび,_出発点付き料金表). 新幹線のぞみ料金述語を定義する(_,[]). 新幹線のぞみ料金述語を定義する(_行き先ならび,[[_出発点|_料金ならび]|R]) :- 出発点からの料金を定義する(_出発点,_行き先ならび,_料金ならび), 新幹線のぞみ料金述語を定義する(_行き先ならび,R). 出発点からの料金を定義する(_,_,[]). 出発点からの料金を定義する(_出発点,[_行き先|R1],[_料金|R2]) :- assertz(新幹線のぞみ料金(_出発点,_行き先,_料金)), 出発点からの料金を定義する(_出発点,R1,R2). 'なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする' :- split('なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする',[が,と,','],L), append(_,[',',_駅名,'が,N|_],L). assertz(駅番号(_駅名,N)), fail. 'なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/947 # # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク): # 配列strに文字列を入力した後、 # 最初の2文字を取り除いた文字列を表示せよ # 参考:http://kie.nu/cCu # '文字列を入力した後、最初の2文字を取り除いた文字列を表示する' :- 文字列を入力した後(_文字列), 最初の2文字を取り除いた文字列を(_文字列,_副文字列), 表示する(_副文字列). 文字列を入力した後(_文字列) :- write('文字列を入力してください : '), get_line(_文字列). 最初の2文字を取り除いた文字列を(_文字列,_副文字列) :- sub_atom(_文字列,2,_,_,_副文字列). 表示する(_文字列) :- writef('%t\n',[_文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/712 # # よろしくお願いします! # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク): # 入力した2進数の数値について、10進数表記に直す計算を行いたい。 # 以下に示すように、下の桁から順に2をかける回数を増やすように計算を行い、最終的な結果を表示せよ。 # なお、再帰は用いなくてよい。 # 参考:ttp://kie.nu/bOw #    ttp://kie.nu/bOx # '入力した2進数の数値について、10進数表記に直す計算を行い、最終的な結果を表示する' :- 入力した2進数の数値について(_入力した2進数の数値ならび), '下の桁から順に2をかける回数を増やすように計算を行い、10進数表記に直す'(_入力した2進数の数値ならび,_10進数表記), 最終的な結果を表示する(_10進数表記). 入力した2進数の数値について(_入力した2進数の数値ならび) :- write('2進数を0か1からなる数字列として入力してください : '), get_line(Line), 入力した2進数の数値表現診断(Line,_入力した2進数の数値ならび),!. 入力した2進数の数値について(_入力した2進数の数値ならび) :- 入力した2進数の数値について(_入力した2進数の数値ならび). 入力した2進数の数値表現診断(Line,_入力した2進数の数値ならび) :- findall(_文字,( sub_atom(Line,_,1,_,_文字)), L), '2進数文字ならびを数値ならびに変換する'(L,_入力した2進数の数値ならび),!. 要素が0または1のみの場合数値に変換する( 入力した2進数の数値表現診断(Line,_入力した2進数の数値ならび) :- writef('入力された %t には2進数として不適切な文字が含まれています。再入力をお願いします。\n',[Line]), fail. '2進数文字ならびを数値ならびに変換する'(['0',b|R],_入力した2進数の数値ならび) :- 要素が0または1のみの場合数値に変換する(R,_入力した2進数の数値ならび),!. '2進数文字ならびを数値ならびに変換する'(L,_入力した2進数の数値ならび) :- 要素が0または1のみの場合数値に変換する(L,_入力した2進数の数値ならび). 要素が0または1のみの場合数値に変換する([]). 要素が0または1のみの場合数値に変換する(['0'|R1],[0|R2]) :- 要素が0または1のみの場合数値に変換する(R1,R2). 要素が0または1のみの場合数値に変換する(['1'|R1],[1|R1]) :- 要素が0または1のみの場合数値に変換する(R1,R2). '下の桁から順に2をかける回数を増やすように計算を行い、10進数表記に直す'(_入力した2進数の数値ならび,_10進数表記) :- 下の桁から取り出しやすいように逆順に並べ直す(_入力した2進数の数値ならび,_逆順に並べ直した2進数の数値ならび), '下の桁から順に2をかける回数を増やすように計算を行い'(_逆順に並べ直した2進数の数値ならび,0,_10進数), '10進数表記に直す'(_10進数,_10進数表記). '下の桁から順に2をかける回数を増やすように計算を行い'([],_,0). '下の桁から順に2をかける回数を増やすように計算を行い'([N|R],M,X) :- _掛ける数 is truncate(2 ^ M), M_2 is M + 1, '下の桁から順に2をかける回数を増やすように計算を行い'(R,M_2,X_2), X is (N * _掛ける数) + _X_2. 下の桁から取り出しやすいように逆順に並べ直す(_入力した2進数の数値ならび,_逆順に並べ直した2進数の数値ならび) :- reverse(_入力した2進数の数値ならび,_逆順に並べ直した2進数の数値ならび). '10進数表記に直す'(_10進数,_10進数表記) :- swritef(_10進数表記,'%t',[_10進数]). 最終的な結果を表示する(_10進数表記) :- writef('%t\n',[_10進数表記]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/703 # # # レポート課題 # # 標準入力で与えた単語が,指定ファイル中に出現した回数を出力するプログラムを作成せよ. # 単語データは以下の構造体を使用し,ハッシュを使用すること # ハッシュ関数は各自で定義してよい # 単語は,スペースまたは改行で区切られる文字列とする # ハッシュのサイズはコマンド引数から指定し,作成したハッシュテーブルの偏り具合を表示すること # # struct word { # char *str; # int count; # struct word *next; # }; # 実行例 # # $ ./wordcount 13 api.txt # [0]:147 [1]:133 [2]:170 [3]:137[4]:133[5]:132 [6]:160 [7]:167 [8]:136 [9]:154 [10]:142 [11]:149 [12]:125 # Word => API # API: 10 # Word => virtual # virtual: 33 # Word => 0 # $ # # # お願いします。 # # '標準入力で与えた単語が,指定ファイル中に出現した回数を出力する'(_指定ファイル) :- 標準入力で与えた単語が(_標準入力で与えた単語), 指定ファイル中に出現した回数を(_指定ファイル,_標準入力で与えた単語,_出現した回数), 出力する(_指定ファイル,_標準入力で与えた単語,_出現した回数). 標準入力で与えた単語が(_標準入力で与えた単語) :- get_line(_標準入力で与えた単語). 指定ファイル中に出現した回数を(_指定ファイル,_標準入力で与えた単語,_指定ファイル中に出現した回数) :- get_lines(_指定ファイル,Lines), count(( member(_行,Lines), sub_atom(_行,_,_,_,_標準入力で与えた単語)), _指定ファイル中に出現した回数). 出力する(_指定ファイル,_標準入力で与えた単語,_指定ファイル中に出現した回数) :- writef('単語 %t が ファイル "%t" 中に出現した回数は %t です。\n',[_標準入力で与えた単語,_指定ファイル,_指定ファイル中に出現した回数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- get_line(_文字列), findsum([A,B,C],( sub_atom(_文字列,_,1,_,_文字), 文字種判定(_文字,A,B,C)), [_英字の数,_数字の数,_その他の文字の数]), writef('英字の数は %t,数字の数は %t,その他の文字の数は %t\n',[_英字の数,_数字の数,_その他の文字の数]). 文字種判定(_文字,1,0,0) :- 英字(_文字),!. 文字種判定(_文字,0,1,0) :- 数字(_文字),!. 文字種判定(_文字,0,0,1). % findsum/3 % 英字/1 % 数字/1 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- get_line(_文字列), count((sub_atom(_文字列,_,1,_,_文字),英字(_文字)),_英字の数), count((sub_atom(_文字列,_,1,_,_文字),数字(_文字)),_数字の数), count((sub_atom(_文字列,_,1,_,_文字),\+(英字(_文字)),\+(数字(_文字))),_その他の文字の数), writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). % count/2 % 説明的でない述語表現。行き止まりの述語がならぶ。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- get_line(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- count((sub_atom(_文字列,_,1,_,_文字),英字(_文字)),_英字の数), count((sub_atom(_文字列,_,1,_,_文字),数字(_文字)),_数字の数), count((sub_atom(_文字列,_,1,_,_文字),\+(英字(_文字)),\+(数字(_文字))),_その他の文字の数). % count/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力する。'(_文字列). '文字列を入力し'(_文字列) :- get_line(_文字列). 'その文字列に含まれる英字、数字、その他の文字の数を出力する'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力する(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- count((sub_atom(_文字列,_,1,_,_文字),英字(_文字)),_英字の数), count((sub_atom(_文字列,_,1,_,_文字),数字(_文字)),_数字の数), count((sub_atom(_文字列,_,1,_,_文字),\+(英字(_文字)),\+(数字(_文字))),_その他の文字の数). 英字(_英字) :- _英字 @>= 'a', _英字 @=< 'z',!. 英字(_英字) :- _英字 @>= 'A', _英字 @=< 'Z'. 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. 出力する(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). % count/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力する。'(_文字列). '文字列を入力し'(_文字列) :- get_line(_文字列). 'その文字列に含まれる英字、数字、その他の文字の数を出力する'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力する(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- findall(_文字種,( sub_atom(_文字列,_,1,_,_文字), 文字種判定(_文字,_文字種)), L), count(member(英,L),_英字の数), count(member(数,L),_数字の数), count(member(他,L),_その他の文字の数). 文字種判定(_英字,英) :- _英字 @>= 'a', _英字 @=< 'z',!. 文字種判定(_英字,英) :- _英字 @>= 'A', _英字 @=< 'Z'. 文字種判定(_数字,数) :- _数字 @>= '0', _数字 @=< '9'. 文字種判定(_その他の文字,他) :- \+(英字(_その他の文字)), \+(数字(_その他の文字)). 出力する(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). % count/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力する。'(_文字列). '文字列を入力し'(_文字列) :- get_line(_文字列). 'その文字列に含まれる英字、数字、その他の文字の数を出力する'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,0,0,0,_英字の数,_数字の数,_その他の文字の数), 出力する(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'('',_英字の数,_数字の数,_その他の文字の数,_英字の数,_数字の数,_その他の文字の数) :- !. 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数_1,_数字の数_1,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数) :- sub_atom(_文字列,0,1,_残り文字数,_文字), sub_atom(_文字列,1,_残り文字数,0,_残り文字列), 文字数加算(_文字,_英字の数_1,_数字の数_1,_その他の文字の数_1,_英字の数_2,_数字の数_2,_その他の文字の数_2), 'その文字列に含まれる英字、数字、その他の文字の数を'(_残り文字列,_英字の数_2,_数字の数_2,_その他の文字の数_2,_英字の数,_数字の数,_その他の文字の数), 文字数加算(_文字,_英字の数_1,_数字の数,_その他の文字の数,_英字の数,_数字の数,_その他の文字の数) :- 英字(_文字), _英字の数 is _英字の数_1 + 1. 文字数加算(_文字,_英字の数,_数字の数_1,_その他の文字の数,_英字の数,_数字の数,_その他の文字の数) :- 数字(_文字), _数字の数 is _数字の数_1 + 1. 文字数加算(_文字,_英字の数,_数字の数,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数) :- \+(英字(_文字)), \+(数字(_文字)), _その他の文字の数 is _その他の文字の数_1 + 1. 出力する(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). 英字(_英字) :- _英字 @>= 'a', _英字 @=< 'z',!. 英字(_英字) :- _英字 @>= 'A', _英字 @=< 'Z'. 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力する。'(_文字列). '文字列を入力し'(_文字列) :- get_line(_文字列). 'その文字列に含まれる英字、数字、その他の文字の数を出力する'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力する(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'('',0,0,0). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- sub_atom(_文字列,0,1,_残り文字数,_文字), sub_atom(_文字列,1,_残り文字数,0,_残り文字列), 'その文字列に含まれる英字、数字、その他の文字の数を'(_残り文字列,_英字の数_1,_数字の数_1,_その他の文字の数_1), 文字数加算(_文字,_英字の数_1,_数字の数_1,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数). 文字数加算(_文字,_英字の数_1,_数字の数,_その他の文字の数,_英字の数,_数字の数,_その他の文字の数) :- 英字(_文字), _英字の数 is _英字の数_1 + 1. 文字数加算(_文字,_英字の数,_数字の数_1,_その他の文字の数,_英字の数,_数字の数,_その他の文字の数) :- 数字(_文字), _数字の数 is _数字の数_1 + 1. 文字数加算(_文字,_英字の数,_数字の数,_その他の文字の数_1,_英字の数,_数字の数,_その他の文字の数) :- \+(英字(_文字)), \+(数字(_文字)), _その他の文字の数 is _その他の文字の数_1 + 1. 出力する(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). 英字(_英字) :- _英字 @>= 'a', _英字 @=< 'z',!. 英字(_英字) :- _英字 @>= 'A', _英字 @=< 'Z'. 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/488 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/8gKIcGy2 # 上記のプログラムを参考にし、文字型配列moji[15]を宣言し、初期値として"one-two-three"を代入すると # "one,two,three"と出力されるプログラムを作成しなさい。 # '文字列中の-を,に変換する'(_文字列,_変換された文字列) :- findall(_文字_1,( sub_atom(_文字列,_,1,_,_文字), '-を,に変換する'(_文字,_文字_1)), Chars), atom_chars(_変換された文字列,Chars). '-を,に変換する'('-',',') :- !. '-を,に変換する'(_文字,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/501 # # ../test/read.cgi/tech/1335517816/496 ../test/read.cgi/tech/1335517816/498 # ありがとうございます。 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、 # リターンキーを押すと数字のみ#に置き換えられた文字列が出力されるプログラムを作成しなさい。 # 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、リターンキーを押すと数字のみ#に置き換えられた文字列が出力される' :- 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列), '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列), 出力される(_置き換えられた文字列). 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列) :- length(Ln,48), get_char(_文字), 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(Ln,_文字,_文字ならび), atom_chars(_文字列,_文字ならび). 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_,'\n',[]) :- !. 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'([_],_文字,[_文字]) :- !. 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'([_|Ln],_文字,[_文字|R]) :- 'アルファベット、数字、空白が混在した文字'(_文字_2), 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(Ln,_文字_2,R). 'アルファベット、数字、空白が混在した文字'(_文字) :- get_char(_文字), 'アルファベット、数字、空白が混在した文字診断'(_文字),!. 'アルファベット、数字、空白が混在した文字'(_文字) :- 'アルファベット、数字、空白が混在した文字'(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- アルファベット(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 数字(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 空白(_文字). アルファベット(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. アルファベット(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 数字(_文字) :- member(_文字,['0','1','2','3','4','5','6','7','8','9']). 空白(' '). '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列) :- findall(_数字のみ置き換えられた文字,( sub_atom(_文字列,_,1,_,_文字), '数字のみ#の置き換える'(_文字,_数字のみ置き換えられた文字)), L), atomic_list_concat(L,_置き換えられた文字列). '数字のみ#の置き換える'(_文字,'#') :- 数字(_文字),!. '数字のみ#の置き換える'(_文字,_文字). 出力される(_置き換えられた文字列) :- writef('置き換えられた文字列 = "%t"\n',[_置き換えられた文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/501 # # ../test/read.cgi/tech/1335517816/496 ../test/read.cgi/tech/1335517816/498 # ありがとうございます。 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、 # リターンキーを押すと数字のみ#に置き換えられた文字列が出力されるプログラムを作成しなさい。 # 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、リターンキーを押すと数字のみ#に置き換えられた文字列が出力される' :- 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列), '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列), 出力される(_置き換えられた文字列). 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列) :- length(L,48), findall(_文字,( append(L0,[_|_],L), 'アルファベット、数字、空白が混在した文字'(_文字), ( _文字='\n',!,fail; true)), _文字ならび), atom_chars(_文字列,_文字ならび). 'アルファベット、数字、空白が混在した文字'(_文字) :- get_char(_文字), 'アルファベット、数字、空白が混在した文字診断'(_文字),!. 'アルファベット、数字、空白が混在した文字'(_文字) :- 'アルファベット、数字、空白が混在した文字'(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- アルファベット(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 数字(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 空白(_文字). アルファベット(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. アルファベット(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 数字(_文字) :- member(_文字,['0','1','2','3','4','5','6','7','8','9']). 空白(' '). '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列) :- findall(_数字のみ置き換えられた文字,( sub_atom(_文字列,_,1,_,_文字), '数字のみ#の置き換える'(_文字,_数字のみ置き換えられた文字)), L), atomic_list_concat(L,_置き換えられた文字列). '数字のみ#の置き換える'(_文字,'#') :- 数字(_文字),!. '数字のみ#の置き換える'(_文字,_文字). 出力される(_置き換えられた文字列) :- writef('置き換えられた文字列 = "%t"\n',[_置き換えられた文字列]). % 以下のサイトは search(_文字列,_選択範囲起点,_選択範囲中央,_選択範囲終点,S1,S2,S3,L1,L2,L3) :- sub_atom_search(_文字列,_選択範囲起点,_選択範囲中央,_選択範囲終点,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- list(_選択範囲起点ならび), list(_選択範囲終点ならび), atom_chars(_選択範囲起点,_選択範囲起点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- atom(_選択範囲起点), list(_選択範囲終点ならび), atom_chars(_選択範囲起点,_選択範囲起点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点,S1,S2,S3,L1,L2,L3) :- list(_選択範囲起点ならび), atom(_選択範囲終点), atom_chars(_選択範囲終点,_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点,_選択範囲中央,_選択範囲終点,S1,S2,S3,L1,L2,L3) :- atom(_選択範囲起点), atom(_選択範囲終点), atom_chars(_選択範囲起点,_選択範囲起点ならび), atom_chars(_選択範囲終点,_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- var(_選択範囲起点ならび), list(_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- list(_選択範囲起点ならび), var(_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点,S1,S2,S3,L1,L2,L3) :- var(_選択範囲起点ならび), atom(_選択範囲終点ならび), atom_chars(_選択範囲終点,_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- atom(_選択範囲起点), var(_選択範囲終点ならび), atom_chars(_選択範囲起点,_選択範囲起点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- var(_選択範囲起点ならび), var(_選択範囲終点ならび), sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3). sub_atom_search_list(_文字列,_選択範囲起点ならび,_選択範囲中央,_選択範囲終点ならび,S1,S2,S3,L1,L2,L3) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(_選択範囲起点ならび,_選択範囲中央ならび,_選択範囲終点ならび,L2), \+(append(_,_選択範囲起点ならび,_,_選択範囲中央ならび)), \+(append(_,_選択範囲終点ならび,_,_選択範囲中央ならび)), atom_chars(_選択範囲中央,_選択範囲中央ならび). % sub_atom/10 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/792 # # ABCが登場したらその後に登場する全てのDEFをXYZへ置換するにはどうしたらいいのん? # # xkdmeABCidkDEFledxaoDEFasdDEF # ↓ # xkdmeABCidkXYZledxaoXYZasdXYZ # # 'ABCが登場したらその後に登場する全てのDEFをXYZへ置換するにはどうしたらいいのん? '(_文字列,_置換された文字列) :- sub_atom(_文字列,S1,'ABC',S2),!, その後に登場する全てのDEFをXYZへ置換する(S2,S3), atom_list_concat([S1,'ABC',S3],_置換された文字列). 'ABCが登場したらその後に登場する全てのDEFをXYZへ置換するにはどうしたらいいのん? '(_文字列,_文字列). その後に登場する全てのDEFをXYZへ置換する(_文字列,_置換された文字列) :- 決定性の全置換(_文字列,'DEF','XYZ',_置換された文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 決定性の全置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- sub_atom(_文字列,Start,Length,Rest,_置換対象文字列), sub_atom(_文字列,0,Start,_,S1), Start_S3 is Start + Length, sub_atom(_文字列,Start_S3,Rest,0,S3), 決定性の全置換(S3,_置換対象文字列,_置換文字列,_置換された文字列_2), atomic_list_concat([S1,_置換文字列,_置換された文字列_2],_置換された文字列),!. 決定性の全置換(_文字列,_,_,_文字列). % sub_atom/4 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- length(_30行ならび,30), 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_文字列,_30行ならび), atomic_list_concat(_30行ならび,_末尾を削除された文字列). 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_,[]) :- !. 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_文字列,[_前文字列|R]) :- 'キャレッジ・リターンが登場'(_文字列,_前文字列,_後文字列), 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_後文字列,R). 'キャレッジ・リターンが登場'(_文字列,_前文字列,_後文字列) :- sub_atom(_文字列,S,1,R,'\r'), sub_atom(_文字列,0,_,R,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- sub_atom(_文字列,0,_,_,_末尾を削除された文字列), count(sub_atom(_末尾を削除された文字列,_,1,_,'\r'),30),!. 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_文字列). % 以下のサイトは # 出典:: 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/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/1328276597/956 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):次のプログラムをstrcpy(a,b)を使わずに # whileを使って同じことを行うプログラムを作れ。 # int main(void){ # char a[64],*b; # b="INFORMATION"; # strcpy(a,b); # printf("%s\n",a); # return 0; # } # b("INFORMATION"). '次のプログラムをstrcpy(a,b)を使わずに同じことを行うプログラムを作れ。' :- b(_b), strcpyもどき(_a,_b), writef('%t\n',[_a]). strcpyもどき([],[]). strcpyもどき([A|R1],[A|R2]) :- strcpyもどき(R1,R2). % ここではINFORMATIONがstringつまり文字コードのリストとして定義されている。 % % 今日的にはstringはあまり使われないが、atom_charsなどを介さずリスト処理に % 入れる魅力はある。アトムテーブルが無闇に増えない点も利点だが、 % その代わりリストとしてスタックに負荷がかかる。 % % 今日、あまり使われなくなった理由は、 % 1) ダブルクォーツが情報として邪魔。この理由が一番大きいと思う。 % 2) 効率が悪い。どんなに工夫しても、リストのユニフィケーションは高負担。 % 3) 少なくとも、関数名はストリングではなく、アトムであり、functorや % =.. を使用するときに不整合な部分が現れる。 % 4) 表示文字に変換する記法が何通りもあり、それをoptionのprolog_flagで % 指定することになっている。この指定方法を知らなかったり、習熟して % いないことがプログラムエラーの原因となる。 % 5) sub_atom/5のようなatom操作の強力な組込述語が開発された。 % 以上のような理由からだと思われる。 % % % 一般にProlog述語を定義する時は、引数の前半に入力引数、後半に % 出力引数を集めるものだが、ここはstrcpyとstrcpyもどきの対応を % くっきりとさせるため、敢えて引数をひっくり返した。 % ひっくり返してもまったく機能的には削がれることがないことを確認して下さい。 % % 以下のサイトは # 出典:: 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/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/db/1316769778/662 # # MySQL5 # # 開始日、終了日を持ったテーブルを日付単位に表示したいです。 # tbl_job は、以下の構造です。 # # id, name, start_date, end_date # --------------------------- # 1, JOB1, 2012-04-01, 2012-04-03 # 2, JOB2, 2012-04-02, 2012-04-04 # # 上記テーブルから以下のように日付単位でJOBを表示するSQLを教えてほしいです。 # # date, id, name # -------------------- # 2012-04-01, 1, JOB1 # 2012-04-02, 1, JOB1 # 2012-04-02, 2, JOB2 # 2012-04-03, 1, JOB1 # 2012-04-03, 2, JOB2 # 2012-04-04, 2, JOB2 # # '開始日、終了日を持ったテーブルを日付単位に表示したい' :- 日付単位tbl_jobの生成(_日付単位tbl_jobならび), findsetof(_日付,( member([_date,_,_],_日付単位tbl_jobならび)), _日付ならび), 日付単位に表示する(_日付ならび,_日付単位tbl_jobならび). 日付単位tbl_jobの生成(_日付単位tbl_jobならび) :- findall(_日付,( tbl_job(_id,_name,_start_date,_end_date), 日付の生成(_start_date,_end_date,_日付)), _日付単位tbl_jobならび). 日付の生成(_終了年-_終了月-_終了日,_終了年-_終了月-_終了日,_終了年-_終了月-_終了日) :- !. 日付の生成(_開始年-_開始月-_開始日,_終了年-_終了月-_終了日,_開始年-_開始月-_開始日). 日付の生成(_開始年-_開始月-_開始日,_終了年-_終了月-_終了日,_年-_月-_日) :- 翌日(_開始年,_開始月,_開始日,_翌日年,_翌日月,_翌日日), 日付の生成(_翌日年-_翌日月-_翌日日,_終了年-_終了月-_終了日,_年-_月-_日). 翌日(_年,12,31,_翌年,1,1) :- !. 翌日(_年,_月,30,_年,_翌月,1) :- member(_月,[4,6,9,11]), _翌月 is _月 + 1,!. 翌日(_年,_月,31,_年,_翌月,1) :- _翌月 is _月 + 1,!. 翌日(_年,2,29,_年,3,1) :- !. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)), 翌日(_年,_月,_日,_年,_月,_翌日) :- _翌日 is _日 + 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 日付単位に表示する(_日付ならび,_日付単位tbl_jobならび) :- member(_日付,_日付ならび), member([_日付,_id,_name],_日付単位tbl_jobならび), 日付の形式を整えながら一行表示する(_日付,_id,_name), fail. 日付単位に表示する(_日付ならび,_日付単位tbl_jobならび). 日付の形式を整えながら一行表示する(_年-_月-_日,_id,_name) :- swritef(S,'%2r-%2r-%2r',[_年-_月-_日]), 空白を0に置換した日付文字列(S,_空白を0に置換した日付文字列), writef('%t, %t, %t\n',[_空白を0に置換した日付文字列,_id,_name). 空白を0に置換した日付文字列(S,_空白を0に置換した日付文字列) :- findall(_文字_2,( sub_atom(S,_,1,_,_文字), 空白を0に置換(_文字,_文字_2)), _空白を0に置換した日付文字列). 空白を0に置換(' ','0') :- !. 空白を0に置換(A,A). % 以下のサイトは # 出典:: http://kohada.2ch.net/test/read.cgi/php/1168450843/821 # # 住所と番地の間にある空白を削除する場合どうやればいいですか? # 「見附市 見附 123番地」この文字列を # 「見附市 見附123番地」としたいです # 「見附市」と「見附」の間の空白はそのままという条件付です # 市(見附市). 住所と番地の間にある空白を削除する(_文字列,_住所と番地の間にある空白を削除された文字列) :- 空白で分割して空白を含む要素ならびを作る(_文字列,_要素ならび), 前の要素が市名でない番地前の空白を削除されたならび(_要素ならび,_前の要素が市名でない番地前の空白を削除されたならび), ならびを結合して住所と番地の間にある空白を削除された文字列を生成(_前の要素が市名でない番地前の空白を削除されたならび,_住所と番地の間にある空白を削除された文字列). 空白で分割して空白を含む要素ならびを作る(_文字列,_要素ならび) :- sPLIT(_文字列,[' '],L). 前の要素が市名でない番地前の空白を削除されたならび(_要素ならび,_前の要素が市名でない番地前の空白を削除されたならび) :- append(L1,[A|R2],[B|R3],L), 前の要素が市名でない番地前の空白を(A,B,R2), 削除されたならび(L1,A,B,R2,_前の要素が市名でない番地前の空白を削除されたならび). 前の要素が市名でない番地前の空白を(A,B,R2) :- \+(市名(A)), all(R2,' '), sub_atom(B,0,1,_,_B0), member(B0,['0','1','2','3','4','5','6','7','8','9']),!. 削除されたならび(L1,A,B,R2,_前の要素が市名でない番地前の空白を削除されたならび) :- append(L1,[A,B|R3],_前の要素が市名でない番地前の空白を削除されたならび). ならびを結合して住所と番地の間にある空白を削除された文字列を生成(_前の要素が市名でない番地前の空白を削除されたならび,_住所と番地の間にある空白を削除された文字列) :- atomic_list_concat(_前の要素が市名でない番地前の空白を削除されたならび,_住所と番地の間にある空白を削除された文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/647 # # #インデントが崩れる場合は http://ime.nu/pastebin.com/26BkXDHs をみてください。 # # -- # -- 商品テーブルと、 # -- # create table items ( # id serial primary key, # name varchar(255) not null, # price integer not null -- 単価 # ); # # -- # -- 販売テーブルがあるとする。 # -- # create table sales ( # id serial primary key, # item_id integer not null references items(id), # count integer not null default 1, -- 個数 # total integer not null, -- 単価 * 個数 # created_at timestamp not null default current_datetime # ) # # -- # -- 日付を指定して、その日の商品別販売金額合計を大きい順に表示したい。 # -- どういうSQLを書けばいいの? # -- こんなかんじで書けたらいいんだけど。 # -- # select items.id, items.name # from items, # (select item_id, sum(total) as sum_total # from sales # where date(created_at) = '2012-04-01' # group by item_id) as totals # where items.id = totals.item_id # order by totals.sum_total desc; # # '日付を指定して、その日の商品別販売金額合計を大きい順に表示したい' :- '日付を指定して、'(_日付), その日の商品別販売金額合計を(_日付,L1), 大きい順に表示する(L1). '日付を指定して、'(_日付) :- write('日付を8桁の整数で入力して下さい : '), get_line(Line), '日付を指定して、の診断'(Line,_日付),!. '日付を指定して、'(_日付) :- '日付を指定して、'(_日付). '日付を指定して、の診断'(Line,_日付) :- atom_to_term(Line,_8桁の整数,_), '8桁の整数'(_8桁の整数), '8桁の整数から日付を得る'(_8桁の整数,_日付),!. '日付を指定して、の診断'(Line,_日付) :- writef('入力された %t からは日付が得られませんでした。再入力をお願いします\n',[Line]), fail. '8桁の整数'(_8桁の整数) :- integer(_8桁の整数), _8桁の整数 >= 10000000, _8桁の整数 =< 99999999. '8桁の整数から日付を得る'(_8桁の整数,_日付) :- swritef(_日付文字列,'%t',[_8桁の整数]), sub_atom(_日付文字列,0,4,_,_年), sub_atom(_日付文字列,4,2,_,_月), sub_atom(_日付文字列,6,2,_,_日), atomic_list_concat([_年,'-',_月,'-',_日],_日付),!. その日の商品別販売金額合計を(_日付,L1) :- findsetof(_id,( sales(_id,_item_id,_count,_total,_日付)), L), findall([_total,_id],( append(_,[_id|R],L), 商品の販売合計(_日付,_id,_合計金額)), L1). 商品の販売合計(_日付,_id,_合計金額) :- findsum(_total,( sales(_id,_item_id,_count,_total,_日付)), _合計金額). 大きい順に表示する(L1) :- 大きい順に(L1,L2), 表示する(L2). 大きい順に(L1,L2) :- sort(L1,L3), reverse(L3,L2). 表示する(_日付,[]). 表示する(_日付,[[_合計金額,_id]|R]) :- items(_id,_name,_price), writef('%t %t %20l %10r\n',[_日付,_id,_name,_合計金額]), 表示する(_日付,R). % 以下のサイトは 順に置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- {_文字列,_,_,_,_前文字列,_置換文字列,_後文字列,_,_,_}, 順に置換(_前文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列). 順に置換(_前文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- atomic_list_concat([_前文字列,_置換文字列,_後文字列],_置換された文字列). 順に置換(_前文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 順に置換(_後文字列,_置換対象文字列,_置換文字列,_置換された文字列_2), atomic_list_concat([_前文字列,_置換文字列,_置換された文字列_2],_置換された文字列). {_文字列,_開始位置,_文字列長,_残り文字列長,_前文字列,_目的文字列,_後文字列,_前文字列の文字ならび,_目的文字列の文字ならび,_後文字列の文字ならび} :- sub_atom(_文字列,_開始位置,_文字列長,_残り文字列長,_前文字列,_目的文字列,_後文字列,_前文字列の文字ならび,_目的文字列の文字ならび,_後文字列の文字ならび). % % sub_atom/10 % % 以下のサイトは # # 文字列を置換する。一度置換したものは元に戻ることはなく。 # 文字列を置換する(_残り文字列,_置換対象副文字列,_置換文字列,_置換された文字列) :- 置換対象副文字列の前後を取得する(_文字列,_置換対象副文字列,_前文字列,_残り文字列), atomic_list_concat([_文字列,_置換文字列,_残り文字列],_置換された文字列). 置換対象副文字列の前後を取得する(_文字列,_置換対象副文字列,_前文字列,_残り文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り文字数,_置換対象副文字列), sub_atom(_文字列,0,_開始位置,_,_前文字列), _残り文字列の開始位置 is _開始位置 + _長さ, sub_atom(_文字列,_残り文字列の開始位置,_残り文字数,_,_残り文字列). % % 置換対象副文字列の前後を取得する/4 の最後のカットを外した。 % % 以下のサイトは 文字列を順に置換する(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 文字列を置換対象文字列に対して前方文字列と後方文字列に分解する(_文字列,_置換対象文字列,_前方文字列,_後方文字列), 文字列置換を順に置換する(_前方文字列,_置換対象文字列,_後方文字列,_置換文字列,_置換された文字列). 文字列置換を順に置換する(_前方文字列,_置換対象文字列,_後方文字列,_置換文字列,_置換された文字列) :- atomic_list_concat([_前方文字列,_置換文字列,_後方文字列],_置換された文字列). 文字列置換を順に置換する(_前方文字列,_置換対象文字列,_後方文字列,_置換文字列,_置換された文字列) :- 文字列置換を順に置換する(_後方文字列,_置換対象文字列,_置換文字列,_置換された後方文字列), atomic_list_concat([_前方文字列,_置換文字列,_置換された後方文字列],_置換された文字列). 文字列を置換対象文字列に対して前方文字列と後方文字列に分解する(_文字列,_置換対象文字列,_前方文字列,_後方文字列) :- sub_atom(_文字列,_開始位置0オリジン,_,_残り長さ,_置換対象文字列), sub_atom(_文字列,0,_開始位置0オリジン,_前方文字列), sub_atom(_文字列,_,_残り長さ,0,_後方文字列),!. % 以下のサイトは # # 非決定性述語を目標とする時、その得られる解の内で最後の解だけを取得したい。 # # 適用例としては、 # 文字列置換を出現順に非決定性で置換する。つまり利用者は出現順に1-n個の # 置換を選択することができる。そういう述語が定義済みだとする。 # この述語を使って、全置換を求めるというような場合。 # 非決定性述語の最後の解(_非決定性述語,_解) :- findall(_解,_非決定性述語,_解ならび), last(_解ならび,_解). % % 非決定性述語の引数を構成する項の中に_解が含まれる必要がある。 % % 順に置換する述語例 % 全ての対象を置換する(_文字列,_置換対象副文字列,_置換文字列,_置換された文字列) :- 非決定性述語の最後の解(_置換された文字列,順に置換する(_文字列,_置換対象副文字列,_置換文字列,_置換された文字列),_置換された文字列). 順に置換する(_文字列,_置換対象副文字列,_置換文字列,_置換された文字列) :- 置換対象副文字列の前後を取得する(_文字列,_置換対象副文字列,_前文字列,_残り文字列), 順に置換する(_文字列,_置換対象副文字列,_置換文字列,_前文字列,_残り文字列,_置換された文字列). 順に置換する(_文字列,_置換対象副文字列,_置換文字列,_前文字列,_残り文字列,_置換された文字列) :- atomic_list_concat([_前文字列,_置換文字列,_残り文字列],_置換された文字列). 順に置換する(_文字列,_置換対象副文字列,_置換文字列,_前文字列,_残り文字列,_置換された文字列) :- 順に置換する(_残り文字列,_置換対象副文字列,_置換文字列,_置換された文字列_2), atomic_list_concat([_前文字列,_置換文字列,_置換された文字列_2],_置換された文字列). 置換対象副文字列の前後を取得する(_文字列,_置換対象副文字列,_前文字列,_残り文字列) :- sub_atom(_文字列,_開始位置0オリジン,_長さ,_残り文字数,_置換対象副文字列), sub_atom(_文字列,0,_開始位置0オリジン,_,_前文字列), _残り文字列の開始位置 is _開始位置0オリジン + _長さ, sub_atom(_文字列,_残り文字列の開始位置,_残り文字数,_,_残り文字列),!. % 以下のサイトは # 出典:: 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/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/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/db/1316769778/638 # # mysql 5.5.10 # # table hogehoge # inputdate data1 data2 data3 # 2012-02-16 ssssss wwwww yyyyyy # 2012-02-17 xxxxxx xxxxx xxxxx # 2012-02-18 null aaaaa vvvvv # 2012-02-19 null null null # 2012-02-20 null null null # 2012-02-21 null null null # 2012-02-22 xxxxxx ccccc fffff # # とある時に、指定日の前日のデータが欲しい # 例でいうなら # data1について、 # 2012-02-17を指定することによって2012-02-16のssssssを、 # 2012-02-22の日付を指定して2012-02-17のxxxxxxが得られ # るようにしたいのですが。 # # よろしくお願いします # 指定日の前日のデータが欲しい(_指定日,_指定日の前日,_data1,_data2,_data3) :- 指定日の前日(_指定日,_指定日の前日), hogehoge(_指定日の前日,_data1,_data2,_data3). 指定日の前日(_指定日,_指定日の前日) :- 指定日から年取得(_指定日,_年), 指定日から月取得(_指定日,_月), 指定日から日取得(_指定日,_日), 指定日の前日(_年,_月,_日,_指定日の前日). 指定日の前日(_年,'01','01',_指定日の前日) :- 前年(_年,_前年), atomic_list_concat([_前年,-,'12',-,'31'],_指定日の前日),!. 指定日の前日(_年,_月,'01',_指定日の前日) :- member(_月,['05','07','08','10','12']), 前月(_月,_前月), atomic_list_concat([_年,-,_前月,-,'30'],_指定日の前日),!. 指定日の前日(_年,_月,'01',_指定日の前日) :- member(_月,['02','04','06','09','11']), 前月(_月,_前月), atomic_list_concat([_年,-,_前月,-,'31'],_指定日の前日),!. 指定日の前日(_年,'03','01',_指定日の前日) :- atom_to_term(_年,_年整数,_), うるう年(_年整数), atomic_list_concat([_年,-,'02',-,'29'],_指定日の前日),!. 指定日の前日(_年,'03','01',_指定日の前日) :- atom_to_term(_年,_年整数,_), \+(うるう年(_年整数)), atomic_list_concat([_年,-,'02',-,'28'],_指定日の前日),!. 指定日の前日(_年,_月,_日,_指定日の前日) :- 二桁日文字列の前日文字列(_日,_前日文字列), atomic_list_concat([_年,-,_月,-,_前日文字列],_指定日の前日). 指定日から年取得(_指定日,_年) :- sub_atom(_指定日,0,4,_,_年). 指定日から月取得(_指定日,_月) :- sub_atom(_指定日,5,2,_,_月). 指定日から日取得(_指定日,_日) :- sub_atom(_指定日,8,2,_,_日). 前年(_年,_前年) :- atom_to_term(_年,_年整数), _前年整数 is _年整数 - 1, swritef(_前年,'%t',[_前年整数]). 前月('12','11'). 前月('11','10'). 前月('10','09'). 前月('09','08'). 前月('08','07'). 前月('07','06'). 前月('06','05'). 前月('05','04'). 前月('04','03'). 前月('03','02'). 前月('02','01'). 二桁日文字列の前日文字列('31','30'). 二桁日文字列の前日文字列('30','29'). 二桁日文字列の前日文字列('29','28'). 二桁日文字列の前日文字列('28','27'). 二桁日文字列の前日文字列('27','26'). 二桁日文字列の前日文字列('26','25'). 二桁日文字列の前日文字列('25','24'). 二桁日文字列の前日文字列('24','23'). 二桁日文字列の前日文字列('23','22'). 二桁日文字列の前日文字列('22','21'). 二桁日文字列の前日文字列('21','20'). 二桁日文字列の前日文字列('20','19'). 二桁日文字列の前日文字列('19','18'). 二桁日文字列の前日文字列('18','17'). 二桁日文字列の前日文字列('17','16'). 二桁日文字列の前日文字列('16','15'). 二桁日文字列の前日文字列('15','14'). 二桁日文字列の前日文字列('14','13'). 二桁日文字列の前日文字列('13','12'). 二桁日文字列の前日文字列('12','11'). 二桁日文字列の前日文字列('11','10'). 二桁日文字列の前日文字列('10','09'). 二桁日文字列の前日文字列('09','08'). 二桁日文字列の前日文字列('08','07'). 二桁日文字列の前日文字列('07','06'). 二桁日文字列の前日文字列('06','05'). 二桁日文字列の前日文字列('05','04'). 二桁日文字列の前日文字列('04','03'). 二桁日文字列の前日文字列('03','02'). 二桁日文字列の前日文字列('02','01'). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/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/1328276597/728 # # [1] 授業単元:Cプログラミング演習 # [2] 問題文(含コード&リンク): あたえられた単語で文字数が最長となるようなしりとりをプログラムしパターンと文字数を導出せよ.ただし構造体とポインタを使用すること. # 'あたえられた単語で文字数が最長となるようなしりとりをプログラムしパターンと文字数を導出せよ'(_開始単語,_最長しりとり) :- findmax([_長さ,L],( 'あたえられた単語で文字数が最長となるようなしりとりをプログラムしパターンと文字数を導出せよ'(_開始単語,[],L,_長さ)), [_長さ,_最長しりとり]). 'あたえられた単語で文字数が最長となるようなしりとりをプログラムしパターンと文字数を導出せよ'(_単語_1,L1,L,_長さ) :- しりとり(_単語_1,L1,_単語_2), 'あたえられた単語で文字数が最長となるようなしりとりをプログラムしパターンと文字数を導出せよ'(_単語_2,[_単語_1|L1],L,_長さ). 'あたえられた単語で文字数が最長となるようなしりとりをプログラムしパターンと文字数を導出せよ'(_単語_1,L,[_単語_1|L],_長さ) :- length([_単語_1|L],_長さ). しりとり(_単語_1,L,_単語_2) :- 単語(_単語_2), \+(member(_単語_2,[_単語_1|L])), sub_atom(_単語_1,_,1,0,_開始文字), sub_atom(_単語_2,0,1,_,開始文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1331904826/120 # # コマンドプロンプトにてワイルドカードで複数マッチングしてそれぞれ別のsetを置きたいんですけど # うまく行きません。 # for %%A in ("%folder%~n1*.txt") do ( # set tatoeba1=%%A # set tatoeba2=%%A # ) # こういう形まで考えたんですが結局最後のマッチングにsetされます。 # どのような形が正解なのでしょうか? # # 順に置換対象が現れる度に置換ならびから順に取り出して書き換える(_文字列,_置換対象,[_置換要素|R],_置換された文字列) :- 置換対象に合致したら(_文字列,_置換対象,S1,S3), 順に置換対象が現れる度に置換ならびから順に取り出して書き換える(S3,_置換対象,R,_置換された文字列_2), concat_atom([S1,_置換要素,_置換された文字列_2],_置換された文字列),!. 順に置換対象が現れる度に置換ならびから順に取り出して書き換える(_文字列,_,_,_文字列). 置換対象に合致したら(_文字列,_置換対象,S1,S3) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 置換対象と合致(S2,_置換対象). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/695 # # Objective-CのNSRegularExpressionで、 # 行頭の半角スペース列を置換しようとして@"^ +"と書いたのですが、文字列の最初しか行頭と認識してくれないらしく、 # 複数行にまたがる文字列の各行頭のスペースが置換できないので、改行文字に続く次のスペースも検出しようとして # @"^ +|\\n +" # と書くと、改行文字も含めて置換してしまうため、マッチ部分をキャプチャする()を使って # @"^( +)|\\n( +)" # としたのですが、 # (2147483647,0)という文字列の外の範囲がマッチされてしまい、置換しようとしてエラーとなってしまいます。 # 文字列途中も含めて、行頭の半角スペース列のみを置換するためにはどのようなパターンを使うのが適切でしょうか? # # '文字列途中も含めて、行頭の半角スペース列のみを置換する'(_改行を含む文字列,_置換文字列,_置換された改行を含む文字列) :- 行頭の半角スペース列のならび(_改行を含む文字列,_前文字列,_行頭の空白ならび,_後文字列), '文字列途中も含めて、行頭の半角スペース列のみを置換する'(_後文字列,_置換文字列,_置換された改行を含む文字列_2), concat_atom([前文字列,'\n',_置換文字列,_置換された改行を含む文字列_2],_置換された改行を含む文字列),!. '文字列途中も含めて、行頭の半角スペース列のみを置換する'(_文字列,_,_文字列). 行頭の半角スペース列のならび(_改行を含む文字列,_前文字列,_行頭の空白ならび,_後文字列) :- sub_atom(_改行を含む文字列,_,_,_,_前文字列,S2,_後文字列,L1,['\n'|R2],L3), \+(R2=[]), all(R2,' '), \+((L3=[A|R3],A=' ')). % sub_atom/10 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/610 # # [1] 授業単元:Cプログラミング演習 # [2] 問題文(含コード&リンク): 最長しりとり問題を整数計画法を用い、しりとりの数が最長となるパターンを導出するプログラムを作成せよ.ただし構造体とポインタを使用すること. # 'しりとりの数が最長となるパターンを導出する'(_しりとりの数が最長となるパターン) :- しりとり節を定義, findmax([_長さ,_節番号ならび],( しりとり(_長さ,_節番号ならび)), [_長さ,_節番号ならび]), 節番号ならびを語彙ならびに変換(_節番号ならび,_しりとりの数が最長となるパターン). しりとり(_長さ,_節番号ならび) :- しりとり節(_,_節番号,_先頭文字,_末尾文字), しりとり(_先頭文字,[],_節番号ならび), length(L,_長さ). しりとり(_先頭文字,L2,_節番号ならび) :- しりとり節(_,_節番号,_先頭文字,_末尾文字), \+(member(_節番号,L2)), しりとり(_末尾文字,[_節番号|L2],_節番号ならび). しりとり(_,L2,L) :- reverse(L2,L). 節番号ならびを語彙ならびに変換([],[]). 節番号ならびを語彙ならびに変換([_節番号|R1],[_語彙|R2]) :- しりとり節(_語彙,_節番号,_,_), 節番号ならびを語彙ならびに変換(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% しりとり節を定義 :- findall(_語彙,( 語彙(_語彙)), _語彙ならび), sort(_語彙ならび,_整列した語彙ならび), しりとり節を定義(0,_整列した語彙ならび). しりとり節を定義(_,[]). しりとり節を定義(N,[_語彙|R]) :- 節を定義(N,_語彙), N_2 is N + 1, しりとり節を定義(N_2,R). 節を定義(N,_語彙) :- sub_atom(_語彙,0,1,_,_先頭文字), sub_atom(_語彙,_,1,0,_末尾文字), assertz(しりとり節(_語彙,N,_先頭文字,_末尾文字)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/671 # # sedです # # foo # bar # *piyo # *hoge # *zieg # kero # piyo # のような文章があるとして、先頭にアスタリスクがついている部分を別記号で囲みたいです。 # foo # bar # [ # *piyo # *hoge # *zieg # ] # kero # piyo # # sedのスクリプトファイルで書いているのですが複数行にまたがるマッチングをこなしてくれません # どうか御教示願います。 # # '先頭にアスタリスクがついている部分を別記号で囲みたい'(_文字列,_置換された文字列) :- 'リスト要素の先頭にアスタリスクがついている部分を別記号で囲みたい'(L,L5). append(L5,['\n'],L6), concat_atom(L5,'\n',_置換された文字列_0), concat_atom([_置換された文字列_0,'\n'],_置換された文字列),!. '先頭にアスタリスクがついている部分を別記号で囲みたい'(_文字列,_文字列). 'リスト要素の先頭にアスタリスクがついている部分を別記号で囲みたい'(L,X) :- append(L1,L2,L3,L), '先頭にアスタリスクがついている部分'(L1,L2,L3), 'リスト要素の先頭にアスタリスクがついている部分を別記号で囲みたい'(L3,L4), append(L1,['[\n'|L2],[']\n'|L4],X),!. 'リスト要素の先頭にアスタリスクがついている部分を別記号で囲みたい'(L,L). '先頭にアスタリスクがついている部分'(L1,L2,L3) :- \+((last(L1,A),sub_atom(A,0,1,_,'*'))), \+((L3 = [B|_],sub_atom(B,0,1,_,'*'))), '全ての要素の先頭文字が*'(L2). '全ての要素の先頭文字が*'([]). '全ての要素の先頭文字が*'([A|R]) :- sub_atom(A,0,1,_,'*'), '全ての要素の先頭文字が*'(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/671 # # sedです # # foo # bar # *piyo # *hoge # *zieg # kero # piyo # のような文章があるとして、先頭にアスタリスクがついている部分を別記号で囲みたいです。 # foo # bar # [ # *piyo # *hoge # *zieg # ] # kero # piyo # # sedのスクリプトファイルで書いているのですが複数行にまたがるマッチングをこなしてくれません # どうか御教示願います。 # # '先頭にアスタリスクがついている部分を別記号で囲みたい'(_文字列,_置換された文字列) :- sPLIT(_文字列,['\n'],L), '先頭にアスタリスクがついている部分を別記号で囲みたい'(L,L2), concat_atom(L2,_置換された文字列). '先頭にアスタリスクがついている部分を別記号で囲みたい'([],[]). '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n'],['\n']) :- !. '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n',A|R1],['[','\n',A|R2]) :- sub_atom(A,0,1,_,'*'), '先頭にアスタリスクがついている部分'(R1,R2),!. '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n',A|R1],['\n',A|R2]) :- '先頭にアスタリスクがついている部分を別記号で囲みたい'(R1,R2). '先頭にアスタリスクがついている部分'([],[']','\n']). '先頭にアスタリスクがついている部分'(['\n'],[']','\n']) :- !. '先頭にアスタリスクがついている部分'(['\n',A|R1],['\n',A|R2]) :- sub_atom(A,0,1,_,'*'), '先頭にアスタリスクがついている部分'(R1,R2),!. '先頭にアスタリスクがついている部分'(['\n',A|R1],['\n',']','\n',A|R2]) :- '先頭にアスタリスクがついている部分を別記号で囲みたい'(R1,R2),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/671 # # sedです # # foo # bar # *piyo # *hoge # *zieg # kero # piyo # のような文章があるとして、先頭にアスタリスクがついている部分を別記号で囲みたいです。 # foo # bar # [ # *piyo # *hoge # *zieg # ] # kero # piyo # # sedのスクリプトファイルで書いているのですが複数行にまたがるマッチングをこなしてくれません # どうか御教示願います。 # # '先頭にアスタリスクがついている部分を別記号で囲みたい'(_文字列,_置換された文字列) :- sPLIT(_文字列,['\n'],L), '先頭にアスタリスクがついている部分を別記号で囲みたい'(L,L2), concat_atom(L2,_置換された文字列). '先頭にアスタリスクがついている部分を別記号で囲みたい'([],[]). '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n'],['\n']) :- !. '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n',A|R1],L) :- sub_atom(A,0,1,_,'*'), '先頭にアスタリスクがついている部分'(['\n',A|R1],L1,R1_1), '先頭にアスタリスクがついている部分を別記号で囲みたい'(R1_1,R2), append(L1,R2,L),!. '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n',A|R1],['\n',A|R2]) :- '先頭にアスタリスクがついている部分を別記号で囲みたい'(R1,R2). '先頭にアスタリスクがついている部分'(['\n',A|R1],['\n',A|R2],R) :- sub_atom(A,0,1,_,'*'), '先頭にアスタリスクがついている部分'(R1,R2,R),!. '先頭にアスタリスクがついている部分'(L,['\n',']'],L). % 以下のサイトは # 出典:: 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,'.'))). % 以下のサイトは # # /(a|b)\1{5}/ で 「aaaaaa」と「bbbbbb」にはマッチするけど # 「ababab」とか「aabbaa」にはマッチしない。 # 正規表現ってこういう書き方できるんだ・・・。 # 後方参照を同じ正規表現の中で使えるというか、そんな感じ。 文字候補(a). 文字候補(b). 決まった文字数の同一文字ならび(_文字列,_文字数,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), length(L2,_文字数), all(L1,A), 文字候補(A). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/646 # # 質問です # # phpのpreg_replaceで文字列を入れ替えたいのですが # # <a href="mailto:example@example.com">問い合せ</a> # # のexample@example.comのみを入れ替えるにはどのような正規表現を使えば出来るでしょうか? # # よろしくお願いします # 'example@example.comのみを入れ替える'(_文字列,_入れ替える文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), メールアドレス部分(S2,L2), 'example@example.comのみを入れ替える'(S3,_入れ替える文字列,_置換されたS3), concat_atom([S1,'"mailto:',_入れ替える文字列,'"',_置換されたS3],_置換された文字列),!. 'example@example.comのみを入れ替える'(_文字列,_,_文字列). メールアドレス部分(S2,L2) :- L2 = ['"',m,a,i,l,t,o,:|R2], append(L2_1,['"'],R2), \+(member('"',L2_1)), atom_chars(S2_2,R2), メールアドレスとして可能な文字文字列(S2_2),!. メールアドレスとして可能な文字列(_文字列) :- split(_文字列,['@'],[A,B]), メールに使用できるアルファベット(A), メールに使用できるアルファベット(B). メールに使用できるアルファベット(_文字) :- char_code(_文字,_文字コード), メールに使用できる文字コード(_文字コード),!. メールに使用できるアルファベット(_文字) :- member(_文字,['_','-','~']). メールに使用できる文字コード(_文字コード) :- _文字コード >= 65, _文字コード =< 90,!. メールに使用できる文字コード(_文字コード) :- _文字コード >= 97, _文字コード =< 122,!. メールに使用できる文字コード(_文字コード) :- _文字コード >= 48, _文字コード =< 57,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/489 # # [1] 授業単元:C言語演習 # [2] 問題文: # キーボードで入力された名前をchar型の一次元の配列nameに入れていきます。 # 各名前の先頭アドレスをp_nameに入れます。 # p_nameのアドレスをptrptrに入れます。 # 最後に一番長い名前と一番短い名前、変数ptrptr、p_name、nameのアドレスを表示します。 # 実行例: # 名前を10個まで入力できます。桁数は最大30です。 # name1: tanaka # name2: nakabayashi # name3: hama #    ・ #    ・ # 一番長いのは"nakabayashi"で、11桁。 # 一番短いのは"hama"で、4桁。 # Adress of name: 231191 Adress of p_name: 231511 Adress of ptrptr: 231551 # # 'キーボードで入力された名前をならび_nameに入れていきます。一番長い名前と一番短い名前を表示します。' :- キーボードで入力されたならび_nameに入れていきます(_name), 一番長い名前と一番短い名前を表示します(_name). 一番長い名前と一番短い名前を表示します(_name) :- 一番長い名前(_name,_一番長い名前ならび), 一番短い名前(_name,_一番短い名前ならび), 表示します(_一番長い名前ならび,_一番短い名前ならび). 一番長い名前(_name,_一番長い名前ならび) :- findmax(_名前の長さ,( member(_名前,_name), sub_atom(_名前,0,_名前の長さ,0,_名前)), _一番長い長さ), findall(_名前,( member(_名前,_name), sub_atom(_名前,0,_一番長い長さ,_名前)), 一番長い名前ならび). 一番短い名前(_name,_一番短い名前ならび) :- findmin(_名前の長さ,( member(_名前,_name), sub_atom(_名前,0,_名前の長さ,0,_名前)), _一番短い長さ), findall(_名前,( member(_名前,_name), sub_atom(_名前,0,_一番短い長さ,_名前)), 一番短い名前ならび). 表示します(_一番長い名前ならび,_一番短い名前ならび) :- concat_atom(_一番長い名前ならび,' , ',_一番長い名前表示), writef('一番長い名前は %t です。\n',[_一番長い名前表示]), concat_atom(_一番短い名前ならび,' , ',_一番短い名前表示), writef('一番短い名前は %t です。\n',[_一番短い名前表示]). キーボードで入力された名前をならび_nameに入れていきます(_name) :- findall(_名前,( 名前を入力(_名前,_終了状態), ( _終了状態=終了,!,fail; true)), _name). 名前を入力(_名前,_終了状態) :- append(L0,_,_), length([_|L0],Nth), writef('名前[%t]: ',[Nth]), get_line(Line), 名前入力検査(Line,_名前,_終了状態). 名前入力検査('',_,終了) :- !. 名前入力検査(end_of_file,_,終了) :- !. 名前入力検査(名前,_名前,正常). % 以下のサイトは ?- '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',!. % 以下のサイトは # 出典::スレ立てるまでもない質問はここで 117匹目 #333 # # Prologに於ける文字置換のパターンを示す # # 置換対象文字列に出会う度に非決定性で置換される事を基本として # 併せて、置換回数が最大になるような置換述語を定義する # # 文字列を検索して、適合パターンを置換していく # 1) 文字列の先頭から検索パターンに適合する文字列の前の文字列 # 2) 検索パターンに適合した文字列 # 3) 検索パターンに適合した文字列より後の文字列 # # 2) 検索パターンに適合した文字列を置換文字列に置き換える # 置換文字列定義(def,'DEF'). '置換回数が最大になるような文字列置換'(_文字列,_置換された文字列) :- 全ての置換回数を計測した置換された文字列ならび(_文字列,LL), 置換回数が最大になるような置換された文字列(LL,_置換された文字列). 全ての置換回数を計測した置換された文字列ならび(_文字列,LL) :- findall([_置換された回数,_置換された文字列],( '置換パターン'(_文字列,_置換された回数,_置換された文字列)),LL). 置換回数が最大になるような置換された文字列(LL,_置換された文字列) :- 置換回数が最大に(LL,_最大数), なるように置換された文字列(LL,_最大数,_置換された文字列). 置換回数が最大に(LL,_最大数) :- findmax(N,member([N,_],LL),_最大数). なるように置換された文字列(LL,_最大数,_置換された文字列) :- member([_最大数,_置換された文字列],LL). '置換パターン'(_文字列,_置換された回数,_置換された文字列) :- '置換回数付き置換パターン'(_文字列,0,_置換された回数,_置換された文字列). '置換回数付き置換パターン'(_文字列,_置換された回数_1,_置換された回数,_置換された文字列) :- 置換対象文字列を得る(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1), succ(_置換された回数_1,_置換された回数_2), '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数_2,_置換された回数,_置換された文字列). 置換対象文字列を得る(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1) :- sub_atom(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1), 置換文字列定義(_適合文字列_1,_置換する文字列). '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数,_置換された回数,_置換された文字列) :- atomic_list_concat([_前文字列_1,_置換する文字列,_後文字列_1],_置換された文字列). '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数_1,_置換された回数,_置換された文字列) :- '置換回数付き置換パターン'(_後文字列_1,_置換された回数_1,_置換された回数,_置換された文字列_2), atomic_list_concat([_前文字列_1,_置換する文字列,_置換された文字列_2],_置換された文字列). findmax(_射影項,_目標,_最大数) :- findall(_射影項,_目標,_解ならび), 最大値を取り出す(_解ならび,_最大数). 最大値を取り出す(_解ならび,_最大数) :- sort(_解ならび,_整列した解ならび), last(_整列した解ならび,_最大数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328439334/333 # # c言語で「私の名前はyouhei kikuchiです。25才です。」という文から # 「kikuchi」と「25」の部分を、それぞれ抽出したいんですが # どのような方法があるでしょうか? # '「私の名前はyouhei kikuchiです。25才です。」という文から「kikuchi」と「25」の部分を、それぞれ抽出したい'(_前文字列,_適合文字列,_後文字列) :- '「kikuchi」と「25」の部分を、それぞれ抽出したい'('私の名前はyouhei kikuchiです。25才です。',_前文字列,_適合文字列,_後文字列). '「kikuchi」と「25」の部分を、それぞれ抽出したい'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り文字数,_適合文字列), '「kikuchi」と「25」の部分を'(_適合文字列), sub_atom(_文字列,0,_開始位置+_長さ,_,_前文字列), sub_atom(_文字列,_開始位置+_長さ,_,0,_後文字列). '「kikuchi」と「25」の部分を'(kikuchi) :- !. '「kikuchi」と「25」の部分を'('25'). % 以下のサイトは # 出典:: 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/1323566370/502 # # 正規表現で足し算はできないでしょうか? # # PHPのソースなんですが # array( 'start' => 10.000, 'end' => 10.166 ), # array( 'start' => 11.166, 'end' => 11.414 ), # array( 'start' => 12.414, 'end' => 14.559 ), # などと並んでる部分があり、これらの数値全部に1を足したいのですが # # 'これらの数値全部に1を足したい'([],[]). 'これらの数値全部に1を足したい'([_行|R1],[_変更された行|R2]) :- 数値に1を加える(_行,_変更された行), 'これらの数値全部に1を足したい'(R1,R2). 数値に1を加える(_行,_変更された行) :- sub_atom(_行,_,_,_,S1_1,S2_1,S3_1,L1_1,L2_1,L3_1), 数値に1を加える(S1_1,S2_1,S3_1,L1_1,L2_1,L3_1,_変更部分,S3_1), 数値に1を加える(S3_1,_残りの変更部分), concat_atom([_変更部分,_残りの変更部分],_変更された行),!. 数値に1を加える(_行,_行). 数値に1を加える(S1_1,S2_1,S3_1,L1_1,L2_1,L3_1,_変更された部分,S3_1) :- 数値部分を取り出す(L1_1,L2_1,L3_1), 数値に1を加えた文字列(L2_1,_数値文字列), concat_([S1_1,_数値文字列],_変更された部分). 数値部分を取り出す(L1_1,L2_1,L3_1) :- 数値に還元できるならび(L2_1), \+((last(L1_1,A),数値(A))), \+((L3_1 = [B|_],数値(B))). 数値に1を加えた文字列(L2_1,_数値文字列) :- number_chars(_数値,L2_1), _数値_2 is _数値 + 1.0, number_chars(_数値_2,L2_2), atom_chars(_数値文字列,L2_2). 数値に還元できるならび([A|R]) :- 数字(A), last([A|R],B), \+(B='.'), 全てが数字かピリオド(R). 全てが数字かピリオド([]). 全てが数字かピリオド([A|R]) :- member(A,['.','0','1','2','3','4','5','6','7','8','9']), 全てが数字かピリオド(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/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/1325685876/975 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):2つの文字列(s[1][3]={"abo"},t[3][1]={"b","c","a"})の中で同じ文字があったらその文字を表示し、 #                  なかったら同じ文字はないことを表示するプログラムを作れ。 # '2つの文字列(s[1][3]={"abo"},t[3][1]={"b","c","a"})の中で同じ文字があったらその文字を表示し、なかったら同じ文字はないことを表示する' :- sub_atom('abo',_,1,_,A), member(A,[b,c,a]). '2つの文字列(s[1][3]={"abo"},t[3][1]={"b","c","a"})の中で同じ文字があったらその文字を表示し、なかったら同じ文字はないことを表示する' :- \+((sub_atom('abo',_,1,_,A),member(A,[b,c,a]))), writef('%tと%tには同じ文字はありません\n',['abo',[b,c,a]]). % 以下のサイトは # 出典:: 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/300 # # テキストファイルの中に # foo=bar # という形式で設定値が列挙されています。 # grepかegrepだけでfoo=の右辺値のbarを抽出する正規表現はどうなるでしょうか? # (?<=foo=).* # とかやりたいんですけどgrepもegrepもこの式を受け付けてくれません。 # # 'テキストファイルの中に foo=bar という形式で設定値が列挙されています。foo= の右辺値のbarを抽出する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列_1,_適合文字列_1,_後文字列_1,L1,[f,o,o,=|R2],L3), \+((last(L1,A),区切り文字(A))), \+((L2 = [B|_],区切り文字(B))), 'テキストファイルの中に foo=bar という形式で設定値が列挙されています。foo= の右辺値のbarを抽出する'(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列). 'テキストファイルの中に foo=bar という形式で設定値が列挙されています。foo= の右辺値のbarを抽出する'(_文字列,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). 'テキストファイルの中に foo=bar という形式で設定値が列挙されています。foo= の右辺値のbarを抽出する'(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- 'テキストファイルの中に foo=bar という形式で設定値が列挙されています。foo= の右辺値のbarを抽出する'(_後文字列_1,_前文字列_2,_適合文字列,_後文字列), concat_atom([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 区切り文字(A) :- 数字(A),!, fail. 区切り文字(A) :- アルファベット(A),!, fail. 区切り文字(A) :- 全角文字(A),!, fail. 区切り文字(_). 数字(A) :- char_code(A,Code), Code >= 48, Code =< 57,!. アルファベット(A) :- char_code(A,Code), Code >= 65, Code =< 90,!. アルファベット(A) :- char_code(A,Code), Code >= 97, Code =< 122,!. 全角文字(A) :- char_code(A,Code), 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/1323566370/224 # # 全角文字(2バイト文字?)だけを検索するには # なんと書くんでしょうか? # # '全角文字(2バイト文字?)だけを検索する'(_文字列,_前文字列,_適合文字,_後文字列) :- sub_atom(_文字列,_,1,_,前文字列,_適合文字列,_後文字列,_,_,_), char_code(_適合文字列,_文字コード), _文字コード > 255. % 以下のサイトは # 出典:: 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/1325685876/177 # # [1] 授業単元:C++ # [2] 問題文(含コード&リンク): # 以下のxmlファイルからSysDataの格納パスを取得する # # <?xml version="1.0" encoding="utf-8"?> # <Data> # <Items> # <Key>SysConf</Key> # <Value>D:\tmp\conf</Value> # </Item> # <Items> # <Key>SysEtc</Key> # <Value>D:\tmp\etc</Value> # </Item> # <Items> # <Key>SysData</Key> # <Value>D:\tmp\data</Value> # </Item> # # </Data> # '以下のxmlファイルからSysDataの格納パスを取得する'(_ファイル,_格納パス) :- get_lines(_ファイル,Lines), append(_,['','SysData',Line,''|_],Lines), sub_atom(Line,_,_,_,S1,S2,S3,L1,[<,'V',a,l,u,e,>|R1],[<,/,'V',a,l,u,e,>,|_]), concat_atom(R1,_格納パス),!. % 以下のサイトは # 出典:: 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/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/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/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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/703 # # [1] 授業単元:C言語 # [2] 問題文:入力したxとyを交互に読み取り、zに出力するプログラムを作成せよ # 例 # x=いはほとりる # y=ろにへちぬを # z=いろはにほへとちりぬるを # '入力したxとyを交互に読み取り、zに出力する'(_z) :- write('xを入力して下さい : '), get_line(_x), write('yを入力して下さい : '), get_line(_y), 'xとyを交互に読み取り、zに出力する'(_x,_y,_z). 'xとyを交互に読み取り、zに出力する'(_x,_y,_z) :- 'xとyを交互に読み取り'(_x,_y,A,B,_x_2,_y_2), 'xとyを交互に読み取り、zに出力する'(_x_2,_y_2,_z_2), concat_atom([A,B,_z_2],_z). 'xとyを交互に読み取り、zに出力する'(_x,_y,_z) :- atom_concat(_x,_y,_z). 'xとyを交互に読み取り'(_x,_y,A,B,_x_2,_y_2) :- sub_atom(_x,0,1,R1,A), sub_atom(_y,0,1,R2,B), sub_atom(_x,1,R1,0,_x_2), sub_atom(_y,1,R2,0,_y_2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/669 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): 文字列HeLLo中の文字について、大文字は小文字に #                小文字は大文字に変換せよ。 # '文字列HeLLo中の文字について、大文字は小文字に小文字は大文字に変換する' :- findall(_文字,( sub_atom('HeLLo',_,1,_,_文字1), 大文字小文字相互変換(_文字1,_文字2)), _変換された文字ならび), atom_chars(_変換された文字列,_変換された文字ならび), writef('%t',[_変換された文字列]). 大文字小文字相互変換('A',a) :- !. 大文字小文字相互変換(a,'A') :- !. 大文字小文字相互変換('B',b) :- !. 大文字小文字相互変換(b,'B') :- !. 大文字小文字相互変換('C',c) :- !. 大文字小文字相互変換(c,'C') :- !. 大文字小文字相互変換('D',d) :- !. 大文字小文字相互変換(d,'D') :- !. 大文字小文字相互変換('E',e) :- !. 大文字小文字相互変換(e,'E') :- !. 大文字小文字相互変換('F',f) :- !. 大文字小文字相互変換(f,'F') :- !. 大文字小文字相互変換('G',g) :- !. 大文字小文字相互変換(g,'G') :- !. 大文字小文字相互変換('H',h) :- !. 大文字小文字相互変換(h,'H') :- !. 大文字小文字相互変換('I',i) :- !. 大文字小文字相互変換(i,'I') :- !. 大文字小文字相互変換('J',j) :- !. 大文字小文字相互変換(j,'J') :- !. 大文字小文字相互変換('K',k) :- !. 大文字小文字相互変換(k,'K') :- !. 大文字小文字相互変換('L',l) :- !. 大文字小文字相互変換(l,'L') :- !. 大文字小文字相互変換('M',m) :- !. 大文字小文字相互変換(m,'M') :- !. 大文字小文字相互変換('N',n) :- !. 大文字小文字相互変換(n,'N') :- !. 大文字小文字相互変換('O',o) :- !. 大文字小文字相互変換(o,'O') :- !. 大文字小文字相互変換('P',p) :- !. 大文字小文字相互変換(p,'P') :- !. 大文字小文字相互変換('Q',q) :- !. 大文字小文字相互変換(q,'Q') :- !. 大文字小文字相互変換('R',r) :- !. 大文字小文字相互変換(r,'R') :- !. 大文字小文字相互変換('S',s) :- !. 大文字小文字相互変換(s,'S') :- !. 大文字小文字相互変換('T',t) :- !. 大文字小文字相互変換(t,'T') :- !. 大文字小文字相互変換('U',u) :- !. 大文字小文字相互変換(u,'U') :- !. 大文字小文字相互変換('V',v) :- !. 大文字小文字相互変換(v,'V') :- !. 大文字小文字相互変換('W',w) :- !. 大文字小文字相互変換(w,'W') :- !. 大文字小文字相互変換('X',x) :- !. 大文字小文字相互変換(x,'X') :- !. 大文字小文字相互変換('Y',y) :- !. 大文字小文字相互変換(y,'Y') :- !. 大文字小文字相互変換('Z',z) :- !. 大文字小文字相互変換(z,'Z') :- !. 大文字小文字相互変換(_対象外の文字,_対象外の文字). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/501 # # [1] 授業単元:配列とポインタ(アルゴリズム) # [2] 問題文(含コード&リンク):以下の実行例のように,文字列を入力すると,その前 # 後に"を付けた文字列を生成するプログラムを,ライブ # ラリ関数strcpy とstrcat を用いて作成せよ.ただし, # プログラムは以下の要件を満たすこととする # ・ユーザに入力させる文字列を格納する配列をstr1[],前後に"を付けた文字列のための配列をstr2[] とする. # ・ユーザに入力させる文字列は30 字までとする。 # ・配列str2[] は初期化せずに宣言し,ライブラリ関数strcpy とstrcat を使って(添字演算子[] を使わずに)前後に"を付けた文字列を生成すること. #   実行例. # 文字列を入力してください:Tokyo # 文字列の前後に"を付けました。 # str2:"Tokyo" #  [3.1] OS: linux debian #  [3.2] コンパイラ名とバージョン: gcc4.3.2 #  [3.3] 言語:C言語 # [4] 期限: 12月13日 14時 # [5] その他の制限: # '文字列を入力すると,その前後に"を付けた文字列を生成するプログラムを,ライブラリ関数strcpy とstrcat を用いて作成せよ.ただし,プログラムは以下の要件を満たすこととする。 ・ユーザに入力させる文字列を格納する配列をstr1[],前後に"を付けた文字列のための配列をstr2[] とする. ・ユーザに入力させる文字列は30 字までとする。 ・配列str2[] は初期化せずに宣言し,ライブラリ関数strcpy とstrcat を使って(添字演算子[を使わずに)前後に"を付けた文字列を生成すること.' :- 文字列の入力(_文字列), concat_atom(['"',_文字列,'"'],_生成された文字列), writef('前後に"を付加された文字列は %t です\n',[_生成された文字列]). 文字列の入力(_文字列) :- write('文字列を入力して下さい : '), get_line(Line), 文字列入力診断(Line,_文字列),!. 文字列入力診断(文字列,_文字列) :- atom_length(_文字列,_長さ), _長さ =< 30,!. 文字列入力診断(Line,_文字列) :- sub_atom(Line,0,30,_,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/962 # # 対象 # ABCこの間に文字列があったりなかったりDEF # # 結果 # DEF # # "ABC"よりも後続にある(最初の)"DEF"だけを対象としたいです # 戻り読み条件が、長さ一定でなくてもOKならばできるのですが・・・ # # '"ABC"よりも後続にある(最初の)"DEF"だけを対象としたいです。戻り読み条件が、長さ一定でなくてもOKならばできるのですが・・・ '(_文字列,_前文字列,'DEF',_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,'DEF',_後文字列,_,_,_), sub_atom(_前文字列,_,3,_,'ABC'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/929 # # AをB、BをC・・・と # アルファベットをひとつずつずらすには、どうやって書いたらいいでしょうか? # サクラエディタでの置換を考えてます # # 'AをB、BをC・・・とアルファベットをひとつずつずらす'(_文字列,_アルファベットをひとつずつずらされた文字列) :- findall(_ずらした文字,( sub_atom(_文字列,_,1,_,_文字), アルファベットをひとつずらす(_文字,_ずらした文字)), L), concat_atom(L,_アルファベットをひとつずらされた文字列). アルファベットをひとつずらす(_文字,_ずらした文字) :- append(_,[_文字,_ずらした文字|_],[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]),!. アルファベットをひとつずらす(_文字,_ずらした文字) :- append(_,[_文字,_ずらした文字|_],['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']),!. アルファベットをひとつずらす(_文字,_文字). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/408 # # [1] アルゴリズム 文字列ポインタ演習 # [2] 問題文:文字列st の中に,文字c が含まれていればその文字 # へのポインタを返し,含まれていなければNULL を返す # 関数char *str_chr(const char *st, int c) # を作成せよ.以下の実行例のように,関数の動作を確認 # できるmain 関数も作成すること. # 実行例 # 文字列str:ABCDEFGHIJKLMNOPQRSTUVWXYZ # 1 文字入力してください:X # その文字はstr に含まれています。 # その文字以降を表示します:XYZ # 例.2 # 文字列str:ABCDEFGHIJKLMNOPQRSTUVWXYZ # 1 文字入力してください:3 # その文字はstr に含まれていません # '文字列st の中に,文字c が含まれていればその文字へのポインタを返し,含まれていなければNULL を返す'(_st,_c,_その文字以降の文字列) :- sub_atom(_st,S,1,R,_c), sub_atom(_st,S,R,0,_その文字以降の文字列). '文字列st の中に,文字c が含まれていればその文字へのポインタを返し,含まれていなければNULL を返す'(_,_,''). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/916 # # 質問です。 # # 数字と文字が混在する文字列の中から、数字だけを取り出すことは可能でしょうか? # (ただし、複数個の数字文字列としてではなく、一つの文字列として取り出す場合) # # 例えば # 「a12b3cd456efg」から「123456」を取り出す # (「12」と「3」と「456」ではなく) # # '数字と文字が混在する文字列の中から、数字だけを取り出す。ただし、複数個の数字文字列としてではなく、一つの文字列として取り出す'(_文字列,_数字文字列) :- findall(_数字,( sub_atom(_文字列,_,1,_,_文字), member(_文字,['0','1','2','3','4','5','6','7','8','9'])), L), concat_atom(L,_数字文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/361 # # [1] 授業単元: プログラミングC (ポインタ、文字列) # [2] 文字列を後ろから逆に表示する(例えば"ABC"を受け # 取ったら"CBA"と表示する)関数 # void put_rstring(const char *st) # を,添字演算子[] を使わずに作成せよ # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を後ろから逆に表示する(_文字列) :- atom_chars(_文字列,Chars), ならびを後ろから逆に表示する(Chars). ならびを後ろから逆に表示する([]). ならびを後ろから逆に表示する([A|R]) :- ならびを後ろから逆に表示する(R), put_char(A). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を後ろから逆に表示する(_文字列) :- sub_atom(_文字列,0,_文字列の長さ_1,1,_), for(0,N,_文字列の長さ_1), sub_atom(_文字列,_,1,N,_文字), put_char(_文字), N = _文字列の長さ_1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を後ろから逆に表示する(_文字列) :- atom_chars(_文字列,Chars), reverse(Chars,Chars2), atom_chars(_反転した文字列,Chars2), writef('%t',[_反転した文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を後ろから逆に表示する(_文字列) :- sub_atom(_文字列,0,_文字列の長さ_1,1,_), findall(_文字,( for(0,N,_文字列の長さ_1), sub_atom(_文字列,_,1,N,_文字)), Chars), atom_chars(_反転した文字列,Chars), writef('%t',[_反転した文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を後ろから逆に表示する(_文字列) :- atom_chars(_文字列,Chars), rappend(L0,[_文字|_],Chars), writef('%t',[_文字]), L0 = []. rappend(L0,[X|R],L) :- rappend_1(L,L0,X,[],R). rappend_1(L,L0,X,R1,R) :- append(L1,[A],L), rappend_2(L1,L0,A,X,R1,R). rappend_2(L1,L1,A,A,R,R). rappend_2(L1,L0,B,X,R1,R) :- rappend_1(L1,L0,X,[B|R1],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/tech/1322562648/172 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 前日商品別に在庫を登録したファイル "zaiko.txt" と # 当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し、 # 新たな在庫ファイル "zaiko_new.txt" を出力するプログラムを作成せよ。 # ファイルの各レコード(行)は次の形式であり、ひとつの商品に対してひとつのレコードとする。 # # 商品コード 整数 4桁 # 数量 数字 4桁 # # なお、各ファイルは商品コードの昇順にソートされているものとする。 # ※実行例:http://ime.nu/s2.etowns.slyip.net/~c_cpp_homework/cgi-bin/joyful/img/256.txt # '前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し、新たな在庫ファイル "zaiko_new.txt" を出力する' :- '前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し'(LL1,LL2), '新たな在庫ファイル "zaiko_new.txt" を出力する'(LL1,LL2). '前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し'(LL1,LL2) :- get_lines('zaiko.txt',Lines1), get_lines('nyuko.txt',Lines2), 行を商品番号と数量に分解する(Lines1,LL1), 行を商品番号と数量に分解する(Lines2,LL2). 行を商品番号と数量に分解する(Lines,LL) :- findall([_商品番号,_数量],( append(_,[_行|_],Lines), 商品番号と数量に分解(_行,_商品番号,_数量)), LL). 商品番号と数量に分解(_行,_商品番号,_数量) :- sub_atom(_行,0,4,4,S1), sub_atom(_行,4,4,0,S2), atom_to_term(S1,_商品番号,_), atom_to_term(S2,_数量,_). '新たな在庫ファイル "zaiko_new.txt" を出力する'(LL1,LL2) :- '新たな在庫ファイル'(LL1,LL2,LL3), 出力する('zaiko_new.txt',LL3). '新たな在庫ファイル "zaiko_new.txt" を出力する'(LL1,[],LL1) :- !. '新たな在庫ファイル "zaiko_new.txt" を出力する'([],LL2,LL2) :- !. '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号,_数量_1]|R1],[[_商品番号,_数量_2]|R2],[[_商品番号,_数量_3]|R3]) :- _数量_2_1 is _数量_1 + _数量_2, 入庫の集約(_商品番号,R2,_数量_2_1,_数量_3,R2_2), '新たな在庫ファイル "zaiko_new.txt" を出力する'(R1,R2_2,R3). '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号_1,_数量_1]|R1],[[_商品番号_2,_数量_2]|R2],[[_商品番号_1,_数量_1]|R3]) :- _商品番号_1 @< _商品番号_2, '新たな在庫ファイル "zaiko_new.txt" を出力する'(R1,[[_商品番号_2,_数量_2]|R2],R3). '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号_1,_数量_1]|R1],[[_商品番号_2,_数量_2]|R2],[[_商品番号_2,_数量_3]|R3]) :- _商品番号_1 @> _商品番号_2, 入庫の集約(_商品番号_2,R2,_数量_2,_数量_3,R2_2), '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号_1,_数量_1]|R1],R2_2,R3). 入庫の集約(_商品番号,[],_数量_3,_数量_3,[]) :- !. 入庫の集約(_商品番号,[[_商品番号,_数量]|R],_数量_2_1,_数量_3,R2_2) :- _数量_2_2 is _数量_2_1 + _数量, 入庫の集約(_商品番号,R,_数量_2_2,_数量_3,R2_2),!. 入庫の集約(_商品番号,[[_商品番号_2_2,_数量]|R2],_数量_3,_数量_3,[[_商品番号_2,_数量_2]|R2]) :- \+(_商品番号=_商品番号_2). 出力する(File,LL) :- open(File,write,Outstream), append(_,[[_商品番号,_数量]|R],LL), writef(Outstream,'%4r%4r\n',[_商品番号,_数量]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/161 # # [1] 授業単元:C言語プログラミング # [2] 問題文 # ポインタの利用方法として,配列を使わない文字列処理を習得する.課題3を配列を使わずに「メモリの動的確保」及び「ポインタ演算」により処理する. # 課題3 # 配列の値を前後に移動させる際に押し出された要素(文字)は反対側に入るようにします. # 例. ABCDE に 手続き(1)(=1つ前に詰める)を適用すると #   BCDEA となる. # 文字型の配列に値を格納しなくてはなりませんが「配列の初期化」のテクニックを # 使って,プログラム中で行う(つまりキーボードから打ち込まない). # また,配列のサイズ(つまり要素数)は5個とする. ( 例."ABCDE" の5文字を # 処理対象とする等) # 条件 # プログラム中で配列を用いてはいけません.配列の宣言の代わりに,必ずにある「メモリの動的割り当て」の手法を使って malloc関数で必要なメモリを確保する方法で実装すること. # 変化したことが分かるようにprintf関数で確認できるようにすること # 文字列の先頭文字を切り取り残り文字列の末尾に結合した文字列を作る(_文字列,_対象となった文字,_結合された文字列) :- sub_atom(_文字列,0,1,R,_対象となった文字), sub_atom(_文字列,1,R,_,_残りの文字列), atom_concat(_残りの文字列,_対象となった文字,_結合された文字列). 文字列の末尾文字を切り取り先頭に結合した文字列を作る(_文字列,_対象となった文字,_結合された文字列) :- sub_atom(_文字列,S,1,0,_対象となった文字), sub_atom(_文字列,0,S,1,_末尾を切り取られた文字列), atom_concat(_対象となった文字,_末尾を切り取られた文字列,_結合された文字列). 文字列の先頭からN文字を切り取り残り文字列の末尾に結合した文字列を作る(_文字列,N,_対象となった文字列,_結合された文字列) :- sub_atom(_文字列,0,N,R,_対象となった文字列), sub_atom(_文字列,N,R,0,_残りの文字列), atom_concat(_残りの文字列,_対象となった文字,_結合された文字列). 文字列の末尾からN文字を切り取り先頭に結合した文字列を作る(_文字列,_対象となった文字,_結合された文字列) :- sub_atom(_文字列,S,N,0,_対象となった文字), sub_atom(_文字列,0,S,N,_末尾を切り取られた文字列), atom_concat(_対象となった文字,_末尾を切り取られた文字列,_結合された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/61 # # 1] 授業単元:バイナリデータの扱い方 # [2] 問題文(含コード&リンク): # 白黒のbmp画像を読みとり、白なら0、黒なら1として以下の例のような画像情報を載せたtxtファイルを作成する。 # (txtファイルの1行目にはbmpの横と縦のピクセル数を書き込むこと) # <例> # 元のbmp画像(direct.bmp):http://ime.nu/loda.jp/kng311tt/?id=74.bmp # ↓ # /********direct.txtの中身******************** # 24 15 # 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 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 # 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 # 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 # 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 # 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 # 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 # 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 # 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 # 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 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 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 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 # ******************************************/ # '白黒のbmp画像を読みとり、白なら0、黒なら1として以下の例のような画像情報を載せたtxtファイルを作成する'(_画像ファイル名,_txtファイル名) :- get_bytes(_画像ファイル名,Chars), 画像情報の取得(Chars,_幅サイズ,_高さサイズ,_ファイルの中でのイメージの位置), 画素ならびの取得(Chars,_幅サイズ,_高さサイズ,_画素ならび), 'txtファイルを作成する'(_txtファイル名,_幅サイズ,_画素ならび),!. 画素ならびの取得(Chars,_ファイルの中でのイメージの位置,_画素ならび) :- length(_ヘッダ,_ファイルの中でのイメージの位置), append(_ヘッダ,_画素ならび,Chars),!. 画像情報の取得(Chars,_幅サイズ,_高さサイズ,_ファイルの中でのイメージの位置) :- bmpヘッダー値(Chars,biWidth,_幅サイズ), bmpヘッダー値(Charr,biHeight,_高さサイズ), bmpヘッダー値(Charr,bfOffBits,_ファイルの中でのイメージの位置),!. 'txtファイルを作成する'(_txtファイル名,_幅サイズ,_高さサイズ,_画素ならび) :- open(_txtファイル名,write,Outstream), writef(Outstream,'%t %t\n',[_幅サイズ,_高さサイズ]), イメージデータの表示(Outstream,_幅サイズ,_高さサイズ,_画素ならび), close(Outstream),!. イメージデータの表示(Outstream,_幅サイズ,_高さサイズ,_画素ならび) :- append(L0,[_画素|R],_画素ならび), length(L0,_ビットマップ変位), 画素表示(Outstream,_ビットマップ変位,_幅サイズ,_画素), R = []. 画素表示(Outstream,_ビットマップ変位,_幅サイズ,255) :- (_幅サイズ - 1) =:= _ビットマップ変位 mod _幅サイズ, write(Outstream,'0\n'),!. 画素表示(Outstream,_ビットマップ変位,_,255) :- write(Outstream,'0 '),!. 画素表示(Outstream,_ビットマップ変位,_幅サイズ,0) :- (_幅サイズ - 1) =:= _ビットマップ変位 mod _幅サイズ, write(Outstream,'1\n'),!. 画素表示(Outstream,_ビットマップ変位,_,0) :- write(Outstream,'1 '),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '画像ファイルヘッダ'(bmp,0,2,bfType,'ASCII"BM"'). '画像ファイルヘッダ'(bmp,2,4,bfSize,'ファイルサイズ'). '画像ファイルヘッダ'(bmp,6,2,bfReserved1,'00'). '画像ファイルヘッダ'(bmp,8,2,bfReserved2,'00'). '画像ファイルヘッダ'(bmp,10,4,bfOffBits,'ファイルの中でのイメージの開始位置'). '画像ファイルヘッダ'(bmp,14,4,biSize,'ヘッダサイズ。40バイト'). '画像ファイルヘッダ'(bmp,18,4,biWidth,'イメージの幅(ピクセル単位)'). '画像ファイルヘッダ'(bmp,22,4,biHeight,'イメージの高さ(ピクセル単位)'). '画像ファイルヘッダ'(bmp,26,2,biPlanes,'イメージのプーン数。1でなければならない。'). '画像ファイルヘッダ'(bmp,28,2,biBitCount,'ピクセルあたりのビット数。1,4,8,24'). '画像ファイルヘッダ'(bmp,30,4,biCompression,'圧縮形式'). '画像ファイルヘッダ'(bmp,34,4,biSizeImage,'圧縮されたイメージのサイズ(バイト単位),または0'). '画像ファイルヘッダ'(bmp,38,4,biXPeisPerMeter,'水平解像度(1メートルあたりのピクセル数'). '画像ファイルヘッダ'(bmp,42,4,biYpeisPerMeter,'垂直解像度(1メートルあたりのピクセル数'). '画像ファイルヘッダ'(bmp,46,4,biCirUsed,'使用するカラー数。'). '画像ファイルヘッダ'(bmp,50,4,biCirimportant,'重要な色'). '画像ファイルヘッダ'(bmp,54,N,biIColors,'カラーマップ') :- '画像データならび'(_画像データならび), '画像ファイルヘッダ'(bmp,_オフセット,_サイズ,biCirused,_), length(L0,_オフセット), append(L0,[A,B,C,D|_],_画像データならび), 'カラーマップ欄のサイズを得る'([A,B,C,D],N). 'カラーマップ欄のサイズを得る'([0,0,0,0],16) :- !. 'カラーマップ欄のサイズを得る'(L,N) :- 'byte整数ならびを整数に変換'(L,0,M), N is 4 * M. bmpヘッダー値(L,bfType,'BM') :- !. bmpヘッダー値(L,_名前,_名前の値) :- 画像ファイルヘッダ(bmp,_オフセット,4,_名前,_), lenght(L0,_オフセット), length(LX,4), append(L0,LX,_,L), 'byte整数ならびを整数に変換'(LX,0,_名前の値),!. bmpヘッダー値(L,_名前,_名前の値) :- 画像ファイルヘッダ(bmp,_オフセット,2,_名前,_), lenght(L0,_オフセット), length(LX,2), append(L0,LX,_,L), 'byte整数ならびを整数に変換'(LX,0,_名前の値),!. bmpヘッダー値(L,_名前,_名前の値) :- 画像ファイルヘッダ(bmp,_オフセット,_サイズ,_名前_1,_摘要), sub_atom(_摘要,_,_,_,_名前), bmpヘッダー値(L,_名前_1,_名前の値),!. 'byte整数ならびを整数に変換'([],X,X). 'byte整数ならびを整数に変換'([N|R],M_1,X) :- M_2 is M_1 * 256 + N, 'byte整数ならびを整数に変換'(R,M_2,X). % 以下のサイトは ?- 'a##'. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/821 # # aの4回以上8回以下の繰り返し「 ^a{4,8}$ 」 # ではなくて、 # 「aの4回または8回の繰り返し」 # を ^(a{4}|a{8})$ のように「a」を2回使用せずに、「a」を1回だけ使用して指定する方法を教えてください。 # # 'aの4回または8回の繰り返し'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), \+(last(L1,'a')), \+(L3=[a|_]), 'aの4回または8回繰り返し'(L2). 'aの4回または8回の繰り返し'([a,a,a,a,a,a,a,a]). 'aの4回または8回の繰り返し'([a,a,a,a]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/814 # # Javaでaaaa1.txt と bbbb2_2.txtというファイル名が有り、 # aaaaと1、bbbb2_と2を抽出したい # どう書いたらいい? # 'aaaa1.txt と bbbb2_2.txtというファイル名が有り、aaaaと1、bbbb2_と2を抽出したい'(_文字列,_ファイル名,_指標) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), 'aaaa1.txt と bbbb2_2.txtというファイル名が有り、aaaaと1、bbbb2_と2を抽出したい'(L2,_ファイル名,_指標). 'aaaa1.txt と bbbb2_2.txtというファイル名が有り、aaaaと1、bbbb2_と2を抽出したい'([a,a,a,a|R],aaaa,_指標) :- 指標を得る(R,_指標). 'aaaa1.txt と bbbb2_2.txtというファイル名が有り、aaaaと1、bbbb2_と2を抽出したい'([b,b,b,b,_,2|R],bbbb_2,_指標) :- 指標を得る(R,_指標). 指標を得る(L,_指標) :- append(L1,['.',t,x,t],L), number_chars(_指標,L1). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/860 # # [1] 授業単元: C言語とアルゴリズム # [2] 問題文(含コード&リンク): # 文字列st が回文(前から読んでも後ろから読んでも # 同じ)であれば1 を,そうでなければ0 を返す関数 # int isPalindrome(const char st[]) # を作成せよ.以下の実行例のように,関数の動作を確認 # できるmain 関数も作成すること. # <実行例> # ./5-4 # 文字列を入力してください:AKASAKA # その文字列は回文です。 # # % ./5-4 # 文字列を入力してください:tomato # その文字列は回文ではありません。 # 回文述語の動作確認 :- write('文字列を入力して下さい : '), get_line(_文字列), 回文(_文字列,_診断), 回文診断(_診断). 回文(_文字列,1) :- atom_chars(Chars), reverse(Chars,Chars),!. 回文(_文字列,0). 回文診断(1) :- write('文字列は回文です。\n'). 回文診断(0) :- write('文字列は回文ではありません。\n'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- 回文(_文字列,1). 回文('',1). 回文(_文字列,_診断) :- 文字列の先頭と末尾から一文字取り出す(_文字列,A,_中間部分文字列,A), 回文(_中間部分文字列,_診断). 文字列の先頭と末尾から一文字取り出す(_文字列,_先頭,_中間部分文字列,_末尾) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_,1,0,_末尾文字). '文字列の先頭と末尾からN文字取り出した中間部分'(_文字列,1,_中間部分文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列の先頭と末尾から一文字取り出す(_文字列,_先頭,_末尾) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_,1,0,_末尾文字). '文字列の先頭と末尾からN文字取り出した中間部分'(_文字列,_N文字,_中間部分文字列) :- sub_atom(_文字列,_N文字,_,_N文字,_中間部分文字列). 文字列の先頭から一文字取り出す(_文字列,_先頭文字,_残り文字列) :- sub_atom(_文字列,0,1,R,_文字), sub_atom(_文字列,1,R,0,_残り文字列). 文字列の先頭からN文字取り出す(_文字列,_N文字,_先頭からの文字列,_残り文字列) :- sub_atom(_文字列,0,_N文字,R,_先頭からの文字列), sub_atom(_文字列,_N文字,R,0,_残り文字列). 文字列の末尾から一文字取り出す(_文字列,_末尾文字,_残り前方文字列) :- sub_atom(_文字列,R,1,0,_末尾文字), sub_atom(_文字列,0,R,1,_残り前方文字列). 文字列の末尾部分N文字取り出す(_文字列,_N文字,_末尾部分文字列,_残り前方文字列) :- sub_atom(_文字列,R,_N文字,0,_末尾部分文字列), sub_atom(_文字列,0,R,_N文字,_残り前方文字列). 文字列の末尾から逆順にN文字取り出す(_文字列,_N文字,_末尾からの逆順文字列,_残り前方文字列) :- 文字列の末尾部分を逆順にN文字取り出す(_文字列,_N文字,_末尾からの逆順文字列), sub_atom(_文字列,0,R,_N文字,_残り前方文字列). 文字列の末尾部分を逆順にN文字取り出す(_文字列,_N文字,_末尾からの逆順文字列) :- 文字列の末尾部分を逆順にN文字取り出す(_文字列,0,_N文字,_末尾からの逆順文字列). 文字列の末尾部分を逆順にN文字取り出す(_文字列,N,N,'') :- !. 文字列の末尾部分を逆順にN文字取り出す(_文字列,M,_N文字,_末尾からの逆順文字列) :- sub_atom(_文字列,_,1,M,_文字), M_2 is M + 1, 文字列の末尾部分を逆順にN文字取り出す(_文字列,M_2,_N文字,_末尾からの逆順文字列_2), atom_concat(_末尾からの逆順文字列_2,_文字,_末尾からの逆順文字列). % % sub_atom/5はPrologの中でも極めてスーパーな組込述語である。この述語を % 使っての文字列操作について、いくつか述語定義をしてみた。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/625 # # [1] 授業単元:C言語 # [2] 問題文:123, 1.23, 1.2.3という数字を入力したとき、 #        整数、小数、使用できない数字という分類に分けよ。 # '123, 1.23, 1.2.3という数字を入力したとき、整数、小数、使用できない数字という分類に分けよ。'(_整数分類ならび,_小数分類ならび,_使用できない数字分類ならび) :- split('123, 1.23, 1.2.3',[',',' '],L), '整数、小数、使用できない数字という分類'(L,_整数分類ならび,_小数分類ならび,_使用できない数字分類ならび). '整数、小数、使用できない数字という分類'([],[],[],[]). '整数、小数、使用できない数字という分類'([A|R1],[A|R2],R3,R4) :- 整数である(A), '整数、小数、使用できない数字という分類'(R1,R2,R3,R4),!. '整数、小数、使用できない数字という分類'([A|R1],R2,[A|R3],R4) :- 小数である(A), '整数、小数、使用できない数字という分類'(R1,R2,R3,R4). '整数、小数、使用できない数字という分類'([A|R1],R2,R3,[A|R4]) :- '整数、小数、使用できない数字という分類'(R1,R2,R3,R4),!. 整数である(A) :- 第一文字が符号で残りの文字列をA2とすると(A,A2), 文字列が符号を含まない数字だけから構成される(A2),!. 整数である(A) :- 文字列が符号を含まない数字だけから構成される(A2),!. 小数である(A) :- 第一文字が符号で残りの文字列をA2とすると(A,A2), 数字から始まる小数点表現文字列(A2),!. 小数である(A) :- 数字から始まる小数点表現文字列(A2),!. 数字から始まる小数点表現文字列(A) :- 間にピリオドがひとつだけあり他は数字である文字列(A),!. 数字から始まる小数点表現文字列(A) :- atom_chars(A,Chars), 指数部表現が適切(Chars). 指数部表現が適切(Chars) :- append(L0,[e,+|R],Chars), 'L0部の診断'(L0), 空ではなくかつ全て数字(R). 指数部表現が適切(Chars) :- append(L0,[e,-|R],Chars), 'L0部の診断'(L0), 空ではなくかつ全て数字(R). 'L0部の診断'(L0) :- 空ではなくかつ全て数字(L0),!. 'L0部の診断'(L0) :- append(L01,['.'|R],L0), 空ではなくかつ全て数字(L0), 空ではなくかつ全て数字(R),!. 間にピリオドがひとつだけあり他は数字である文字列(A) :- atom_chars(A,Chars), append(L0,['.'|R],Chars), 空ではなくかつ全て数字(L0), 空ではなくかつ全て数字(R),!. 第一文字が符号で残りの文字列をA2とすると(A,A2) :- sub_atom(A,0,1,R,_符号), member(_符号,[+,-]), sub_atom(A,1,R,0,A2). 文字列が符号を含まない数字だけから構成される(_文字列) :- atom_chars(_文字列,Chars), 空ではなくかつ全て数字(Chars). 空ではなくかつ全て数字([]) :- !,fail. 空ではなくかつ全て数字(L) :- 全て数字(L). 全て数字([]). 全て数字([A|R]) :- member(A,['0','1','2','3','4','5','6','7','8','9']), 全て数字([R]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/659 # # [1] 授業単元:(文字列) # [2] 問題文(含コード&リンク):文字列st の中に含まれる文字ch の個数(含まれて # いなければ0 とする)を返す関数 # int str_chnum(const char st[], int ch) # を作成せよ.以下の実行例のように,関数の動作を確認 # できるmain 関数も作成すること. # 【注意】scanf で文字列を入力させた後にgetchar 関 # 数で文字を入力させたい場合,getchar で文字を入力 # させる前に # scanf("%*c"); # などとして,バッファに残った改行コードを読み捨て # ておく必要がある. # # のように動作するプログラムを作成せよ # '文字列st の中に含まれる文字ch の個数(含まれていなければ0 とする)を返す'(_何個) :- '文字列stの入力'(_st), '文字chの入力'(_ch), '文字列st の中に含まれる文字ch の個数'(_st,_ch,_何個). '文字列stの入力'(_st) :- write('文字列を入力して下さい : '), get_line(_st). '文字chの入力'(_ch) :- write('個数を数える文字を入力して下さい : '), get_char(_ch). '文字列st の中に含まれる文字ch の個数'(_st,_ch,_何個) :- count(sub_atom(_st,_,1,_,_ch),_何個). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/624 # # [1] 授業単元:リスト構造体 # [2] 問題文(含コード&リンク): # enqueue()とdequeue()を用いて実行結果が # # Please input E(登録) or D(削除): E # Input number and name: 8 Nakamura # Please input E(登録) or D(削除): E # Input number and name: 3 Saito # Please input E(登録) or D(削除): D # Number=8 Name=Nakamura # Please input E(登録) or D(削除): D # Number=3 Name=Saito # Please input E(登録) or D(削除): D # No Data! # Please input E(登録) or D(削除): E # ・ # ・ # ・ # のように動作するプログラムを作成せよ # :- dynamic(キュー/2). 'enqueue()とdequeue()を用いて実行' :- start_queue, 要求の取得(_要求), 'enqueue()とdequeue()を用いて実行'(_要求). 要求の取得(_要求) :- write('Please input E(登録) or D(削除) or q(終了) : '), 行入力(_要求),!. 'enqueue()とdequeue()を用いて実行'(q) :- !. 'enqueue()とdequeue()を用いて実行'('E') :- enqueue, fail. 'enqueue()とdequeue()を用いて実行'('D') :- dequeue, fail. 'enqueue()とdequeue()を用いて実行'(_) :- 要求の取得(_要求), 'enqueue()とdequeue()を用いて実行'(_要求). start_queue :- キューの生成(一時的). enqueue :- write('Input number and name: '), 'Input number and name'(_number,_name), キューへの追加(一時的,[_number,_name]). 'Input number and name'(_number,_name) :- 区切り入力([' ',','],[_number,_name]). dequeue :- キューからの取り出し(一時的,_項), dequeue診断(_項,_診断), writef('%w\n',[_診断]). dequeue診断([],' No Data!') :- !. dequeue診断([_number,_name],_表示文字列) :- concat_atom(['nunmber = ',_number,' name = ',_name],_表示文字列). キューの生成(_キューの名前) :- キュー(_キューの名前,_), writef('%wというキューは既に存在します。登録できません。\n',[_キューの名前]),!. キューの生成(_キューの名前) :- asserta(キュー(_キューの名前,[])). キューからの取り出し(_キューの名前,_取り出した項) :- retract(キュー(_キューの名前,[_取り出した項|R])), asserta(キュー(_キューの名前,R)),!. キューからの取り出し(_キューの名前,[]). キューへの追加(_キューの名前,_追加する項) :- retract(キュー(_キューの名前,_キュー)), append(_キュー,[_追加する項],_追加されたキュー), asserta(キュー(_キューの名前,_追加されたキュー)). キューを空にする(_キュー名) :- retract(キュー(_キューの名前,_)), asserta(キュー(_キューの名前,[])). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 区切り入力(_区切り文字列ならび,_区切られた文字列ならび) :- 行入力(_行), 区切り文字列によって区切る(_行,_区切り文字列ならび,_区切られた文字列ならび). 区切り文字列によって区切る(_文字列,_区切り文字列ならび,[_前文字列|R]) :- sub_atom(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび), 区切り文字列によって区切る(_後文字列,_区切り文字列ならび,R),!. 区切り文字列によって区切る(_文字列,_,[_文字列]). 区切り文字列によって区切る('',_,[]). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % % キューは引数内の論理変数として重リストを使って定義し、 % それを更新しながら持ちまわるのが普通だが、 % ここでは愚直に、キューを述語としてassertし、reatract/assertを % 繰り返して値を出入りさせる述語群を定義してみた。 % % 以下のサイトは # 出典:: 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/1301067486/777 # # JavaScriptで # aa1 # っていう文字列の塊を1セットで[a-z]{2}[0-9]と表します # この文字列が # fi1cs2bc3wr4 # ってう風に4回繰り返されている場合にヒットさせる正規表現はどうかくのでしょうか? # ([a-z]{2}[0-9]){4}って感じで書いてみたんですけど(〜){数字}のケースって見たことないんですがどうでしょうか # # ある文字パターンが四回繰り返されているパターン(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), ある文字パターンが四回繰り返されている(L2). ある文字パターンが四回繰り返されている(L) :- append(A,B,L1), append(L1,C,L2), append(L2,D,L). 同一パターン([A,B,C,D],_). 同一パターン([],_) :- !. 同一パターン([A|R],N) :- パターン候補(A,1), 同一パターン(R,N). パターン候補(A,1) :- 一文字目がアルファベット(A), 二文字目がアルファベット(A), 三文字目が数字(A). 一文字目が英文字(A) :- sub_atom(A,0,1,_,A1), 英文字(A1),!. 二文字目が英文字(A) :- sub_atom(A,1,1,_,A2), 英文字(A2),!. 三文字目が数字(A) :- sub_atom(A,2,1,_,A3), A3 @>= '0', A3 @=< '9',!. 英文字(A) :- A @>= 'a', A @=< 'z',!. 英文字(A) :- A @>= 'A', A @=< 'Z',!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/246 # # [1] 授業単元:プログラミングと実習2 # [2] 五目並べの石を並べる関数を作りる # 条件 # 1.読み込み部分を関数化する。場所の指定は、行(row,大文字)、 # 列(column,小文字)の順として連続した半角アルファベットとする。 # 例:Aa↓,Gg↓(↓はEnter)とする。 # 読み込んだ結果はA〜Zが0〜25,a〜zが0〜25とする #  出力例Bg # row=1 # columnp=6 # 3] 環境 #  [3.1] OS:windowsXP #  [3.2] コンパイラ名とバージョン: Visual C++ 2008 Express #  [3.3] 言語:C言語 # [4] 期限:11月15日 # [5]その他の制限:アルファベットを整数値に変換して*rowp,*columnpに #         格納し*rowo,*columnpの値を評価するプルグラムを作る # # どうかよろしくお願いします  # '五目並べの石を並べる'(_盤面) :- 盤面を用意する(_盤面), 石を並べる([_],黒,_盤面). 盤面を用意する(_盤面) :- length(_盤面,19), findall(_,( append(_,[L|_],_盤面), length(L,19)), _盤面). 石を並べる(Ln,_石の色,_盤面) :- 着手を得る(Ln,_手), 着手を解析して盤面に石を配置する(_手,_石の色,_盤面), 次の石の色(_石の色,_次の石の色), 石を並べる([_|Ln],_次の石の色,_盤面),!. 石を並べる(_,_,_). 着手を得る(Ln,_手) :- length(Ln,_何手目), writef('着手を入力して下さい(終了するときは改行だけ)\n第%t手目 : ',[_何手目]), get_line(_手). 着手を解析して盤面に石を配置(_手,_石の色,_盤面) :- 着手を解析して(_手,_行,_列), 盤面に石を配置する(_何行,_何列,_石の色,_盤面). 盤面に石を配置する(_何行,_何列,_石の色,_盤面) :- length([_|Ln1],_何行), length([_|Ln2],_何列), append(Ln1,[L|_],_盤面), append(Ln2,[_石の色|_],L),!. 手の解析(_手,_何行,_何列) :- sub_atom(_手,0,1,_,_行を表す英大文字), sub_atom(_手,1,1,_,_列を表す英小文字), 英大文字の何番目(_行を表す英大文字,_何行), 英小文字の何番目(_列を表す英小文字,_何列),!. 英大文字の何番目(_行を表す英大文字,_何行) :- nth1(_何行,['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'],_行を表す英大文字). 英小文字の何番目(_列を表す英小文字,_何列) :- nth1(_何列,[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],_列を表す英小文字). 次の石の色(黒,白). 次の石の色(白,黒). % 以下のサイトは # 出典:: 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/1320365280/92 # # [1] 授業単元:C言語 # [2] 問題文:ttp://www1.axfc.net/uploader/Sc/so/290413 # # 数字の文字列を 1文字ずつ整数値に変換するプログラムを作成せよ. # (例)文字列"12345" → 5つの整数値 1, 2, 3, 4, 5 # # ただし,次の手順に沿って作成せよ # # 手順1.数字を数値に変換する関数 char_to_intの作成 # # 数字1文字を数値に変換する(文字'1'であれば整数値1に変換する)関数char_to_int # を作成せよ.ただし,引数として 1文字を値渡しで渡し,戻り値は変換後の数値とする. # また,数字以外の文字が渡された場合は戻り値を‐1とする. # # 作成した関数 char_to_intが正常に動作するかどうかは次のmain関数を使って確認すること. # # int main(void) # { # char a = '2'; # char b = '5'; # char c = 'A'; # # printf("%c, %d, %d\n", a, (int)a, char_to_int(a)); # printf("%c, %d, %d\n", b, (int)b, char_to_int(b)); # printf("%c, %d, %d\n", c, (int)c, char_to_int(c)); # # # return 0; # } # # # 実行結果 # 2, 50, 2 # 5, 53, 5 # A, 65, ‐1 # # # # 手順2. 数字の文字列を 1文字ずつ整数値に変換する関数 str_to_intの作成 # # 数字の文字列を 1文字ずつに分割し,それぞれの文字を整数値に変換して,その整数値を # # 配列に代入して返す関数 str_to_intを作成せよ.ただし,第1引数は文字列が # # 代入されている配列の先頭アドレスを受け取るポインタ変数,第2引数は変換後の整数値を # # 代入する配列の先頭アドレスを受け取るポインタ,第3引数は数値の個数(文字列の長さ)を # # 返すためのポインタ変数とすること.また,関数内ではポインタを使って # # 簡潔かつ高速に文字列を操作すること.この関数内で配列を使用した場合や意味のないポインタの # # 使い方をした場合は,課題を達成したとは認めない.また手順1で作成した char_to_intを # # 有効利用すること # # # 関数 str_to_intが正しく動作することを次の main関数を使って確認せよ. # ([]は適切に埋めること.) # # int main(void) # { # char *str1 = "4096"; /*変換対象の文字列 1 */ # char *str2 = "1A5z24"; /*変換対象の文字列 2 */ # # int data[20]; /*変換後のデータを代入する配列 */ # int num; /*データ数を代入する変数 */ # int i; # # str_to_int([] ,[] ,[]); /*関数呼び出し */ # for(i = 0; i < num; i++) # printf("%d ", data[i]); # printf("\n"); # # str_to_int([],[] ,[]); /*関数呼び出し*/ # for(i = 0; i < num; i++) # printf("%d ", data[i]); # printf("\n"); # # # return 0; # } # # # (3)実行結果 # 4 0 9 6 # 1 ‐1 5 ‐1 2 4 # '数字の文字列を 1文字ずつに分割し,それぞれの文字を整数値に変換して,その整数値をならびとして返す'(_数字の文字列,_整数値ならび) :- findall(_整数値,( '数字の文字列を 1文字ずつ整数値に変換する'(_数字の文字列,_整数値)), _整数値ならび). '数字の文字列を 1文字ずつ整数値に変換する'(_数字の文字列,_整数値) :- sub_atom(_数字の文字列,_,1,_,_文字としての数字), 文字としての数字を整数値に変換する(_文字としての数字,_整数値). 文字としての数字を整数値に変換する('0',0) :- !. 文字としての数字を整数値に変換する('1',1) :- !. 文字としての数字を整数値に変換する('2',2) :- !. 文字としての数字を整数値に変換する('3',3) :- !. 文字としての数字を整数値に変換する('4',4) :- !. 文字としての数字を整数値に変換する('5',5) :- !. 文字としての数字を整数値に変換する('6',6) :- !. 文字としての数字を整数値に変換する('7',7) :- !. 文字としての数字を整数値に変換する('8',8) :- !. 文字としての数字を整数値に変換する('9',9) :- !. 文字としての数字を整数値に変換する(_,-1). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/92 # # [1] 授業単元:C言語 # [2] 問題文:ttp://www1.axfc.net/uploader/Sc/so/290413 # # 数字の文字列を 1文字ずつ整数値に変換するプログラムを作成せよ. # (例)文字列"12345" → 5つの整数値 1, 2, 3, 4, 5 # # ただし,次の手順に沿って作成せよ # # 手順1.数字を数値に変換する関数 char_to_intの作成 # # 数字1文字を数値に変換する(文字'1'であれば整数値1に変換する)関数char_to_int # を作成せよ.ただし,引数として 1文字を値渡しで渡し,戻り値は変換後の数値とする. # また,数字以外の文字が渡された場合は戻り値を‐1とする. # # 作成した関数 char_to_intが正常に動作するかどうかは次のmain関数を使って確認すること. # # int main(void) # { # char a = '2'; # char b = '5'; # char c = 'A'; # # printf("%c, %d, %d\n", a, (int)a, char_to_int(a)); # printf("%c, %d, %d\n", b, (int)b, char_to_int(b)); # printf("%c, %d, %d\n", c, (int)c, char_to_int(c)); # # # return 0; # } # # # 実行結果 # 2, 50, 2 # 5, 53, 5 # A, 65, ‐1 # # # # 手順2. 数字の文字列を 1文字ずつ整数値に変換する関数 str_to_intの作成 # # 数字の文字列を 1文字ずつに分割し,それぞれの文字を整数値に変換して,その整数値を # # 配列に代入して返す関数 str_to_intを作成せよ.ただし,第1引数は文字列が # # 代入されている配列の先頭アドレスを受け取るポインタ変数,第2引数は変換後の整数値を # # 代入する配列の先頭アドレスを受け取るポインタ,第3引数は数値の個数(文字列の長さ)を # # 返すためのポインタ変数とすること.また,関数内ではポインタを使って # # 簡潔かつ高速に文字列を操作すること.この関数内で配列を使用した場合や意味のないポインタの # # 使い方をした場合は,課題を達成したとは認めない.また手順1で作成した char_to_intを # # 有効利用すること # # # 関数 str_to_intが正しく動作することを次の main関数を使って確認せよ. # ([]は適切に埋めること.) # # int main(void) # { # char *str1 = "4096"; /*変換対象の文字列 1 */ # char *str2 = "1A5z24"; /*変換対象の文字列 2 */ # # int data[20]; /*変換後のデータを代入する配列 */ # int num; /*データ数を代入する変数 */ # int i; # # str_to_int([] ,[] ,[]); /*関数呼び出し */ # for(i = 0; i < num; i++) # printf("%d ", data[i]); # printf("\n"); # # str_to_int([],[] ,[]); /*関数呼び出し*/ # for(i = 0; i < num; i++) # printf("%d ", data[i]); # printf("\n"); # # # return 0; # } # # # (3)実行結果 # 4 0 9 6 # 1 ‐1 5 ‐1 2 4 # '数字の文字列を 1文字ずつ整数値に変換する'(_数字の文字列,_整数値) :- sub_atom(_数字の文字列,_,1,_,_文字としての数字), 文字としての数字を整数値に変換する(_文字としての数字,_整数値). 文字としての数字を整数値に変換する('0',0) :- !. 文字としての数字を整数値に変換する('1',1) :- !. 文字としての数字を整数値に変換する('2',2) :- !. 文字としての数字を整数値に変換する('3',3) :- !. 文字としての数字を整数値に変換する('4',4) :- !. 文字としての数字を整数値に変換する('5',5) :- !. 文字としての数字を整数値に変換する('6',6) :- !. 文字としての数字を整数値に変換する('7',7) :- !. 文字としての数字を整数値に変換する('8',8) :- !. 文字としての数字を整数値に変換する('9',9) :- !. 文字としての数字を整数値に変換する(_,-1). % 以下のサイトは # 出典:: 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/6 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):文字列st が回文(前から読んでも後ろから読んでも # 同じ)であれば1 を,そうでなければ0 を返す関数 # int isPalindrome(const char st[]) # を作成せよ.以下の実行例のように,関数の動作を確認 # 例.文字列を入力してください:AKASAKA # その文字列は回文です。 # # # # # できるmain 関数も作成する. # 例 # '文字列st が回文(前から読んでも後ろから読んでも同じ)であれば1 を,そうでなければ0 を返す'(_st,1) :- 回文(_st),!. '文字列st が回文(前から読んでも後ろから読んでも同じ)であれば1 を,そうでなければ0 を返す'(_st,0). 回文(_文字列) :- atom_chars(_文字列,Chars), reverse(Chars,Chars). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- atom_chars(_文字列,Chars), 回文(Chars,[],Chars). 回文([],L,L). 回文([_],L,L). 回文([A|R1],L1,L) :- 回文(R1,[A|L1],L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- atom_chars(_文字列,Chars), reverse(Chars,Chars1), atom_chars(_文字列,Chars1). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- atom_chars(_文字列,Chars), 回文(Chars,[]). 回文(L,L) :- !. 回文([_|L],L) :- !. 回文([A|R],L1) :- 回文(R,[A|L1]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- atom_chars(_文字列,Chars), 回文_1(Chars). 回文_1([]). 回文_1([_]). 回文_1(L) :- append([A],L2,[A],L), 回文_1(L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- sub_atom(_文字列,0,_長さ,0,_文字列), _長さ_1 is _長さ // 2, 回文(文字列,0,_長さ_1,_長さ),!. 回文(_文字列,_長さ_1,_長さ_1,_長さ) :- !. 回文(_文字列,N,_長さ_1,_長さ) :- sub_atom(_文字列,N,1,_,_文字), sub_atom(_文字列,_長さ-N-1,1,_,_文字), N_2 is N + 1, 回文(_文字列,N_2,_長さ_1,_長さ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- sub_atom(_文字列,0,_長さ,0,_文字列), _長さ_1 is _長さ // 2, 回文(文字列,0,_長さ_1,_長さ),!. 回文(_文字列,_長さ_1,_長さ_1,_長さ) :- !. 回文(_文字列,N,_長さ_1,_長さ) :- sub_atom(_文字列,N,1,_,_文字), sub_atom(_文字列,_長さ-N-1,1,_,_文字), N_2 is N + 1, 回文(_文字列,N_2,_長さ_1,_長さ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文('') :- !. 回文(_文字列) :- 両端の文字(_文字列,A,_中間の文字列,A), 回文(_中間の文字列,1),!. 両端の文字('','','','') :- !. 両端の文字(_文字列,'',_文字列,'') :- sub_atom(_文字列,0,1,0,_文字列),!. 両端の文字(_文字列,_最前の文字,'',_最後の文字) :- sub_atom(_文字列,0,1,1,_最前の文字), sub_atom(_文字列,1,1,0,_最後の文字),!. 両端の文字(_文字列,_最前の文字,_中間の文字列,_最後の文字) :- sub_atom(_文字列,0,1,_,_最前の文字), sub_atom(_文字列,1,_,1,_中間の文字列), sub_atom(_文字列,_,1,0,_最後の文字),!. % 以下のサイトは # # 非決定性の置換述語を使って、全てを置換した文字列だけを取り出せ。 # 全てを置換した文字列だけを取り出す(_文字列,_置換対象文字列,_置換文字列,_全てを置換した文字列) :- findall(_置換された文字列,( 非決定性の置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列)), _置換された文字列ならび), append(_,[_全てを置換した文字列],_置換された文字列ならび),!. 非決定性の置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1), 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列). 非決定性の置換(_,_,_,_,_置換された文字列,_置換された文字列). 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列) :- 非決定性の置換(_後文字列,_置換対象文字列,_置換文字列,_置換された文字列_2), concat_atom(_置換された部分までの文字列,_置換された文字列_2],_置換された文字列). 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列) :- sub_atom(_文字列,S,Len,R,_置換対象文字列), sub_atom(_文字列,0,S,0,_前文字列), sub_atom(_文字列,S+Len,R,0,_後文字列), concat_atom([_前文字列,_置換文字列,_置換された部分までの文字列]), concat_atom([_置換された部分までの文字列,_後文字列],_置換された文字列),!. % 以下のサイトは # # 非決定性の置換述語の雛形を作れ。 # 非決定性の置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1), 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列). 非決定性の置換(_,_,_,_,_置換された文字列,_置換された文字列). 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列) :- 非決定性の置換(_後文字列,_置換対象文字列,_置換文字列,_置換された文字列_2), concat_atom(_置換された部分までの文字列,_置換された文字列_2],_置換された文字列). 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列) :- sub_atom(_文字列,S,Len,R,_置換対象文字列), sub_atom(_文字列,0,S,0,_前文字列), sub_atom(_文字列,S+Len,R,0,_後文字列), concat_atom([_前文字列,_置換文字列,_置換された部分までの文字列]), concat_atom([_置換された部分までの文字列,_後文字列],_置換された文字列),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/681 # # 0パディングされてない1〜3桁の数字のみにヒットさせる正規表現ってどのように書けますか? # # ヒットする例 # 0 # 9 # 10 # 19 # 99 # 100 # 999 # # ヒットさせない例 # 00 # 000 # 09 # 010 # 019 # 099 # 0100 # # '0パディングされてない1〜3桁の数字のみにヒットさせる'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列_1,_適合文字列_1,_後文字列_1,L1,L2,L3), for(3,Len,1), length(L2,Len), 全て数字(L2), \+((last(L1,C1),数字(C1))), L2 = [A2|R2], ((\+(A2='0');R2=[])), '0パディングされてない1〜3桁の数字のみにヒットさせる'(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列). '0パディングされてない1〜3桁の数字のみにヒットさせる'(_文字列,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). '0パディングされてない1〜3桁の数字のみにヒットさせる'(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- '0パディングされてない1〜3桁の数字のみにヒットさせる'(_後文字列,_前文字列_2,_適合文字列,_後文字列), append(_前文字列_1,_適合文字列_1,_前文字列_2,_前文字列). 全て数字([]). 全て数字([A|R]) :- A @>= '0', A @=< '9', 全て数字(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/985 # # [1] 授業単元:C++ # [2] 問題文(含コード&リンク):文字を一文字入力して、入力文字が a-z の範囲のときのみ、 # 文字コードが一個隣のアルファベットを表示するプログラムを作成せよ。 # ただし、zを入力した場合は a を表示し、a-z以外の文字を入力した # 場合は入力した文字をそのまま表示すること。 # # 例: # aを入力 → b を出力 # bを入力 → c を出力 # zを入力 → a を出力 # 3を入力 → 3 を出力 # $を入力 → $ を出力 # Aを入力 → A を出力 #  [3.1] OS: Windows 7 #  [3.2] コンパイラ名とバージョン:gcc-4.3.4 #  [3.3] 言語: C++ # [4] 期限: 2011年11月5日 # # すみません、こちらも同時にお願いします # # よろしくお願いします # # '文字を一文字入力して、入力文字が a-z の範囲のときのみ、文字コードが一個隣のアルファベットを表示するプログラムを作成せよ。ただし、zを入力した場合は a を表示し、a-z以外の文字を入力した場合は入力した文字をそのまま表示すること。' :- '文字を一文字入力して、'(_入力文字), '入力文字が a-z の範囲のときのみ、文字コードが一個隣のアルファベットを表示する。ただし、zを入力した場合は a を表示し、a-z以外の文字を入力した場合は入力した文字をそのまま表示すること。'(_入力文字). '文字を一文字入力して、'(_入力文字) :- write('文字を一文字入力して下さい : '), get_char(_入力文字). '入力文字が a-z の範囲のときのみ、文字コードが一個隣のアルファベットを表示する。ただし、zを入力した場合は a を表示し、a-z以外の文字を入力した場合は入力した文字をそのまま表示すること。'(_入力文字) :- '入力文字が a-z の範囲のとき'(_入力文字), '文字コードが一個隣のアルファベットを表示する。ただし、zを入力した場合は a を表示する'(_入力文字). '入力文字が a-z の範囲のときのみ、文字コードが一個隣のアルファベットを表示する。ただし、zを入力した場合は a を表示し、a-z以外の文字を入力した場合は入力した文字をそのまま表示すること。'(_入力文字) :- 'a-z以外の文字を入力した場合は'(_入力文字). '入力した文字をそのまま表示すること。'(_入力文字). '入力文字が a-z の範囲のとき'(_入力文字) :- _入力文字 @>= 'a', _入力文字 @=< 'z'. '文字コードが一個隣のアルファベットを表示する。ただし、zを入力した場合は a を表示する'(_入力文字) :- 隣の文字(_入力文字,_隣の文字), writef('入力された文字はa-zの範囲ですから隣の文字を表示します -> %t\n',[_隣の文字]). 隣の文字(_入力文字,_隣の文字) :- sub_atom(abcdefghijklmnopqrstuvwxyza,_入力文字の文字列中の変位,1,_,_入力文字), sub_atom(abcdefghijklmnopqrstuvwxyza,_入力文字の文字列中の変位+1,1,_,_隣の文字). 'a-z以外の文字を入力した場合は'(_入力文字) :- \+('入力文字が a-z の範囲のとき'(_入力文字)). '入力した文字をそのまま表示すること。'(_入力文字) :- writef('a-z以外の文字が入力されたのでそのまま入力文字を表示します-> %t\n',[_入力文字]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/980 # # [1] 授業単元:基礎C # [2] 問題文(含コード&リンク):以下の実行例のように,姓と名を入力すると,2 つの # 間にスペースを入れて連結した文字列を生成するプロ # グラムを作成せよ.姓と名はそれぞれ配列family[] と # first[] に,連結した文字列は配列fullname[] に格納 # すること.入力できる姓と名の長さはそれぞれ30 字ま # でとする。 # 例. Family name: Kouka # First name: Dai # Kouka Dai # '姓と名を入力すると,2つの間にスペースを入れて連結した文字列を生成する' :- 姓の入力(_姓), 名の入力(_名), '姓と名を入力すると,2つの間にスペースを入れて連結した文字列を生成する'(_姓,_名,_連結した文字列), writef('間にスペース入れて連結した文字列は「%t」\n',[_連結した文字列]). '姓と名を入力すると,2つの間にスペースを入れて連結した文字列を生成する'(_姓,_名,_間にスペースを入れて連結した文字列) :- concat_atom([_姓,_名],' ',_間にスペースを入れて連結した文字列). 姓の入力(_姓) :- write('姓名の姓を入力して下さい : '), get_line(_姓), 姓の入力診断(_姓),!. 姓の入力(_姓) :- 姓の入力(_姓). 姓の入力診断(_姓) :- atom(_姓), sub_atom(_姓,0,Len,0,_姓), Len =< 30,!. 姓の入力診断(_姓) :- writef('入力された %t は姓名の姓として適切でありません。再入力をお願いします。\n',[_姓]), fail. 名の入力(_名) :- write('姓名の名を入力して下さい : '), get_char(_名), 名の入力診断(_名),!. 名の入力(_名) :- 名の入力(_名). 名の入力診断(_名) :- atom(_名), sub_atom(_名,0,Len,0,_名), Len =< 30,!. 名の入力診断(_名) :- writef('入力された %t は姓名の名として適切でありません。再入力をお願いします。\n',[_名]), fail. % 以下のサイトは # 出典:: 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/647 # # <hoge>aaa</hoge> # bbb # <hoge>ccc</hoge> # # <hoge></hoge>に囲まれてる文字を大文字に置き換える処理をしてるのですが、 # <hoge>(.*)</hoge>で一応できます。 # <hoge>(.*)?</hoge>と?をつけてもできるのですが、 # どっちが正しいのでしょうか? # # '<hoge></hoge>に囲まれてる文字を大文字に置き換える'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [<,h,o,g,e,>|R2], append(R22,[<,/,h,o,g,e,>],R2), findall(B,( member(A,R22), to_upper(A,B)), R23), concat_atom([<,hoge,>,R23,<,'/hoge',>],S23), concat_atom([S1,S23],_置換された部分までの文字列), concat_atom([S1,S23,S3],_置換された文字列_1), '<hoge></hoge>に囲まれてる文字を大文字に置き換える'(_文字列,_置換された部分までの文字列,S3,_置換された文字列_1,_置換された文字列). '<hoge></hoge>に囲まれてる文字を大文字に置き換える'(_文字列,_置換された部分までの文字列,_,_置換された文字列,_置換された文字列). '<hoge></hoge>に囲まれてる文字を大文字に置き換える'(_文字列,_置換された部分までの文字列,_後文字列,_置換された文字列,_置換された文字列) :- '<hoge></hoge>に囲まれてる文字を大文字に置き換える'(_後文字列,_置換された文字列_1), concat_atom([_置換された部分までの文字列,_置換された文字列_1],_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/829 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # ユーザーに入力させた半角英数字の文字列を、char型配列に入れ、一字ずつずらして表示させるプログラムの作成。 # 入力された順番と同じになったら表示終了とする。 # 例 abcd # bcda # cdab #   dabc # abcd # # ポインタを使うと思います。それから、strlen(c)を使うようです。 # 'ユーザーに入力させた半角英数字の文字列を、char型配列に入れ、一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。' :- 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_半角英数字の文字列). 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列) :- write('半角英数字の文字列を入力してください : '), get_line(Line), 'ユーザーに入力させた半角英数字の文字列入力検査'(Line,_半角英数字の文字列),!. 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列) :- 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列). 'ユーザーに入力させた半角英数字の文字列入力検査'(Line,Line) :- atom_codes(Line,Codes), \+((append(_,[N|_],Codes), 半角英数字のコード(N))),!. 'ユーザーに入力させた半角英数字の文字列入力検査'(Line,_半角英数字の文字列) :- writef('入力された %t には半角英数字以外の文字が含まれています。再入力をお願いします。\n',[Line]), fail. 半角英数字のコード(N) :- N >= 48,N =< 57,!. 半角英数字のコード(N) :- N >= 65,N =< 90,!. 半角英数字のコード(N) :- N >= 97,N =< 122,!. '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_半角英数字の文字列) :- 入力された文字列を表示する(_半角英数字の文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_半角英数字の文字列,_一文字ずらした文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_一文字ずらした文字列,_半角英数字の文字列). '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_文字列,_文字列) :- 入力された順番と同じになったら表示終了とする。',!. '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_文字列,_半角英数字の文字列) :- '一字ずつずらして表示させる'(_文字列,_一文字ずらした文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_一文字ずらした文字列,_半角英数字の文字列). '一字ずつずらして表示させる'(_文字列,_一文字ずらした文字列) :- sub_atom(_文字列,0,1,R,_先頭文字), sub_atom(_文字列,1,R,0,_残り文字列), concat_atom([_残り文字列,_先頭文字],_一文字ずらした文字列), writef('%t\n',[_一文字ずらした文字列]). 入力された文字列を表示する(_半角英数字の文字列) :- writef('%t\n',[_半角英数字の文字列]). 入力された順番と同じになったら表示終了とする。'. % % 一文字ずらしてというところが、「先読み」的な制御となり、ややこしい。 % % 以下のサイトは # 出典:: 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),!. % 以下のサイトは # abcdefgfedcba という文字列から # defという文字列を消すこと出来るのですが、 # def以外を消すにはどうすればいいのでしょうか? 'abcdefgfedcba という文字列からdef以外を消す'(_文字列,_削除された文字列) :- sub_atom(_文字列,S,Len,R,def), S2 is S + Len, sub_atom(_文字列,S2,R,0,S3), 'abcdefgfedcba という文字列からdef以外を消す'(S3,_後半の削除された文字列), concat_atom([def,_後半の削除された文字列],_削除された文字列),!. 'abcdefgfedcba という文字列からdef以外を消す'(_文字列,''). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #531 # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # 平成○年の値を入力し、西暦に変換するプログラムを作成 # '平成○年の値を入力し、西暦に変換する' :- '平成○年の値を入力し漢数字を数字に変換する'(_数字), '平成元年は西暦1989年であることから西暦を得る'(_数字,_西暦), format('西暦は ~w です。\n',[_西暦]). '平成○年の値を入力し漢数字を数字に変換する'(_数字) :- '平成○年の値を入力し'(_漢数字年), 漢数字を数字に変換する(_漢数字年,_数字). '平成○年の値を入力し'(_漢数字年) :- write('平成○年を入力してください : '), 漢数字年を得る(_漢数字年). 漢数字年を得る(_漢数字年) :- 行入力されたものが漢数字であるか検査する(_漢数字年),!. 漢数字年を得る(_漢数字年) :- 漢数字年を得る(_漢数字年). 行入力されたものが漢数字であるか検査する(_漢数字年) :- 行入力(_行), 年は切り取って検査する(_行,_年が切り取られた行), 漢数字年入力検査(_年が切り取られた行,_漢数字年). 年は切り取って検査する(_行,_年が切り取られた行) :- 末尾文字が年だったら切り取る(_行,_年が切り取られた行),!. 年は切り取って検査する(_行,_行). 末尾文字が年だったら切り取る(_行,_年が切り取られた行) :- sub_atom(_行,_,1,0,年), sub_atom(_行,0,_,1,_年が切り取られた行). 漢数字年入力検査(元,元) :- !. 漢数字年入力検査(_漢数字年,_漢数字年) :- forall(sub_atom(_漢数字年,_,1,_,A),'漢数字・数字'(A,_)),!. 漢数字年入力検査(_行,_) :- writef('入力された %t からは漢数字が得られませんでした。再入力をお願いします。\n',[_行]), fail. 漢数字を数字に変換する(元,1) :- !. 漢数字を数字に変換する(_年,_数字) :- '二桁年の数字を得る'(_年,_数字). 漢数字を数字に変換する(_年,_数字) :- '一桁年の数字を得る'(_年,_数字). '二桁年の数字を得る'(_年,_数字) :- '十の桁、一の桁の漢数字を切り取り数字を得る'(_年,_数字). '十の桁、一の桁の漢数字を切り取り数字を得る'(_年,_数字) :- '十の桁、一の桁の漢数字を得る'(_年,_十の桁の漢数字,_一の桁の漢数字), '十の桁、一の桁の数字を得る'(_十の桁の漢数字,_一の桁の漢数字,_十の桁の数字,_一の桁の数字), _数字 is _十の桁の数字 * 10 + _一の桁の数字. '十の桁、一の桁の漢数字を得る'(_年,_十の桁の漢数字,_一の桁の漢数字) :- sub_atom(_年,0,1,R,_十の桁の漢数字), sub_atom(_年,R,1,0,_一の桁の漢数字), R > 0. '十の桁、一の桁の数字を得る'(_十の桁の漢数字,_一の桁の漢数字,_十の桁の数字,_一の桁の数字) :- '漢数字・数字'(_十の桁の漢数字,_十の桁の数字), '漢数字・数字'(_一の桁の漢数字,_一の桁の数字). '一桁年の数字を得る'(_年,_数字) :- sub_atom(_年,0,1,0,_一の桁の漢数字), '漢数字・数字'(_一の桁の漢数字,_数字). '平成元年は西暦1989年であることから西暦を得る'(_数字,_西暦) :- _西暦 is _数字 + 1989 - 1. '漢数字・数字'(一,1). '漢数字・数字'(二,2). '漢数字・数字'(三,3). '漢数字・数字'(四,4). '漢数字・数字'(五,5). '漢数字・数字'(六,6). '漢数字・数字'(七,7). '漢数字・数字'(八,8). '漢数字・数字'(九,9). '漢数字・数字'(十,1). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは 九蓮宝燈(_牌ならび) :- すべてが筒か索か萬(_牌ならび), '一から九までの牌が揃っている'(_牌ならび). すべてが筒か索か萬(_牌ならび) :- すべてが筒(_牌ならび),!. すべてが筒か索か萬(_牌ならび) :- すべてが索(_牌ならび),!. すべてが筒か索か萬(_牌ならび) :- すべてが萬(_牌ならび),!. すべてが筒([]) :- !. すべてが筒([_牌|R]) :- sub_atom(_牌,1,1,0,筒), すべてが筒(R). すべてが索([]) :- !. すべてが索([_牌|R]) :- sub_atom(_牌,1,1,0,索), すべてが索(R). すべてが萬([]) :- !. すべてが萬([_牌|R]) :- sub_atom(_牌,1,1,0,筒), すべてが萬(R). '一から九までの牌が揃っている'(_牌ならび) :- '一から九までの牌が揃っている'([一,ニ,三,四,五,六,七,八,九],_牌ならび). '一から九までの牌が揃っている'([],_). '一から九までの牌が揃っている'([_漢数字|R],_牌ならび) :- member(_牌,_牌ならび), sub_atom(_牌,0,1,1,_漢数字), '一から九までの牌が揃っている'(R,_牌ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/570 # # 小文字英字、大文字英字、数字、「@_#」、のどれか3つが入っているかの条件は正規表現で可能でしょうか? # どれか3つのやり方がわかりません。 # # 以下は全く動作せず… # ^(?=(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])|(?=.*[A-Z])(?=.*[a-z])(?=.*[@_#])).*$ # # '小文字英字、大文字英字、数字、「@_#」、のどれか3つが入っているか'(_文字列) :- findall(_,'小文字英字、大文字英字、数字、「@_#」、のどれか'(_文字列),L), '3つが入っている'(L). '小文字英字、大文字英字、数字、「@_#」、のどれか'(_文字列) :- 小文字英字(_文字列). '小文字英字、大文字英字、数字、「@_#」、のどれか'(_文字列) :- 大文字英字(_文字列). '小文字英字、大文字英字、数字、「@_#」、のどれか'(_文字列) :- 数字(_文字列). '小文字英字、大文字英字、数字、「@_#」、のどれか'(_文字列) :- '@_#'(_文字列). 小文字英字(_文字列) :- sub_atom(_文字列,_,1,_,_文字), _文字 @>= 'a', _文字 @=< 'z',!. 大文字英字(_文字列) :- sub_atom(_文字列,_,1,_,_文字), _文字 @>= 'A', _文字 @=< 'Z',!. 数字(_文字列) :- sub_atom(_文字列,_,1,_,_文字), _文字 @>= '0', _文字 @=< '9',!. '@_#'(_文字列) :- sub_atom(_文字列,_,3,_,'@_#'),!. '3つが入っている'(L) :- length(L,3). % このPrologプログラムのポイントは 小文字英字/1, 大文字英字/1, 数字/1, '@_#'/1 % 各述語の本体最後のカットです。組込み述語sub_atom/5は非決定性の述語なので % このカットがないと例えば小文字英数がn個あれば、n個分_を収集してしまいます。 % 文字種検査は一度現れたらそれまで。ただ一とだけ勘定したいのです。 % 以下のサイトは # 出典:: 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/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/541 # # ●正規表現の使用環境 # 一般社会 # # ●検索か置換か? # 検索 # # ●説明 # すぐにやれる女を見つけたいです # # ●対象データ # OL # 女子大生 # 女子高生 # キャバ嬢 # ヘルス嬢 # 近所のおばさん # 母親 # # ●希望する結果 # させこ # やりまん # 公衆便所 # すぐにやれる女(させこ). すぐにやれる女(やりまん). すぐにやれる女(公衆便所). 'すぐにやれる女を見つけたいです'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,_,_), すぐにやれる女(_適合文字列). % 以下のサイトは # 出典:: 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/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/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/php/1168450843/784 # # ttp://aaa.co.jp:8888 # http://bbb.com:9999/ # を除外しつつ # 他の # h?ttp://○○○.△△△.□□□:☆☆☆/? #      ↑ここから      ここまで↑ # をヒットさせたいのですが色々試したのですが出来ませんでした # 何か方法がありますでしょうか? # # 'ttp://aaa.co.jp:8888とhttp://bbb.com:9999/を以外のURLの内、第3ドメインからトップドメインまでの部分'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_S1,S2,_後文字列,L1,[h,t,t,p,:,/,/|R2],[/|R3]), 除外URLではない(_適合文字列), \+(member(/,R2)), concat_atom([S1,'http://'],_前文字列), atom_chars(_適合文字列,R2). '除外URLではない'(S) :- \+(sub_atom(S,0,20,_,'ttp://aaa.co.jp:8888')),!. '除外URLではない'(S) :- \+(sub_atom(S,0,20,_,'http://bbb.com:9999/')),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/748 # # 「次の人」または「前の人」という文字列を文章内から拾う場合、どの様な書き方が良いのでしょうか?? # [次の人 | 前の人] だと「の」一文字だけでも拾ってしまいます… # '「次の人」または「前の人」という文字列を文章内から拾う'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), '「次の人」または「前の人」という文字列'(_適合文字列). '「次の人」または「前の人」という文字列'(次の人). '「次の人」または「前の人」という文字列'(前の人). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/745 # # Aの繰り返しはA+とかA{m,n}でマッチできますが、 # 繰り返された個数を元にAAAAAをA*5などに置換する「うまい」方法はあるでしょうか。 # # 言語はとりあえずJavaScriptで考えています。 # replace(/A+/g, 'A*'); //←ここから進まない。 # # '繰り返された個数を元にAAAAAをA*5などに置換する'(_文字列,_繰り返し対象文字,_繰り返し数) :- sub_atom(_文字列,_,_繰り返し数,_,S1,S2,S3,L1,L2,L3), all(L2,_繰り返し対象文字), \+(last(L1,_繰り返し対象文字)), \+(L3 = [_繰り返し対象文字|_]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/743 # # http://ime.nu/から最初の空白までを抽出する正規表現はどうなりますか? # # 'http://ime.nu/から最初の空白までを抽出する'(_文字列,_前文字列,_抽出された文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,_後文字列,[h,t,t,p,:,/,/,i,m,e,'.',n,u,'/'|R2],L2,[' '|_]), \+(member(' ',R2)), atom_chars(_抽出された文字列,R2), concat_atom([S1,'http://ime.nu/'],_前文字列). % 以下のサイトは # 出典:: 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/483 # # ●希望する結果 # ;AA    [ac][ad]・・・・・[zw][zx]  [zz];AB[aa][zy]AC[ab]   ←;AAから;ABまでの[aa][zy][ab]を削除 # ;AA  [ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[df]AC[aa][fb]   ←;AAから;ABまでの[df][aa][fb]を削除 # ;AA[aa][ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[bc][fh]AC[ge][eg] ←;AAから;ABまでの[bc][fh][ge][eg]を削除 # # この結果。。。ムリだ # # 削除文字列('[aa][zy][ab]'). 削除文字列('[df][aa][fb]'). 削除文字列('[bc][fh][ge][eg]'). ';AAから;ABまでの削除文字列を削除'(_対象文字列,_削除された文字列) :- findall(Chars,( 削除文字列(_削除文字列), atom_chars(_削除文字列,Chars)),LL), ';AAから;ABまでの削除文字列を削除'(_対象文字列,LL,_削除された文字列). ';AAから;ABまでの削除文字列を削除'(_対象文字列,LL,_削除された文字列) :- sub_atom(_対象文字列,_,_,_,S1,S2,S3,L1,[';','A','A'|R2],[';','A','B'|R3]), '削除文字列を削除'(R2,LL,R2_2), atom_chars(S2_2,[';','A','A'|R2_2]), concat_atom([S1,S2_2,S3],_削除された文字列). '削除文字列を削除'([],_,[]) :- !. '削除文字列を削除'(R2,LL,L) :- member(LX,LL), append(LX,LR,R2), '削除文字列を削除'(LR,LL,L),!. '削除文字列を削除'([A|R1],LL,[A|R2]) :- '削除文字列を削除'(R1,LL,R2),!. % 以下のサイトは # 出典:: 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/477 # # どなたかご教授ください・・・ # ●正規表現の使用環境 # EmEditor # # ●検索か置換か? # 検索 # # ●検索対照データ # (abcdefg:;[]あいうえお)) # # ●希望する結果 # (で始まり、途中にいろいろあっても、))で終わる対象データを検索したいです。 # すみませんが、よろしくお願いします。 # # '(で始まり、途中にいろいろあっても、))で終わる対象データを検索する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), append(['('],L22,[')',')'],L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/468 # # 「ecv 0000 ef773s 1111 87ed93」と言った数字、文字、スペースが混ざった文字列から # 数字だけのブロック("0000"と"1111")を取り出したい場合のパターンを教えてください。 # # 自分で思いつくのは下記。もっとスマートなやりかたないでしょうか # 1.\s→\r\nに置換 # 2.^(\d+)$→●$1に置換 # 3.^[^●].*$→空白に置換 # 4.●→空白に置換 # # ちなみにサクラエディタです。 # よろしくお願いいたします。 # '数字だけのブロック("0000"と"1111")を取り出したい'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), すべて数字(L2), 'L1が空であるか最後の要素が空白または改行'(L1), 'L3が空であるか最初の要素が空白または改行'(L3). すべて数字([]) :- !. すべて数字([A|R]) :- member(A,['0','1','2','3','4','5','6','7','8','9']), すべて数字(R). 'L1が空であるか最後の要素が空白または改行'([]) :- !. 'L1が空であるか最後の要素が空白または改行'(L1) :- member(A,[' ','\n']), append(_,[A],L1),!. 'L3が空であるか最後の要素が空白または改行'([]) :- !. 'L3が空であるか最初の要素が空白または改行'([A|_]) :- member(A,[' ','\n']),!. % 以下のサイトは # 出典:: 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/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/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/336 # # http://ime.nu/何が来るかわからない.何が来るかわからない.test.com/何が来るかわからない # http://ime.nu/何が来るかわからない.test.com/何が来るかわからない # # 上の2つともにマッチさせる正規表現は、どのように書くのでしょうか? # 'http://ime.nu/何が来るかわからない.何が来るかわからない.test.com/何が来るかわからない http://ime.nu/何が来るかわからない.test.com/何が来るかわからない の2つともにマッチさせる'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,[]), append([h,t,t,p,:,/,/,i,m,e,'.'n,u,/|R21],['.',t,e,s,t,/|R22],L2), 適合パターン(R21). 適合パターン(L) :- \+(member('.',L)),!. 適合パターン(L) :- append(L0,['.'|R],L), \+(member('.',L0)), \+(member('.',R)). % 以下のサイトは # 出典:: 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/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/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/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/1312201995/111 # # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '文字列から"CGUU"をギャップ("-")を含んでいても検出する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), '"CGUU"をギャップ("-")を含んでいても'(['C','G','U','U'],L2). '文字列から"CGUU"をギャップ("-")を含んでいても検出する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,_,L2,_), '"CGUU"をギャップ("-")を含んでいても'(['C','G','U','U'],L2), '文字列から"CGUU"をギャップ("-")を含んでいても検出する'(S3,_前文字列2,_適合文字列,_後文字列), concat_atom([S1,S2,_前文字列2],_前文字列). '"CGUU"をギャップ("-")を含んでいても'([],_) :- !. '"CGUU"をギャップ("-")を含んでいても'([A|R1],[A|R2]) :- '"CGUU"をギャップ("-")を含んでいても'(R1,R2). '"CGUU"をギャップ("-")を含んでいても'([A|R1],[-|R2]) :- '"CGUU"をギャップ("-")を含んでいても'(R1,R2). '"CGUU"をギャップ("-")を含んでいても'([A|R1],[B|R2]) :- \+(A=B),!,fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/279 # # ●正規表現の使用環境 # C# 4.0 # # ●検索か置換か? # 置換です # # ●説明 # HTMLファイルのソースコードの # <script type="text/javascript">〜省略〜</script> # scriptタグ開始を含めてscriptタグ終了タグまでを消去したいんです # # ●対象データ # <script type="text/javascript"> # <!-- # // 〜コメント〜 # 内容 # // --> # </script> # # <script type="text/javascript" src="script.js"></script> # # 上記のどちらも以下のものでやったのですが、どうもヒットしません # <script\s[a-zA-Z0-9<>()-\.!_~*,;/:@&=+$,%#'""]+>[a-zA-Z0-9<>()-\.!_~*,;/:@&=+$,%#]+\</script> # # 解答よろしくお願いします # # 'scriptタグ開始を含めてscriptタグ終了タグまでを消去'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [<,s,c,r,i,p,t,' '|R2], append(R20,[/,s,c,r,i,p,t,>],R2), \+(append(_,[<,s,c,r,i,p,t,' '|_],R20)), \+(append(_,[/,s,c,r,i,p,t,>|_],R20)), 'scriptタグ開始を含めてscriptタグ終了タグまでを消去'(S3,_置換された文字列2), concat_atom([S1,_置換された文字列2],_置換された文字列),!. 'scriptタグ開始を含めてscriptタグ終了タグまでを消去'(_文字列,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/914 # # [1] 授業単元:プログラム概論 # [2] 問題文(含コード&リンク):ファイルの商品名を順に読み込んで、オーダー #                   の順を出力する関数を作成しなさい. # http://ime.nu/codepad.org/q5G3hxdB ←ここまで作りましたが、"ファイルが見つかりません"と表示されます. # # 'ファイルの商品名を順に読み込んで、オーダーの順を出力する'(_ファイル) :- get_lines(_ファイル,Lines), append(_,[Line|R],Lines), sub_atom(Line,0,20,_,_商品名), writef('%t\n',[_商品名]), R = []. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'ファイルの商品名を順に読み込んで、オーダーの順を出力する'(_ファイル) :- open(_ファイル,read,Instream), '商品名を順に読み込んで、オーダーの順を出力する'(Instream), close(Instream). '商品名を順に読み込んで、オーダーの順を出力する'(Instream) :- at_end_of_stream(Instream),!. '商品名を順に読み込んで、オーダーの順を出力する'(Instream) :- get_line(Instream,Line), sub_atom(Line,0,20,_,_商品名), writef('%t\n',[_商品名]), '商品名を順に読み込んで、オーダーの順を出力する'(Instream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/788 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # #include <stdio.h> # #include <string.h> # # struct Address_data{ # char name[81]; # char phone[20]; # int age; # }; # # int main() # { # struct Address_data data[2], *p = data; # printf("Input end = Ctrl + D\n"); # for (p = data; p - data < 2; p++) # p->age = -1; # for (p = data; p - data < 2; p++) { # printf("[%ld]name phone age = ", p - data); # if (scanf("%s %s %d", p->name, p->phone, &p->age) != 2) # break; # } # printf("\n"); # for (p = data; p->age >= 0; p++) # printf("%s\t(%d)\t[%s]\n", p->name, p->age, p->phone); # return (0); # } # # 要素数10の構造体ならび(_要素数10の構造体ならび) :- length(_要素数10の構造体ならび,10), findall(電話番号(氏名(_氏名),電話番号(_電話番号)),( append(_,[_|_],_要素数10の構造体ならび), 名前の入力(_名前), 電話番号の入力(_電話番号)), _要素数10の構造体ならび). 名前の入力(_名前) :- write('名前を入力してください : '), get_line(Line), 名前入力診断(Line,_名前),!. 名前入力診断(Line,_名前) :- sub_atom(Line,0,Len,0,_Line), Len > 80, sub_atom(Line,0,80,_,_名前),!. 名前入力診断(_名前,_名前). 電話番号の入力(_電話番号) :- write('電話番号を入力してください : '), get_line(Line), 電話番号入力診断(Line,_電話番号),!. 電話番号入力診断(Line,_電話番号) :- sub_atom(Line,0,Len,0,_Line), Len > 20, sub_atom(Line,0,20,_,_電話番号),!. 電話番号入力診断(_電話番号,_電話番号). % 以下のサイトは # 出典:: 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/1308749241/600 # # [1] 授業単元:関数 # [2] 問題文(含コード&リンク): # 情報量の単位は、8bit=1B,1024B=1KB,1024KB=1MB,…(1TBまで)となっている。 # [実数]MBや、実数[KB]のような入力をしたとき、それが何bitを意味しているかを表示するプログラムを作成したい。 # なお、設定において、数値変換処理には、関数を利用することとし、入力は【整数】の後に「空白」を1つ挟み、【TB/MB/KB/B】のいずれかの単位を表す文字列が書かれているものとする。 # '[実数]MBや、実数[KB]のような入力をしたとき、それが何bitを意味しているかを表示する'(_文字列,_ビット数) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 数値変換(_文字列,L1,L2,_ビット数). 数値変換(_文字列,S1,[' ','T','B'|_],_ビット数) :- atom_to_term(S1,_テラバイト数,_), _ビット数 is 8 * _テラバイト数 * 1000000000,!. 数値変換(_文字列,S1,[' ','M','B'|_],_ビット数) :- atom_to_term(S1,_メガバイト数,_), _ビット数 is 8 * _メガバイト * 1000000,!. 数値変換(_文字列,S1,[' ','K','B'|_],_ビット数) :- atom_to_term(S1,_キロバイト数,_), _ビット数 is 8 * _キロバイト * 1000,!. 数値変換(_文字列,S1,[' ','B'|_],_ビット数) :- atom_to_term(S1,_バイト数,_), _ビット数 is 8 * _バイト数,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/549 # # [1] 授業単元:演習 # [2] 問題文(含コード&リンク):http://pastebin.com/index/sg6akdN0 # 標準入力から「id, 名前, 年月日, 住所」のようなコンマ区切形式 (CSV 形式) の名簿データを受け付けて, # 項目を切り出してメモリ中に格納する.また,% で始まる入力行をコマンド入力として解釈し,格納されたデータを表示や整列する # '標準入力から「id, 名前, 年月日, 住所」のようなコンマ区切形式 (CSV 形式) の名簿データを受け付けて,項目を切り出してメモリ中に格納する.また,% で始まる入力行をコマンド入力として解釈し,格納されたデータを表示や整列する' :- get_line(Line), テキストの解析処理(Line,1,[]). テキストの解析処理(end_of_file,N,_オプションモード) :- \+member(整列,_オプションモード)),!. テキストの解析処理(end_of_file,N,_オプションモード) :- member(整列,_オプションモード), 名簿データをならびに変換(LL1), sort(LL1,LL2), 整列した名簿の表示(LL2),!. テキストの解析処理(_行,N,_オプションモード) :- コメント行(_行,_オプションモード,_オプションモードのニ), get_line(_行2), テキストの解析処理(_行2,N,_オプションモードのニ),!. テキストの解析処理(_行,N,_オプションモード) :- 'CSV行'(_行,_オプションモード), get_line(_行2), N2 is N + 1, テキストの解析処理(_行2,N2,_オプションモード). コメント行(_行,_オプションモード,_オプションモードのニ) :- sub_atom(_行,0,1,R,'%'), sub_atom(_行,1,R,0,_残り文字列), split(_残り文字列,[' ',','],L), コメント行解析(L,_オプションモード,_オプションモードのニ). 'CSV行'(_行,N,_オプションモード) :- member(表示,_オプションモード), writef('%t: %t\n',[N,_行]), split(_行,[','],[_id,_名前,_年月日,_住所]), assertz(名簿データ(_id,_名前,_年月日,_住所)), writef('%q\n',[名簿データ(_id,_名前,_年月日,_住所)]),!. 'CSV行'(_行,N,_オプションモード) :- \+(member(表示,_オプションモード)), split(_行,[','],[_id,_名前,_年月日,_住所]), assertz(名簿データ(_id,_名前,_年月日,_住所)),!. コメント行解析([],_オプションモード,_オプションモード) :- !. コメント行解析([非表示|R],_オプションモード,_オプションモードのニ) :- ならびから削除(表示,_オプションモード,_オプションモードの一), コメント行解析(R,_オプションモードの一,_オプションモードのニ),!. コメント行解析([_コマンド|R],_オプションモード,_オプションモードのニ) :- \+(member(_コマンド|_オプションモード)), コメント行解析(R,[_コマンド|_オプションモード],_オプションモードのニ). コメント行解析([_コマンド|R],_オプションモード,_オプションモードのニ) :- member(_コマンド|_オプションモード), コメント行解析(R,_オプションモード,_オプションモードのニ). 名簿データをならびに変換(LL) :- findall([_id,_名前,_年月日,_住所],( 名簿データ(_id,_名前,_年月日,_住所)), LL),!. 整列した名簿の表示(LL) :- append(_,[L|R],LL), writef('%t,%t,%t,%t\n',L), 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/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/1308749241/410 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): http://codepad.org/ZtuWkxys # # //決まった形式のテキストを9×9の配列に1~9の数字の情報を入力する関数aa_readを作りたいです。 # //たとえば1を読み込めばビットで000000001を、4を読み込めば000001000を、 # //つまりビットの1の位置を数字に対応させています。 # //そして「.」を読み込めば特別に111111111を構造体aa_tのcellに入力します。 # //r,cは行と列に対応しています。下のテキストファイルの内容と、入力する盤面の位置は対応させます。 # //読み込む形式はテキストファイルで、内容はたとえば下のようなものです。 # //123|..1|43. # //4..|24.|31. # //..7|7.6|... # //---+---+--- # //...|..8|5.. # //5.1|1..|1.. # //5.9|2..|3.4 # //---+---+--- # //41.|..1|1.1 # //..5|.3.|4.. # //2..|...|..7 # //テキストファイルから1文字ずつfgetcで走査していき数字のみ拾って、 # //aa_tのcellの正しい位置にその情報を入れる、という動作をさせたいのですが、 # //どうもうまくいきません。よろしくお願いします # '決まった形式のテキストを9×9の配列に1~9の数字の情報を入力する'(_テキストファイル,LL) :- length(LL,9), findall(L,( length(L,9), append(_,[L|_],LL)), LL), open(_テキストファイル,read,Instream), '数字のみ拾って、cellの正しい位置にその情報を入れる'(Instream,LL), close(Instream). '数字のみ拾って、cellの正しい位置にその情報を入れる'(Instream,LL) :- findall(L,( append(_,[L|_],LL), findall(_数値ビット表現,( append(_,[_|_],L), '数字かドットを読み込む'(Instream,_数値ビット表現)), L)), LL). '数字かドットを読み込む'(Instream,_数値ビット表現) :- at_end_stream(Instream),!, fail. '数字かドットを読み込む'(Instream,_数値ビット表現) :- get_char(Instream,_数字かドット), 数値ビット表現(_数字かドット,_数値ビット表現),!. '数字かドットを読み込む'(Instream,_数値ビット表現) :- '数字かドットを読み込む'(Instream,_数値ビット表現). 数値ビット表現('0',0). 数値ビット表現('1',1). 数値ビット表現('2',2). 数値ビット表現('3',4). 数値ビット表現('4',8). 数値ビット表現('5',16). 数値ビット表現('6',32). 数値ビット表現('7',64). 数値ビット表現('8',128). 数値ビット表現('9',256). 数値ビット表現('.',511). 数値ビット表現述語の生成 :- append(_,[A|R],['0b0','0b1','0b10','0b100','0b1000','0b10000','0b100000','0b1000000','0b10000000','0b100000000','0b111111111']), atom_to_term(A,N,_), sub_atom(A,2,Len,0,B), wr('数値ビット表現(''%t'',%t).\n',[Len,N]), R =[]. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/143 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # 8 桁までの整数を表わす文字列(例: "-3246") を整数値(例: ?3246) に変換する関数を作りたい。各問いに答えよ。 # # 1. 整数を表わす文字列はつぎの条件を全て同時に満たすと考えられる。 # # (1) 文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である # (2) 文字列の2 文字目以降は’0’〜’9’ である # (3) 符号を除いた文字列の長さは1 以上8 以下である # # 文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時(整数と # して文字列にエラーがある場合) には0 を戻り値として返す関数check() を作れ。 # # 2. 変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、負の時には?1 # を、整数として文字列にエラーがある場合には0 を返す関数sign() を作れ。 # # 3. 問1, 2 を利用して、8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す関数 # myatoi() を作成せよ。 # # myatoi(_文字列,_整数値) :- '8 桁までの整数を表わす文字列を引数とし、整数値に変換する'(_文字列,_整数値),!. '8 桁までの整数を表わす文字列を引数とし、整数値に変換する'(_文字列,_整数値) :- check(_文字列,1), sign(_文字列,_符号), atom_chars(_文字列,Chars), 数値部を得る(Chars,_数値部), _整数値 is _数値部 * _符号,!. check(_文字列,1) :- '文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である'(_文字列), '文字列の2 文字目以降は’0’〜’9’ である '(_文字列), '符号を除いた文字列の長さは1 以上8 以下である'(_文字列),!. check(_,0). '文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である'(_文字列) :- append(_,[A|_],['+','-']), subatom(_文字列,0,1,_,A),!. '文字列の2 文字目以降は’0’〜’9’ である '(_文字列) :- sub_atom(_文字列,1,_,0,_副文字列), count(sub_atom(_副文字列,_,1,_,_文字), _文字 @>= '0', _文字 @=< '9'),Count), sub_atom(_副文字列,0,Count,0,_副文字列),!. '符号を除いた文字列の長さは1 以上8 以下である'(_文字列) :- sub_atom(_文字列,1,Len,0,_文字列), Len >= 1, Len =< 8,!. sign(_文字列,1) :- '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1'(_文字列),!. sign(_文字列,-1) :- '変換したい文字列を引数とし、正負を判断して値が負の時には-1'(_文字列),!. '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1'(_文字列) :- sub_atom(_文字列,0,1,_,_文字), append(_,[_文字|_],['+','-','0','1','2','3','4','5','6','7','8','9']),!. '変換したい文字列を引数とし、正負を判断して値が負の時には-1'(_文字列) :- sub_atom(_文字列,0,1,_,'-'),!. 数値部を得る([],1,0) :- !. 数値部を得る(['+'|R],M,N) :- 数値部を得る(R,M,N),!. 数値部を得る(['-'|R],M,N) :- 数値部を得る(R,M,N),!. 数値部を得る([_文字|R],M,N) :- 数値部を得る(R,M1,N1), 文字数値変換(_文字,N2), M is M1 * 10, N is N2 * M + N1. 文字数値変換('0',0). 文字数値変換('1',1). 文字数値変換('2',2). 文字数値変換('3',3). 文字数値変換('4',4). 文字数値変換('5',5). 文字数値変換('6',6). 文字数値変換('7',7). 文字数値変換('8',8). 文字数値変換('9',9). % 以下のサイトは # 問1 # 5つの整数と長さ3の文字列を読み込み,文字列が"MAX"のときは最大値を,文字列が"MIN"のときは最小値を出力するプログラムを以下の関数 main() を用いて作成せよ. # # 実行例 # 0 > 1 # 1 > 5 # 2 > 4 # 3 > 8 # 4 > 3 # MIN or MAX > MAX # 最大値: 8 # # 実行例 # 0 > 1 # 1 > 5 # 2 > 4 # 3 > 8 # 4 > 3 # MIN or MAX > MIN # 最小値: 1 # '5つの整数と長さ3の文字列を読み込み,文字列が"MAX"のときは最大値を,文字列が"MIN"のときは最小値を出力する' :- '5つの整数と長さ3の文字列を読み込み'(_5つの整数ならび,_長さ3の文字列), '文字列が"MAX"のときは最大値を,文字列が"MIN"のときは最小値を出力する'( '5つの整数と長さ3の文字列を読み込み'(_5つの整数ならび,_長さ3の文字列) :- '5つの整数'(_5つの整数ならび), 長さ3の文字列(_長さ3の文字列). '5つの整数'(_5つの整数ならび) :- length(_5つの整数ならび,5), writef('5個の整数をスペース区切りで入力してください : '), readln(_5つの整数ならび),!. '5つの整数'(_5つの整数ならび) :- write('正しく入力できていません\n'), '5つの整数'(_5つの整数ならび). 長さ3の文字列(_長さ3の文字列) :- write('MAX or MIN 3文字で入力してください : '), get_line(_長さ3の文字列), sub_atom(_長さ3の文字列,0,3,0,_長さ3の文字列),!. 長さ3の文字列(_長さ3の文字列) :- 長さ3の文字列(_長さ3の文字列). '文字列が"MAX"のときは最大値を,文字列が"MIN"のときは最小値を出力する'(_5つの整数ならび,'MAX') :- append(L0,[_最大値|R],_5つの整数ならび), \+((member(N1,L0),N1 > _最大値)), \+((member(N2,R),N2 > _最大値)), writef('MAX = %t\n',[_最大値]). '文字列が"MAX"のときは最大値を,文字列が"MIN"のときは最小値を出力する'(_5つの整数ならび,'MIN') :- append(L0,[_最小値|R],_5つの整数ならび), \+((member(N1,L0),N1 < _最小値)), \+((member(N2,R),N2 < _最小値)), writef('MIN = %t\n',[_最小値]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/196 # # [1] 授業単元:システムコール # [2] 問題文(含コード&リンク):http://codepad.org/XAPpvt1n # # コマンドライン引数でファイル名をn個指定し、 ファイル1からファイルn-1まで # の内容を連結し、 その結果をファイルnに書き込むプログラムを書け。 # ただし、標準入力と標準出力を当該のファイルにリダイレクトした状態で # UNIX標準コマンドを実行することで行うこと。 入力ファイルに関して # エラーが発生した場合、 そこで処理を終了せず、残りのファイルの処理を # 続けること。 ただし、以下のオプションをとることができるようにせよ。 # # -a # 書き込む際に、 ` を *' に、 ~ を *^ に、 それぞれ変換する。 # -b # 書き込む際に、 { を *[ に、 } を *] に、 # | (縦棒)を *\ (アスタリスク バックスラッシュ)に、 それぞれ変換する。 # -l # 書き込む際に、 アルファベット小文字を、 対応する大文字の # 前に * (アスタリスク)を添えた二文字に変換する。 # # 注意1 # ファイルをcloseした後に同名のファイルをopenすると、セキュリティ上の # 問題が生じる。出力のリダイレクトで、そのようなことにならないよう # 注意してプログラミングすること 'コマンドライン引数でファイル名をn個指定し、ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む' :- 'オプションならび・ファイル名ならび・出力ファイル名の取得'(_オプションならび,_ファイル名ならび,_出力ファイル名), フィルタの定義(_オプションならび), 'ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む'(_ファイル名ならび,_出力ファイル名). 'オプションならび・ファイル名ならび・出力ファイル名の取得'(_オプションならび,_ファイル名ならび,_出力ファイル名) :- user_parameters(_ユーザパラメータ), append(_オプションまたはファイル名ならび,[_出力ファイル名],_ユーザパラメータ), オプションとファイル名の分離(_オプションまたはファイル名ならび,_オプションならび,_ファイル名ならび),!. オプションとファイル名の分離([],[],[]) :- !. オプションとファイル名の分離([_オプション指定|R1],[_オプション指定|R2],_ファイル名ならび) :- sub_atom(_オプション指定,0,1,_,'-'), オプションとファイル名の分離(R1,R2,_ファイル名ならび), オプションとファイル名の分離([_ファイル名|R1],R2,[_ファイル名|R3]) :- \+(sub_atom(_オプション指定,0,1,_,'-')), オプションとファイル名の分離(R1,R2,R3),!. 'ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む'(_ファイル名ならび,_出力ファイル名) :- open(_出力フィル名,write,Outstream), 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,_ファイル名ならび), close(Outstream). 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,[]) :- !. 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,[_ファイル名|R]) :- open(_ファイル名,read,Instream), フィルタを通しながら出力する(Instream,Outstream), close(Instream), 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,R). フィルタを通しながら出力する(Instream,Outstream) :- at_end_of_stream(Instream),!. フィルタを通しながら出力する(Instream,Outstream) :- get_char(Instream,_文字), フィルタ(_文字,_変換された文字列), writef(Outstream,'%t',[_変換された文字列]), フィルタを通しながら出力する(Instream,Outstream). フィルタの定義(_オプションならび) :- member('-a',_オプションならび), asserta((フィルタ('`','*''') :- !)), asserta((フィルタ('~','*^') :- !)), fail. フィルタの定義(_オプションならび) :- member('-b',_オプションならび), asserta((フィルタ('{','*{') :- !)), asserta((フィルタ('}','*}') :- !)), fail. フィルタの定義(_オプションならび) :- member('-l',_オプションならび), asserta((フィルタ(A,B) :- A @>= 'a', A @=< 'z', to_upper(A,A1), concat_atom(A1,B),!)), fail. フィルタの定義(_) :- assertz((フィルタ(A,A))). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1276873238/534 # # テキストボックスに # A222BあああA555BえええAおおおB55A454B # と入っていたとします。 # この文字列の # AとBとその間の文字を1セットにして、AとBの間の文字に5が入っていたときだけ、AとBを削除する # # このようなロジックをつくっていただけないでしょうか? # 'AとBとその間の文字を1セットにして、AとBの間の文字に5が入っていたときだけ、AとBを削除する'(_文字列,_削除された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['A'|R2],['B'|R3]), \+(member('A',R2)), \+(member('B',R2)), '5が入っている'(R2), append([S1|R2],R3,L), concat_atom(L,_削除された文字列),!. '5が入っている'(L) :- member('5',L),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/231 # # <(.*)>を取得したいのですが # <aiueo> # <aiueo<kakikukeko> # これはaiueo kakikukekoの2つを取得したいのですが # このままだと # aiueoとaiueo<kakikukekoが取得されてしまいます # どうしたらいいでしょうか? # # '<(.*)>を取得したいのですが <aiueo> <aiueo<kakikukeko> これはaiueo kakikukekoの2つを取得したい'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[<|R2],[A|R3]), ( A == '<'; A == '>'), member(B,R2), \+(B == '<'), \+(B == '>'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/108 # # 以下のCのプログラム "test.c" から # 電話番号情報を抜き取り述語 電話帳/2 を定義しなさい。 # 電話番号はperson型の構造体 telbook として定義されている。 # # #include <stdio.h> # #include <string.h> # #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; # } # # 'Cのプログラム "test.c" から電話番号情報を抜き取り述語 電話帳/2 を定義する' :- get_lines('test.c',Lines), telbookを捜す(Lines,R), 電話帳を定義する(R). telbookを捜す(Lines,R) :- append(L0,[_行|R],Lines), sub_atom(_行,_,_,_,'struct person telbook[];'),!. 電話帳を定義する(Lines) :- append(_,[_行|R],Lines), split(_行,[' ','{','"','}'],[_名前,_電話番号]), assertz(電話帳(_名前,_電話番号)), '}が2回出現'(R),!. '}が2回出現'([_行|_]) :- count(sub_atom(_行,_,1,_,'}'),2),!. '}が2回出現'([]). % 以下のサイトは # 出典:: 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/1307166756/987 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 「空白を挟まず、何か入力してください。」と表示した後、入力された先頭文字が英字大文字、英字小文字、数字かを判定し、 # 「先頭文字は○○です。」という表示を行うプログラムを作成しなさい。 # '「空白を挟まず、何か入力してください。」と表示した後、入力された先頭文字が英字大文字、英字小文字、数字かを判定し、「先頭文字は○○です。」という表示を行う' :- '「空白を挟まず、何か入力してください。」と表示', 入力された先頭文字が(_入力された先頭文字), '英字大文字、英字小文字、数字かを判定し'(_入力された先頭文字,_判定), '「先頭文字は○○です。」という表示を行う'(_判定). '「空白を挟まず、何か入力してください。」と表示' :- write('空白を挟まず、何か入力してください。\n'). 入力された先頭文字が(_入力された先頭文字) :- get_line(Line), sub_atom(Line,0,1,_,_入力された先頭文字). '英字大文字、英字小文字、数字かを判定し'(_入力された先頭文字,英字大文字) :- _入力された先頭文字 @>= 'A', _入力された先頭文字 @=< 'Z',!. '英字大文字、英字小文字、数字かを判定し'(_入力された先頭文字,英字小文字) :- _入力された先頭文字 @>= 'a', _入力された先頭文字 @=< 'z',!. '英字大文字、英字小文字、数字かを判定し'(_入力された先頭文字,数字) :- _入力された先頭文字 @>= '0', _入力された先頭文字 @=< '9',!. '英字大文字、英字小文字、数字かを判定し'(_入力された先頭文字,'英字大文字、英字小文字、数字の何れでもありません'). '「先頭文字は○○です。」という表示を行う'(_判定) :- writef('先頭文字は%tです。\n',[_判定]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/717 # # <html>......<div class="list">画像リスト<br>1枚目<br><img src="http://ime.nu/example.com/aaa.jpg"><br> # 2枚目<br><img src="http://ime.nu/example.com/bbb.jpg"><br> # 3枚目<br><img src="http://ime.nu/example.com/ccc.jpg"><br>もっと見る<br></div>........</html> # # これで<div class="list">と</div>の間のアドレスだけ抜き出すのってどうやりますか? # ........の中にも画像アドレスがあります。そっちはマッチさせないようにしたい。 # # preg_match_all("/list\".+?src=\"(.+)\".+</div>/", $html, $m); # # 'これで div class="list" と /div の間のアドレスだけ抜き出す'(File,URL) :- get_lines(File,Lines), append(_,[Line|_],Lines), 'div class="list" と /divの間'(Line,URL). 'div class="list" と /divの間'(Line,URL) :- sub_atom(Line,_,_,_,S1,S2,S3,L1,L2,[<,/,d,i,v,>|R3]), sub_atom(S2,0,18,N,'
'), sub_atom(S2,18,N,0,URL), \+(sub_atom(URL,_,_,_,'')). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/928 # # ../test/read.cgi/tech/1307166756/885に追加で # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # file1を読み込み、特定の文字列string1 を全てstring2 に置き換え、file2に書き込むファイル、ensyu07.cを作成せよ # replase_strings( ”file1”, ”file2”, ”string1”, ”string2” ) ; # # file1を読み込み、行の文字数の大きい順番に並び換え、file2に書き込むファイル、ensyu08.cを作成せよ # text_sort( ”file1”, ”file2” ) ; # # 出来れば../test/read.cgi/tech/1307166756/900や../test/read.cgi/tech/1307166756/907のような形式で書いてもらえると助かります # 'file1を読み込み、特定の文字列string1 を全てstring2 に置き換え、file2に書き込む' :- 'file1を読み込み'(_行ならび), '特定の文字列string1 を全てstring2 に置き換え'(_行ならび,_string1,_string2,_置き換えられた行ならび), file2に書きこむ(_置き換えられた行ならび). file1を読み込み(_行ならび) :- get_lines(file1,_行ならび). '特定の文字列string1 を全てstring2 に置き換え'(_行ならび,_string1,_string2,_置き換えられた行ならび) :- findall(_行1,( append(_,[_行|_],_行ならび), 置換対象文字列は置換する(_行,_string1,_string2,_行1)), _置換された行ならび). 置換対象文字列は置換する(_行,_string1,_string2,_置換された行) :- sub_atom(_行,_,_,_,S1,_string1,S3,_,_,_), 置換対象文字列は置換する(S3,_string1,_string2,_行2), concat_atom([S1,_string2,_行2],_置換された行),!. 置換対象文字列は置換する(_行,_,_,_行). file2に書き込む(_行ならび) :- open(file2,write,Outstream), append(_,[_行|R],_行ならび), writef('%t\n',[_行]), R = [], close(Outstream),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/885 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # file1を読み込み、特定の文字列string を含む行を削除し、file2に書き込むファイル、ensyu05.cを作成せよ # erase_string( ”file1”, ”file2”, ”string” ) ; # 'file1を読み込み、特定の文字列string を含む行を削除し、file2に書き込む'(_特定の文字列) :- file1を読み込み(Lines), open(file2,write,Outstream), '特定の文字列string を含む行を削除し、file2に書き込む'(Outstream,_特定の文字列,Lines), close(Outstream). '特定の文字列string を含む行を削除し、file2に書き込む'(Outstream,_特定の文字列,[]) :- !. '特定の文字列string を含む行を削除し、file2に書き込む'(Outstream,_特定の文字列,[Line|R]) :- sub_atom(Line,_,_,_,_特定の文字列), '特定の文字列string を含む行を削除し、file2に書き込む'(Outstream,_特定の文字列,R),!. '特定の文字列string を含む行を削除し、file2に書き込む'(Outstream,_特定の文字列,[Line|R]) :- \+(sub_atom(Line,_,_,_,_特定の文字列)), writef(Outstream,'%t\n',[Line]), '特定の文字列string を含む行を削除し、file2に書き込む'(Outstream,_特定の文字列,R),!. file1を読み込み(Lines) :- get_lines(file1,Lines). % 以下のサイトは # 出典:: 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)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/176 # # 言語:JAVA # 次の例文で、[ ]の部分にひらがなの「ぺ」が27回続く場合にのみマッチする正規表現 # #   ゆうていみやおうきむこうほりいゆうじとりやまあきら[ ] # # 処理対象文字 # ゆうていみやおうきむこうほりいゆうじとりやまあきらぺぺぺぺぺぺぺぺぺぺぺぺ # ゆうていみやおうきむこうほりいゆうじとりやまあきらぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺ # ゆうていみやおうきむこうほりいゆうじとりやまあきらぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺ # # 実行した正規表現 # .*ぺ{27} # # 実行結果 # ゆうていみやおうきむこうほりいゆうじとりやまあきらぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺ # ゆうていみやおうきむこうほりいゆうじとりやまあきらぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺ # # 何で27回以外の「ぺ」が出力されるのか訳ワカメちゃん # # '次の例文で、[ ]の部分にひらがなの「ぺ」が27回続く場合にのみマッチする正規表現'(_文字列,_前文字列,_適合文字列,_後文字列) :- length(L2,27), all(L2,ペ), sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), \+(last(L1,ぺ)), \+(L3 = [ぺ|_]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/177 # # [1]C言語 # [2]本文 # 文字列を置換するプログラム # <条件> # ・右記の配列を使用 char str1[] str2[] syougou[] chikan[] # ・str1を先頭からコピーしてstr2を作る # このときstr1にsyougouと一致する文字列があればその文字列を見つける毎に文字列chikanに置換 # # 実行例: #     対象文字列を入力してください(str1):aabcabb #     照合文字列を入力してください(syougou):ab #     置換文字列を入力してください(chikan):ABC #     結果文字列は aABCcABCb です # 'str1を先頭からコピーしてstr2を作る。このときstr1にsyougouと一致する文字列があればその文字列を見つける毎に文字列chikanに置換' :- write('対象文字列を入力してください(str1):'), get_line(_str1), write('照合文字列を入力してください(syougou):'), get_line(_syougou), write('置換文字列を入力してください(chikan):'), get_line(_chikan), 文字列を置換する(_str1,_syougou,_chikan,_str2). 文字列を置換する(_str1,_syougou,_chikan,_str2) :- sub_atom(_str1,_,_,_,S1,_syougou,S3,_,_,_), 文字列を置換する(S3,_syougou,_chikan,_str3), concat_atom([S1,_chikan,_str3],_str2),!. 文字列を置換する(_str,_,_,_str). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を置換する(_str1,_syougou,_chikan,_str2) :- sub_atom(_str1,St1,Len,R,_syougou), sub_atom(_str1,0,St1,_,_str0), St3 is St1 + Len, sub_atom(_str1,St3,R,0,_str3), 文字列を置換する(_str0,_str3,_syougou,_chikan,_str3), concat_atom([_str0,_chikan,_str3],_str2),!. 文字列を置換する(_str,_,_,_str). % 以下のサイトは # 出題場所 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/1305867431/848 # # すいませんおねがいします。日曜までです。 # # # String型の配列として与えられた人の名前を全て使って「しりとり」を作りましょう。 # 参考資料ファイルを自分のプロジェクトにコピーもしくはインポートし、50音順で並んでいる配列をしりとりの原理で並び替え、出力するプログラムを作成してください。 # -----------Original NameList----------- # ごりら # らっぱ # りんご # -----------Sorted NameList----------- # りんご # ごりら # らっぱ # # 単語は適当に自分がうめるのでプログラミングそのものだけつくってもらえませんか? # # # しりとり :- write('最初の語彙をすべてで入力してください : '), get_line(_語彙), しりとり([],_語彙). しりとり(_すでに使った語彙ならび,_語彙) :- sub_atom(_語彙,_,1,0,_文字), 'Original NameList'(_次の語彙), \+(append(_,[_次の語彙|_],_すでに使った語彙ならび)), writef('%t\n',[_次の語彙]), しりとり([_次の語彙|_すでに使った語彙ならび],_次の語彙). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/726 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力した10文字以内の任意の文字列の中で、 # ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す関数 # char *cut_str(char *address1, char target_char)を定義し、 # その動作を確認するkadai7-2.cを作りなさい。 # ただし、文字列と、ある特定の文字の入力は、 # char str[10], target_char; # scanf("%s %c", str, &target_char); # で入力されるものとして、 # 答えは以下で出力されるものとする。 # printf("answer = %s\n", cut_str(str, target_char)); # # 'キーボードから入力した10文字以内の任意の文字列の中で、ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す'(_ある特定の文字が最初に表れる位置からそれ以降の部分文字列) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字), sub_atom(_文字列,S,_,_,_ある特定の文字), sub_atom(_文字列,S,_,0,_ある特定の文字が最初に表れる位置からそれ以降の部分文字列). キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- write('10文字以内の任意の文字列とある特定の文字を空白区切りで入力してください : '), get_line(Line), 文字列入力診断(Line,_文字列,_ある特定の文字),!. キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字). 文字列入力診断(Line,_文字列,_ある特定の文字) :- split(Line,[' ',','],[_文字列,_ある特定の文字]), atom(_文字列), sub_atom(_ある特定の文字,0,1,0,_ある特定の文字), sub_atom(_文字列,_,_文字列の長さ,_,_文字列), 文字列の長さ診断(_文字列,_文字列の長さ),!. 文字列入力診断(Line,_,_) :- writef('入力された %t から適切な情報が得られません。再入力をお願いします。\n',[Line]), fail. 文字列の長さ診断(_文字列,_文字列の長さ) :- _文字列の長さ =< 10,!. 文字列の長さ診断(_文字列,_文字列の長さ) :- writef('入力された文字列 %t は%t文字あります。10文字以下の長さで再入力をお願いします\n',[Line,_文字列の長さ]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/719 # # # (1)%で始まっていればコマンドに応じた処理ができるように分岐処理を書く # %Q:プログラムの終了 # %C:メモリ中に保持しているデータの登録数を出力 # %P:0~99番目までの100人分のデータが登録されている場合 # %P 8 …0番目→7番目の順で表示 # %P -10 …90番目→99番目の順で表示 # 出力例: # # ID : 100023 # Name : Tokyo # Date : 1900/1/1 # Addr : Tokyoto....... # Memo : aaeiou 1234566.... # # ID : 100048 # Name : Osaka # Date : 1900/2/2 # Addr : Osakafu....... # Memo : abcde 124816.... # # (2)%で始まっていなければデータを格納 # (3)ループするようにしておいて何行でも入力可能にする(%Qでプログラムを終了) # # # # 以下プログラムですが実行してもうまくいきません。 # とりあえずどういった感じで作っているか雰囲気だけでも分かってもらえればと思います。 # プログラム :- データまたはコマンドの入力(_データまたはコマンド行), コマンドループ(_データまたはコマンド行,_診断), _診断 = 終了. データまたはコマンドの入力(_データまたはコマンド行) :- get_line(_データまたはコマンド行). コマンドループ(_データまたはコマンド行,_診断) :- sub_atom(_データまたはコマンド行,0,1,_,'%'), split(_データまたはコマンド行,['%',' '],[_コマンド|_引数], コマンドの実行(_コマンド,_引数,_診断). コマンドループ(_データまたはコマンド行,_診断) :- \+(sub_atom(_データまたはコマンド行,0,1,_,'%')), データ入力(_データまたはコマンド行,_診断). コマンドループ(_,_診断) :- データまたはコマンドの入力(_データまたはコマンド行), コマンドループ(_データまたはコマンド行,_診断). コマンドの実行('Q',_,終了) :- コマンドの実行('C',_,true) :- count(clause(データ(_),_),_登録データ数), writef('登録データ数 = %t\n',[_登録データ数]). コマンドの実行('P',[N],true) :- N < 0, N >= -50, M1 is 100 + N, M2 is 0 - N - 1, for(M1,M,M2), データ(M,_データ), writef('%t\n',[_データ]), M = M2,!. コマンドの実行('P',[N],true) :- N >= 0, N =< 100, M1 is 0, M2 is N - 1, for(M1,M,M2), データ(M,_データ), writef('%t\n',[_データ]), M = M2,!. コマンドの実行(_,_,false). データ入力(_データ,true) :- findmax(N,データ(N,_),Max), Max2 is Max + 1, assertz(データ(Max2,_データ)),!. データ入力(_データ,true) :- assertz(データ(0,_データ)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/681 # # 1.言語/環境 # C / Linux # # 2.問題文 # あるアルファベットの文字列中に出現する「a」の出現数を表示するプログラムを作れ。 # # 3.条件 # アルファベットの文字列は確実適当にプログラム内に作ること。 # # 26文字全てのアルファベットの出現数を保持する配列を作ること。 # # 大文字、小文字は区別しない。 # # # # 宜しくお願いします。 # # アルファベットの文字列(uzopzzajjavwxcccblnqtv). あるアルファベットの文字列中に出現する「a」の出現数を表示する :- あるアルファベットの文字列(_文字列), findall(a,(sub_atom(_文字列,_,1,_,_文字),to_lower(_文字,a)),L), length(L,_出現数), writef('アルファベット文字列 %t 中に出現する「a」の出現数は %t です\n',[_文字列,_出現数]). % 以下のサイトは # 出典:: 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/1305867431/242 # # [1] 授業単元: Cプログラミング1 # [2] 問題文: 与えられた文字数分だけ文字を1文字ずつ順に表示する print 関数を作成せよ。 # 引数として文字列配列 string と整数 n を用いること。 # ここで、 string は文字列型ポインタ配列の先頭アドレスを。 n は表示する文字数を意味する。 # # 与えられた文字数分だけ文字を1文字ずつ順に表示する(_文字列,_文字数) :- _文字数 =< 0,!. 与えられた文字数分だけ文字を1文字ずつ順に表示する(_文字列,_文字数) :- sub_atom(_文字列,S,1,_,_文字), write(_文字), S = _文字数 - 1,!. 与えられた文字数分だけ文字を1文字ずつ順に表示する(_,_). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/79 # # aaa=bbb;ccc=ddd;eee=fff # # という感じの文字列からcccの値dddを取得したいです。 # dddは可変でその部分にはセミコロンとカンマは入ることはありません。 # (セミコロンは区切りとしては使いますが値としては使いません。) # cccは最後に書かれてる場合もあり、その場合は、 # 上記のeee=fffのように最後にセミコロンがつきません。 # # そこで正規表現なんですが、 # ccc=(.*?;|[^;\,]+$) # という感じにしました。 # 後方参照で()内の部分を取り出したとき、 # ccc=ddd;のときは、「ddd;」といった感じにセミコロンつきで取得され、 # ccc=dddのときは、「ddd」といった感じにセミコロンなしで取得されます。 # ccc=ddd;のときでもセミコロンなしで取得したいのですが、 # 正規表現のみで可能でしょうか? # # 'aaa=bbb;ccc=ddd;eee=fffという感じの文字列からcccの値dddを取得したい'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,後文字列,L1,L2,L3), sub_atom(S1,_,1,0,C1), セミコロンかカンマ(C1), sub_atom(_後文字列,0,1,_,C2), セミコロンかカンマ(C2), セミコロンかカンマを含まない(L2), split(S2,['='],[S2_1,_適合文字列]), concat_atom([S1,S2_1,'='],_前文字列). セミコロンかカンマ(';'). セミコロンかカンマ(','). セミコロンかカンマを含まない([]). セミコロンかカンマを含まない([A|R]) :- \+(A = ';'), \+(A = ','), セミコロンかカンマを含まない(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/20 # # [1]課題 # [2]文字列Aと文字列Bを受け取り,文字列Bが文字列Aの終わりにあるかの判定を「yes」または「no」と出力するプログラム。 # 実行例1 # 文字列A > aaa # 文字列B > aaa # yes # 実行例2 # 文字列A > defg # 文字列B > abcdefg # no # 文字列Aと文字列Bを受け取り,文字列Bが文字列Aの終わりにあるかの判定を「yes」または「no」と出力する(_文字列A,_文字列B) :- sub_atom(_文字列A,_,_,0,_文字列B), write('yes\n'),!. 文字列Aと文字列Bを受け取り,文字列Bが文字列Aの終わりにあるかの判定を「yes」または「no」と出力する(_,_) :- write('no\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/72 # # 長い文字列から文字列を抽出したいんだけど、どうすれば簡単ですか? # 122ch345673ch89 # この文字列から2chと3chの間の文字だけを取得したいです # # 長い文字列から文字列を抽出したい(_長い文字列,_前文字列,_抽出文字列,_後文字列) :- sub_atom(_長い文字列,_,_,_,_前文字列,_抽出文字列,_後文字列,_,_,_), 抽出したい文字列(_抽出文字列). 抽出したい文字列('2ch'). 抽出したい文字列('3ch'). % 以下のサイトは % http://stackoverflow.com/questions/5852841/ 辞書を捜して形態素に分解する('',[]). 辞書を捜して形態素に分解する(_文,[_語彙|L]) :- sub_atom(_文,St,Len,RLen,_語彙), 辞書(_語彙), sub_atom(_文,St+Len,RLen,0,_残りの文), 辞書を捜して形態素に分解する(_残りの文,L). % 以下のサイトは # 出典:: 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/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/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/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/1301553333/7 # # [1] 授業単元:暇つぶし # [2] 問題文(含コード&リンク): # 下記のような2chへの書き込み時刻のログを標準入力より受け取り、 # EOF がきたら現在の !ninja レベルがいくつであるか出力せよ # # !ninja レベルについて # 最初の書き込み時にはレベル1である # 最後にレベルアップした書き込み時刻から24時間以上経過して書き込むと1レベルアップする # # 条件1 一番最初の書き込み時刻以前にはクッキーは存在しないものとする # 条件2 ●無しとする # 条件3 書き込み時刻のログは古いものから順に並んでいるものとする # # 2011/02/11 22:33:44 # 2011/02/12 01:23:45 # 2011/02/14 18:19:20 # '下記のような2chへの書き込み時刻のログを標準入力より受け取り、 EOF がきたら現在の !ninja レベルがいくつであるか出力せよ' :- 一番最初の書き込み時刻以前にはクッキーは存在しないものとする(_ninja_1), get_lines(Lines), ninjaレベルの計測(Lines,_ninja_1,_ninja), writef('現在の !ninja レベルは %t です\n',[_ninja]),!. ninjaレベルの計測([],_ninja,_ninja) :- !. ninjaレベルの計測([_],_ninja,_ninja) :- !. ninjaレベルの計測([_時刻_1,_時刻_2|R],_ninja_1,_ninja) :- '24時間以上経過'(_時刻_1,_時刻_2), _ninji_2 is _ninja_1 + 1, ninjaレベルの計測([_時刻_2|R],_ninja_2,_ninja),!. ninjaレベルの計測([_時刻_1,_時刻_2|R],_ninja_1,_ninja) :- \+('24時間以上経過'(_時刻_1,_時刻_2)), ninjaレベルの計測([_時刻_2|R],_ninja_1,_ninja),!. 一番最初の書き込み時刻以前にはクッキーは存在しないものとする(1). '24時間以上経過'(_時刻_1,_時刻_2) :- sub_atom(_時刻_1,0,10,_,_年月日_1), sub_atom(_時刻_2,0,10,_,_年月日_2), sub_atom(_時刻_1,11,8,_,_時分秒_1), sub_atom(_時刻_1,11,8,_,_時分秒_2), '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2), '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2) :- _年月日_1 @< _年月日_2, _時分秒_1 @=< _時分秒_2,!. '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2) :- \+(_月末日(_年月日_1)), _時分秒_1 @> _時分秒_2, 翌日(_年月日_1,_翌日_1), _翌日_1 @< _年月日_2,!. 翌日(_年月日,_翌日の表示表現) :- sub_atom(_年月日,0,4,_年), sub_atom(_年月日,5,2,_月), sub_atom(_年月日,8,2,_日), 翌日(_年,_月,_日,_翌日の表示表現). 翌日(_年,'12','31',_翌日の表示表現) :- atom_to_term(_年,_年整数,_), _年整数_2 is _年整数 + 1, concat_atom([_年整数_2,/,'01',/,'01'],_翌日の表示表現),!. 翌日(_年,_月,_日,_翌日の表示表現) :- 月末日(_月,_日), 次の数字に対応する二文字の頭部零文字列(_月,_翌月), concat_atom([_年,/,_翌月,/,'01'],_翌日の表示表現),!. 翌日(_年,_月,_日,_翌日の表示表現) :- \+(月末日(_月,_日)), 次の数字に対応する二文字の頭部零文字列(_日,_翌日), concat_atom([_年,/,_翌月,/,_翌日],_翌日の表示表現),!. 次の数字に対応する二文字の頭部零文字列(_数値文字列,_次の数値文字列) :- length(L,2), atom_to_term(_数値文字列,_整数,_), _整数_2 is _整数 + 1, number_chars(_整数_2,Chars), append(L0,Chars,L), all(L0,'0'). 月末日(_年,'02','29') :- atom_to_term(_年,_年整数,_), うるう年(_年整数),!. 月末日(_年,'02','28') :- atom_to_term(_年,_年整数,_), \+(うるう年(_年整数)),!. 月末日(_年,_月,30) :- append(_,[_月|_],['04','06','09','11']),!. 月末日(_年,_月,31) :- append(_,[_月|_],['01','03','05','07','08','10','12']),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail . うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: 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),!. % 以下のサイトは 英数文字を含まない日本語の文を抽出する(_文字列,_前文字列,_抽出文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_抽出文字列,_後文字列,L1,L2,L3), \+((last(L1,A),多バイト文字(A))), \+((L3=[B|_],他バイト文字(B))), すべて多バイト文字(L2). すべて多バイト文字([]) :- !. すべて多バイト文字([A|R]) :- char_code(A,Code), Code >= 256, すべて多バイト文字(R). % 以下のサイトは '「YYYY/MM/DD HH:MI PM」形式に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), sPLIT(_適合文字列,['/',' ',':'],[_年,/,_月,/,_日,' ',_時,':',_分,' '_AMまたはPM]), すべて整数([_年,_月,_日,_時,_分]), \+((L3=[A|_],append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']))). すべて整数([]) :- !. すべて整数([N|R]) :- integer(N), すべて整数(R). 'AMまたはPM'('AM'). 'AMまたはPM'('PM'). % 以下のサイトは '「YYYY/MM/DD HH:MI」形式に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,後文字列,L1,L2,L3), sPLIT(_適合文字列,['/',' ',':'],[_年,/,_月,/,_日,' ',_時,':',_分]), すべて整数([_年,_月,_日,_時,_分]), \+((L3=[A|_],append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']))). すべて整数([]) :- !. すべて整数([N|R]) :- integer(N), すべて整数(R). % 以下のサイトは '-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','+','-']). % 以下のサイトは '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. % 以下のサイトは 計画停電グループ所属(グループ1,西荻). 計画停電グループ所属(グループ1,所沢). 計画停電グループ所属(グループ1,横浜南). 計画停電グループ所属(グループ1,けやき台). 計画停電グループ所属(グループ1,狭山ヶ丘). 計画停電グループ所属(グループ1,大井). 計画停電グループ所属(グループ4,上野毛). 計画停電グループ所属(グループ4,大井). 計画停電グループ所属(グループ5,埼玉). 計画停電グループ所属(グループ5,熊谷). % *** user: '計画停電' / 1 *** 計画停電(_年月日) :- 計画停電(_年月日,L), 計画停電表示(L). 計画停電表示(L) :- append(L0,[_グループ|R],L), 表示形式の取得(L0,_表示形式), 営業所並び文字列の取得(_グループ,_営業所並び文字列), wr(_表示形式,[_グループ,_営業所並び文字列]), R = []. 表示形式の取得(L0,_表示形式) :- length(L0,Len), 表示形式(Len,_表示形式). 表示形式(0,' %t 6:20-10:00; 13:50-17:30; %s\n'). 表示形式(1,' %t 9:20-13:00; 16:50-20:30; %s\n'). 表示形式(2,' %t 12:20-16:00; %s\n'). 表示形式(3,' %t 15:20-19:00; %s\n'). 表示形式(4,' %t 17:20-22:00; %s\n'). 営業所並び文字列の取得(_グループ,_営業所並び文字列) :- findall(_営業所,計画停電グループ所属(_グループ,_営業所),_営業所ならび), concat_atom(_営業所ならび,',',_営業所並び文字列). /* 計画停電(_日文字列,L) :- atom(_日文字列), sub_atom(_日文字列,_,2,_,_日文字列), 今日(_今日), 年月日から年月取得(_今日,_年月), concat_atom([_年月,_日文字列],_年月日), 計画停電(_年月日,L),!. 計画停電(_日,L) :- integer(_日), _日 =< 31, 今日(_今日), 年月日から年月取得(_今日,_年月), 整数から文字列(2,_日,_日文字列), concat_atom([_年月,_日文字列],_年月日), 計画停電(_年月日,L),!. 計画停電(_月日文字列,L) :- atom(_月日文字列), _月日文字列 @>= '0101', _月日文字列 @=< '1231', 今日(_今日), 年月日から年取得(_今日,_年), concat_atom([_年,_月日文字列],_年月日), 計画停電(_年月日,L),!. 計画停電(_月日,L) :- integer(_月日), _月日 >= 101, _月日 =< 1231, 今日(_今日), 年月日から年取得(_今日,_年), 整数から文字列(4,_月日,_月日文字列), concat_atom([_年,_月日文字列],_年月日), 計画停電(_年月日,L),!. */ 計画停電(_年月日,L) :- atom(_年月日), atom_length(_年月日,8), count((日付の発生('20110317',_年月日_1,_年月日), _年月日_1 @>= '20110317' , _年月日_1 @=< _年月日),_経過日数), ならびの回転(左方向,_経過日数,[グループ4,グループ5,グループ1,グループ2,グルーブ3],L) . ならびの回転(左方向,0,L,L) :- !. ならびの回転(左方向,N,[A|R1],L) :- N_1 is N - 1, append(R1,[A],L2), ならびの回転(左方向,N_1,L2,L). 日付の発生(_日付,_日付,_日付上限) :- _日付 @> _日付上限,!,fail. 日付の発生(_日付,_日付,_日付上限). 日付の発生(_日付の一,_日付,_日付上限) :- 年・月・日に分解(_日付の一,_年の一,_月の一,_日の一), 翌日(_年の一,_月の一,_日の一,_翌日), 日付の発生(_翌日,_日付,_日付上限). 年・月・日に分解(_年月日,_年,_月,_日) :- sub_atom(_年月日,0,4,_,_年), sub_atom(_年月日,4,2,_,_月), sub_atom(_年月日,6,2,_,_日). 翌日(_年,'12','31',_翌日) :- 翌年(_年,_翌年), concat_atom([_翌年,'01','01'],_翌日),!. 翌日(_年,_月,'31',_翌日) :- append(_,[_月|_],['01','03','05','07','08','10','12']), 翌月(_月,_翌月), concat_atom([_年,_翌月,'01'],_翌日),!. 翌日(_年,_月,'30',_翌日) :- append(_,[_月|_],['04','06','09','11']), 翌月(_月,_翌月), concat_atom([_年,_翌月,'01'],_翌日). 翌日(_年,'02','29',_翌日) :- concat_atom([_年,'03','01'],_翌日),!. 翌日(_年,'02','28',_翌日) :- \+(うるう年(_年)), concat_atom([_年,'03','01'],_翌日),!. 翌日(_年,_月,_日,_翌日) :- 翌日(_日,_翌日の日), concat_atom([_年,_月,_翌日の日],_翌日). 翌月(_月,_翌月) :- atom_to_term(_月,M,_), M2 is M + 1, 整数から文字列(2,M2,_翌月). 翌年(_年,_翌年) :- atom_to_term(_年,Y,_), Y2 is Y + 1, 整数から文字列(4,Y2,_翌年). 翌日(_日,_翌日) :- atom_to_term(_日,D,_), D2 is D + 1, 整数から文字列(2,D2,_翌日). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: 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えええいいい]. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/958 # # XXXとYYYの間を削除したくて、 # javaで、replaceAll("XXX.*YYY", "") # このようなコードを書いてるんですが、対象が複数ある場合にうまくいきません。 # # AAAXXXBBBYYYCCCXXXDDDYYYEEE # AAACCCEEE ←このように変換したい  # AAAEEE ←こうなってしまう # # 最初のXXXと最後のYYYで認識されてしまってるようなんですが、どのようにすればよいでしょうか # # 'XXXで始まり、YYYで終わる区間を削除する。複数ヶ所ある場合はすべて削除する'(_文字列,_削除された文字列) :- sub_atom(_文字列,S,3,R,'XXX'), sub_atom(_文字列,0,S,_,_副文字列の一), 'YYYまでが削除対象'(_文字列,_残り文字列), 'XXXで始まり、YYYで終わる区間を削除する。複数ヶ所ある場合はすべて削除する'(_残り文字列,_削除された文字列の一), concat_atom([_副文字列の一,_削除された文字列の一],_削除された文字列),!. 対象が複数ある部分文字列の削除(_文字列,_文字列). 'YYYまでが削除対象'(_文字列,_残り文字列) :- sub_atom(_文字列,S,3,_残り文字数,YYY), S2 is S + 3, sub_atom(_文字列,S2,_残り文字数,_,_残り文字列),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/946 # # 16進数を2桁づつに分解する正規表現って # 例えば # '5d8ce34a7dbaab' # を # ['5d', '8c', 'e3', '4a', '7d', 'ba', 'ab'] # というリストにしたい場合 # ([0-9A-Fa-f]{2}){7} # じゃだめなんでしょうか? # # '16進数を2桁づつに分解する'('',[]) :- !. '16進数を2桁づつに分解する'(_16進文字列,[X|R]) :- sub_atom(_16進文字列,0,2,_残り長さ,X), sub_atom(_16進文字列,2,_残り長さ,_,_16進文字列の二), '16進数を2桁づつに分解する'(_16進文字列の二,R). % 以下のサイトは # 出典:: 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/921 # # <p>text</p> を <h3>text</h3> に変換したいんです。 # # ただし text がない<p></p>はそのままで。 # # '/<p>(.+?)<\/p>/is', '<h3>$1</h3>' # # ここから進まない… 助けて # % % 最初から順に変換していく非決定性の述語とすべてを一気に変換してしまう決定性の述語の両例を示す。 %%%%%% 最初から順に変換していく。以前に変換された部分が変換前の状態に戻ることがないように注意する %%%%% '

text

text

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

text

text

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

text

text

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

text

text

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

text

text

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

text

text

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

text

text

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

text

text

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

text

text

に変換し、変換部分までのならびとする'(_文字列,[_文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/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)