“Число шантен” во всех условиях равно числу шатен на таняо.
Если число шантен после открытия увеличивается на 1 пункт или больше, то не открываемся.
Если число шантен остается таким же, и в руке меньше 2 центральных дор, то не открываемся.
Если есть 2 или больше центральные доры, то открываемся только в том случае, если укеире на таняо после открытия будет больше, чем укеире на таняо до открытия.
Если число шантен уменьшается на 1, в руке 1 дора и у нас ряншантен или больше, то открываемся после 8 хода.
Если число шантен уменьшается на 1, в руке нет дор и у нас саншантен или больше, то открываемся после 8 хода.
Если число шантен уменьшается на 1, в руке нет дор и у нас ряншантен или ишантен, открываемся после 11 хода.
Идея для реализации:
В метод calculate_outs добавить параметр restriction, который может обозначать отсутствие ограничений, либо же ограничения типа "только таняо", "только хоницу в масти X", "только чанта" и т.п.
Для таняо это будет работать так:
Проверяем, что в руке не более 7 нецентральных тайлов. Если их больше, алгоритм не будет работать правильно. Мы не должны вызывать метод с таким ограничением для руки, в который больше 7 нецентральных тайлов - так что надо продумать, как правильно обрабатывать такую ошибку, мб просто крашиться.
В самом начале алгоритма раскидываем все "нецентральные" тайлы по одиночным ветрам и драконам. Таким образом одиночная 9 не сможет образовать форму 98 при заходе 8, так что дополнительного укеире при заходе центрального тайла она нам не даст.
Во внутреннем цикле алгоритма мы будем пропускать тайлы, которые удовлетворяют ограничению. Здесь же мы сохраним лучшее значение числа шантен, которое мы смогли получить.
Вместо подсчета числа шантен заново в конце алгоритма мы возьмем лучшее из значений, которое получили в цикле в пункте 3. Таким образом рука 234567m234567p99s будет посчитана, как ишантен на таняо, а не как темпай и не как агари.
Все это надо будет плотно обложить это тестами, например, проверить, что:
234567m234567p99s - ишантен на таняо
23m234567p45677s - темпай на таняо, но укеире == 4, а не 8
12m234567p45677s - ишантен на таняо
123m234567p4567s - ишантен на таняо
123m234567p4569s - ряншантен на таняо
234m567p678s12345z - саншантен на таняо
Алгоритм не универсальный, для чанты или хоницу вероятно придется придумывать что-то еще.
Идея для реализации:
В метод
calculate_outs
добавить параметрrestriction
, который может обозначать отсутствие ограничений, либо же ограничения типа "только таняо", "только хоницу в масти X", "только чанта" и т.п.Для таняо это будет работать так:
234567m234567p99s
будет посчитана, как ишантен на таняо, а не как темпай и не как агари.Все это надо будет плотно обложить это тестами, например, проверить, что:
234567m234567p99s
- ишантен на таняо23m234567p45677s
- темпай на таняо, но укеире == 4, а не 812m234567p45677s
- ишантен на таняо123m234567p4567s
- ишантен на таняо123m234567p4569s
- ряншантен на таняо234m567p678s12345z
- саншантен на таняоАлгоритм не универсальный, для чанты или хоницу вероятно придется придумывать что-то еще.