Фон
Якщо ви багато займаєтеся гольфним кодом, ви, ймовірно, знаєте про побітну операцію XOR . Враховуючи два цілих числа, воно дає ще одне ціле число з 1
s у бітах, де два входи відрізняються. Так, наприклад, 1010 XOR 0011 = 1001
.
Це виявляється дуже корисним в теорії ігор, де вона більш відома як "nim sum". Якщо у вас є сума двох ігор (тобто ви робите рухи в одній грі за один раз), значення позиції - це повна сума значень позицій у кожній грі.
Але ми можемо зробити це на крок далі. За допомогою додавання nim та відповідного визначення множення nim ми можемо сформувати поле з невід’ємних цілих чисел. Тож завданням є розмноження нім для гольфу.
Визначення
Множення Нім підкоряється таким правилам:
Найменший добуток потужності Ферма 2-ї потужністю n = (2 ^ (2 ^ k)) з будь-яким меншим числом є звичайним добутком.
Нім добуток потужності n Fermat 2 потужністю 3n / 2.
Множення Nim розподіляється на додавання nim.
Множення Nim є комутативним та асоціативним (як і додавання nim).
Мультипликативна ідентичність дорівнює 1 (а ідентична добавка - 0).
Будь-яке невід'ємне ціле число може бути записане як нім сума сукупності різних потужностей двох, а будь-яка сила двох може бути записана як добуток різних чисел Ферма, тому цього достатньо, щоб визначити 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 добуток.
Це код-гольф , тому виграє найкоротше подання.