Jack e Jane decidiram jogar uma partida de xadrez para passar o tempo fora. Infelizmente, Jack é bastante ruim em visualizar. Ele acha difícil imaginar os movimentos possíveis para uma determinada peça que não seja um peão, é claro!
Seu desafio é ajudar a encontrar Jack as opções possíveis para uma determinada peça (exceto um peão).
Caso se tenha esquecido, as várias peças são indicadas por:
- K: King
- Q: rainha
- N: Cavaleiro
- B: Bispo
- R: Rook
Como um exemplo, na imagem seguinte o cavaleiro está localizado na d4
e pode mover-se para c2
, b3
, b5
, c6
, e6
, f5
, f3
, e2
. Para uma determinada entrada:
Nd4
você produziria:
Nc2 Nb3 Nb5 Nc6 Ne6 Nf5 Nf3 Ne2
Regras:
- A ordem da saída não importa, desde que todos os movimentos possíveis estejam listados
- Os movimentos possíveis podem ser separados por espaços em branco, novas linhas ou qualquer outro delimitador
- A entrada pode ser transmitida ao programa como parâmetro ou via
STDIN
- Os espaços em branco no programa devem ser contados; portanto, faça o melhor uso possível.
Isso é código de golfe. (Evite usar quaisquer ferramentas / utilitários projetados especificamente para essa finalidade.) A resposta mais curta vence!
f(x)... case "Q": {f("B");f("R")}
se a função exigir #includes, essas devem fazer parte da contagem de bytes.Respostas:
GolfScript,
9493 caracteresMeu primeiro programa GolfScript! Isso me levou muitas horas se atrapalhando sem realmente saber o que estava fazendo, mas eu persisti e acho que consegui aprender o básico do idioma e jogar bastante bem.
Totalmente jogado :
Fonte comentada e mais agradável :
Pode parecer a resposta de Claudiu, porque eu referenciei a resposta dele, bem como a minha solução C (não enviada), enquanto fazia a minha. Ele forneceu uma boa amostra de um programa GolfScript funcional (relativamente) complexo, e isso me ajudou a aprender muito sobre a linguagem. Então, obrigado, Claudiu!
Ainda sendo novo no GolfScript, se vocês tiverem algum feedback, eu gostaria de ouvi-lo!
fonte
Python,
217212220217213 caracteresAmarrada a solução Mathematica de 213 bytes
Comecei gerando todos os movimentos válidos, mas que cresceram muito, de modo que a abordagem é bastante semelhante à do Mathematica.
fonte
Mathematica,
278272264260215213 caracteresVersão não destruída:
Exemplo de uso:
A versão sem golfe cria uma pensão completa e, em seguida, seleciona as posições corretas com
Cases
, enquanto a versão com golfe descarta movimentos inválidos imediatamente noTable
comando, emitindo##&[]
, o que simplesmente desaparece.fonte
N4d
? Não deveria serNd4
?Nd4
.ChessboardDistance
Abs
no Mathematica, porque denotam alternativas em um padrão.Haskell
225 220 208 205 200182Vai ser difícil tocar no Mathematica quando houver jogadas de xadrez: roletes: (m.buettner bem jogado) Retirotudo isso. Batendo Mathematica por 31!Última edição: caixa substituída por uma função, filtro embutido na compreensão, para superar a entrada em R;)
uso:
Ungolfed (corresponde à versão de 208 caracteres antes de 'u' ser incorporado):
fonte
piece
à lista[piece,newfile, newrank]
se não a usa na correspondência de padrões, pode economizar alguns caracteres?Bash, 238
Como funciona
A idéia é representar todos os campos no quadro por um valor numérico, tomando suas coordenadas como um número da base 20 e subtraindo 200. Dessa forma,
a1
torna-se20 * 10 + 1 - 200 = 1
,h8
torna-se20 * 17 + 8 - 200 = 148
, etc.Agora, os possíveis movimentos do Bispo podem ser representados por múltiplos (positivos ou negativos) de 19 - a mesma quantidade de passos acima (+20) e para a esquerda (-1) - ou 21 - a mesma quantidade de passos acima (+20 ) e à direita (+1).
O posicionamento da figura após o movimento é simplesmente a soma de sua posição original e do movimento. Depois de adicionar esses números, temos que verificar se a soma deles corresponde a um campo válido no quadro.
Como a base (20) é mais que o dobro do número mais alto possível (8), a soma não pode ser agrupada em torno do quadro, por exemplo, mover Bh1 sete etapas para a direita e para cima resultará em uma posição inválida no quadro.
A linha
enumera todos os movimentos possíveis das peças que são representadas por números positivos.
Os comandos
armazena o identificador da peça na variável a , a representação numérica da posição original em be as letras a a h na matriz d .
Após a expansão da cinta,
eval{,} echo '$'$a
torna-seeval eval echo '$'$a
(duplamente mau), que avalia como, por exemploeval echo $K
, qual avalia comoecho 1 19 20 21
.for i in $c -${c// / -};do …; done
circunda todos os movimentos possíveis e suas contrapartes negativas.echo $a${d[$[(i+=b)/20]]}$[i%20]
dá a posição final após o movimento.grep '[a-h][1-8]$'
garante que temos uma posição válida no conselho.fonte
Golfscript,
144135 caracteresEm vez de continuar tentando jogar minha solução Python , eu a traduzi para Golfscript:
Tradução simples, sem muito golfe, por isso pode ser ainda mais reduzida. Pega a entrada do stdin sem uma nova linha, tente aqui (as primeiras duas linhas são para imitar o stdin).
fonte
C
634632629625600 caracteresAlguma sugestão sobre como melhorar isso? Esta é minha primeira vez enviando uma resposta.
fonte
C
pode ser bastante simplificado usando o operador ternário?:
e usando o valor de retorno deprintf
. (printf
retorna o número de caracteres escritos, portanto, neste caso, é sempre diferente de zero.)C(P,c,r){return(0<=c)&(c<8)&(0<r)&(r<9)?printf("%c%c%d ",P,c+'a',r):0;}
. Uma edição menor: há um espaço extraM
após oif
que você pode remover.Haskell,
300269 caracteresObrigado a bazzargh pela ajuda na perda de 31 caracteres ...
Mesmo algoritmo que a versão Mathematica. Saída de amostra do ghci:
(Você não pediu verificação de sanidade!)
fonte
Haskell, 446 caracteres
Chamado usando a
j
funçãoNão trabalho com Haskell há alguns meses, por isso não acabou sendo tão curto quanto a maioria das outras soluções, mas tenho certeza de que há algumas otimizações a serem feitas, principalmente
h
. Eu posso reduzi-lo um pouco.fonte
perguntas e respostas [
311262 caracteres]Existe o potencial de reduzir mais alguns caracteres. Vou reduzi-lo na próxima iteração.
Uso
Torre
Rei
Cavaleiro
Bispo
Rainha
fonte
R, 203 caracteres
Versão não destruída:
Uso:
A solução é até boa legível. No entanto, adicionei alguns parênteses e comentários para os leitores que não estão familiarizados com o código R (na versão ungolfed).
fonte
Haskell (hipotético), 248 caracteres
Infelizmente, todos os compiladores Haskell em que posso colocar minhas mãos agora têm problemas com literais de seqüência de caracteres Unicode. Aqui está a versão (mais longa) que realmente funciona:
A definição
h x y=...
é uma função hash; movimentos válidos serão hash para números de caracteres que estão na sequência de 41 caracteres. Isso elimina a necessidade de uma declaração "case" ou equivalente.Não estou planejando trabalhar mais nisso agora. Seria divertido ver se alguém pode usar uma função de hash em uma linguagem mais concisa para criar uma solução mais curta.
fonte