tło
W grze Nim gracze naprzemiennie usuwają „kamienie” z „stosów”: w każdej turze gracz musi usunąć jeden lub wszystkie kamienie z jednego stosu. Celem Nim jest zabranie ostatniego kamienia lub, w wariancie misere, zmusić przeciwnika do zrobienia tego - jednak okazuje się, że strategie są prawie identyczne.
Nim to fajna gra w bar. Możesz użyć zapałek lub monet do „kamieni”, a „stosy” są zazwyczaj ułożone w jednej linii. Poniżej znajduje się klasyczny układ z stosami 1, 3, 5 i 7:
Jeśli nigdy wcześniej nie grałeś w Nima, możesz spróbować swoich sił przed tym wyzwaniem. Oto wersja o nazwie „Perły przed świnią” .
Strategia
Optymalna strategia w Nim jest na tyle trudna, że większość laików przegrywa konsekwentnie z ekspertem, ale jest łatwa do opisania za pomocą binarnej arytmetyki .
Wykonywanie mentalnych binarnych operacji XOR jest jednak trudne, więc na szczęście istnieje równoważny sposób wizualizacji prawidłowej strategii, który jest łatwiejszy do wdrożenia w czasie rzeczywistym, nawet gdy jest pijany.
Istnieją tylko trzy kroki:
- Mentalnie pogrupuj „kamienie” w każdej linii w podgrupy, których rozmiary to potęgi 2, zaczynając od największego możliwego rozmiaru: 8, 4, 2 i 1 są wystarczające dla większości gier.
- Spróbuj dopasować każdą grupę do bliźniaka w innej linii, aby każda grupa miała parę.
- Jeśli nie jest to możliwe, usuń niesparowane „kamienie” z jednej linii (zawsze będzie to możliwe - zobacz link do Wikipedii, dlaczego), aby krok 2. stał się możliwy.
Lub, powiedział inny sposób: „Usuń niektóre kamienie z jednego stosu, tak że jeśli zgrupujesz stosy w potęgi 2, wszystkie grupy mogą zostać sparowane z grupą na innym stosie”. Z zastrzeżeniem, że nie możesz rozbić większych mocy 2 na mniejsze - np. Nie możesz pogrupować linii z 8 kamieniami w dwie grupy po 4.
Na przykład oto jak wizualizujesz tablicę powyżej:
Ta plansza jest idealnie wyważona, więc najpierw chcesz, aby przeciwnik się poruszył.
Wyzwanie
Biorąc pod uwagę listę dodatnich liczb całkowitych reprezentujących rozmiar „stosów” Nima, zwróć wizualizację zwykłego tekstu na tablicy Nim, widzianą przez eksperta.
To, co stanowi prawidłową wizualizację, najlepiej wyjaśnić na przykładzie, ale musisz:
- Przypisz odrębny znak do każdej „podgrupy potęgi-2” i jej pary (niesparowane podgrupy nie kwalifikują się) i użyj tego znaku do przedstawienia „kamieni” zarówno podgrupy, jak i pary.
- Reprezentują żadnych niesparowanych „kamienie” (czyli te, ekspert usunęłaby podczas odtwarzania normalny - nie misere - NIM) za pomocą łącznika:
-
.
Istnieje wiele sposobów na uzyskanie prawidłowej wizualizacji i wszystkie są ważne. Przeanalizujmy niektóre przypadki testowe:
Przypadki testowe
Wejście: 1, 3, 5, 7
Możliwe wyjście 1:
A
BBA
CCCCD
CCCCBBD
Opcjonalnie możesz dołączyć spacje między znakami, a także puste linie między wierszami:
Możliwe wyjście 2:
A
B B A
C C C C D
C C C C B B D
Wejście: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Kolejność i wybór postaci może być dowolna:
Możliwe wyjście 1:
G
E E
E E G
C C C C
C C C C F
B B B B D D
B B B B D D F
H H I - - - - -
A A A A A A A A I
A A A A A A A A H H
Symbole Unicode też są w porządku:
Możliwe wyjście 2:
◎
◈ ◈
◈ ◈ ◎
△ △ △ △
△ △ △ △ ◉
◐ ◐ ◐ ◐ ◀ ◀
◐ ◐ ◐ ◐ ◀ ◀ ◉
▽ ▽ ◒ - - - - -
▥ ▥ ▥ ▥ ▥ ▥ ▥ ▥ ◒
▥ ▥ ▥ ▥ ▥ ▥ ▥ ▥ ▽ ▽
Wejście: 7
Z zasad wynika, że każdy „pojedynczy stos” musi zostać całkowicie usunięty.
Możliwe wyjście 1:
-------
Możliwe wyjście 2:
- - - - - - -
Wejście: 5, 5
Możliwe wyjście:
A A A A B
A A A A B
Dodatkowe zasady
- To jest golf golfowy ze standardowymi zasadami. Najkrótszy kod wygrywa.
- Dane wejściowe są elastyczne i można je przyjmować w dowolnej dogodnej dla ciebie formie listy.
- Dane wyjściowe są również elastyczne, co ilustrują powyższe przykłady. Dopuszczalne będą najbardziej rozsądne zmiany. Zapytaj, czy czegoś nie wiesz.
["H","EE","EEH","CCCC","CCCCI","DDDDFF","DDDDFFI","AAAAAAAA","AAAAAAAA-","----------"]
AAAABBBB
jest właściwie nieważny iABB
nie jest - ale sprawia, że dane wyjściowe są mniej czytelne, więc myślę, że zmniejszanie w linii jest wyraźną regułą.Odpowiedzi:
Rubin,
169164148 bajtówWypróbuj online!
Najpierw inicjujemy
s=eval a*?^
(który jest krótszy niża.reduce:^
)c
, która przechowuje pierwszy nieużywany unikalny znakm
która odwzorowuje potęgę dwóch długości na znaki używane do ich reprezentowaniaNastępnie, zapętlając każdy stos, uruchamiamy następujące czynności:
Zgodnie ze strategią Wikipedii , jeśli stos XOR nim-suma jest mniejszy niż stos , powinniśmy usunąć kamienie z tego stosu, aby jego długość stała się stosem XOR nim-suma . Przechowując różnicę w zmiennej
z
, możemy sprawdzić, czy ta różnica jest dodatnia, a jeśli tak 1.) wydrukuj tyle kresek, 2.) odejmij ją od stosu i 3.) ustaw zmienną nim-sum na zero, aby zapobiec dalszemu usuwaniu kamieni.Teraz my „pętla” w ciągu każdego bitu i śledzić ich wartości poprzez wielokrotne dzielenie
x
przez2
i mnożąc akumulatorn
przez2
. Pętla jest tak naprawdęx
czasem obliczonym przez ciąg znaków , który jest znacznie większy niżlog2(x)
czas, gdy jest to konieczne, ale nie wyrządza żadnej szkody (poza nieefektywnością). Dla każdego bitu uruchamiamy następujące polecenie, jeśli bit ma wartość 1 (x&1>0
):Wydrukuj
n
czasy postaci . Jeśli wydrukowaliśmy już niesparowaną grupę tak wielu kamieni, użyj tej postaci; w przeciwnym razie użyj następnej nieużywanej postaci (awansc
na miejscu z powodu!
).Jeśli
m[n]
istniał (tzn. Właśnie ukończyliśmy parę), tom[n]
jest resetowany. W przeciwnym razie właśnie zaczęliśmy nową parę, więc ustawm[n]
na znak, którego użyliśmy (*1
jest to krótki sposób na zrobienie kopiic
).źródło
Python 2 ,
150196206 bajtówWypróbuj online!
źródło
4, 9, 10
.14, 21, 35
.There will be multiple ways to achieve a valid visualization, and all are valid
JavaScript (ES6), 215 bajtów
Wizualizuje tylko do 36 różnych postaci. Ulżyło mi, że to działa
1, 3, 4, 5
.źródło
Czysty , 454 bajtów
wciąż gra w golfa
Wypróbuj online!
Definiuje funkcję
$ :: [Int] -> String
, przyjmując rozmiary stosu i zwracając ciąg znaków, w którym-
oznaczane są kamienie do usunięcia, a grupy są reprezentowane przez znaki ASCII rosnące-
. Jeśli potrzeba wystarczającej liczby grup, postacie ostatecznie się zawrócą, a to z powodufoldr
tego wymaga więcej niż gigabajta pamięci do uruchomienia drugiego przypadku testowego.Wcięta wersja gigantycznego zrozumienia:
źródło