ナンクロにはまる(4)検索

SQL に精通していない私にとり、「くり121」のような検索(slelect)でも何とかなるだろうとボンヤリと考えていたが、調べてみると SQL で出来るのは精々「くり___」まで。
「くり」を含む5文字の単語検索は SQL で出来ても、「121」の部分は自力で対応せざるを得ないようだ。

年の所為か妙案が全く浮かばない。
華麗なロジックを諦め、捻り出したのが超ダサい
全文字総当たり方式
つまり、
(p1) 「くり___」で得られた結果の集合から配列Aを作る。
(p2) 1 の部分に「あ~ん」+ 「-(カナ長音)」、2 の部分に「1 以外の文字」
を割り当てた文字列aを作る(実際には、「く」と「り」を除く必要がある)。
(p3) 「くり+a」が配列Aに存在するかチェックする。
(p4) 存在した「くり+a」だけで配列Bを作成すれば「くり121」に絞り込める。
という次第。
ダサいが確実、でも処理時間 & 処理方式が・・・
ということで、無い知恵を絞り考え出したのが以下の改善策。

検索文字数の絞り込み

(1) 変数の「1と2」に該当するのは、「くり___」で得られた文字の範囲に限られる。
(2) その中に「く」と「り」が含まれていれば、既に使用済みなのでそれを削除する。
この集合をCとする。
(3) 上記(p2)の「あ~ん」+ 「-(カナ長音)」に代え、集合Cを使用すれば、検索する
文字数を減らすことが可能ではないか。
この方式以外に名案が思い浮かばないのでこれに決定。
配列A内の全単語を一文字ずつに分解し、重複する文字を削除して文字集合Cを作るのは
それ程難しくはない。

存在チェック

(p3)の存在チェック処理方式は、「正規表現」の一択のみ!
その汚いロジックを見られたくないのでサーバサイド(PHP)でやることに!

正規表現パターンの生成と絞り込み

① 「1→あ」の場合、「くり121」から正規表現のパターン
/’くりあ[^あ]あ’/
を生成する。

  • preg_replace(/’1’/, ‘あ’, ‘くり121’) → くりあ2あ
  • preg_replace(/’2’/, ‘[^あ]’, ‘くりあ2あ’) → くりあ[^あ]あ

② このパターンを配列Aとマッチング
preg.match(/’くりあ[^あ]あ’/, 配列A[n])

処理に関しては、方式のみでこれ以上の深入りは避けようと思います。
完成品はナンクロ単語検索をご覧ください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


This blog is kept spam free by WP-SpamFree.

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください