詰将棋創作プログラミング 15 データベースを手順で検索
[2016年1月18日最終更新]
詰将棋創作プログラミング 15 データベースを手順で検索
筆者はおもちゃ箱の展示室という詰将棋コーナーを担当している。筆者に限らず詰将棋コーナーの担当者にとって、既存作品の検索はとても必要性が高い機能である(中には類似作をあまり気にしない担当者もいるが・・・)。創作プログラミングからは少し離れてしまうが、創作のための作品評価の準備としても必要な機能なので、もう少し追求してみることにした。
詰将棋創作プログラミング 13 詰将棋データベースの活用で触れたように、これまで、書誌事項、図面(初形、途中図、詰上り)の検索プログラムを開発してきた。手順についても同一手順や類似収束などシンプルな条件の検索プログラムを作成したが、「七種合」とか「双方歩不成」とか「飛打飛合10回以上」とか、手順条件作や趣向詰の検索はそれだけではできない。
そこで、少し汎用的な手順検索機能を開発してみようと思った。
1.手順ファイルtejun.txtの形式
TumeBaseのktkファイルには手順が含まれていないので、各詰将棋のkifファイルから手順を集めて手順ファイルを作成した。
ktbu003.rb 手順ファイル作成
ts.ktkに登録されているkifファイルの手順を収集、tejun.txtに格納する
この手順ファイルでは、各手ごとに次の情報を格納している(中合、空き王手、駒取りなどの情報の追加も検討中)。
# 手数 指手 先後 元 先 駒 成 玉 相対元 相対先
1,2三飛成(26),1,2,6,2,3,7,2,1,4,1,2,1,-1
- 何手目か:1
- 指し手(kif形式):2三飛成(26)
- 先手(1)か後手(2)か:1 (先手)
- 移動元(打の場合は0,0):2,6
- 移動先:2,3
- 駒(歩1~玉8、と9~龍15):7 (飛)
- 成れない(0)か不成(1)か成(2)か:2 (成)
- 玉位置:1,4
- 玉相対の移動元(打の場合は0,0):1,2 (1,4 + 1,2 = 2,6)
- 玉相対の移動先:1,-1 (1,4 + 1,-1 = 2,3)
2.文字列での手順検索 ktbu022.rb
まずは、この手順の文字列を単純に検索するプログラムを作ってみた。
ktbu022.rb 手順検索
ts.ktkに登録されている詰将棋から手順を検索する。
結果はktbu_result.txt、result.ktkに格納する
例えば、大道詰将棋の金問題を検索したいと思ったら
["9六金打", "8四玉", "8七香", "8六飛打"]
という具合に特徴的な数手を条件とすればよい。
ここで、ちょっと工夫して、連続した手順の一致だけでなく、指定した手がばらばらに出現する場合も検索できるようにしてみた。
SEQPAT = 2
# 0 出現順は問わない
# 1 順番通り出現
# 2 連続した手順
例えば七種合を調べるには、手順パターンを
["歩打,2", "香打,2", "桂打,2", "銀打,2", "金打,2", "角打,2", "飛打,2"]
(",2"は後手の手の意味。後手の駒打ちは合駒)
として、SEQPAT = 0 とすればよい。歩から飛の順列七種合なら、SEQPAT = 1 とすればいいわけだ。
3.正規表現での手順検索 ktbu023.rb
TumeBaseの手順検索機能では +**金 -84玉 +8*香 -86*合 という感じに手順の一部にワイルドカード(その部分は何であっても一致とみなす)が使える。これはとても便利なので、なんとか実装したいと思った。
幸い、Rubyでは正規表現が使えるので、文字列のかわりに正規表現で検索できるようにすれば可能になる。もちろん、単なる文字列も正規表現で表現できるので、機能的にktbu022の上位互換になるわけだ。
ktbu023.rb 正規表現による手順検索
ts.ktkに登録されている詰将棋から正規表現で手順を検索する。
結果はktbu_result.txt、result.ktkに格納する
例えば、最近書きかけのブログの位置エネルギーは落ちてくる(4)で紹介された青山雁氏作の間接打診作品。同様な作がほかにないかと、「五段玉に二段目角打、三段目歩合」という条件で検索したいときは、次のように指定すればよい(SEQPAT は 2)。もちろんこの条件だけでは間接打診とは限らないので、検索された詰将棋の手順を確かめることが必要だ。
[/二角打,1,\d,\d,\d,\d,\d,\d,\d,5/, /三歩打/]
(1は先手の手、5が玉位置の段)
\dは数字[0-9]にマッチするので、TumeBaseの*と同じことができる。繰り返しの表現を使って [/二角打,1(,\d){7},5/, /三歩打/] と書くことも可能。駒コードは角は一桁だからこれでよいが、成駒の場合は二桁になることがあるので要注意。
4.正規表現での手順検索の拡張 ktbu024.rb
記録作や趣向詰を調べたいとき、手順パターンが何回か出現する作品を検索したいことがある。「歩不成が5回以上」とか「(ある趣向パターンが)3回以上」とかいうようなケースだ。
そこで、手順検索の拡張として、出現回数を指定できるようにした。
例えば、歩不成5回以上なら [/歩\(\d\d\)(,\d){6},1/] が5回とか指定する(1が不成)。柿木将棋の棋譜は不成は記述されていない(成でないとき不成と判断できる)ので、別途情報を付加している。
前述の七種合のパターンで回数を2と指定すれば、「七対子」を見つけることができる。
また、類似作の検索などでは、キーになる手順パターンでこの部分とこの部分が両方でてくる作品を探したいということもよくある。
こういうケースも検索できるように、手順パターンを複数指定できるように拡張した。出現回数と組み合わせて、「このパターンが2回以上、このパターンが1回以上出現」という検索もできる。
ktbu024.rb 正規表現による手順検索 複数条件、回数指定を可能に
ts.ktkに登録されている詰将棋から正規表現で手順を検索する。
結果はktbu_result.txt、result.ktkに格納する
試しにこの機能を利用して、「七種合かつ六種不成」という条件で検索してみた。
2016-01-17T18:05:49+09:00 手順検索開始
2016-01-17T18:05:49+09:00 詰将棋データベースを読み込みます
2016-01-17T18:05:49+09:00 収録詰将棋数:256592
2016-01-17T18:05:52+09:00 詰将棋の手順を手順ファイルtejun.txtから読み込みます
2016-01-17T18:05:53+09:00 指定された手順を含む詰将棋を探します
##### No.86513 駒場和男 六法七変化 85手 近代将棋 P157 1996年10月
##### No.125547 駒場和男 六法七変化 85手 近代将棋 P172 1988年3月
##### No.128744 駒場和男 六法七変化 85手 近代将棋 P132 1987年8月
##### No.128768 駒場和男 六法七変化 85手 近代将棋 P132 1987年8月
手順パターン:
[[/歩打,2/, /香打,2/, /桂打,2/, /銀打,2/, /金打,2/, /角打,2/, /飛打,2/],
[/歩(dd)(,d){6},1/, /香(dd)(,d){6},1/, /桂(dd)(,d){6},1/, /銀(dd)(,d){6},1/, /角(dd)(,d){6},1/, /飛(dd)(,d){6},1/]]
繰り返し回数:[1, 1]
出現順は問わない
2016-01-17T18:05:57+09:00 検出詰将棋数:4
2016-01-17T18:05:57+09:00 検索結果をktbu_result.txt、result.ktkに出力しました
2016-01-17T18:05:57+09:00 詰将棋データベース手順検索終了
予想通りであるが、駒場さんの六法七変化がこの条件のオンリーワンの作品であることが確認できた。
5.今後に向けて
開発方針として、必要になる都度単機能のプログラムを開発してきた。この方針は早く開発できてよいのだが、情報、図面から手順まで、ある程度の検索手法は掴めたので、いずれはどの検索もできる統合検索プログラムを作ろうと考えている。
このメリットは、どのプログラムで検索するか悩まなくていいこともあるが、それよりも複数の条件を組み合わせて検索できるようになることが大きい。例えば「添川公司さんの七種合煙」といった、情報、図面、手順にまたがる検索が可能になるわけだ。
まあ、例によっていつになるかわからないが・・・
| 固定リンク
「コンピュータ詰将棋」カテゴリの記事
- 詰将棋創作プログラミング 26 同一作リストの分析(2019.03.27)
- 詰将棋創作プログラミング 25 記録に挑戦!(2018.08.30)
- 詰将棋創作プログラミング 24 飛角図式のランダム生成(2018.01.22)
- 詰将棋創作プログラミング 23 柿木将棋自動化の効果(2017.01.22)
- 詰将棋創作プログラミング 22 詰将棋創作AIを作るには(2017.01.17)
コメント
もちろんご存知でしょうけど、打たない合駒というのもありますよね。。。
投稿: 和田 裕之 | 2016.01.18 10:20
移動合のことですね。柿木棋譜では合も記述されないので、移動合は手順の文字パターンだけでは検索できません。こういうケースがいろいろあるので手順データに識別情報の追加を検討しているわけです。
投稿: TETSU | 2016.01.18 17:08
移動合を含む場合も広い意味では七種合ですが、普通は七種合といえば打合のみ七種を指します。移動合だけで七種揃えた七種移動合という作品も作られています。
投稿: TETSU | 2016.01.18 17:16