詰み手順数と詰み上がり局面数(書きかけ)最終更新2022/10/20

詰み上がりのテキスト図を出力するプログラムを作ったので、同一局面を除いた詰み上がり局面数を算出したのでまとめておきます。(2022/4/22開始)

詰みに必要な駒の配置だけに絞った主要図の数を追加しました。(2022/9/14追加開始)

手数 詰み手順数 詰み上がりの局面数 主要図数
7手詰 29通り 11 10
8手詰 3,420通り 365 116
9手詰 657,904通り 34873 2225
10手詰 421,54,478通り 598733 10413
11手詰

3,947,329,046通り

21324139 98542
12手詰

203,510,100,771通り

283303759 407175

 

以下は作業メモ

2022/4/24追記

詰み上がり局面数を求めるブログラム実行でエラーが出ると思ったら、2019年12月にできた11手詰手順のデータに間違いがあったのが原因だった。4手目の局面から解図を開始して7手詰手順を求めていたのだが、4手目局面が同じになる

56歩、34歩、78銀、72銀

56歩、72銀、78銀、34歩

78銀、34歩、56歩、72銀

78銀、72銀、56歩、34歩

の初期図の77地点が先手の歩ではなく後手の馬が配置されていた図で7手詰手順を求めていた

ということで11手詰手順数の3947385940通りは間違いで、正しい解図開始図を使って解図し直し、間違い手順の除去と正しい手順の追加をしないと正しい手順数を求めることができない。データ修正作業を開始した。(2022/4/24)

修正完了。間違った手順数は144100で、正しい手順数は1932なので

3947385940 - 144100 + 1932 = 3947243772 なので11手詰手順数は3947243772通り。

 

修正その2

どうやら、▲56歩-▲78銀 の先手駒配置の時は大量の手作業での作成で寝ぼけていたのか、

56歩、34歩、78銀、77角成

78銀、34歩、56歩、77角成

の局面図も間違っていた。77地点に馬が居ない!

手順数の増減は、間違い手数が318 で、正しい手数が85904なので差し引き3947329362通りが更新後の11手詰手数でした。

 

4手目77角不成の図は正しかったのに....

 

2022/4/27 追記

11手詰の詰み上がり局面数が21,324,190個だとわかった。2千万個を越えているので局面を全部見るなんてことはできそうにない感じ。(一応、各詰み手数での詰み上がり局面を下図のようなテキスト画面の出力はするつもり。全局面をひとつのテキストファイルへ連続出力)

類似局面(詰みに関係が無い場所の歩が突かれているとか)の重複があるはずなので、詰みの要素だけでまとめればもっと少なくなるはず。だが、どうやってそれをプログラミングするのかが次の課題。ネット上の類似画像検索は使えない。

受け方の玉周りの地点の駒の状況(攻め方と受け方)や玉周り8地点の空きマスに利きがある攻め方の駒、王手を掛けた駒を支えている駒、PINの状況などの要素を入れる必要がありそう。玉の退路を自ら塞いでいる受け方の駒は駒種不問にするとか、攻め方の駒で玉周りの空きマスの退路カバーしている駒種やその位置も不問にすれば更に詰み上がり図は少なくなるけど、プログラムを作るのが面倒そう。

その前に、12手詰の詰み上がり局面数を算出するかどうか...。それなりのディスクの空きが必要なので難しいかも。そもそも sort -k13 -u でソートできるのかどうかも不明。ファイルを分割してそれぞれのファイルでソートした結果ファイルをいくつかまとめて再度ソートすれば徐々にデータ数は減っていくから大丈夫かな。11手詰手順の時は1000万行ごとの395ファイルに分割してそれぞれをソートし、10個単位で再度ソートしてできた40ファイルを4つずつまとめて再々ソート。10個のファイルは2つずつまとめて5つにしてから最後は5つのファイル一緒にソートして21,324,190行(※)だと判明した。(12手詰データはgzip圧縮後のサイズを5GB程度にした126個のファイルに分割しているので、概算では1つ16億通りの手順のはず。11手詰が39億通りなので2つずつまとめて32億通り程度にして処理できるはず。ただし、63回の繰り返し作業になり、最後は63個の結果ファイルを更にまとめる必要がある。)

※2022/9/16 主要図数算出のために11手の詰み上がり図数を再計算したところ、40個少ない21324150になっていた。40ファイルに分けて実行した際に空行が紛れ込んでいた可能性が大。空行だと40個の違いにはならないはずなので、ファイル特有の文字列の行が入っていたのかもしれない。全図、全行を確認することはできないので行数カウントしかしていないのが原因だったようである。まだ何か潜んでいるかも。

