Totalmente surpreso que isso ainda não tenha sido publicado, dado o grande número de quebra-cabeças de xadrez no site. Enquanto eu pensava nisso, agradeço a Anush por publicá-lo na caixa de areia em março . Mas imaginei que já fazia tempo o suficiente para poder fazer isso sozinho.
Um xeque-mate no xadrez é uma posição em que o rei é atacado e não há movimento que possa defendê-lo. Se você não está familiarizado com o movimento das peças de xadrez, pode se familiarizar na Wikipedia .
O desafio
Para esse desafio, sua opinião será a posição de um tabuleiro de xadrez em qualquer notação que você desejar. Para esclarecer, o seu contributo irá descrever as peças em um tabuleiro de xadrez, com suas cores e posições, juntamente com a possível en passant quadrado captura, se houver. (A capacidade de fazer castelo é irrelevante, pois você não pode fazer castelo fora de controle.) Você pode achar a notação FEN útil , mas qualquer formato conveniente é adequado. Para simplificar, você pode assumir que é preto para jogar - isso significa que o preto sempre será o jogador com xadrez. Uma posição em que as brancas estejam em xeque, xeque-mate ou impasse será considerada inválida para este desafio.
Você deve emitir um valor verdadeiro se a posição for xeque-mate e um valor falsey se não for. Observe que o impasse não é xeque-mate - - o rei deve ser atacado!
Casos de teste de verdade
1k5R / 6R1 / 8/8/8/8/8 / 6K1 b - -
rn2r1k1 / pp1p1pQp / 3p4 / 1b1n4 / 1P2P3 / 2B5 / P5PP / R3K2R b - -
kr5R / rB6 / 8/8/8 / 5Q2 / 6K1 / R7 b - -
2K5 / 1B6 / 8/8/8 / 7N / R7 / R3r2k b - - 0 1
Casos de teste Falsey
rnbqkbnr / pppppppp / 8/8 / 4P3 / 8 / PPPP1PPP / RNBQKBNR b KQkq -
8/8/8/8/8 / 1KQ5 / 4N3 / 1k6 b - -
2K5 / 1B6 / 8/8/8 / 7N / R7 / 4r2k b - -
8/8 / 2T5 / 3k4 / 3T5 / 8/8 / 7K b - -
8 / 4Q1R1 / R7 / 5k2 / 3pP3 / 5K2 / 8/8 b - e3 (Veja isso em passante!)
Código golf - o código mais curto em bytes vence. Boa sorte!
fonte
Respostas:
JavaScript (Node.js) ,
499 ... 374370 bytes(b)(X)
Abaixo estão os valores esperados para cada quadrado:
Experimente online!
Quão?
Representação do Conselho
Usamos a representação clássica da placa 0x88 , para que os quadrados de destino fora dos limites possam ser facilmente detectados.
Mover codificação
Cada conjunto de movimentos é codificado com 5 parâmetros:
Todos esses parâmetros são compactados em uma única sequência. Por exemplo, os movimentos dos cavaleiros são codificados da seguinte maneira:
que dá:
Todos os conjuntos de movimentos estão resumidos na tabela a seguir, exceto as capturas passantes que são processadas separadamente.
Comentado
fonte
8/1ppp4/1pkp4/8/2Q5/8/8/7K b - -
Haskell ,
116510651053 bytesBytes economizados graças a Leo Tenenbaum
Experimente online!
Isso não está exatamente bem no momento, mas é um começo.Com alguma ajuda ao longo do caminho, agora joguei isso de forma bastante agressiva (e corrigi um erro ao longo do caminho).A única coisa questionável que isso faz é que ele pressupõe que, exceto por um rei ou um peão de passagem, você nunca poderá sair do controle capturando uma de suas próprias peças. No xadrez, você não tem permissão para fazer essa jogada, mas meu programa considera essas jogadas para economizar bytes, pressupondo que, se você estiver checado, isso nunca poderá tirar você disso.
Essa suposição é válida porque tais movimentos
Não é possível capturar a peça que está atacando o rei, pois a peça que eles capturam é preta.
Não é possível bloquear o caminho da peça que está atacando o rei, pois a peça preta capturada já estaria fazendo isso.
Também acrescentamos a estipulação adicional de que, se você não tem rei, está em xeque.
Esse programa também pressupõe que, se houver um peão que possa ser capturado passant, então o peão foi a última peça a ser movida e essa foi uma jogada legal. Isso ocorre porque o programa não verifica se o quadrado para o qual move o peão preto está vazio; portanto, se houver uma peça, as coisas podem ficar um pouco esquisitas. No entanto, isso não pode ser obtido se a última jogada foi uma jogada legal e, além disso, não pode ser representada na FEN . Portanto, essa suposição parece bastante sólida.
Aqui está a minha versão "ungolfed" para referência:
Experimente online!
fonte
guard x = [0|x]
e você também pode usarx?y=Just(x,y)
para salvar mais alguns bytes: 1129 bytesPython 3 (PyPy) , 729 bytes
Experimente online!
fonte
8/2p5/Q7/Q2k4/Q7/8/8/7K b - -
(não para xeque-mate).