Apricot-S / xiangting

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

順子候補の待ちと対子変化の牌をすべて副露牌で使い切っているとき、置換数を誤計算する #9

Closed Apricot-S closed 3 weeks ago

Apricot-S commented 1 month ago

概要

順子候補の待ちと対子変化の牌をすべて副露牌で使い切っているとき、置換数を誤計算する 例: 12m11z 3333m 111m 222m calculate_replacement_number の戻り値: 2 実際の置換数: 3

詳細

上記の手牌の置換数を部分置換数で計算した場合

副露で 3 面子確定しているので和了形に必要な残りブロック数は 1 面子 1 雀頭

萬子の部分置換数は

字牌の部分置換数は

よって、1 面子 1 雀頭になる手牌全体の置換数は 3 となる

再現コード

use xiangting::{calculate_replacement_number, FuluMianzi};

fn main() {
    // 12m11z (3 melds required)
    let hand_4 = [
        1, 1, 0, 0, 0, 0, 0, 0, 0, // m
        0, 0, 0, 0, 0, 0, 0, 0, 0, // p
        0, 0, 0, 0, 0, 0, 0, 0, 0, // s
        2, 0, 0, 0, 0, 0, 0, // z
    ];

    // 3333m 111m 222m (3 melds)
    let melds = [
        None,
        Some(FuluMianzi::Gangzi(2)),
        Some(FuluMianzi::Kezi(0)),
        Some(FuluMianzi::Kezi(1)),
    ];

    let r_wo_melds = calculate_replacement_number(&hand_4, &None);
    println!("replacement number w/o melds: {}", r_wo_melds.unwrap());

    let r_w_melds = calculate_replacement_number(&hand_4, &Some(melds));
    // Expected 3 but got 2
    println!("replacement number w/ melds: {}", r_w_melds.unwrap());
}

出力

replacement number w/o melds: 1
replacement number w/ melds: 2
Apricot-S commented 3 weeks ago

単体テスト https://github.com/Apricot-S/xiangting/blob/756baba0d5d204814b54545f7c0fb9adf1f81b0e/src/standard/calculate.rs#L655-L678

Apricot-S commented 3 weeks ago

v2.0.0 でのアルゴリズム変更により修正された。

cargo test --package xiangting --lib -- standard::calculate::tests::calculate_replacement_number_waiting_for_the_5th_tile_13 --exact --show-output 

   Compiling xiangting v2.0.0 (/workspaces/xiangting)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 1m 07s
     Running unittests src/lib.rs (target/debug/deps/xiangting-6e0ccd763b88be1d)

running 1 test
test standard::calculate::tests::calculate_replacement_number_waiting_for_the_5th_tile_13 ... ok

successes:

successes:
    standard::calculate::tests::calculate_replacement_number_waiting_for_the_5th_tile_13

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