Apricot-S / xiangting

A library for calculation of deficiency number (a.k.a. xiangting number, 向聴数).
MIT License
1 stars 0 forks source link

4 枚使いの牌がある手牌で置換数を誤計算する #3

Closed Apricot-S closed 2 months ago

Apricot-S commented 2 months ago

Nyanten との比較テストにより発見した例 (数値は置換数)

Apricot-S commented 2 months ago

条件の変更で 1111444478m は修正された (未コミット fix/3-miscalculation にコミットした)

代わりに以下の手牌の置換数が誤計算されるようになった

Apricot-S commented 2 months ago

11 (11) 24 77 77 (カッコは死に対子、雀頭と同じ牌のため対子として数えない)と 111 1 24 777 7 にしか分解できていない

111 12 4 777 7 に分解する必要がある

Apricot-S commented 2 months ago

6ed5572225befda946ff715fc43eaf3d93b50273 で面子・ターツ・対子の数が同じときは4枚使いの孤立牌が少ない分解を選ぶようにしたところすべての単体テストが通った。

しかし、Nyanten との比較テストで手牌 7 枚以降のとき不明なエラーが発生するようになった。 test プロファイルでビルドしたところ、Ctrl+C で強制終了するまでテストが終了しなくなった。

Apricot-S commented 2 months ago

しかし、Nyanten との比較テストで手牌 7 枚以降のとき不明なエラーが発生するようになった。 test プロファイルでビルドしたところ、Ctrl+C で強制終了するまでテストが終了しなくなった。

以下のデバッグ用 println! が残っていたせいだと思われる。

                println!(
                    "雀頭: {:?}, 面子数: {}, 搭子数: {}, 対子数: {}, 孤立牌数: {}, 置換数: {} ",
                    jiangpai, num_mianzi, num_dazi, num_duizi, num_gulipai, temp
                );
Apricot-S commented 2 months ago

f15459ae00a71c495b5fd3355ff2dce64f061568 で単体テストはすべて通った。 また、Nyanten との比較テストで 10 枚のときまでが通った。

比較テスト実行時間の参考

    Finished `release` profile [optimized] target(s) in 7.97s
     Running unittests src/lib.rs (target/release/deps/xiangting-39300c774503dea4)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 115 filtered out; finished in 0.00s

     Running tests/correctness.rs (target/release/deps/correctness-5dd416d06c82eabe)

running 1 test
test tests::verify_correctness_10 has been running for over 60 seconds
test tests::verify_correctness_10 ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 9 filtered out; finished in 3065.95s

     Running tests/nyanten.rs (target/release/deps/nyanten-c69f4217025dad28)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Apricot-S commented 2 months ago

副露牌を計算に含めないルールに関してはおそらく修正が完了したが、含めるルールで誤計算することがわかった。

例: 13333m11z [2222m, 4444m] 正しい値: 2、計算結果: 3

先にターツを抜いて計算した後でターツをブロックに含めるかを待ちの有無で判定しているのが原因と思われる。 先にターツの待ちの有無を判定し、待ちがあるときだけターツを抜いて計算すればよいと思われる。

Apricot-S commented 2 months ago

2d331ab553e84fcf4c127d2ec09efca5bb302f5f にて修正した。