Skip to content

Instantly share code, notes, and snippets.

@Cryolite
Last active August 14, 2024 13:15
Show Gist options
  • Save Cryolite/31fd88f5276d93623328215467228306 to your computer and use it in GitHub Desktop.
Save Cryolite/31fd88f5276d93623328215467228306 to your computer and use it in GitHub Desktop.
「牌構成の変わらない槓」の一定義

本稿の趣旨

ある牌姿(純手牌 + 上がり牌)が与えられた時に,それを標準和了形( $m$ 面子1雀頭による和了形)に分解する手順を厳格に定義するのは難しいように思われる.他方,ある4つの面子と1つの雀頭が与えられた時に,それが成す牌姿を得るのは非常に簡単である(無論,異なる4面子1雀頭の組み合わせが同じ牌姿となることはある).そこで,まず最初に $m$ 面子1雀頭の組み合わせを構成的に全列挙してしまってから各種の定義を導こうというのが本稿の趣旨である.

定義(分解子)

分解子集合 $D = \{d_0,\ d_1,\ d_2,\ d_3,\ d_4,\ d_5,\ d_6,\ d_7,\ d_8,\ d_9\} \subset \mathbb{N}^3$ を以下で定義する:

  • $d_0 = (0, 0, 0)$
  • $d_1 = (1, 0, 0)$
  • $d_2 = (2, 0, 0)$
  • $d_3 = (0, 0, 1)$
  • $d_4 = (3, 0, 0)$
  • $d_5 = (1, 0, 1)$
  • $d_6 = (0, 1, 0)$
  • $d_7 = (4, 0, 0)$
  • $d_8 = (2, 0, 1)$
  • $d_9 = (1, 1, 0)$

以下,分解子集合の要素を分解子と呼ぶ.

定義の意図

分解子 $d_i$$(\text{牌} i \text{を先頭とする非副露順子の個数}, \text{牌} i \text{で構成される非副露刻子の個数}, \text{牌} i \text{で構成される雀頭の個数})$ を表す意図を持たせてある1.牌 $i$ の枚数が高々4枚であるという条件と雀頭は高々1つしかないという条件のみを考慮すると,上に挙げた数字の組み合わせしかありえない.ただし,この数字の組み合わせは麻雀に関するその他の条件,例えば「8,9,字牌を先頭とする非副露順子はあり得ない」などといった条件は一切考慮していない.

定義(分解子列の結合)

分解子の列 $\mathbf{d} = (d_0, \dots, d_{n - 1}) \in D^n \quad (0 \leq n \leq 33)$ および分解子 $d' \in D$ に対して,二項演算 $\mathbf{d} \cdot d' \in D^{n + 1}$$\mathbf{d} \cdot d' = (d_0, \dots, d_{n - 1}, d')$ で定義する.

定義の意図

各牌に対していずれかの分解子を割り当てていけば,最終的に $m$ 面子 $h$ 雀頭の組み合わせを全列挙できる.34個の分解子の列によってこれを表現しようという意図である.ただし,このままでは任意の分解子の列が表現する $m$ 面子 $h$ 雀頭に関して $m$ は4を超えうるし $h$ は1を超えうる.

定義(分解子列集合の結合)

分解子列の集合 $\mathbb{D} \subset D^n$ および分解子 $d' \in D$ に対して,二項演算 $\mathbb{D} \circ d'$$\mathbb{D} \circ d' = \{\mathbf{d} \cdot d' \mid \mathbf{d} \in \mathbb{D} \}$ で定義する.

定義(標準和了形集合接頭辞)

標準和了形集合接頭辞 $\mathbb{W}_{i, m, h, a, b} \subset D^i \quad (0 \leq i \leq 34)$ を以下で再帰的に定義する:

  • $\mathbb{W}_{0, 0, 0, 0, 0} = \{()\}$
  • $\mathbb{W}_{i, m, h, a, b} = \emptyset \quad ((m < 0 \vee m > 4) \wedge (h < 0 \vee h > 1) \wedge (a < 0 \vee a > 4) \wedge (b < 0 \vee b > 4))$
  • $\mathbb{W}_{i + 1, m, h, a, 0} = (\text{以下の全ての集合の和})$
    • $\bigcup_{t = 0, 1, 2, 3, 4} (\mathbb{W}_{i, m, h, t, a} \circ d_0)$
    • $\bigcup_{t = 0, 1, 2, 3, 4} (\mathbb{W}_{i, m, h - 1, t, a} \circ d_3)$
    • $\bigcup_{t = 0, 1} (\mathbb{W}_{i, m - 1, h, t, a} \circ d_6)$
  • $\mathbb{W}_{i + 1, m, h, a, 1} =$
    • $0 \leq i \leq 6 \vee 9 \leq i \leq 15 \vee 18 \leq i \leq 24$ の場合,以下の全ての集合の和:
      • $\bigcup_{t = 0, 1, 2, 3} (\mathbb{W}_{i, m - 1, h, t, a - 1} \circ d_1)$
      • $\bigcup_{t = 0, 1} (\mathbb{W}_{i, m - 1, h - 1, t, a - 1} \circ d_5)$
      • $\mathbb{W}_{i, m - 2, h, 0, a - 1} \circ d_9$
    • それ以外の場合, $\emptyset$
  • $\mathbb{W}_{i + 1, m, h, a, 2} =$
    • $0 \leq i \leq 6 \vee 9 \leq i \leq 15 \vee 18 \leq i \leq 24$ の場合,以下の全ての集合の和:
      • $\bigcup_{t = 0, 1, 2} (\mathbb{W}_{i, m - 2, h, t, a - 2} \circ d_2)$
      • $\mathbb{W}_{i, m - 2, h - 1, 0, a - 2} \circ d_8$
    • それ以外の場合, $\emptyset$
  • $\mathbb{W}_{i + 1, m, h, a, 3} =$
    • $0 \leq i \leq 6 \vee 9 \leq i \leq 15 \vee 18 \leq i \leq 24$ の場合, $\bigcup_{t = 0, 1} (\mathbb{W}_{i, m - 3, h, t, a - 3} \circ d_4)$
    • それ以外の場合, $\emptyset$
  • $\mathbb{W}_{i + 1, m, h, a, 4} =$
    • $0 \leq i \leq 6 \vee 9 \leq i \leq 15 \vee 18 \leq i \leq 24$ の場合, $\mathbb{W}_{i, m - 4, h, 0, a - 4} \circ d_7$
    • それ以外の場合, $\emptyset$

