Introdução
Aron Nimzowitsch foi um dos principais mestres do xadrez e um influente escritor de xadrez.
Em seu livro 'My System', o primeiro capítulo trata da importância do centro e por que você deve dominá-lo. A simples razão é que suas peças têm mais movimentos diretos possíveis quando estão no centro, o que novamente dá ao jogador mais poder.
Isso fica muito claro quando se olha para diferentes posições de um cavaleiro e seus possíveis próximos movimentos (mostrados em rosa) em um tabuleiro vazio:
Objetivo
Avalie o número de possíveis próximos movimentos diretos de um cavaleiro em um tabuleiro vazio com base em sua posição.
Especificações de entrada
A posição do cavaleiro.
Primeiro o x (coluna) e depois o y (linha). 0 0
é o canto inferior esquerdo.
Para simplificar, mudei os rótulos de um tabuleiro de xadrez para apenas números. Para nossos exemplos e casos de teste, usamos um índice baseado em 0, mas você pode usar um índice baseado em 1.
Você pode usar qualquer tipo de possível formato de entrada, matriz, argumentos de função etc.
Especificações de saída
O número de próximos movimentos diretos em potencial para um cavaleiro em um tabuleiro vazio.
Casos de teste
3 4 => 8
4 6 => 6
7 7 => 2
1 0 => 3
Os casos de teste estão empregando um índice baseado em 0. A grade completa de valores é:
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
Respostas:
Python 2 , 35 bytes
Experimente online!
Python 2 , 39 bytes
Experimente online!
Leva as entradas indexadas em 0.
A expressão
x*(7-x)/5
leva os valores das coordenadas0..7
para(
min(x,7-x,2)
faz o mesmo, mas é mais longo.) Soma issox
ey
fornece o padrão certo, mas com os números errados(Veja a solução de Neil para um melhor raciocínio sobre por que isso dá o padrão certo.)
Finalmente, o mapeamento
a -> 50/(8-a)-4
com divisão de piso fornece os valores certosUma solução alternativa igualmente longa com entradas indexadas 1:
fonte
(7-a)*a/5
é 3 bytes menor quemin(a,7-a,2)
.*l
na verdade, o custo total de um bytelambda a,b:"23468"[(7-a)*a/5+(7-b)*b/5]
é de apenas 41 bytes.x*(9-x)/6
, um indexado.<strike>
como todo mundo para mostrar o progresso no golfe?MATL ,
17141312 bytesGraças a @ Neil por 1 byte de desconto!
A entrada é baseada em 1.
Experimente online!
Explicação
Isso calcula a distância euclidiana da entrada para cada uma das 64 posições no tabuleiro de xadrez e descobre quantos desses valores são iguais à raiz quadrada de 5.
Como as coordenadas são valores inteiros, podemos ter certeza de que os dois valores de ponto flutuante que representam a raiz quadrada de 5 (calculados a partir das coordenadas e calculados diretamente) são realmente os mesmos.
fonte
double
número. Ant salva um byteMathematica
6343 bytesCom 20 bytes salvos, graças às sugestões de Martin Ender!
A tabela acima mostra o número de quadrados que estão a 1 salto da célula especificada no gráfico completo do tour dos cavaleiros.
g=KnightTourGraph[8,8,VertexLabels->"Name",Axes->True]
exibe o gráfico completo do tour do cavaleiro, com nomes e coordenadas de vértices. Observe que o Mathematica assume como padrão a indexação baseada em uma única para as coordenadas.
#+1+8#2&[r,f]
converts retorna o vértice correspondente ao quadrado na classificação (linha)r
e arquivo (coluna)f
, usando valores baseados em zero como entrada.Por exemplo,
#+1+8#2&[2,1]
retorna 11.EdgeCount
fornece o número de arestas no gráfico da vizinhança.As arestas da classificação 2, arquivo 1 (quadrado 11):
As arestas destacadas:
Método 2: Distância euclidiana
70 bytes
Este método é mais longo, mas possivelmente de algum interesse. A abordagem é verificar a distância euclidiana entre o centro do tabuleiro de xadrez e a célula de interesse.
Exemplificando
2
8
Para ajudar a visualizar como a distância do centro do tabuleiro de xadrez é suficiente para atribuir um valor.
Círculo [{4,5, 4,5}, 4],
Círculo [{4.5, 4.5}, 4.6], Achatar [f / @ {2, 3, 4, 6, 8}, 1]}, Eixos -> Verdadeiro, AxesOrigin -> {-1, -1}]
Os números 2.2, 3, 4 e 4.6 são os raios dos círculos.
fonte
KnightTourGraph
Mathematica e seus builtins ... :-)#
no final do seu código-fonte (pouco antes do]
). Você deve poder usar emIncidenceList
vez de fazê-loEdgeList@NeighborhoodGraph
. (Como alternativa, há tambémEdgeCount
, mas eu acho que acaba por ser mais longo.)EdgeCount[8~KnightTourGraph~8,#+1+8#2<->_]&
EdgeCount
é muito legal!JavaScript (ES6), 38 bytes
Recebe entradas indexadas em 0. Explicação: Observe os quadrados das distâncias para o centro:
O número de quadrados alcançáveis cai em cinco faixas:
Na verdade, eu calculo 24,5 - (3,5 - x) ** 2 - (3,5 - y) ** 2 = (7 - x) * x + (7 - y) * y como é um cálculo mais curto, mas tudo o que faz é inverso a ordem das bandas.
fonte
x*(7-x)
apenas como uma operação que se parece com um arco descendente0..7
e acontece com o ajuste de curva, mas isso explica por que ele produz um padrão tão bom quando somado ax
ey
.Gelatina, 10 bytes
1 indexado. Aceita um único argumento do formulário
[x,y]
. Experimente aqui.Dennis salvou um byte!
fonte
Mathematica,
4440 bytesAtualmente, tenho três soluções na mesma contagem de bytes:
Todas essas são funções sem nome que usam par de coordenadas
{3, 4}
, que são baseadas em 1.Tentei encontrar uma fórmula um pouco explícita. O padrão geral em todo o quadro é assim:
Os valores reais dessas cores (do mais claro ao mais escuro) são
2, 3, 4, 6, 8
. Isso é:Primeiro exploramos a simetria deslocando a origem para o centro, pegando o valor absoluto e subtraindo o resultado
4
. Isso nos dá coordenadas0.5
para3.5
aumentar a partir de cada canto. A fim de tornar as coordenadas do centro a mesma necessidade que para mapear0.5
e1.5
para diferentes valores e2.5
e3.5
para o mesmo valor. Isso é feito facilmente multiplicando por0.8
(distribuindo{0.4, 1.2, 2., 2.8}
) e colocando o resultado no piso. Então agora temos{0, 1, 2, 2}
as distâncias do centro. Se somarmos as coordenadas em cada célula, obteremos esta tabela:Isso tem valores exclusivos para todos os diferentes resultados possíveis, então simplesmente o usamos como um índice para
2[3,4,6,8]
.Na segunda versão, usamos teto em vez de piso. Desta forma,
2
,3
e4
já estão corretos, mas nós temos5
e6
, em vez de6
e8
, por isso, corrigir os manualmente com uma regra de substituição.Por fim, na terceira versão, estendemos
5
e subimos6
para6
e8
por meio de exponenciação, seguidos por outra operação de andar.fonte
APL, 21 caracteres
Em inglês:
(⍳8 8)
: Matriz 8x8 rank-2 contendo as coordenadas de todas as células;+/¨×⍨(⍳8 8)-⊂⍵
: quadrado das distâncias euclidianas da célula especificada em relação a cada célula do quadro;5=
: matriz de 0/1, onde os 1s aparecem a distâncias quadradas iguais a 5;+/,
: soma a matriz achatadaTeste (na origem 1):
Nesta forma:
o argumento da esquerda pode especificar as dimensões do quadro. Portanto
8 8 f
, funcionará para o tabuleiro de xadrez quadrado padrão. Mas em uma placa maior e retangular, os casos de teste dariam resultados diferentes. Por exemplo, em uma placa 12x10:fonte
≢⍸5=+/¨×⍨-∘⎕¨⍳8 8
Experimente online!Java -
160150 bytesUngolfed:
O código ungolfed é idêntico, exceto para alterar os limites do loop for para economizar 4 bytes. Trabalha iterando cada movimento possível e executando uma verificação de limites (> 0 e <8). Usa o fato de que as compensações são (1, 2), (2, 1), (-1, 2), (-2, 1) etc., e é capaz de verificar 2 movimentos para cada valor de iej.
Editar: 10 bytes salvos graças às sugestões de Leaky Nun e u902383.
fonte
int m=0,i=-1,j;
para salvar alguns bytesC, 44 bytes
Mas isso é melhor:
fonte
;
. Não será compilado.Haskell,
4948 bytesfonte
[0..7]
em uma variável para 1 byte.Java, 81 caracteres (113 bytes)
Codifique a tabela de resultados inteira como tabela unicode e obtenha os bytes apropriados executando operações bit a bit.
Você pode vê-lo online aqui: https://ideone.com/K9BojC
fonte
Python, 94 bytes
Usa 1 indexação baseada.
Demonstração em https://repl.it/C6gV .
fonte
Pitão -
3315 bytesObrigado a @LeakyNun por reduzir meu tamanho pela metade.
Reorganizar os mapas e
V
provavelmente deixará o golfe um pouco fora.Conjunto de Teste .
fonte
APL (Dyalog Unicode) , SBCS de 15 bytes
Experimente online!
fonte
J , 23 bytes
Experimente online!
Homenagem ao método de Lynn, convertido em J
fonte
Na verdade, 18 bytes
Experimente online!
Este implementa a mesma fórmula que muitas outras respostas têm vindo a utilizar:
50/(8-x*(7-x)//5+y*(7-y))//5)-4
. A entrada é tomada como uma lista:[x,y]
(ou qualquer literal iterável em Python, como(x,y)
oux,y
).Explicação:
fonte
Perl 6 , 44 bytes
Experimente online!
fonte