Desafio
A notação de Forsyth-Edwards (FEN) é uma notação padrão para descrever uma posição específica do tabuleiro de um jogo de xadrez. Seu desafio é avaliar a pontuação usando a string FEN. Este é um exemplo de uma sequência FEN:
5k2/ppp5/4P3/3R3p/6P1/1K2Nr2/PP3P2/8
Usando essa sequência, você pode calcular a pontuação do material para cada cor com a seguinte tabela de pontuação:
- p / P = Peão = 1 ponto
- n / N = Cavaleiro = 3 pontos
- b / B = Bispo = 3 pontos
- r / R = Torre = 5 pontos
- q / Q = rainha = 9 pontos
- k / K = Rei, estes não têm nenhum ponto porque toda posição legal contém um rei para cada lado
As peças brancas são designadas usando letras maiúsculas ("PNBRQK"), enquanto as peças pretas usam letras minúsculas ("pnbrqk"). Os quadrados vazios são anotados usando os dígitos de 1 a 8 (o número de quadrados vazios) e "/" separa as classificações.
A partir da sequência FEN de exemplo, podemos calcular as pontuações do material para cada lado:
Para preto:
5 k 2 / ppp 5 / 4P3 / 3R3 p / 6P1 / 1K2N r 2 / PP3P2 / 8
Todas as peças pretas restantes: p + p + p + p + r, totalizam 9
Para branco:
5k2 / ppp5 / 4 P 3/3 R 3p / 6 P 1/1 K 2 N r2 / PP 3 P 2/8
Todas as peças brancas restantes: P + R + P + N + P + P + P, totalizam 13
A pontuação final é determinada com a seguinte fórmula: Escore em branco - Escore em preto = Escore final , portanto, no exemplo, o escore final seria: 13 - 9 = 4
Exemplo :
Entrada:
5k2/ppp5/4P3/3R3p/6P1/1K2Nr2/PP3P2/8
Resultado:
4
Todas as regras de código-golfe se aplicam aqui, a solução com a menor quantidade de bytes ganha.
Como publicar
# Language Name, N bytes
[code]
[explaination, etc.]
Respostas:
CJam,
282726 bytesExperimente on-line no intérprete CJam .
Como funciona
fonte
> <> ,
64575653 bytes(-7 bytes com alguma inspiração da resposta de @ El'endiaStarman, -3 bytes graças a @randomra)
Explicação
O programa usa o codebox como uma tabela de pesquisa. Put / gets fora do intervalo não funcionam com o intérprete on-line, portanto, isso só funciona com o intérprete oficial do Python.
A primeira linha empurra as peças, seguida pelos valores das peças. Ele também pressiona um 0 inicial para iniciar o total da terceira linha.
A segunda linha coloca o valor positivo ou negativo apropriado na célula da peça correspondente, por exemplo,
-1
é colocada em('p', 4)
e1
é colocada('P', 4)
. O comprimento da pilha é verificado para garantir que o loop seja executado 5 vezes.Depois que o loop termina, a pilha consiste em nosso único zero da primeira linha. Para cada caracter, realizamos uma pesquisa na célula correspondente na tabela e a adicionamos ao nosso total. Por padrão, os valores das células não inicializadas são 0, o que é perfeito para nossos propósitos.
A última linha apenas imprime o resultado.
fonte
Ruby, 88 caracteres
Isso é estranho e feio, e provavelmente existe uma maneira melhor, mas tudo bem.
{foo: 'bar'}
Na verdade, a sintaxe do Ruby é apenas para açúcar{:foo => 'bar'}
- isso é irritante para o golfe, porque significa que tenho que converter a chave em um símbolo antes de usá-la para acessar um elemento de hash (:"#{x}"
é um caractere menor quex.to_sym
).fonte
Pip, 39 bytes
Vou assumir minha breve liderança antes que as respostas CJam e Pyth apareçam ...
Toma a seqüência de caracteres FEN como um argumento de linha de comando. Aqui está uma explicação para uma versão um pouco não destruída:
fonte
Perl, 44 bytes
Contando o shebang como um, a entrada é obtida de stdin.
Uso da amostra
Explicação
As peças são transliteradas com seus respectivos valores. Se a peça estiver em maiúscula (ou seja, menor que
a
), seu valor será adicionado à soma, se não for subtraído.fonte
JavaScript ES7, 79 bytes
124131O mais curto que eu conseguir. Usa sofisticadas compreensões de array, para percorrer a string.
Explicação
fonte
Minkolang 0.9 ,
72656460444241 bytesExperimente aqui.
Muito obrigado ao Sp3000 por apontar uma maneira muito mais eficiente de fazer isso!
Explicação
13359"QRBNP"m
empurra as pontuações e seus personagens correspondentes, em seguida, intercala -los, de modo que os olhares pilha como este:[1,80,3,78,3,66,5,82,9,81]
. Em seguida,5[d3~c~$r48*+0p0p]
coloca a pontuação de cada caractere, em minúsculas e maiúsculas, em seu local no espaço de código. Por fim,$I[o0q+]N.
percorre a entrada até ficar vazia, somando as pontuações à medida que avança.fonte
CJam, 33 bytes
Aqui está a maneira super ingênua de encontrar seqüências de caracteres. Experimente online .
fonte
Ouroboros , 82
Ouroboros é um esolang que eu projetei esta semana. Hora de dar uma volta!
Cada linha de comandos de caractere único 1 representa uma cobra ouroboros, em que a execução prossegue da cabeça (início) à cauda (final) e volta à cabeça. Os comandos
(
e)
permitem que você coma parte da cauda ou regurgite, alterando assim os comandos que são executados. Se o ponteiro da instrução for engolido, a cobra morre (para de executar). Um programa Ouroboros consiste em uma ou mais cobras executando em paralelo. Cada cobra tem uma pilha própria e também há uma pilha compartilhada.1 Uma exceção, que distingue Ouroboros de muitas linguagens 2D: números de vários dígitos podem ser escritos diretamente, sem a necessidade de fazer contas ou pressionar o 0 primeiro.
Cobra 1
A primeira cobra lê um caractere (
i
) e verifica se é -1 / EOF (.1+!
). Nesse caso, ele come a maior parte de sua cauda, incluindo eM
(57*(
).A cobra então troca o código do caractere com o registro que está acima dele na pilha (
\
), move o registro para a pilha compartilhada (m
) e engole outro caractere (1(
). Se ele já engoliu um monte, isso significa que engole o(
que o IP está atualmente ativo e morre. Caso contrário, a execução prossegue movendo o registro de volta para a pilha da cobra 1, trocando-o pelo código char e regurgitando o personagem que foi engolido anteriormente (M\1)
).Em seguida, usamos operações matemáticas e de pilha para gerar a pontuação apropriada para o personagem.
.96>
testa se é minúsculo ou não; o subsequente32*-
converte para maiúsculas. Em seguida, a longa extensão de.80=
para81=9*++++
mapasP
->1
,N
->3
, etc. Finalmente,\2*1\-*
nega a pontuação se a carta foi minúsculas, e+
adiciona-lo para o registro ativo. A cobra então dá laços e lê outro personagem.Cobra 2
A segunda cobra começa com uma operação de regurgitação (
)
), que não faz nada na primeira vez (já que nada foi engolido ainda e também desde que abrir uma pilha vazia0
). Em seguida, envia o comprimento da pilha compartilhada para sua própria pilha e nega logicamente (L!
). Isso fornece1
se a pilha estiver vazia,0
caso contrário. A cobra multiplica por 4 e come tantos caracteres (4*(
).Se a pilha compartilhada estava vazia, isso significa que a cobra agora termina antes da
S
. Ele empurra4
e volta para o)
, onde regurgita os personagens que acabou de engolir e começa novamente.Se houver um valor na pilha compartilhada, no entanto, nenhum caractere será engolido e a execução continuará. A cobra muda para a pilha compartilhada e gera o número lá (
Sn
); depois engole seu último caractere e morre (1(
).Sincronização
As duas cobras devem ser cuidadosamente sincronizadas para que nunca haja um valor na pilha compartilhada quando a cobra 2 faz sua verificação, até que o final da entrada seja alcançado. Snake 1 coloca um valor brevemente na pilha compartilhada em cada passagem em seu loop. Assim, o
L
comando da cobra 2 nunca deve ser executado entre os comandosm
eM
na cobra 1. Felizmente, as cobras se alinham muito bem. Fundamentalmente, o comprimento do loop da cobra 1 (70 instruções) é um múltiplo do loop da cobra 2 (7 instruções), para que os dois nunca fiquem fora de sincronia:Se os números não tivessem funcionado tão perfeitamente, eu teria preenchido uma ou ambas as cobras com espaços para fazê-las alinhar conforme necessário.
Tudo isso está muito bem, mas eu quero vê-lo em ação!
Aqui está o programa acima via Stack Snippet. Mesmo em 1000 operações por segundo, leva cerca de 10 segundos para cuspir a resposta para a entrada de amostra - mas chega lá!
Mostrar snippet de código
fonte
JavaScript ES6, 71
Como uma função anônima
fonte
Perl 5,
7163 bytesIsso modifica
$\
(o separador de linha paraprint
, que começa com false) para cada alfanumérico na string que é uma chave do hash%a
definido no início. Aumenta$\
pelo valor do hash se a letra for uma chave como está; caso contrário, aumenta em negativo o valor do hash se a letra maiúscula for uma chave; caso contrário, não adiciona nada.Muito obrigado ao primo por me salvar oito bytes (em um comentário sobre esta resposta).
Posso salvar outro byte com outra sugestão do primo (obrigado!): Mude
$a{$_}||-$a{uc$_}
para$a{$_}-$a{$"^$_}
. Mas essa é uma resposta bastante diferente da minha, eu acho, então não aceitarei o "crédito" (de -1 byte) por ela.fonte
Clojure / ClojureScript, 63 caracteres
Escrito usando um ClojureScript REPL, também deve ser um Clojure válido. Experimente aqui . Digite e chame usando
(*1 "FEN_string_here")
Bem direto.
{"P"1..."q"-9}
é uma estrutura de dados literal para um mapa de "P" para 1, "N" para 3, etc.map
assume a função como o primeiro argumento e a estrutura de dados a processar como o segundo - nesse caso, ele está usando o recurso que uma estrutura de dados (o literal do mapa) pode atuar como sua própria função de acessador. O parâmetro string (%
da macro de funções) pode ser tratado como uma lista de cadeias de caracteres individuais. Qualquer personagem que não esteja no mapa terminará comonil
na lista resultante, que+
felizmente ignora.fonte
Pitão, 25 bytes
Demonstração
Isso usa a seguinte fórmula de mapeamento para letras em
pbnrq
, sek
for a letra:Isso é representado no Pyth como:
Primeiro, o programa cria a versão trocada entre maiúsculas e minúsculas da entrada e, em seguida, em ambas as seqüências filtra letras minúsculas, aplica a fórmula acima e depois soma e subtrai os valores em preto dos valores em branco.
fonte
Python 3, 93
fonte