0
エンタメ解説
文献あり

最小除外数のVBA

20
0
$$$$

参考文献[1]にて、石取りゲームに関する記事を書いた。
その記事に載せているgrundy数の表はマクロ付きExcelで作成している。grundy数を求めるには、非負整数の集合から最小除外数を求める操作が必要となる。そこで、ChatGPTに最小除外数を求めるVBAを作成してもらった。
本記事では、そのVBAを掲載する。

まずは、最小除外数の説明から。

最小除外数(mex)

ある非負整数の集合Tがあったとき、その最小除外数(mex)とはTに属さない最小の非負整数のことである。すなわち、

\begin{eqnarray} mex(T)=min(\mathbb{N}-T) \end{eqnarray}
である。

最小除外数(mex)の例

T={0,1,3,4}の場合、
\begin{eqnarray} mex(T)=min({2,5,6,\cdots})=2 \end{eqnarray}
である。

T={1,3,4}の場合、
\begin{eqnarray} mex(T)=min({0,2,5,6,\cdots})=0 \end{eqnarray}
である。

次に最小除外数(mex)のVBAを示す。

      Function mex(rng As Range) As Long
    Dim cell As Range
    Dim numbers As Object
    Dim i As Long
    ' Dictionaryを使用して存在する整数を記録
    Set numbers = CreateObject("Scripting.Dictionary")
    ' 選択範囲内の値を確認
    For Each cell In rng
        If IsNumeric(cell.Value) And cell.Value >= 0 Then
            numbers(cell.Value) = True
        End If
    Next cell
    ' 最小の非負整数を探す
    i = 0
    Do While numbers.exists(i)
        i = i + 1
    Loop
    mex = i
End Function

    

最小除外数(mex)のVBAの説明・使い方。

  • VBA関数として作成している(以下、mex関数と呼ぶ)。
  • シートでは、いくつかのセルに、それぞれ非負整数を1つずつ入力しておく。
  • mex関数は、セル範囲を引数として取り、セル範囲に入力されている非負整数の集合に対する最小除外数を求める。
  • シートのセルに「=mex((セル範囲))」のように入力して使用する。

このmex関数は引数を1つしか取れないため、シートで用いるときは、飛び地になっているセル範囲を引数とする場合は(セル範囲にカンマが含まれる場合は)、以下のようにセル範囲全体を括弧で囲む必要がある。つまり、括弧を二重にする必要がある。

      =mex((S5,B5:C5,D4:D4))
    

更新履歴

  • 2025年9月14日 初版投稿。

参考文献

投稿日:914
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。

投稿者

L
0
107
工学部出身の会社員です。数学は趣味程度です。

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中