Фон
Если вы много играете в код, вы, вероятно, знаете о побитовой операции XOR . Учитывая два целых числа, оно дает другое целое число с 1
s в битах, где два входа различаются. Так, например 1010 XOR 0011 = 1001
.
Это оказывается очень полезным в теории игр, где она более известна как «nim sum». Если у вас есть сумма двух игр (то есть вы делаете ходы в одной игре за раз), значение позиции - это минимальная сумма значений позиций в каждой отдельной игре.
Но мы можем сделать еще один шаг вперед. С добавлением nim и соответствующим определением умножения nim мы можем сформировать поле из неотрицательных целых чисел. Таким образом, задача состоит в том, чтобы умножить игру в гольф.
Определение
Умножение Nim подчиняется следующим правилам:
Произведение nim 2-степени Ферма n = (2 ^ (2 ^ k)) с любым меньшим числом является обычным произведением.
Произведение nim n-степени Ферма n само по себе равно 3n / 2.
Умножение Нима распределяется по сложению Нима.
Умножение по Nim коммутативно и ассоциативно (как и сложение по nim).
Мультипликативная идентичность равна 1 (а аддитивная идентичность равна 0).
Любое неотрицательное целое число может быть записано как сумма nim различных степеней двойки, а любая степень два может быть записана как произведение различных чисел Ферма, поэтому этого достаточно для определения умножения 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
Вызов
Напишите программу или функцию, которая, учитывая два неотрицательных целых числа в любой удобной форме, вычисляет их произведение nim.
Это код-гольф , поэтому выигрывает самое короткое представление.