参考文献[1]にて、石取りゲームに関する記事を書いた。
その記事に載せているgrundy数の表はマクロ付きExcelで作成している。grundy数を求めるには、非負整数の集合から最小除外数を求める操作が必要となる。そこで、ChatGPTに最小除外数を求めるVBAを作成してもらった。
本記事では、そのVBAを掲載する。
まずは、最小除外数の説明から。
ある非負整数の集合Tがあったとき、その最小除外数(mex)とはTに属さない最小の非負整数のことである。すなわち、
\begin{eqnarray}
mex(T)=min(\mathbb{N}-T)
\end{eqnarray}
である。
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の説明・使い方。
このmex関数は引数を1つしか取れないため、シートで用いるときは、飛び地になっているセル範囲を引数とする場合は(セル範囲にカンマが含まれる場合は)、以下のようにセル範囲全体を括弧で囲む必要がある。つまり、括弧を二重にする必要がある。
=mex((S5,B5:C5,D4:D4))