Introdução
O Nine Mens's Morris (também chamado Mills) é um jogo de tabuleiro para dois jogadores, que é jogado no seguinte tabuleiro (imagem retirada da página da Wikipedia vinculada):
Cada jogador tem 9 homens, coloridos em preto e branco. As regras concretas não são importantes para esse desafio, mas verifique a página da Wikipedia se você estiver interessado.
O desafio
Dada uma grade como entrada, o que representa um certo boardstate, a saída do moinho de contagem total m
com 0<=m<=8
.
Três homens da mesma cor formam um moinho quando estão em uma linha reta de pontos conectados. b2
a f2
não é um moinho, uma vez que os homens são de cor diferente. Também d2
para d5
não formar um moinho desde os três pontos têm de ser ligados.
A placa na imagem acima contém dois moinhos, por exemplo. Um de f2
para f6
e um de e3
para e5
.
Entrada
A placa é representada como uma grade 2D com 24 pontos, que são conectados como mostrado na imagem de exemplo acima. O exemplo usa letras de a-g
para as colunas e números 1-7
para as linhas, mas você pode escolher qualquer formato de entrada razoável, desde que mapeie 24 coordenadas exclusivas para um dos seguintes estados:
- Esvaziar
- Lomografo: black
- Tirada por branco
A representação do concreto depende de você; você não está restrito a "b" ou "w" para as cores.
Além disso, sua entrada pode não conter nenhuma informação adicional.
Notas Adicionais
- Você não precisa mapear os pontos por nenhum tipo de valor. Se você deseja pegar a entrada como uma matriz 2D, tudo bem também. Mas lembre-se de que nem todos os pontos são usados e que você deve considerar as conexões entre eles.
- A entrada pode estar vazia; nesse caso, você deve gerar zero (placa vazia -> sem fresas).
- Como cada jogador tem 9 homens, a entrada nunca conterá mais de 18 pontos conquistados.
- Você pode omitir pontos vazios na entrada e, portanto, apenas os pontos de entrada que são capturados.
- A entrada pode ser solicitada de qualquer forma. Você não pode confiar em um pedido específico.
- Você pode assumir que a entrada sempre será válida. Isso significa que não haverá mais de 9 homens de cada cor e que cada ponto será único.
Regras
- Esclareça qual formato de entrada você usa em sua solução. É altamente recomendável fornecer um exemplo de execução do seu programa.
- Função ou programa completo permitido.
- Regras padrão para entrada / saída.
- Aplicam-se brechas padrão .
- Isso é código-golfe , portanto, a menor contagem de bytes vence. O desempatador é uma inscrição anterior.
Casos de teste
O formato de entrada aqui é uma lista de tuplas com as coordenadas, como no exemplo acima, como primeiro elemento e o estado do segundo elemento do ponto. Um ponto tomado por branco é marcado como "w" e um ponto tomado por preto como "b". Todos os outros pontos são deixados de fora e estão vazios.
[("a4", "w"), ("b2", "b"), ("b4", "b"), ("c4", "b"), ("d1", "w") , ("d2", "w"), ("e3", "w"), ("e4", "w"), ("e5", "w"), ("f2", "b") , ("f4", "b"), ("f6", "b"), ("g4", "w")] -> 2 [("a1", "b"), ("a4", "b"), ("a7", "b"), ("b4", "b"), ("c4", "b") , ("d3", "w"), ("d2", "w"), ("d1", "w")] -> 3 [] -> 0 [("b4", "b"), ("a4", b "), (" c4 ", w")] -> 0 [("b4", "b"), ("a4", b "), (" c4 ", b")] -> 1 [("a1", "b"), ("a4", "b"), ("a7", "b"), ("b2", "b"), ("b4", "b") , ("b6", "b"), ("c3", "b"), ("c4", "b"), ("c5", "b"), ("e3", "w") , ("e4", "w"), ("e5", "w"), ("f2", "w"), ("f4", "w"), ("f6", "w") , ("g1", "w"), ("g4", "w"), ("g7", "w")] -> 8
Feliz codificação!
fonte
d3
ed5
não está conectado. Regras dizem:Three men of the same color form a mill when they are in a straight row of connected points.
. Adicionei alguns exemplos nesta seção para deixar claro, obrigado pelo comentário!Respostas:
APL (Dyalog Classic) ,
2625 bytes-1 graças a FrownyFrog
Experimente online!
O argumento é uma matriz 3x3x3 de
1
(preto),¯1
(branco) e0
(vazio). A primeira dimensão é ao longo da profundidade de aninhamento dos quadrados concêntricos. As outras duas dimensões estão no eixo vertical e horizontal.Temos um moinho sempre que a soma ao longo de qualquer eixo produza a
3
ou¯3
, exceto que devemos descartar os quatro cantos ao somar ao longo do primeiro eixo.{}
é uma função com argumento implícito⍵
↓⍵
é dividido - no nosso caso, transforma um cubo 3x3x3 em uma matriz 3x3 de vetores comprimento-3 aninhados⍵⍪↓⍵
pega o cubo original e cola a matriz 3x3 de 3 vetores abaixo dele, para obter uma matriz mista 4x3x3 de escalares e vetores+/
somas ao longo do último eixo; isso tem o efeito combinado de somar o cubo original ao longo do último eixo (+/⍵
) e somar ao longo do eixo do meio devido à divisão que fizemos (+/↓⍵
)Agora devemos cuidar do caso especial do primeiro eixo.
+⌿⍵
soma ao longo do primeiro eixo, retornando uma matriz 3x34 2⍴
mas não devemos contar os cantos, por isso a remodelamos para uma matriz 4x2 como esta:agora estamos interessados apenas na última coluna (
BDFH
), então usamos o idioma⊢/
,
concatenaBDFH
com a matriz que obtivemos anteriormente para o segundo e o terceiro eixos (BDFH
e a matriz possui uma dimensão principal de 4)∊
nivela tudo o que obtivemos até agora em um único vetor|
pega os valores absolutos{ }∩≢
filtra apenas três - o comprimento (≢) da entrada é sempre 3≢
conta elesfonte
≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢
é um mais curto :) #JavaScript (ES6),
276228125117105 bytes(o acima contém alguns caracteres ASCII imprimíveis que não aparecerão aqui, então aqui está uma versão sem a
btoa
que pode ser copiada e executada)Divide uma sequência de referência em trigêmeos de letras que correspondem às chaves do grupo de fresadoras. A entrada está na forma de um objeto, onde as teclas são as letras
a-x
, começando na parte inferior esquerda e terminando na parte superior direita, movendo-se da esquerda para a direita primeiro. Os valores são1
para branco,-1
preto e0
branco.Exemplo
Esses exemplos são extraídos dos exemplos do OP, convertidos no objeto de letra da letra e número-valor. O primeiro é da imagem de exemplo, enquanto os outros são do conjunto de exemplos.
fonte
atob
.btoa
também. Também foram encontradas outras melhorias que diminuem ainda mais.Mathematica,
217131 bytesEmbora eu tenha certeza de que isso não é particularmente competitivo, aqui está uma entrada para você.
Exemplo de entrada:
Permitir que os nomes de coordenadas de um caractere reduzam trivialmente 51 caracteres, tornando-o uma solução de 166 bytes. Nomear os jogadores 1 e 2 em vez de "w" e "b" joga com mais 17 personagens.
Então nós temos
fonte
1
e2
. o exemplo usadow
eb
, mas tenho quase certeza de que não estamos restritos a isso.APL (Dyalog Unicode) , 50 bytes
"A solução dos objetos"
Embora seja mais longa (29 caracteres) do que a solução da @ ngn , ela usa uma abordagem totalmente diferente: A entrada tem a mesma estrutura geral que a solução, mas todos os slots são representados como objetos. Os slots vazios (incluindo a coluna central não existente) devem ser objetos vazios. enquanto todos os homens negros devem ser referências ao objeto "homem negro", e todos os homens brancos devem ser referências ao objeto "homem branco". Todos os objectos podem, opcionalmente, ter bom D isplay F orm s para facilitar a leitura, e assim a coluna central pode, opcionalmente, ser tornada invisível.
Experimente online!
+/
a soma de1=(
...)
aqueles em≢¨(
… Os)
tallys de,
o enredado (achatado)∪/
conjuntos únicos em,
concatenado para∪⌿⍤2
conjuntos únicos,(
...)
concatenado para⊢/
a coluna mais à direita da4 2⍴
remodelado em quatro linhas e duas colunas,∪⌿
conjuntos colunares exclusivosUm operador no topo , como fornecido com AGL (
ä
), reduziria o comprimento para 27 caracteres .fonte