12手詰手順なのになぜ13列目でソートするのかというと、下図(7手詰)の黄色マーカーのような文字列を各詰み手順の最後の列として追加しているからです。この文字列はSFENに準拠したもので、手番情報なしで持ち駒情報は、スラッシュで区切って盤上の駒情報の文字列に続けて記述し、ひとつの列として扱えるようにしたものです。なので段の区切り文字のスラッシュ「/」は通常は8つしかないけど9つになっています。今回作ったブログラムのひとつは、棋譜データから棋譜データ+SFENのデータを作成するプログラムなのです。実際に棋譜を読み込んで盤上の駒を進める感じなので、合法手でない棋譜データを発見することができたわけです。SFENデータがあれば、それをソートすれば単一局面にすることは簡単。(SFENデータを読み込んで盤+持ち駒のテキスト図を作成するプログラムはあったけど、DELLのPCとバックアップしていた500GBのSSDの両方が飛んでしまっていたので、図面のテキスト出力プログラムは別途作成した。SFENデータを読んで図面出力するのではなく、棋譜を読み込んで最終局面の図面を出力するようにした。その方が少しの変更で2つのプログラムを作れるから。でも、SFENデータから図面を作るプログラムは別途必要だなぁ。詰み上がりの要素だけに凝縮した図にした場合、あるのは手順ではなく局面のSFENデータだから。今、手持ちであるのはコンパイル済みの .exeプログラムしかないので改良ができない。)

 

 

12手詰の総数は408増えて20,350,989,652個。NoCheck5.exe v1.35の実行時の出力ファイルの損傷により解数のカウントが間違っていた。(2022/6/8修正)

別方法で集計すると 203,509,892,851個。199個の差が出ている。どこか集計値が間違っているようだが、再集計には時間がかかりそう。(2022/6/12追記)

 

12手詰の総数は208,119個増えて、203,510,100,771通り。多分、これが正しい値だと思う。詰み上がりの局面数は一両日中に出るはず。(2022/6/23追記)

集計中にディスクスペースが足りなく(/tmpが一杯)なり、再計算と再集計に時間を取られ、7月7日の七夕にようやく集計完了した。

12手詰の詰み上がり図の数(203,510,100,771個の詰み上がり図で同一図を除外した数)は283,217,951個だった。

 

2022/9/15追記

詰み上がり図の主要部分だけを取り出すプログラムを作った。単騎詰の判定と同様に盤上の駒を外しても詰みになっているかを判定して、盤上の不要駒を外していくというアルゴリズム

ピンされている駒を盤上から外すと、王手を掛けている駒が増えるのでピンされている駒だと分かる。

過去作の詰み手順を読み込んで、詰み上がり図と主要図のSFEN準拠文字列を取得し、過去作のエクセルファイルに2列追加してこれらのSFEN準拠文字列を登録しておくことによって、先行作や類作の確認が楽になる。エクセルファイルの修正ついでなので、作品の特徴を記載することにした。(詳細な記述ではなく、「空き王手」とか「吊るし桂」とか「頭金」とか「飛角サンドイッチ」とか「飛先の歩成」等々)(2022/9/15)

 

過去作のSFENデータ作成をしていると下図が出て来た。17の歩は不要な気がするが、盤上から駒をひとつずつ外して王手状況を確認する方法なので、19に香が居る状況では17の歩を外せないという状況のようだ。詰みの主要図という意味ではこの詰み上がりは3段目までの駒で良いのだが、プログラム的には修正が面倒なのでこのままにする。

ちなみに、この図のSFEN文字列は

6+BSl/8k/7p1/9/9/9/8P/9/9/-

だが

6+BSl/8k/7p1/9/9/9/9/9/9/-

への修正は今のところ目視しか思いつかないのでこのままにしておく。(2022/9/16)

 

7手~12手詰手順での詰み上がり主要図の数の算出完了。

最終手は▲15歩の歩突きなんだけど、15の歩を外しても詰んでいるのでこの図になってしまう。本当はバグだけど、先行作チェックだからこのままで放置する。

と思ったけど簡単に修正できるので直した。その結果、7手~12手詰の主要図の再計算が必要になった。これがあるのでやりたくなかった。(2022/9/17)

 

追記2022/9/22

11手詰の主要図を作成したところ、SFEN文字列が終局図のままで要素だけの図に変わらないものが見つかった。原因は詰んでいないので終局図のままだった訳だが、これまで何度が11手詰の手順を修正してきた中で詰まない手順が混入したのだろう。

詰み数は3947329362通り⇒3947329046通り、詰み上がり局面数は21324150⇒21324139、主要図数は48327⇒48440になった。

12手詰も要再確認。

(2022/9/25追記) 2年2ヵ月かけてできた12手詰の全解数だったが、NoCheck5.exeでの解の数は合っているけど棋譜出力に問題があって、香打とすべきところが香のままだったので出力された棋譜では盤上の香移動も香打も同じ棋譜になる手順が存在していた。この不具合があっても12手詰全手順数を求められていたのでNoCheck5.exe ver 1.41(2022/6/10更新版)で不具合は修正されていたが12手詰解の再計算をしていなかったため、今回の詰み上がり局面数や主要図数の算出に影響が出ていた。

