バックグラウンド
でニムのゲーム、プレイヤーは「山」から「石」を削除交互:各ターンに、プレイヤーから1とすべての石の間で削除する必要があり、単一の杭。Nimの目的は、最後の石を取るか、または惨めなバリエーションでは、対戦相手に強制することです-ただし、戦略はほぼ同じであることがわかります。
ニムは楽しいバーゲームを作ります。「石」にはマッチ棒やコインを使うことができ、「山」は通常一列に並べられます。以下は、パイルが1、3、5、および7のクラシックなセットアップです。
Nimをプレイしたことがない場合は、このチャレンジに挑戦する前に、Nimを試してみてください。これは、"Pearls Before Swine"と呼ばれるバージョンです。
戦略
Nimの最適な戦略は十分にトリッキーであり、ほとんどの素人は常に専門家に負けますが、バイナリ演算で簡単に説明できます。
ただし、メンタルバイナリXOR演算を実行するのは難しいので、幸運なことに、酔っているときでもリアルタイムで実装しやすい正しい戦略を視覚化する同等の方法があります。
手順は3つだけです。
- 各行の「ストーン」を2の累乗のサイズのサブグループに精神的にグループ化します。可能な最大のサイズから始めます。ほとんどのゲームでは8、4、2、1で十分です。
- 各グループを別の行のツインと一致させて、すべてのグループがペアになるようにします。
- これが不可能な場合は、ペアになっていない "石"を1行から削除します(これは常に可能です-理由はWikipediaのリンクを参照してください)。これにより、手順2.が可能になります。
または、別の言い方をすると、「1つの山からいくつかの石を削除して、山を2の累乗にグループ化すると、すべてのグループが別の山のグループとペアになる場合があります。」2の大きな累乗を小さな累乗に分割できないことに注意してください。たとえば、8石のラインを4の2つのグループにグループ化することはできません。
たとえば、上記のボードを視覚化する方法は次のとおりです。
このボードは完全にバランスが取れているので、相手を先に動かしたいでしょう。
チャレンジ
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はありませんが、出力が読みにくくなるので、行内で減らすことを明示的なルールにするだけが最善だと思います。

