Фон
У грі Німа гравці по черзі видаляють "каміння" з "паль": на кожному кроці гравець повинен видаляти між одним і всіма камінням з однієї купи. Завдання Німа - взяти останній камінь або, у мізерному варіанті, змусити опонента зробити це - однак, виявляється, стратегії майже однакові.
Нім робить веселу гру в бар. Можна використовувати сірники або монети для "каменів", а "палі" зазвичай розташовані в рядку. Нижче наведено класичне налаштування з паліми 1, 3, 5 та 7:
Якщо ви ніколи раніше не грали в Нім, ви можете спробувати свої сили перед тим, як спробувати це завдання. Ось версія під назвою «Перлини перед свинями» .
Стратегія
Оптимальна стратегія в Німі є досить хитрою, що більшість непрофесійних людей послідовно втрачає експерта, але просту для опису з двійковою арифметикою .
Однак робити розумові бінарні операції XOR важко, тому, на щастя, існує рівнозначний спосіб візуалізації правильної стратегії, яку легше реалізувати в режимі реального часу, навіть у нетверезому стані.
Є лише три кроки:
- Подумки групуйте «камені» в кожному рядку за підгрупами, розміри яких мають потужність 2, починаючи з максимально можливого розміру: 8, 4, 2 та 1 достатньо для більшості ігор.
- Спробуйте зіставити кожну групу з близнюком в іншому рядку, щоб у кожної групи була пара.
- Якщо це неможливо, видаліть неспарені "камені" з одного рядка (це завжди буде можливо - див. Посилання Вікіпедія для того, чому), щоб крок 2. став можливим.
Або, кажучи іншим способом: "Видаліть з однієї купки якийсь камінь (и), щоб, якщо потім згрупувати палі в потужності 2, усі групи можуть бути сполучені з групою в іншій купі". Застереження про те, що ви не можете розбити більші сили 2 на менші - наприклад, ви не можете згрупувати лінію з 8 камінням на дві групи по 4.
Наприклад, ось як ви візуалізували дошку вище:
Ця дошка ідеально збалансована, тому ви хочете, щоб ваш противник рухався першим.
Змагання
З огляду на перелік позитивних цілих чисел, що представляють розмір Nim "паль", поверніть звичайну текстову візуалізацію дошки Nim, як її бачив експерт.
Що являє собою дійсну візуалізацію, найкраще пояснити на прикладі, але потрібно:
- Призначте виразний символ кожній «підгрупі потужності-2» та її парі (непарні підгрупи не кваліфікуються) та використовуйте цей символ для представлення «каменів» як у підгрупі, так і в парі.
- Представляють будь непарні «камені» (тобто, ті , експерт буде видалити при відтворенні нормально - НЕ мізер - NIM) з допомогою дефіса:
-
.
Існує кілька способів досягти дійсної візуалізації, і всі вони дійсні. Давайте розглянемо кілька тестових випадків:
Випробування
Вхід: 1, 3, 5, 7
Можливий вихід 1:
A
BBA
CCCCD
CCCCBBD
Ви можете додатково включати пробіли між символами, а також порожні рядки між рядками:
Можливий вихід 2:
A
B B A
C C C C D
C C C C B B D
Вхід: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Порядок та вибір символів можуть бути будь-якими:
Можливий вихід 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
Символи Unicode також добре:
Можливий вихід 2:
◎
◈ ◈
◈ ◈ ◎
△ △ △ △
△ △ △ △ ◉
◐ ◐ ◐ ◐ ◀ ◀
◐ ◐ ◐ ◐ ◀ ◀ ◉
▽ ▽ ◒ - - - - -
▥ ▥ ▥ ▥ ▥ ▥ ▥ ▥ ◒
▥ ▥ ▥ ▥ ▥ ▥ ▥ ▥ ▽ ▽
Вхід: 7
З правил випливає, що будь-яку «єдину купу» необхідно повністю видалити.
Можливий вихід 1:
-------
Можливий вихід 2:
- - - - - - -
Вхід: 5, 5
Можливий вихід:
A A A A B
A A A A B
Додаткові правила
- Це кодовий гольф зі стандартними правилами. Найкоротший код виграє.
- Введення даних є гнучким і може здійснюватися в будь-якій зручній для вас формі списку.
- Вихід також є гнучким, як це свідчить вищевказані приклади. Більшість розумних варіантів буде дозволено. Запитайте, чи не знаєте ви про щось.
["H","EE","EEH","CCCC","CCCCI","DDDDFF","DDDDFFI","AAAAAAAA","AAAAAAAA-","----------"]
AAAABBBB
фактично є недійсним, і ABB
це не так, - але це робить результат менш читабельним, тому я думаю, що саме зменшення в рядку явного правила найкраще.