定義の意図

麻雀におけるルールに違反しないためには以下の制約を満たす必要がある.

  • 標準和了形を構成する牌姿は $m$ 面子1雀頭 ($0 \leq m \leq 4$) に分解できなければならない.
  • 各牌を4枚を超えて使ってはならない.
  • ある牌を先頭とする順子を取り出せるのはその牌が萬子の1~7,筒子の1~7,ないしは索子の1~7であるときに限られる.

$\mathbb{W}_{i, m, h, a, b}$ は,萬子・筒子・索子・字牌の順に並べた各牌の先頭から順に上記制約を満たしながら $m$ 面子 $h$ 雀頭の組み合わせを再帰的に列挙していく定義となっている.ここで,添え字 $m$ はそれまでに列挙した面子の数,添え字 $h$ はそれまでに列挙した雀頭の数を表す.添え字 $a$ と添え字 $b$ は各牌を使う枚数が4枚を超えないという制約を満たすために参照している.例えば,一萬に対して分解子 $d_2$ を割り当てた時(一萬を先頭とする非副露順子3つを面子として組み込んだ時),二萬に対して分解子 $d_6$ を割り当てること(二萬の非副露刻子1つを面子として組み込むこと)ができない.二萬を使う枚数が4を超えるからである.そこで,牌 $i$ に分解子を割り当てた段階で,牌 $i + 1$ が非副露順子の一部として使われている枚数を添え字 $a$ で,牌 $i + 2$ が非副露順子の一部として使われている枚数を添え字 $b$ で保持しておくことで,各牌が4枚を超えて使われる場合を取り除いている.

定義(標準和了形集合)

標準和了形集合 $\mathbb{W}$$\mathbb{W} = \bigcup_{m = 0, 1, 2, 3, 4} \mathbb{W}_{34, m, 1, 0, 0}$ で定義する.

定義(標準和了形の牌姿)

標準和了形集合の要素 $\mathbf{w} = (w_0, w_1, \dots, w_{33}) \in \mathbb{W}$ に対して,牌姿関数 $f(\mathbf{w}) = (h_0, \dots, h_{33}) \subset \mathbb{N}^{34}$ を以下で定義する.ただし, $w_i = (w_{i, 0}, w_{i, 1}, w_{i, 2})$ であるとする.

  • $i \in \{ 0, 9, 18, 27, 28, 29, 30, 31, 32, 33 \}$ の場合, $h_i = w_{i, 0} + 3 w_{i, 1} + 2 w_{i, 2}$
  • $i \in \{ 1, 10, 19 \}$ の場合, $h_i = w_{i - 1, 0} + w_{i, 0} + 3 w_{i, 1} + 2 w_{i, 2}$
  • それ以外の場合, $h_i = w_{i - 2, 0} + w_{i - 1, 0} + w_{i, 0} + 3 w_{i, 1} + 2 w_{i, 2}$

定義(牌姿の標準和了形集合)

牌姿 $h \subset \mathbb{N}^{34}$ が与えられた時,その標準和了形集合 $\mathbb{W}(h)$ を牌姿関数 $f$ による $h$ の逆像 $\mathbb{W}(h) = f^{-1}(\{h\})$ で定義する.

定義(牌構成の変わらない槓)

$h_i = 4$ かつ $\sum_i h_i \equiv 2\mod 3$ なる牌姿 $h = (h_0, \dots, h_i, \dots, h_{33})$ が与えられたとし,また, $h' = (h_0, \dots, h_i - 4, \dots, h_{33})$ とする.このとき, ${h''}_j = ({h'}_0, \dots, {h'}_j + 1, \dots, {h'}_{33})$ に対して $|\mathbb{W}(h)| = |\bigcup_j \mathbb{W}({h''}_j)|$ であるとき,牌姿 $h$ に対する牌 $i$ による槓は牌構成が変わらないと呼ぶ.

Footnotes

  1. 「非副露順子」とは副露によるものではない(純手牌と上がり牌を合わせたものの中で構成される)順子を指すこととする.近い用語に「明順子」があるが,こちらは一般に上がり牌がロンによるもの(他家の打牌)である場合を含む定義だが,この定義では本稿の使途に向かないため新たな用語を導入している.「非副露刻子」も同様である.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment