Фон
В игре «Ним» игроки поочередно убирают «камни» из «груд»: на каждом ходу игрок должен убрать от одного до всех камней из одной кучи. Цель Нима - взять последний камень или, в мизерском варианте, заставить своего противника сделать это - однако оказывается, что стратегии почти идентичны.
Ним делает веселую игру в баре. Вы можете использовать спички или монеты для «камней», а «груды» обычно располагаются в линию. Ниже приведена классическая установка с кучами 1, 3, 5 и 7:
Если вы никогда раньше не играли в Nim, вы можете попробовать свои силы, прежде чем пытаться выполнить этот вызов. Вот версия под названием «Жемчуг перед свиньями» .
стратегия
Оптимальная стратегия в Nim достаточно сложна, чтобы большинство непрофессионалов последовательно проигрывали эксперту, но ее легко описать с помощью бинарной арифметики .
Однако выполнять ментальные бинарные операции 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
это не так - но это делает вывод менее читаемым, поэтому я думаю, что лучше всего сделать уменьшение внутри строки явным правилом.