Sumário
Inspirado pela recente popularidade dos desafios de arte ASCII, o objetivo desse desafio é desenhar um tabuleiro de xadrez ASCII, como aquele no qual o xadrez pode ser jogado.
Escreva um programa que use um número inteiro positivo n
como argumento, em stdin
ou como entrada do usuário e imprima um tabuleiro de xadrez com n
x n
quadrados, juntamente com uma borda com 1 caractere de espessura.
Cada quadrado deve ter caracteres de 2x2. Os quadrados devem seguir o padrão alternado branco-preto (branco primeiro, como no canto superior esquerdo) de um tabuleiro de xadrez. Os quadrados brancos devem ser feitos com caracteres space ( ) e os quadrados pretos com
#
caracteres libra ( ).
A borda deve ser feita de traços ( -
) com um sinal de mais ( +
) na borda ou no ponto perpendicular de um quadrado.
Entrada
Número inteiro positivo para representar o número de quadrados (dimensões em quadrados) a serem desenhados no tabuleiro de damas, com cada quadrado com caracteres de 2x2.
Resultados de exemplo
n=2
+--+--+
| |##|
| |##|
+--+--+
|##| |
|##| |
+--+--+
n=3
+--+--+--+
| |##| |
| |##| |
+--+--+--+
|##| |##|
|##| |##|
+--+--+--+
| |##| |
| |##| |
+--+--+--+
n=4
+--+--+--+--+
| |##| |##|
| |##| |##|
+--+--+--+--+
|##| |##| |
|##| |##| |
+--+--+--+--+
| |##| |##|
| |##| |##|
+--+--+--+--+
|##| |##| |
|##| |##| |
+--+--+--+--+
... e assim por diante.
Notas
- Espaços à direita e novas linhas são aceitáveis.
- Você pode escrever um programa inteiro ou uma função.
- Sem espaços à esquerda.
- Seu programa deve exibir resultados corretos para n = 15.
- Para idiomas esotéricos menos conhecidos e similares, forneça um link para o idioma.
n=0
deve produzir+
. (opcional, mas altamente recomendado e incentivado.)- O código mais curto em bytes vence, pois esse é o código golf.
+
paran=0
.Respostas:
J, 24 bytes
Uma função anônima:
Uso:
fonte
&.>
é um menor queeach
. Vale ressaltar que ele funciona apenas seBoxForm
estiver definido comoASCII
.Python 2, 79
Para cada linha, seleciona um dos padrões
e imprime
3*n+1
caracteres a partir dele. O padrão é escolhido repetindo seus 6 primeiros caracteres, selecionados com o truque de intercalação de cadeias, que também serve para extrair um trecho do comprimento correto.O padrão correto é selecionado com base no valor do
i
módulo de índice de linha 6 por uma expressão aritmética3**i%7/2%3
que fornece o padrão de repetição [0,1,1,0,2,2]. Eu o encontrei usando o fato de quex**i%7
tem período e6
, em seguida, tentando valoresx
diferentes e pós-processamento diferentes para obter o padrão certo.fonte
Pyth, 37
Em vez hackeado juntos, mas curto.
Demonstração.
fonte
CJam,
4342 bytesExperimente online .
Cada coordenada é mapeada para um caractere, por exemplo, o canto superior esquerdo
(0, 0) -> "+"
. Especificamente, calculamose indexe na string de
"#|-+ "
acordo.fonte
Retina , 106 bytes
Considera a entrada como unária (com base nesta metat Discussão ).
Cada linha deve ir para seu próprio arquivo e
n
deve ser alterada para nova linha nos arquivos. Isso é impraticável, mas você pode executar o código como está, como um arquivo, com o-s
sinalizador, mantendo osn
marcadores. Você pode alterar asn
linhas para novas linhas na saída para facilitar a leitura, se desejar. Por exemplo:Mais golfe e algumas explicações vêm mais tarde.
fonte
JavaScript (ES6), 117
Snippet:
Função anônima. Inicia com uma matriz completa de
+--+--+--...
linhas e, nas linhas apropriadas, substitui o+
for|
e-
forou
#
conforme apropriado.A expressão que decide o caractere de substituição
"| |##| "[x%6+(i%6>2)*3]
provavelmente poderia ser mais alterada, mas descobri que o uso de uma string mais longa e redundante economiza mais caracteres do que um cálculo complexo.fonte
CJam, 59 bytes
Este é muito longo ..
Experimente online aqui
fonte
CoffeeScript com ES6, 106 bytes
JavaScript (ES6), 111 bytes
As novas linhas são significativas e contadas como 1 byte cada.
O retorno explícito aumentou um pouco:
Demo
No momento da redação deste artigo, o Firefox é o único grande navegador compatível com o ES6.
fonte
Python 3,
114 108100Soluções anteriores
108
114
118 (não enviado)
fonte
CJam, 46 bytes
Experimente online
Bem, eu esperava ter pelo menos uma solução original (normalmente não vejo outras respostas antes de trabalhar por conta própria). Acontece que o @ Sp3000 já havia feito algo muito semelhante, só que melhor. Mas como já fiz o trabalho, pensei em publicá-lo de qualquer maneira.
Explicação:
fonte
HackVM , 158 bytes
Definitivamente não é um vencedor, mas isso parecia um bom desafio para se fazer na HVM.
Coloque o tamanho na primeira célula da memória e use o seguinte código:
Nota: O código precisa estar exatamente em uma linha para funcionar.
Explicação:
O código chama 2 funções
PLUSHDASHLINE
eNORMALLINE
, mantém um estado global para paridades (ou seja, se deve colocar um' '
ou a'#'
em uma célula).Explicação para
PLUSDASHLINE
:Explicação para
NORMALLINE
:Gostaria que alguém desse dicas para melhorá-lo ainda mais :)
fonte
Python 2, 98
Não é o caminho mais curto, mas um método divertido. A função
f
pega duas stringsa,b
e um separadors
e intercala seus argumentos comosaasbbsaasbbsaas
. As linhas do quadro são criadas neste formulário com seus respectivos caracteres, depois são intercaladas dessa maneira para produzir o resultado.fonte
n=0
. A maioria das soluções (que serão aceitas) produz "+". Esta solução produz "++ (nova linha) ++", excluindo as 2 novas linhas à direita normais (o que é permitido).Ruby: 83 caracteres
Exemplo de execução:
fonte
Ruby, 87
Esta é uma função anônima. Chame assim (todas as possibilidades de 0 a 5)
Ele faz uso do
ljust
método em uma string vazia. O Ruby permite que uma string de preenchimento seja especificada para justificativa; portanto, usamosljust
uma das três possíveis sequências de preenchimentob,c,d
por matriza
, ordenadas comobccbdd
.fonte
Julia, 124 bytes
Isso cria uma função sem nome que aceita um número inteiro e imprime no stdout.
Ungolfed + explicação:
fonte
Javascript, ES6 149
Muito divertido de escrever, embora seja um pouco longo
Funciona no firefox
1 - Console aberto
2 - Digite o seguinte
Saída (n = 15):
fonte
join('\n')
porjoin` `
, onde o espaço que escrevi indica um novo caractere de linha real.Haskell, 99
Isso é parcialmente inspirado na resposta anterior de Haskell por catgocat ; Escrevi minha própria versão, depois olhei para ela e depois escrevi outra. Estou jogando com as mesmas regras - a entrada é um argumento, mas a saída é stdout. (Se puder ser uma função pura, subtraia 7 caracteres
putStr$
.)Costumamos
t
pegar uma região de 3 n + 1 caracteres de um tabuleiro de xadrez infinito criado usandocycle
, e é isso. A ideia principal que tirei a outra resposta é a de colocar os padrões de células tanto a fronteira e verificador juntos em cordas.Minha primeira versão (140 caracteres) usou a estratégia de calcular o caractere em cada ponto, o que poderia ser melhor para um problema mais complexo que este.
fonte
cat <<EOF > sol1.hs
e contando comdu -b sol1.hs
.wc
concorda, e verifiquei se há caracteres não imprimíveis. Esta versão de 84 bytes é executada ? Se assim for, eu vou levá-lo :)Haskell, 118
Esta é a minha primeira resposta de código haskell de golfe e aqui está:
Versão mais legível:
Saída
fonte
f 1
deve produzir 1 caixa vazia,f 0
produz apenas o sinal de mais.C -
119101Usa agora o cálculo semelhante à resposta do @ Sp3000. Também otimizações de casal.
Eu acho que
?:
é uma extensão do GCC ...Resposta antiga:
Ele mantém 2 coordenadas e calcula honestamente qual caractere imprimir para cada par. A lista de caracteres a serem impressos é armazenada em matriz e, por si só, imprime uma grade "sem cor". O primeiro elemento da matriz é modificado para desenhar quadrados pretos.
Eu posso mudar isso para que, em vez de duas coordenadas independentes, seja um valor em contagem decrescente ou (talvez até melhor), mas não consigo entender isso agora.
Bônus - substituir 3 por qualquer outro número resulta em um programa que desenha um tabuleiro de damas válido com tamanho de célula diferente.
fonte
awk - 91
Foi uma luta e tanto ficar abaixo de 100. Contar para trás e usar o operador de partida foram os avanços;) O resto é uma lógica bastante direta.
fonte
Pyke, 47 bytes, não concorrente
Experimente aqui!
fonte