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, eABB
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.Respostas:
Ruby,
169164148 bytesExperimente online!
Primeiro, inicializamos
s=eval a*?^
(que é menor quea.reduce:^
)c
, que armazena o primeiro caractere exclusivo não utilizadom
que mapeia dois comprimentos para caracteres usados para representá-losEm seguida, percorrendo cada pilha, executamos o seguinte:
De acordo com a estratégia da Wikipedia , se a pilha XOR de nim-sum for menor que a pilha , devemos remover pedras dessa pilha para que seu comprimento se torne uma pilha XOR de nim-soma . Armazenando a diferença na variável
z
, podemos testar para ver se essa diferença é positiva e, em caso afirmativo, 1.) imprimir muitos traços, 2.) subtraí-la da pilha e 3.) definir a variável nim-sum como zero para evitar mais remoção de pedras.Agora nós "laço" sobre cada bit e manter o controle de seus valores dividindo-se repetidamente
x
por2
e multiplicando o acumuladorn
por2
. O loop é, na verdade, umx
tempo avaliado de string , que é muito maior dolog2(x)
que o necessário, mas nenhum dano é causado (além da ineficiência). Para cada bit, executamos o seguinte se o bit for 1 (x&1>0
):Imprima um caractere
n
vezes. Se já imprimimos um grupo não pareado dessas muitas pedras, use esse caractere; caso contrário, use o próximo caractere não utilizado (avançandoc
no local devido ao!
).Se
m[n]
existir (ou seja, acabamos de concluir um par), entãom[n]
é redefinido. Caso contrário, apenas começamos um novo par, então definam[n]
o personagem que usamos (*1
é uma maneira curta de fazer uma cópiac
).fonte
Python 2 ,
150196206 bytesExperimente online!
fonte
4, 9, 10
.14, 21, 35
.There will be multiple ways to achieve a valid visualization, and all are valid
JavaScript (ES6), 215 bytes
Visualiza apenas até 36 caracteres diferentes. Estou aliviado por isso funcionar
1, 3, 4, 5
.fonte
Limpo , 454 bytes
ainda jogando golfe
Experimente online!
Define a função
$ :: [Int] -> String
, pegando o tamanho da pilha e retornando uma sequência na qual-
denota pedras a serem removidas, e os grupos são representados por caracteres ASCII ascendentes de-
. Se grupos suficientes forem necessários, os personagens retornarão eventualmente, e devido aofoldr
fato, requer mais de um gigabyte de memória para executar o segundo caso de teste.Versão recuada da compreensão gigante:
fonte