O desafio
Escreva um programa ou função que utilize uma entrada de string como parâmetro de função ou de stdin e determine se é uma string FEN válida .
Entrada
Você pode assumir que a entrada incluirá apenas os seguintes caracteres (diferencia maiúsculas de minúsculas).
pkqrbnPKQRBN12345678/
O comprimento da entrada sempre será no mínimo 1 caractere e no máximo 100 caracteres
Resultado
A saída deve ser um valor de verdade / falsey. Podem ser quaisquer valores que você desejar, desde que sejam consistentes (todos os resultados verdadeiros têm a mesma saída, todos os resultados falsey têm a mesma saída). Você deve ter exatamente duas saídas possíveis distintas.
O que conta como válido
Letras minúsculas representam peças pretas, letras maiúsculas representam peças brancas.
Você deve garantir que, em um jogo de xadrez, é possível que as peças na posição atual existam.
Cada jogador sempre terá exatamente 1 rei (k / K).
Cada jogador pode ter no máximo 8 peões (p / P).
Cada jogador normalmente não terá mais que 1 * rainha (q / Q).
Cada jogador normalmente não terá mais de 2 * rooks (r / R)
Cada jogador normalmente não terá mais que 2 * cavaleiros (n / N)
Cada jogador normalmente não terá mais que 2 * bispos (b / B)
* É legal para um jogador ' promova 'um peão para qualquer uma dessas quatro peças.
O total de peões, rainhas, gralhas, cavaleiros e bispos para cada jogador nunca será superior a 15
O número total de peças mais quadrados vazios (indicados por números) sempre deve somar exatamente 8 para cada classificação. E sempre deve haver exatamente 8 fileiras, separadas por uma barra.
Coisas que você pode ignorar
Você não precisa se preocupar se é possível ou não participar da posição indicada ou se a posição é legal, apenas que as peças podem existir nas quantidades indicadas.
Você pode ignorar outras complexidades das seqüências de caracteres FEN, como turno do jogador, direitos de castling e passantes.
Isso é código de golfe. O programa mais curto em bytes vence. Aplicam-se brechas e regras usuais.
Casos de teste
Entrada rnbqkbnr / pppppppp / 8/8/8/8 / PPPPPPPP / RNBQKBNR
Saída True
Entrada 2br2k1 / 1p2n1q1 / p2p2p1 / P1bP1pNp / 1BP2PnP / 1Q1B2P1 / 8 / 3NR2K
Saída True
Entrada r2r2k1 / p3q2p / ppR3pr / rP4bp / 3p4 / 5B1P / P4PP1 / 3Q1RK1
Saída falsa
(o preto tem 7 peões e 4 torres - impossível)
Entrada 6k1 / pp3ppp / 4p3 / 2P3b1 / bPP3P1 / 3K4 / P3Q1q1
Saída falsa (apenas 7 classificações)
Entrada 3r1rk1 / 1pp1bpp1 / 6p1 / pP1npqPn / 8 / 4N2P / P2PP3 / 1B2BP2 / R2QK2R
Saída falsa (9 classificações)
Entrada 5n1k / 1p3r1qp / p3p3 / 2p1N2Q / 2P1R3 / 2P5 / P2r1PP1 / 4R1K1
Saída falsa (a segunda classificação tem 9 quadrados / peças)
Entrada rnbqkbnr / pppppppp / 8/35/8/8 / PPPPPPPP / RNBQKBNR
Saída Verdadeiro
Agradecimentos a Feersum e Arnauld por esclarecer este caso (3 + 5 = 8)
O que é FEN?
FEN é uma notação padrão para registrar a posição das peças em um tabuleiro de xadrez.
Crédito de imagem http://www.chessgames.com
fonte
* It is legal for a player to 'promote' a pawn to any of these four pieces.
O jogador pode ter até 9 rainhas, desde que o número de peões seja reduzido para compensar. Você não precisa se preocupar com a posição das peças como legal ou ilegal, apenas com o número de peças.35
é apenas uma maneira incomum de descrever 8 quadrados vazios.Respostas:
Retina , 105 bytes
Experimente online! O link inclui casos de teste. Explicação:
Expanda dígitos para quadrados vazios, que denotamos usando
1
s.Exclua a entrada se ela não corresponder a 8 conjuntos de 8 quadrados válidos unidos a
/
s. (Um extra/
é prefixado para simplificar a verificação.)Exclua a entrada se não houver rei branco ou preto ou se houver dois.
Exclua as peças iniciais das brancas, se elas ainda estiverem lá.
Rebaixe as peças brancas restantes em peões.
Exclua os peões brancos válidos.
Exclua a entrada se houver algum peão branco sobrando.
Verifique novamente, mas com as peças pretas.
Emita um valor verdadeiro, a menos que a linha tenha sido excluída.
fonte
JavaScript (ES6),
168174... 155Esta resposta foi editada um número embaraçoso de vezes. Felizmente, a versão atual é confiável e decentemente jogada.
Retorna um booleano.
Formatado e comentado
Casos de teste
Mostrar snippet de código
fonte
Python 3,
284 259 236 225 247234 bytesExperimente Online!
Experimente on-line com todos os casos de teste!
-11 bytes graças ao Sr. Xcoder
-13 bytes graças a Jonathan Allen
+22 Eu esqueci que os reis existiam.
Semi-ungolfed com alguma explicação:
fonte
,p,P=9,9
por;P=p=9
.for-loop
: /p>0<P
vez dep>0and P>0
salvar também 5 bytes. Alternativamente, você poderia ter usadop and P
(para -3 bytes), você não precisa o>0
, porque diferentes de zero valores são truthy em Pythono=0
antes do loop e incrementando como+=o<2
no final do corpo do loop.PHP , 269 bytes
Experimente online!
fonte
JavaScript (ES6),
181172174 bytesUngolfed:
Mostrar snippet de código
fonte
Python 3 , 263 bytes
Experimente online!
Não é o menor envio de Python, mas acho que ainda tem alguma promessa.
fonte