No xadrez, um cavaleiro só pode se mover para as posições marcadas com X em relação à sua posição atual, marcadas com ♞:
Um gráfico do cavaleiro é um gráfico que representa todos os movimentos legais da peça de xadrez do cavaleiro em um tabuleiro de xadrez. Cada vértice deste gráfico representa um quadrado do tabuleiro de xadrez, e cada aresta conecta dois quadrados que são separados por um cavaleiro.
O gráfico é assim para uma placa 8 por 8 padrão.
Desafio:
Dado um número inteiro N , onde 3 ≤ N ≤ 8 , produz uma matriz N por N que representa uma placa, onde é mostrado o número de movimentos possíveis de cada posição. Para N = 8 , a saída será uma matriz que mostra os valores de cada vértice no gráfico acima.
O formato de saída é flexível. Lista de listas ou mesmo uma lista achatada etc. são formatos aceitos.
Conjunto completo de casos de teste:
--- N = 3 ---
2 2 2
2 0 2
2 2 2
--- N = 4 ---
2 3 3 2
3 4 4 3
3 4 4 3
2 3 3 2
--- N = 5 ---
2 3 4 3 2
3 4 6 4 3
4 6 8 6 4
3 4 6 4 3
2 3 4 3 2
--- N = 6 ---
2 3 4 4 3 2
3 4 6 6 4 3
4 6 8 8 6 4
4 6 8 8 6 4
3 4 6 6 4 3
2 3 4 4 3 2
--- N = 7 ---
2 3 4 4 4 3 2
3 4 6 6 6 4 3
4 6 8 8 8 6 4
4 6 8 8 8 6 4
4 6 8 8 8 6 4
3 4 6 6 6 4 3
2 3 4 4 4 3 2
--- N = 8 ---
2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2
Isso é código-golfe, e a solução mais curta em cada idioma vence. As explicações são incentivadas!
Respostas:
MATL ,
1716 bytesExperimente online!
(-1 byte graças a @Luis Mendo.)
(Em relação ao centro da matriz, cada 1 é um movimento válido de cavaleiro.)
t&l
- Forme uma matriz nxn de todos os 1s (onde n é a entrada). Que seja M.[2K0]
- Empurre uma matriz contendo [2, 4, 0] na pilhaB
- Converta tudo em binário, preenchendo com 0s conforme necessário2:&Zv
- Espelhe isso nas duas dimensões, sem repetir a linha / coluna final ("indexação simétrica da faixa"). Isso nos dá a matriz K. necessáriaZ+
- Realize convolução 2D de K sobre a matriz anterior M (conv2(M, K, 'same')
), somando os 1s nos alvos de movimento do cavaleiro legal para cada posiçãoA matriz de resultados é exibida implicitamente.
fonte
11043370BP5e
mas isso não é mais curta ...Python 2 , 81 bytes
Experimente online!
fonte
JavaScript (ES6), 88 bytes
Retorna uma string.
Experimente online!
Quão?
Para , isso fornece:n=8
A tabela de pesquisa é definida como:T
onde representa um slot não utilizado.0
Definimos cada célula para:(x,y)
JavaScript (ES7), 107 bytes
Uma implementação ingênua que realmente tenta todos os movimentos.
Experimente online!
fonte
Geléia ,
23 22 1410 bytesUm link monádico que produz uma lista simples - usa a idéia usada pela primeira vez pelo KSab em sua resposta em Python - os movimentos do cavaleiro têm "lados" 1 e 2, os únicos fatores de 2.
Experimente online! (o rodapé chama apenas o link do programa e formata o resultado como uma grade)
Como alternativa, também para 10 bytes,5–√
²Ḷdðạ²§ċ5)
(os movimentos do cavaleiro são todos os movimentos possíveis com a distância )Quão?
Anterior 22 byter
Um programa completo (devido a
³
).Experimente online! (o rodapé chama apenas o link do programa e formata o resultado como uma grade)
Encontra todos os movimentos e conta aqueles que pousam no tabuleiro,
provavelmentedefinitivamente vencíveis pelo cálculo (talvez vencível, alterando a lógica "pousar no tabuleiro").fonte
APL (Dyalog Classic) , 18 bytes
Experimente online!
⎕
entrada avaliada N2⍴⎕
duas cópias de N⍳2⍴⎕
os índices de uma matriz N × N - uma matriz de vetores comprimento-2∘.-⍨
subtraia cada par de índices um do outro, obtenha uma matriz N × N × N × N|
valor absoluto×/¨
produto cada2=
onde estão os 2s? retornar uma matriz booleana (0/1)Observe que um cavaleiro se move ± 1 em um eixo e ± 2 no outro, então o valor absoluto do produto dessas etapas é 2. Como 2 não pode ser fatorado de nenhuma outra maneira, isso é válido apenas para movimentos de cavaleiros.
+/+/
soma ao longo da última dimensão, duas vezesfonte
RAD ,
514639 bytesExperimente online!
Quão?
Conta o número de movimentos de cavaleiro válidos para cada quadrado, vendo quais movimentos de cavaleiro cairiam no tabuleiro:
fonte
Braquilog ,
654033 bytesIsso divide para N maior que 9. Então, eu estou feliz que N pode ser apenas ir para 8 =)
Experimente online!
Braquilog ,
4436 bytesEste também funciona para números superiores a 9
Experimente online!
fonte
⟨∋≡∋⟩
desde o início para gerar também as coordenadas da matriz e salvar 7 bytes no geral (a saída é uma lista simples, permitida pelo OP): Experimente online!Retina , 161 bytes
Experimente online! O link inclui casos de teste. Explicação:
Converta para unário.
Liste o valor uma vez para cada um
_
no valor, ou seja, crie um quadrado.Começando no
_
meio da regex, tente combinar o contexto suficiente para determinar se cada um dos oito movimentos do cavaleiro é possível. Cada padrão captura um único caractere se a correspondência for bem-sucedida. Tentei usar grupos nomeados para que o número de capturas fosse igual ao resultado desejado, mas que custasse 15 bytes.Concatene todas as capturas bem-sucedidas e faça a diferença.
fonte
Wolfram Language (Mathematica) , 34 bytes
Mais um Mathematica embutido.
Retorna uma lista nivelada.
Experimente online!
fonte
Python 2 ,
11410392 bytesExperimente online!
fonte
C (gcc) ,
133125 bytesEsta solução deve funcionar em qualquer placa de tamanho.
Experimente online!
fonte