Фон
В игре «Ним» игроки поочередно убирают «камни» из «груд»: на каждом ходу игрок должен убрать от одного до всех камней из одной кучи. Цель Нима - взять последний камень или, в мизерском варианте, заставить своего противника сделать это - однако оказывается, что стратегии почти идентичны.
Ним делает веселую игру в баре. Вы можете использовать спички или монеты для «камней», а «груды» обычно располагаются в линию. Ниже приведена классическая установка с кучами 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
это не так - но это делает вывод менее читаемым, поэтому я думаю, что лучше всего сделать уменьшение внутри строки явным правилом.Ответы:
Рубин,
169164148 байтПопробуйте онлайн!
Сначала мы инициализируем
s=eval a*?^
(который короче, чемa.reduce:^
)c
, которая хранит первый неиспользованный уникальный символm
которая отображает длины двух степеней в символы, используемые для их представленияЗатем, перебирая каждую кучу, мы запускаем следующее:
Согласно стратегии Википедии , если куча XOR с nim-суммой меньше, чем куча , мы должны удалить камни из этой стопки так, чтобы ее длина стала кучей XOR с nim-суммой . Сохраняя разницу в переменной
z
, мы можем проверить, является ли эта разница положительной, и если да, то 1.) вывести столько штрихов, 2.) вычесть ее из кучи и 3.) установить переменную nim-sum в ноль, чтобы предотвратить дальнейшее удаление камня.Теперь мы «петля» над каждым битом и следить за их значения путем многократного деления
x
на2
и умножив аккумуляторn
на2
. Цикл на самом деле является строкой, оцениваемойx
раз, что намного больше, чемlog2(x)
это необходимо, но никакого вреда не причиняется (кроме неэффективности). Для каждого бита мы запускаем следующее, если бит равен 1 (x&1>0
):Распечатать символ
n
времени. Если мы уже напечатали непарную группу из такого количества камней, используйте этот символ; в противном случае используйте следующий неиспользованный символ (продвижениеc
на месте из-за!
).Если
m[n]
существовал (т.е. мы только что завершили пару), тоm[n]
сбрасывается. В противном случае мы только что начали новую пару, поэтому установитеm[n]
символ, который мы использовали (*1
это короткий способ сделать копиюc
).источник
Python 2 ,
150196206 байтПопробуйте онлайн!
источник
4, 9, 10
.14, 21, 35
.There will be multiple ways to achieve a valid visualization, and all are valid
JavaScript (ES6), 215 байт
Только визуализирует до 36 различных персонажей. Я рад, что это работает для
1, 3, 4, 5
.источник
Чисто , 454 байта
все еще играю в гольф
Попробуйте онлайн!
Определяет функцию
$ :: [Int] -> String
, принимая размеры стопки и возвращая строку, в которой-
обозначены камни, подлежащие удалению, а группы представлены символами ASCII, восходящими от-
. Если потребуется достаточное количество групп, персонажи в конце концов будут возвращаться назад, иfoldr
для выполнения второго тестового примера потребуется больше гигабайта памяти.С отступом версия гигантского понимания:
источник