No xadrez, a notação de Forsyth-Edwards , mais comumente chamada "FEN", é uma maneira textual de transcrever quadros. Ele descreve cada uma das oito linhas do tabuleiro (chamadas de "fileiras" no xadrez) de cima para baixo da perspectiva de White. As peças são escritas como K (rei), Q (rainha), R (torre), B (bispo), N (cavaleiro) e P (peão). Peças pretas usam essas letras em minúsculas e peças brancas usam essas letras em maiúsculas. Os espaços vazios são indicados por um número de 1 a 8, indicando quantos espaços vazios consecutivos existem. Uma classificação completamente vazia seria 8
, uma única torre preta na coluna mais à direita (chamada "arquivos" no xadrez) seria 7r
e dois peões brancos em cada extremidade de uma linha seriam PP4PP
. As classificações são separadas por um/
. Normalmente, há outras informações adicionadas, indicando de que lado se deve mover, direitos de passagem e de passagem , número de movimentação e relógio meio movimento, mas os ignoraremos para os propósitos deste desafio.
Entrada
Uma string FEN, na linha de comando ou STDIN, como desejar. Você pode assumir que essa sequência é sempre válida.
Resultado
Escreva para STDOUT uma representação artística ASCII simples do quadro, como ele realmente apareceria:
- As peças são representadas pelo seu caráter na FEN
- Quadrados vazios são representados por espaços
- Peças e quadrados são separados por um cano
|
e existem canos em cada lado do tabuleiro
Portanto, um quadro vazio, escrito como 8/8/8/8/8/8/8/8
no FEN, apareceria como
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
A posição inicial de um jogo de xadrez é escrita como rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
e deve aparecer como
|r|n|b|q|k|b|n|r|
|p|p|p|p|p|p|p|p|
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
|P|P|P|P|P|P|P|P|
|R|N|B|Q|K|B|N|R|
A posição final de Anderssen-Kieseritzky 1851 , chamada "O Jogo Imortal" na comunidade de xadrez, é escrita como r1bk3r/p2pBpNp/n4n2/1p1NP2P/6P1/3P4/P1P1K3/q5b1
e seu programa, quando alimentado com essa entrada, produziria:
|r| |b|k| | | |r|
|p| | |p|B|p|N|p|
|n| | | | |n| | |
| |p| |N|P| | |P|
| | | | | | |P| |
| | | |P| | | | |
|P| |P| |K| | | |
|q| | | | | |b| |
+1
para um desafio interessante.-2
por aceitar a resposta errada, sem uma boa razão #Respostas:
Perl, 28 bytes
Inclui +2 para
-lp
Dê entrada no STDIN
fen.pl
:Na verdade, na liga de algumas línguas de golfe ...
Observe que a versão baseada em arquivo precisa da nova linha final no arquivo, de modo que uma tenha realmente 29 bytes. Mas a versão da linha de comando não precisa dessa nova linha extra e, portanto, o código conta como 28 bytes:
fonte
Retina, 13 bytes
Experimente online!
Explicação
A primeira parte (observe o espaço à direita):
é converter a para o número específico de espaços. A retina tem um
$*
recurso para repetir. A maneira como funciona é:<num>$*<char>
se não houver<num>
, Retina assumirá$&
ou a sequência correspondente, nesse caso, o número correspondente.A próxima parte:
é bastante simples, substitui tudo
/
com o¶
que é uma nova linha.A última parte funciona da mesma maneira:
Isso substituirá tudo (por isso, não há nada na primeira linha) por
|
. Colocando um em|
todo lugar.fonte
S`/
que no segundo estágio.Ruby -
75827876756259585756 bytesEconomizou alguns bytes graças a Ventero
Deixe-me explicar (com a
\n
substituição da nova linha literal):Isso retorna implicitamente o valor da sequência, cada uma
/
substituída por uma nova linha (por padrão,$/
contém uma nova linha)Isso é super simples; é apenas uma string contendo um tubo, interpolação de string e outro pipe. A interpolação de cadeia é avaliada
Isso substitui todos os números por tantos espaços. Também posso economizar alguns bytes encontrando novas linhas aqui; porque
hex
retorna 0 se a string não é um número válido, quando encontra uma nova linha - ou seja, a que está no final do resultado degets
-, ela a substitui por uma string de comprimento 0, excluindo-a efetivamente. Sem isso, haveria um cano à direita.$&
é uma variável mágica que representa o texto completo da última correspondência de variáveis, o que permite salvar um byte ao eliminar|d|
. Posso salvar outro byte usando em.hex
vez de.to_i
, o que funciona porque todo número é menor que 9, o que significa que hex e decimal têm os mesmos valores.Isso coloca um cano entre cada personagem. Observe que é isso que coloca os tubos em ambos os lados das linhas (exceto o primeiro e o último), porque as barras, que eventualmente se transformam em novas linhas
tr
, contam como caracteres e, portanto, são cercadas por tubos. O?|
justo significa "a cadeia de um caractere"|"
".E é isso. É um programa francamente escandalosamente simples. Ele usa muitos truques de sintaxe furtivos.
fonte
puts"|#{gets.gsub(/\d|\n/){' '*$&.hex}.chars*?|}|".split'/'
(é claro, substitua-o\n
por uma nova linha literal novamente).Pyth -
242221 bytesConjunto de Teste .
fonte
Pitão, 23 bytes
Experimente online!
Como funciona:
fonte
JavaScript ES7,
80bytesÉ uma função anônima que aceita uma string como entrada.
Aproximação somente de ES6 de 80 bytes.
Explicação
Usamos uma compreensão de array para percorrer a lista:
Isso é equivalente a:
Se é um número, temos esse número de espaços. Se for um
/
, temos uma nova linha. Caso contrário, temos o personagem. Então, juntamos a compreensão sem nada para formar uma corda.Em seguida, criamos uma matriz de comprimento 3
[,...that,"\n"]
....
divide a compreensão unida em caracteres. Juntar-se a isso produz o resultado.fonte
[x for(x of a)]
) são ES7.Julia, 62 bytes
Esta é uma função anônima que aceita uma string e retorna uma matriz de strings. Para chamá-lo, atribua-o a uma variável.
A abordagem é a mesma que em Ruby inteligente QPaysTaxes resposta . Substituímos cada dígito na entrada por tantos espaços, posicionamos
|
entre cada caractere, aderimos|
à frente e atrás e dividimos em uma matriz/
.Experimente online!
fonte
05AB1E , 21 bytes
Código:
Também 21 de bytes:
'|¹9GNNð×:}S'|«JJ'/¶:
.Usa a codificação CP-1252 .Experimente online! .
fonte
JavaScript (ES6),
696762 bytesAs vírgulas extras criam valores vazios na divisão externa, que cria o começo e o fim
|
caracteres . Você precisa de duas vírgulas finais, pois as vírgulas finais são opcionais no final das listas; portanto, a primeira ainda faz parte do item anterior.Editar: salvou 5 bytes graças a @ user81655.
fonte
/[\d/]/g,c=>+c?` `.repeat(c):`\n`
?Retina ,
5045 bytesIsso foi divertido haha. Não sou apenas um noob em Retina, mas também em regex em geral ... Isso provavelmente pode ser muito praticado , então vou fazer mais algumas pesquisas.
Código:
Experimente online!
fonte
$*
funcionalidade :)Jolf, 28 bytes
Substitua
♣
pelo personagem\x05
ou tente aqui!fonte
Python 3.5, 112 bytes:
Experimente online! (Ideona)
fonte
C, 252 bytes
Teste detalhado online
fonte
JavaScript (FireFox 30+), 61
Usando compreensão de array que não é mais o padrão EcmaScript
Teste
fonte
Lua, 106 bytes
Ungolfed
fonte
print((...):gsub(".",function(c)return(c:find("%d")and("| "):rep(c)or c=="/"and"|\n"or"|"..c)end).."|")
print((...):gsub("%d",function(c)return("| "):rep(c)end):gsub("/","|\n"):gsub("([^%d%s|])","|%1").."|")
para a mesma contagem de bytes.print((...):gsub("%d",function(c)return("| "):rep(c)end):gsub("([^%d |])","|%1"):gsub("/","\n").."|")
é 101 bytesR (fora de competição)
Desculpe se não é apropriado postar isso, mas achei legal que por acaso tivesse uma função por aí que realmente funcionasse para essa pergunta sem editar! Porém, ele imprime saída unicode em vez de ascii. Não me lembro bem por que o escrevi, mas não foi para responder a um desafio.
fonte
Haskell, 110 bytes
Ungolfed:
fonte
Java 7,
190184 bytesTeste detalhado online
fonte
Pyke,
2520 bytesExplicação:
Experimente aqui!
fonte
Python, 84 bytes
Explicação:
fonte
> <>, 64 bytes
4 bytes desperdiçados devido a problemas de alinhamento, embora não tenha certeza de como usá-los. ¯ \ _ (ツ) _ / ¯
fonte