fundo
No jogo de Nim , os jogadores alternam a remoção de "pedras" de "pilhas": em cada turno, um jogador deve remover entre uma e todas as pedras de uma única pilha. O objetivo de Nim é pegar a última pedra ou, na variante errada, forçar seu oponente a fazê-lo - no entanto, as estratégias são quase idênticas.
Nim faz um divertido jogo de bar. Você pode usar palitos de fósforo ou moedas para as "pedras" e as "pilhas" normalmente dispostas em uma linha. Abaixo está uma configuração clássica com pilhas de 1, 3, 5 e 7:
Se você nunca jogou Nim antes, tente sua mão antes de tentar este desafio. Aqui está uma versão chamada "Pearls Before Swine" .
Estratégia
A estratégia ideal em Nim é complicada o suficiente para que a maioria dos leigos perca consistentemente para um especialista, mas simples de descrever com aritmética binária .
Fazer operações binárias mentais de XOR, no entanto, é difícil, por sorte existe uma maneira equivalente de visualizar a estratégia correta que é mais fácil de implementar em tempo real, mesmo quando está bêbado.
Existem apenas três etapas:
- Agrupe mentalmente as "pedras" em cada linha em subgrupos cujos tamanhos são potências de 2, começando com o maior tamanho possível: 8, 4, 2 e 1 são suficientes para a maioria dos jogos.
- Tente combinar cada grupo com um gêmeo em outra linha, para que cada grupo tenha um par.
- Se isso não for possível, remova "pedras" não emparelhadas de uma única linha (isso sempre será possível - consulte o link da Wikipedia para saber o porquê) para que a etapa 2. se torne possível.
Ou, disse de outra maneira: "Remova algumas pedras de uma única pilha, de modo que, se você agrupar as pilhas em potências de 2, todos os grupos poderão ser emparelhados com um grupo em outra pilha". Com a ressalva de que você não pode dividir potências maiores de 2 em potências menores - por exemplo, você não pode agrupar uma linha com 8 pedras em dois grupos de 4.
Por exemplo, veja como você visualizaria o quadro acima:
Este tabuleiro é perfeitamente equilibrado, então você quer que seu oponente se mova primeiro.
O desafio
Dada uma lista de números inteiros positivos que representam o tamanho das "pilhas" de Nim, retorne uma visualização em texto sem formatação do painel Nim, conforme visto por um especialista.
O que constitui uma visualização válida é melhor explicado pelo exemplo, mas você deve:
- Designe um caractere distinto para cada "subgrupo de potência de 2" e seu par (subgrupos não emparelhados não se qualificam) e use esse caractere para representar as "pedras" no subgrupo e no par.
- Representam qualquer "pedras" desemparelhados (ou seja, aqueles especialista iria remover quando se joga normais - não misere - Nim) usando um hífen:
-
.
Haverá várias maneiras de obter uma visualização válida e todas são válidas. Vamos trabalhar com alguns casos de teste:
Casos de teste
Entrada: 1, 3, 5, 7
Saída possível 1:
A
BBA
CCCCD
CCCCBBD
Opcionalmente, você pode incluir espaços entre os caracteres, bem como linhas em branco entre as linhas:
Saída possível 2:
A
B B A
C C C C D
C C C C B B D
Entrada: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
A ordem e a escolha dos caracteres podem ser o que você quiser:
Saída possível 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
Os símbolos Unicode também estão ok:
Saída possível 2:
◎
◈ ◈
◈ ◈ ◎
△ △ △ △
△ △ △ △ ◉
◐ ◐ ◐ ◐ ◀ ◀
◐ ◐ ◐ ◐ ◀ ◀ ◉
▽ ▽ ◒ - - - - -
▥ ▥ ▥ ▥ ▥ ▥ ▥ ▥ ◒
▥ ▥ ▥ ▥ ▥ ▥ ▥ ▥ ▽ ▽
Entrada: 7
Das regras, segue-se que qualquer "pilha única" deve ser completamente removida.
Saída possível 1:
-------
Saída possível 2:
- - - - - - -
Entrada: 5, 5
Saída possível:
A A A A B
A A A A B
Regras adicionais
- Este é o código de golfe com regras padrão. O menor código vence.
- A entrada é flexível e pode ser feita em qualquer forma de lista conveniente para você.
- A saída também é flexível, como ilustram os exemplos acima. As variações mais razoáveis serão permitidas. Pergunte se você não tiver certeza sobre alguma coisa.
["H","EE","EEH","CCCC","CCCCI","DDDDFF","DDDDFFI","AAAAAAAA","AAAAAAAA-","----------"]
AAAABBBB
é realmente inválido, e ABB
não é - mas torna a saída menos legível, por isso acho que apenas tornar decrescente dentro de uma linha uma regra explícita é melhor.