tło
Jeśli dużo grasz w golfa, prawdopodobnie znasz bitową operację XOR . Biorąc pod uwagę dwie liczby całkowite, daje kolejną liczbę całkowitą 1
s w bitach, w których dwa wejścia różnią się. Na przykład 1010 XOR 0011 = 1001
.
Okazuje się, że jest bardzo przydatny w teorii gier, gdzie jest lepiej znany jako „nim sum”. Jeśli masz sumę dwóch gier (to znaczy wykonujesz ruchy w jednej grze na raz), wartość pozycji jest nim sumą wartości pozycji w każdej grze.
Ale możemy pójść o krok dalej. Dzięki dodaniu nim i odpowiedniej definicji mnożenia nim możemy utworzyć pole z nieujemnych liczb całkowitych. Tak więc wyzwanie polega na pomnożeniu golfa nim.
Definicja
Mnożenie Nim podlega następującym zasadom:
iloczyn nim Fermata 2-power n = (2 ^ (2 ^ k)) z dowolną mniejszą liczbą jest produktem zwykłym.
Produkt nim Fermata 2-power n z samym sobą wynosi 3n / 2.
Mnożenie Nim rozkłada się na dodawanie NIM.
Mnożenie Nim jest przemienne i asocjacyjne (podobnie jak dodawanie NIM).
Tożsamość multiplikatywna wynosi 1 (a tożsamość addytywna to 0).
Dowolną nieujemną liczbę całkowitą można zapisać jako sumę nim dwóch odrębnych potęg dwóch, a każdą potęgę dwóch można zapisać jako iloczyn różnych liczb Fermata, więc to wystarczy, aby zdefiniować mnożenie nim dla wszystkich nieujemnych liczb całkowitych.
Przykład
To wszystko było dość abstrakcyjne, więc przeanalizujmy przykład. Użyję +
do oznaczenia NIM Dodatkowo (XOR) i *
za Nim mnożenia.
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
Dodatkowe przypadki testowe
4, 4 -> 6
4, 3 -> 12
4, 7 -> 10
2, 4 -> 8
2, 3 -> 1
1, 42 -> 42
Wyzwanie
Napisz program lub funkcję, która przy dwóch nieujemnych liczbach całkowitych w dowolnej dogodnej formie oblicza ich produkt nim.
To jest golf golfowy , więc wygrywa najkrótsze zgłoszenie.
Odpowiedzi:
Nim , 120 bajtów
Wypróbuj online!
OK, to może być szalone, ale ktoś musiał dokonać mnożenia Nima w Nim ...
Jest to standardowy algorytm z Wikipedii. Problem polega na tym, że nie znam języka, więc musiałem uczyć się podstaw w locie. W szczególności byłem zaskoczony
-=
imin
nie działałem dla zestawów, a najlepszym sposobem, jaki udało mi się znaleźć do wyodrębnienia minimum, było użycie iteratora i zwrócenie pierwszej wartości. Mam nadzieję, że eksperci Nim pomogą mi to poprawić.źródło
Python 2 , 85 bajtów
Wypróbuj online!
Powolny jak cholera. Oblicza mex ({α ′ β ⊕ α β ′ ⊕ α 'β ′: α ′ <α, β ′ <β}) rekurencyjnie.
źródło
Galaretka , 16 bajtów
Używa rekurencyjnej formuły xy = mex ({ay ⊕ xb ⊕ ab: a <x, b <y}) do mnożenia nimbera .
Wypróbuj online!
Jak to działa
źródło
CGSuite ,
523922 bajtyNie zdawałem sobie sprawy, że ma wbudowane i anonimowe „procedury”.
Wersja oryginalna, 36 bajtów:
Lub 25 bajtów, jeśli wejście / wyjście może być nimbers:
Cóż, miałem nadzieję
*a**b
/a*b
pracować, ale to nie działa.źródło
Pyth , 21 bajtów
Demonstracja
Wykorzystuje sformułowanie minimalnego wykluczonego elementu mnożenia nim, jak podano tutaj .
Dwie zagnieżdżone mapy są używane do iteracji wszystkich mniejszych wartości (
mm ... GH
), a następnie wyniki są spłaszczane (s
). Sprytna część pochodzi zf-T ... 0
, w której iterujemy liczby całkowite w górę od 0, aby znaleźć pierwszą nie zawartą w zestawie wspomnianym powyżej. Robiąc to w ten sposób, nie musimy obliczać górnej granicy iteracji, oszczędzając kilka bajtów.Na koniec funkcja
g
oblicza iloczyn NIM.źródło
JavaScript (ES6),
142128 bajtówPierwszym krokiem jest podzielenie obu
x
iy
na XOR mocy2
, weź ich produkty nim parami nim, a następnie XOR wyniki (ponieważ produkt nim rozprowadza się przez XOR). Kiedy już recursed do sprawyx
iy
obie potęgi 2, możemy zauważyć, że kompetencje Fermat pomnożyć ze sobą za pomocą zwykłej arytmetyki, więc możemy zatem na czynnikix
iy
do uprawnień Fermata. Jeślix
ay
nie dzielić władzę Fermata możemy odwrócić ten proces i po prostu wrócićx * y
. Jeśli jednak dzielą moc Fermata, wówczas dzielimy obiex
iy
przez tę moc, obliczamy iloczyn nim, a następnie bierzmy iloczyn nim z kwadratem nim tej mocy Fermata. Nie golfowany:źródło
Wolfram Language (Mathematica) , 81 bajtów
Wypróbuj online!
Za pomocą wzoru:
źródło