背景
在Nim游戏中,玩家交替从“桩”中移除“石头”:每回合,玩家必须从单个桩中移除一个或所有宝石。Nim的目标是夺走最后一块石头,或者在惨败的情况下,迫使对手这样做-但是,事实证明,策略几乎是相同的。
Nim制作了有趣的酒吧游戏。您可以将火柴或硬币用于“石头”,并且通常将“桩”排列成一行。下面是一个经典的设置,其中包含1、3、5和7堆:
如果您以前从未玩过Nim,则可以在尝试此挑战之前尝试一下。这是一个称为“猪前珍珠”的版本。
战略
Nim中的最佳策略非常棘手,以至于大多数非专业人士始终输给专家,但是用二进制算术即可轻松描述。
但是,进行心理二进制XOR操作非常困难,因此幸运的是,有一种等效的方法可以可视化正确的策略,即使在醉酒的情况下,也更容易实时实施。
只有三个步骤:
- 将每行中的“石头”分为大小为2的幂的子组,从可能的最大大小开始:8、4、2和1就足以用于大多数游戏。
- 尝试使每个组与另一行中的双胞胎匹配,以便每个组都有一对。
- 如果无法做到这一点,请从单行中删除未配对的“石头”(这将始终是可能的-请参阅Wikipedia链接以了解原因),从而使步骤2成为可能。
或者说另一种方式:“从单个桩中取出一些石头,这样,如果您将这些桩归为2的幂,则所有组都可以与其他桩中的一组配对。” 需要注意的是,您不能将2的大数分解为较小的小数,例如,您不能将包含8个宝石的线分为4组。
例如,这是您可视化上面的面板的方式:
该板完全平衡,因此您希望您的对手先移动。
挑战
给定代表Nim“桩”大小的正整数列表,返回专家看到的Nim板纯文本可视化。
通过示例可以最好地解释什么构成有效的可视化,但是您必须:
- 给每个“ 2的幂次幂”子组及其对分配一个不同的字符(未配对的子组不合格),并使用该字符表示子组和对中的“石头”。
- 代表任何配对的“石头”(即那些当打正常的专家将消除-不MISERE - 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
但实际上不是无效的,但是它会使输出的可读性降低,因此我认为最好只在一条直线上减小一条明确的规则。