O programa toca em branco.
Exemplo stdin:
8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … … … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h
Exemplo stdout:
8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … ♙ … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ … ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h
Qualquer movimento válido está ok. "En passant" e castling são ignorados. Não há problema em mostrar mensagens de erro ou imprimir nada se não houver movimento válido.
A resposta com mais votos vence.
popularity-contest
chess
Hristo Hristov
fonte
fonte
Respostas:
Não estou reclamando de votos positivos, mas para ser justo ... minha solução aqui não é realmente tão boa assim. O Ugoren's é melhor, além da falta de suporte unicode. Certifique-se de examinar todas as respostas antes de votar, se você se deparar com essa pergunta apenas agora!
De qualquer forma.
Haskell, 893
888904952(sem rosca)862 (sem peões de movimentos duplos)(Você não especificou se isso deveria ser código de golfe, mas parece-me que deveria)
Quando você tem o GHC instalado (por exemplo, como parte da plataforma Haskell ), você pode fazer apenas
fonte
C,
734672640 caracteresCaracteres contados sem espaço em branco removível.
O formato do arquivo que usei não é o solicitado, mas sim o ASCII simplificado.
Preciso adicionar suporte a caracteres Unicode, isso custaria alguns caracteres.
Formato de arquivo de entrada / saída:
deve ter exatamente 8 linhas de exatamente 8 caracteres.
pnbrqk
são usados para peças brancas,PNBRQK
peças pretas, espaços para espaços:A lógica é bastante simples:
para cada movimento possível de cada peça branca, tente cada movimento possível de cada peça preta.
Se nenhum movimento preto capturar o rei branco, o movimento branco é válido.
A placa é mantida como
char[256]
, tratada como uma matriz 16x16, onde apenas o 8x8 superior esquerdo é usado. Posições e vetores de movimento são mantidos em números inteiros de 8 bits (x:4,y:4
). O bit extra permite o uso de aritmética simples (new_pos = old_pos + steps*direction
), com fácil detecção da borda da placa (&0x88
faz a mágica).r[]
codifica três coisas:'('+vector
.Funções:
main
lê o quadro, converte letras em código interno, ligaa
para encontrar movimentos em branco, imprime o quadro.a
circula recursivamente sobre os 64 quadrados. Para cada peça da cor certa (parâmetroc
), ele encontra a regra de movimento da peça e chamad
.d
circula recursivamente sobre a regra de movimento codificado, que é uma lista de vetores, chamandoe
cada um. Ele fornecee
a posição original, o vetor e o limite do alcance (7 para peças acima de B, 2 para peões de segundo escalão, 1 caso contrário).e
testa todos os movimentos ao longo de um vetor. Se o movimento for possível (por exemplo, os peões avançam, dentro do tabuleiro, não bloqueados, a captura de peões na diagonal), verifica uma das duas coisas. Para movimentos em branco, correv
para validar o movimento. Para movimentos em preto, verifica se o rei branco foi capturado. Se verdadeiro, a jogada é jogada no tabuleiro.v
valida um movimento branco. Ele copia o quadro de lado, executa o movimento para testar e chamaa
novamente, para procurar movimentos em preto.fonte
Python 2.6,
886- 1425 caracteresMinha versão inicial (nas revisões) tinha 886 caracteres, mas não satisfazia completamente as especificações (não checava se evitava o xeque-mate; nem considerava os possíveis movimentos das peças pretas).
Agora sim (e eu corrigi vários erros no original). Infelizmente, isso tem um custo em caracteres: 1425 por enquanto, mas ainda deve haver pouco espaço para melhorias. Esta versão deve ser muito mais sólida no tratamento de casos extremos do que a anterior.
Exemplo de entrada e saída:
fonte