O xadrez atômico é uma variante (muito divertida) do xadrez, na qual toda captura causa uma "explosão", destruindo a peça capturada, a peça que captura e todos os não-peões em um raio de 1 quadrado. O objetivo deste desafio não é jogar um jogo inteiro de xadrez atômico, mas simplesmente simular o que acontece quando uma determinada jogada é feita.
Disclaimer: Efeitos sonoros de explosão não incluídos.
Entrada
A posição do conselho será dada na Notação Forsyth-Edwards (comumente conhecida como FEN), mas apenas com o primeiro campo. Por exemplo, uma entrada de:
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
representa a posição inicial:
Isso deve ser tomado como uma string ou equivalente ao seu idioma. É garantido que é válido; por exemplo, você não precisa se preocupar se há dez reis ou se não há rei.
Você também receberá o movimento que deve simular, representado como dois nomes de quadrados: o quadrado no qual a peça a ser movida é e o quadrado para o qual está se movendo. Por exemplo, mover o peão do rei dois espaços para frente na figura acima seria representado como:
e2e4
Isso também deve ser tomado como uma string. A mudança sempre será válida e você não precisa oferecer suporte ao jogo de rolagem . Você precisa apoiar en passant , o que será explicado em mais detalhes na próxima seção.
Resultado
A saída do seu programa deve estar na mesma notação FEN parcial que a entrada, com a movimentação especificada feita (e quaisquer peças explodidas, se necessário).
As regras exatas para explosões são - quando uma peça é capturada:
Remova a peça que está sendo capturada (sempre será a peça no segundo quadrado nomeado na entrada, exceto quando a captura for uma passante ).
Remova a peça que está capturando (esta sempre será a peça no primeiro quadrado nomeado na entrada).
Remova todas as peças que são:
localizado em um dos 8 quadrados que cercam aquele onde a captura ocorreu (para en passant , esta é a praça que o peão captura seria em diante, se não explodiu).
não é um peão.
Visão geral rápida das regras en passant , para aqueles que não estão familiarizados: se um peão se move dois espaços para frente a partir de sua posição inicial, e há um peão que poderia ter capturado se apenas movesse um quadrado para a frente, pode capturá-lo de qualquer maneira, mas somente no movimento subsequente. Diz-se que essa captura é feita " de passagem " (ou em francês: " en passant ").
Casos de teste
Nas figuras, as setas verdes representam o movimento a ser feito e os círculos verdes representam peças que são explodidas.
Entrada: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
, g1f3
saída:rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R
Entrada: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P1pP/2rP1P2/R1B3RK
, f2g3
saída: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P2P/2rP4/R1B3RK
(roubado de http://en.lichess.org/ocoSfS5I/white#36 )
Entrada: rnbqk1nr/1pp5/p2pp1pp/5p2/1bN5/2P1PQ1N/PP1P1PPP/R1B1KB1R
, f3b7
saída: 3qk1nr/2p5/p2pp1pp/5p2/1bN5/2P1P2N/PP1P1PPP/R1B1KB1R
(roubado de http://en.lichess.org/NCUnA6LV/white#14 )
Entrada: rnbqk2r/pp2p2p/2p3pb/3pP3/5P2/2N5/PPPP2P1/R1BQKB1R
, e5d6
saída: rnbqk2r/pp2p2p/2p3pb/8/5P2/2N5/PPPP2P1/R1BQKB1R
(roubado de http://en.lichess.org/AvgU4Skq/white#16 , o que não era o movimento real, mas eu não podia ser incomodado para encontrar um jogo atômica que realmente tinha en passant: P)
Entrada: 5r2/2k5/p1B5/1pP1p3/1P4P1/3P4/P7/1K3R1q
, c6h1
saída: 5r2/2k5/p7/1pP1p3/1P4P1/3P4/P7/1K3R2
(roubado de http://en.lichess.org/l77efXEb/white#58 )
Pontuação
Isso é código-golfe , então o código mais curto em bytes vence.
Respostas:
JavaScript ( ES6 ) 305
310 321Como uma função com 2 parâmetros reais (e muito mais com valores padrão, usados como uma maneira rápida e suja de definir locais)
Teste a execução do snippet abaixo (sendo EcmaScript 6, apenas Firefox)
Ungolfed
fonte
Java, (
946777776 caracteres)1 caractere graças a @ edc65
Nota: Caracteres contados sem casos de teste inseridos.
Código
Não tenho certeza se essa solução é ideal, mas estou trabalhando mais no golfe, todas as sugestões são bem-vindas. Também posso comentar todo o código, se alguém quiser, mas acho que é principalmente autoexplicativo, exceto pela enumeração de variáveis confusa.
Explicação
Expandido
Velho
fonte
String m,i="";m="";char[]n=m.toCharArray()
->String i=a[0];char[]n=a[1].toCharArray()
é mais curto e de modo a obter os parâmetros de fora (como você deve de qualquer maneira)