現在、重複している手順の洗い出し中だが今のところ153390手順を見つけている。棋譜の手順に「打」が抜けているので、最終図の局面を算出したとき、「打」が無い同手順が2つあることになり、詰み上がり図の重複を省いたときに1図が欠落することになっていた。洗い出しが終わったら、詰み上がり局面図の再計算をすることになるが、このページのトップにある表の中の12手の詰み上がり局面数は、現時点では283217951から283371341に増える予定。

更に151906個が見つかったので、今のところ283523247になる予定。

更に54追加で283523301になる予定。

(202210/3)12手の詰み上がり局面数は12388449個増える予定だったが、香打を含む手順違いによる詰み上がり図に重複があるので、重複を除去する必要がある。

重複を除外すると、香打の手がある手順で追加されるのは93447個だったので、12手の詰み上がり図の数は283217951+93447=283311398になった。

香打の棋譜があることで復活した手順の

▲16歩、△34歩、▲38金、△77角成、▲48玉、△68馬、▲11角成、△69馬、▲17香打、△72銀、▲18飛、△58金

の詰み上がりは、既存の手順

▲16歩、△34歩、▲18飛、△72銀、▲48玉、△77角成、▲38金、△78馬、▲11角成、△69馬、▲17香、△58金

と同じ詰み上がりになっている。これまでは「打」が付いていなかった

▲16歩、△34歩、▲38金、△77角成、▲48玉、△68馬、▲11角成、△69馬、▲17香、△72銀、▲18飛、△58金

だと19の香が居ない図になり、▲17香打が正しい棋譜のものと重複していたが、今回、香打を含む棋譜を正しくしたことで、詰み上がり図が既存手順と重複するケースが出てきたので、このようなものも除外する必要がある。(▲18飛を先に指していると持ち駒を打つ手の▲17香には「打」が不要だった既存手順と重複が生じた)

この重複を除外すると、結局、85808個増の283303759個が詰み上がり図の数だった。

主要図数に変化はないはずだったが、再確認したところ695個増えて163559個になっていた。(2022/10/4)

主要図数は3個減って163556個だった。(▲68玉、△34歩、▲78玉、△77角生、▲96歩、△59角成、▲11角成、△69馬、▲88玉、△76金、▲97香打、△87馬のケースでは99の香が97へ上がる手順だと玉の退路ができるが「香打」ではない棋譜で6手順が登録されていた。これら6手順の11手目を全て▲97香打にして修正した。詰み上がり図の数に変更はないが、11角の生・成は主要部に影響しないので3つの図だけになる。修正前は主要部の図が全図になっていた(詰んでいない局面では主要部を作れなくて全図になる)ので6手順存在していたので差し引き3個減。)(2022/10/5)

10手の詰み上がり局面数は594599⇒598733。主要図数は6161⇒6176。(2022/9/23)

9手の主要図数は1462ではなく1460だったので修正した。(2022/10/7)

 

(2022/10/10)主要図を求めるプログラムを修正したので7手~12手の主要図数を再計算開始。(例:53歩に52金の頭金の詰みのとき、飛の横利きを遮る駒や飛の位置が不問になっていたのを個別にした。▲56歩、△52金左、▲55歩、△54歩、▲54同歩、△53金、▲53同歩生、△72金、▲52金の時の△72金を図に取り込んだ。玉周りのマスに居る攻め方の駒に飛や角の紐が付いている時に玉周りの攻め方の駒を取れないので主要図から除外されていたのを必要な駒として残すようにした。▲36歩、△34歩、▲66歩、△55角、▲68玉、△28角生、▲67玉、△32飛、▲56玉、△19角生、▲45玉、△55飛の時の△34歩)

7手の主要図数は10で変更なし。

8手は96 ⇒ 116 ⇒ 116

9手は1598 ⇒ 2225 ⇒ 2225

10手は6601 ⇒ 10413 ⇒ 10413

11手は52745 ⇒ 98565 ⇒ 98568 ⇒ 98542

12手は203469 ⇒ 407175 ⇒ 407175

のようにそれぞれ増えた。(2022/10/11)(2022/10/19再計算開始)変更があったのは11手のみ。

(2022/10/15)主要図の算出プログラムを更に修正(5回目?)した。結果は上表のように7手以外の各手数で増加した。

(2022/10/19)主要図の算出プログラムにミスがあったので再計算開始。(次の処理をすると前処理の間違いが原因で不都合が出て気付くパターン)結果は上表へ追加する予定。主要図内の駒配置が正しくなっただけで所有図数については増減なしかと思ったら11手は3個増の98568。香の利きが逆向きだったのを修正したのだが、成銀が残っているケースを発見。

(2022/10/20)駒の利きの2次元配列のデータに間違いがあり、主要図に必要な駒ではないはずの成銀が盤上に残っていたので2次元配列を修正して再計算。(見出しの龍 馬 全 圭 杏 と 玉 飛 角 金 銀 桂 香 歩 の先頭に余分な半角スペースが入っていた行で 1 , 0 のデータがずれていたのが原因)

最終更新:2022/10/20