Peças de xadrez (reis, rainhas, torres, bispos e cavaleiros) e peões estão em um tabuleiro, mas não no quadrado a1 ou h8 . Sua tarefa é viajar dos quadrados a1 vazios para os vazios h8 , passando apenas pelos quadrados vazios. As regras de movimento são as seguintes:
- Você pode prosseguir de qualquer quadrado vazio para qualquer quadrado vazio próximo a ele (mesma classificação, arquivo seguinte ou anterior; ou mesmo arquivo, classificação seguinte ou anterior).
- Você pode prosseguir de qualquer quadrado vazio para qualquer quadrado vazio na diagonal próximo a ele (classificação seguinte ou anterior, arquivo seguinte ou anterior), desde que os quadrados de cantinho contenham (a) dois peões ou (b) peões / peças opostas cor. (Duas peças que não são de peão, ou uma peça que não é de peão e um peão, da mesma cor são fortes o suficiente para impedir seu progresso no canto, mas dois peões não são; e peças / peões de cor oposta não funcionam Por exemplo, se você estiver em c4 e d5 estiver vazio, poderá prosseguir, desde que c5 e d4 contenham peões ou peças / peões de cor oposta. Veja a seção "Exemplo de diagonais", abaixo, para fotos.
Entrada
Descrição do conselho da FEN . Ou seja: A entrada será uma sequência que inclui uma descrição da classificação 8 , uma barra ( /
), uma descrição da classificação 7 , uma barra,… e uma descrição da classificação 1 . A descrição de cada classificação compreende números e letras que vão de um arquivo para outro h , onde as letras indicam peças e peões (os pretos são p
= peão, n
= cavaleiro, b
= bispo, r
= torre, q
= rainha, k
= rei e branco) uns são versões maiúsculas do mesmo) e os números indicam o número sucessivo de quadrados vazios. Por exemplo, rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBN
é o tabuleiro após um movimento de dobra (peão do rei para e4) em um jogo de xadrez.
a1 e h8 estarão vazios na entrada; ou seja, a primeira barra tem um dígito antes e a última barra tem um dígito depois.
Resultado
Verdade ou falsa, indicando se a passagem bem-sucedida para h8 é possível.
Se a entrada não for uma descrição válida da placa FEN (ou seja, uma que corresponda à minha explicação acima), ou se a1 ou h8 estiver ocupado, a saída poderá ser qualquer coisa ou nada. (Em outras palavras: você pode assumir que a entrada atende aos requisitos acima.)
Pontuação
Este é o código de golfe: o menor número de bytes vence.
Exemplo de entrada e saída
Observe que seu código deve funcionar para todas as entradas válidas, não apenas os exemplos.
Adicione um espaço e um w
após cada FEN para visualizá-lo http://www.dhtmlgoodies.com/scripts/chess-fen/chess-fen-3.html
. (Observe que alguns outros visualizadores online da FEN não permitirão um tabuleiro ilegal no xadrez, por exemplo, com um peão no ranking 1 ou 8 , portanto não podem ser usados para nossos propósitos.)
Exemplos de verdade
8/8/8/8/8/8/8/8
- o tabuleiro vazio1p1Q4/2p1Q3/2p1Q3/2p1Q3/2p1Q3/2p1Q3/Q1p1Q3/1q3q2
- existe um caminho a1 , b2 , b3 , b4 , b5 , b6 , b7 , c8 , d7 , ( não e8 , que está bloqueado, mas) d6 , d5 , d4 , d3 , d2 , d1 , e1 , f2 , f3 , f4 , f5 , f6 , f7 , f8 , g8 , h88/8/KKKKK3/K3K3/K1K1p3/Kp1K4/K1KK4/2KK4
- um exemplo em que um quadrado bloqueado em um ponto deve ser passado mais tarde (para garantir que você não defina quadrados como intransitáveis)K1k1K1K1/1K1k1K1k/K1K1k1K1/1k1K1K1k/K1k1K1k1/1K1k1k1K/K1K1k1K1/1k1k1K1k
- existe um único caminho (siga seu nariz: só existe um quadrado para mover a cada passo, a menos que dê um passo para trás); este também é um exemplo em que um quadrado é bloqueado em um ponto, mas necessário posteriormente
Exemplos de Falsey
6Q1/5N2/4Q3/3N4/2Q5/1N6/2Q5/1N6
- qualquer tentativa de caminho terá que passar por duas peças da mesma cor na diagonalN1q1K1P1/1R1b1p1n/r1B1B1Q1/1p1Q1p1b/B1P1R1N1/1B1P1Q1R/k1k1K1q1/1K1R1P1r
- o único caminho através da diagonal a8-h1 é em f2-g3 , mas isso exigiria a passagem por e1-d2 ou f2-e3 , que são impossíveis.4Q3/4q3/4Q3/5Q2/6Q1/3QqP2/2Q5/1Q6
4q3/4Q3/4q3/5q2/6q1/3qQp2/2q5/1q6
Diagonais de exemplo
Caso a prosa acima não esteja clara, aqui estão algumas fotos.
Diagonais aceitáveis
Diagonais intransponíveis
Respostas:
VBA
668666633622548510489435331322319315 bytesA leitura da sequência de entrada ocupa até 'Wend'. Bom efeito colateral - isso abandona a string de entrada quando o cartão [X] estiver totalmente codificado, para que você possa deixar uma descrição no final.
Na codificação do tabuleiro, os peões são 2, as outras peças são 3, o preto é negativo. Os peões são reconhecidos por 'P' e 'p' com códigos de caracteres divisíveis por 8.
'X (7,0) = 1', configurando a1 acessível, é onde as verificações de caminho começam. Isso varre repetidamente o quadro, tentando adicionar quadrados acessíveis dos quadrados marcados como acessíveis (1) até o momento. O acesso diagonal e a ocupação são verificados em um cálculo lógico + IF que antes vivia em uma função, mas agora fica em loops vizinhos aninhados. A verificação de acesso diagonal depende do produto dos dois quadrados de canto dos gatinhos, que são apenas 6 ou mais se as peças tiverem a mesma cor e pelo menos uma for uma peça e não um peão.
Chamada em planilha; retorna o valor em X (0,7) - 1 se h8 acessível e 0 se não - que o Excel reconhece como verdade / falsidade. = SE (Z (C2), "sim", "não")
Talvez eu tenha me empolgado em escrever o código acima, então aqui está uma versão comentada semi-não-golfista:
Notas de progresso
Edit 1: O código agora não é tão 666-devilish :-D e perdeu suas funções; Eu encontrei uma maneira curta o suficiente para escrevê-los para evitar a sobrecarga.
Edit 2: Outro grande salto em frente, efetivamente terminando o trabalho de remover as funções inc / dec, suspiro e usar algumas globais. Eu posso finalmente estar pegando o jeito disso ....
A codificação de peças e quadrados mudou. Nenhum efeito no comprimento do código.
Editar 3: Retorno de funções (falsas), removendo todos os
Call
bytes irritantes e alguns outros ajustes.Edit 4: Rompendo os 500 grandes, woohoo - dividiu os loops 3 For em 1.
Edit 5: Jiminy Cricket, outra grande queda quando juntei as duas funções - minha verificação de acesso diagonal sempre passa por quadrados adjacentes, então ...
Edit 6: Holy niblicks, outra queda massiva. Adeus a funções externas e, portanto, globais ... eu já estou com menos da metade do tamanho original publicado ...
Editar 7: Adicionar versão não destruída
Edit 8: Revisou o processo de leitura por mais alguns dólares
Edit 9: Espremeu algumas expressões nas últimas gotas de sangue
Editar 10: a
Next
instrução Compund lança alguns bytesPor interesse, os gráficos das placas após a análise de acessibilidade (os números de código estão desatualizados, mas ...) os quadrados acessíveis são verdes, os quadrados inacessíveis são brancos e as outras cores são peças ou peões.
Alguns painéis de desafio: o h8 pode ser acessado em ambos:
fonte
If V>9 Then X(7-P,C)=
eu pensaria (não que eu conheça VBA) se tornarIf V>9 Then X(P,C)=
.[some non-letter character] To
para[some non-letter character]To
Matlab, 636
887bytes salvos (incluindo indentação)Essa solução não é muito eficiente, mas eu queria ir em frente e colocá-la em prática.
Lê uma sequência de caracteres do quadro
x
conforme especificado acima e a transforma na mais completamente representadao
, depois encontra todos os movimentos (arestas do gráfico) entre os espaços, depois descobre quais movimentos são possíveis (não nos espaços preenchidos) e depois descobre quais movimentos possíveis têm " portões "de duas peças para passar entre elas, e descobre se o portão está aberto (peões, cores opostas) ou fechado (mesma cor e incluindo um não-peão). Em seguida, ele percorre para encontrar locais acessíveis por caminhos a partir do quadrado inferior esquerdo e se um caminho pode alcançar o espaço 64, é um quadro Sim.fonte
=
s? (Eu não sei MATLAB: talvez os que são impossíveis.)