バックグラウンド
多くのコードゴルフを行う場合は、ビット単位のXOR操作を知っている可能性があります。2つの整数が与えられると1、2つの入力が異なるビットにsを持つ別の整数が与えられます。したがって、たとえば、1010 XOR 0011 = 1001。
それはゲーム理論で非常に有用であることが判明し、「nim sum」として知られています。2つのゲームの合計がある場合(つまり、一度に1つのゲームで移動している場合)、位置の値は、個々のゲームの位置の値のnim合計です。
しかし、これをさらに一歩進めることができます。nimの追加とnimの乗算の適切な定義により、非負の整数からフィールドを形成できます。したがって、課題はゴルフニムの増殖です。
定義
Nim乗算は次の規則に従います
。Fermat 2乗n =(2 ^(2 ^ k))と任意の小さい数のnim積は通常の積です。
Fermat 2乗nとそれ自体のnim積は3n / 2です。
Nim乗算は、nim加算を介して分散します。
Nim乗算は可換および結合的です(nim加算と同様)。
乗法恒等式は1です(および加法恒等式は0です)。
非負の整数は、2の異なるべき乗のnimの合計として記述でき、2のべき乗は、異なるフェルマー数の積として記述できます。したがって、これは、すべての非負の整数のnim乗算を定義するのに十分です。
例
それはすべてかなり抽象的だったので、例を見ていきましょう。私が使用します+NIM加算(XOR)を表すとする*NIM乗算に。
6 * 13
= (4 + 2) * (8 + 4 + 1)
= (4 + 2) * ((4 * 2) + 4 + 1)
= (4 * 4 * 2) + (4 * 2 * 2) + (4 * 4) + (4 * 2) + (4 * 1) + (2 * 1)
= (6 * 2) + (4 * 3) + 6 + 8 + 4 + 2
= ((4 + 2) * 2) + 12 + 6 + 8 + 4 + 2
= (4 * 2) + (2 * 2) + 12 + 6 + 8 + 4 + 2
= 8 + 3 + 12 + 6 + 8 + 4 + 2
= 15
追加のテストケース
4, 4 -> 6
4, 3 -> 12
4, 7 -> 10
2, 4 -> 8
2, 3 -> 1
1, 42 -> 42
チャレンジ
任意の便利な形式の2つの非負整数が与えられた場合、nim積を計算するプログラムまたは関数を作成します。
これはcode-golfなので、最短の提出が勝ちです。