Acho que as questões artísticas ASCII sobre PPCG são divertidas, mas pessoalmente acho que pode ser bem difícil, especialmente quando a pergunta é marcada como código-golfe .
Gostaria de saber se alguém aqui pode ter algumas dicas que serão úteis para a produção de arte ASCII.
Simplesmente organizar caracteres é fácil, mas com algoritmos (curtos), as coisas se tornam mais complicadas.
Eu estou falando sobre arte ASCII como:
- Texto para arte ASCII (caracteres)
- Imagens (logotipos ou ícones)
Só estou procurando dicas gerais, mas é permitido um idioma específico, pois a maioria deles pode ser traduzida de qualquer maneira.
[0-9A-Za-z]
Procure simetria
Às vezes, a arte ASCII necessária é simétrica em algum momento. Por exemplo, Argyle ASCII Art requer uma saída semelhante a esta:
Pode-se simplesmente imprimir isso normalmente, mas, dependendo do idioma, o código necessário pode ser reduzido, gerando apenas a metade superior do resultado, revertendo-o e trocando
/
e\
.Tente transpor
Em ASCII Art Archery Arrows, o resultado a ser impresso é este, dimensionado para um dado
n
:Se dermos uma olhada na seta, podemos ver que existem 8 tipos de linhas:
Vamos tentar o mesmo para sua transposição.
Aqui, existem 10 tipos de linhas.
Mas aqui está o problema: os 5 inferiores são idênticos aos 5 superiores, exceto para troca
/
e\
. De acordo com a regra anterior, você pode primeiro gerar os 5 primeiros, copiar, fazer a troca e finalmente transpor para obter a seta. Isso pode economizar muito código.fonte
Caracteres de controle, seqüências de escape e códigos de console
A menos que a pergunta os proíba, o consenso atual sobre o Meta é que os desafios da arte ASCII não exigem um fluxo de bytes específico, mas uma saída que parece correta.
Isso significa que podemos usar caracteres de controle ASCII , seqüências de escape ANSI e códigos de console do Linux em nossas respostas, assumindo um terminal de suporte.
A menos que especificado de outra forma, o restante desta resposta explicará o comportamento dos terminais Linux, que é o que tenho disponível para teste no momento.
Caracteres de controle ASCII
O suporte / interpretação varia de terminal para terminal e de caractere para caractere. O mais portátil deve ser o avanço de linha (
\n
,\x0a
), que move o caractere para o início da próxima linha.Outros caracteres úteis incluem:
A guia vertical (
\v
,\x0b
) move o cursor uma posição para a direita e depois uma posição para baixo.O retorno de carro (
\r
,\x0d
) move o cursor para o início da linha atual . Qualquer caractere imprimível subseqüente substituirá o primeiro caractere da linha atual.O backspace (
\b
,\x08
) move o cursor uma posição para a esquerda. Qualquer caractere imprimível subseqüente substituirá o caractere antes do backspace.O escape (
\e
,\x1b
) não faz nada por si só, mas faz parte das seqüências de escape ANSI (opcionalmente) e dos códigos do console Linux.Muitos idiomas permitem caracteres de controle reais no código-fonte.
Sequências de escape ANSI
(ainda está por vir)
Códigos do console do Linux
Embora existam muito mais, os códigos de console mais úteis para a arte ASCII são provavelmente os seguintes:
A sequência
\ec
vai repor o terminal. Isso limpa a tela, coloca o cursor no canto superior esquerdo e define a cor da frente e do fundo, a taxa de piscada do cursor etc. para seus valores padrão.A sequência
\eM
causa um avanço de linha reverso , ou seja, o cursor se move uma posição para cima.A sequência
\eH
define a parada de tabulação na coluna atual.fonte
Procure padrões
Este pode ser um pouco óbvio, mas ... procure padrões, semelhanças e repetições na saída. Por exemplo, quando vi a tarefa Transformar número em padrão de exibição de 7 segmentos, comecei a pensar em como alguém poderia jogar golfe e comecei a procurar semelhanças. Devido à maneira como os segmentos horizontais se posicionam entre os verticais na matriz de caracteres, provavelmente seria mais fácil lidar com três segmentos de cada vez, agrupados como tal (adicionando dois segmentos "sempre vazios" para o primeiro e mais alto) :
Assim, você poderia fazer algo como
).
lc + " "*N + rc + "\n"
N-1 vezes e depoislc + bc*N + rc
uma vez, para cada três segmentos (lc
,bc
,rc
sendo os personagens esquerda, bottom e direito do segmento, ou seja um dos|
,_
oufonte
Usar conversão base
Esta resposta foi para uma pergunta que queria arte ASCII, que consistia em caracteres
+ |-
e novas linhas. Como existem apenas 5 caracteres possíveis, eles podem ser tratados como um número base 5 e convertidos em bytes, compactando 3,45 caracteres por byte.Explorar regularidades
Frequentemente, os dados terão algumas regularidades, mesmo que essas regularidades não sejam fortes o suficiente para empregar ferramentas específicas, como espelhamento. Por exemplo, na pergunta acima, a saída desejada apresentava novas linhas aproximadamente uniformemente espaçadas ao longo do teste, já que o texto era aproximadamente retangular. Eu explorei isso para encurtar meu código, usando a função dividida em n pieces de Pyth, e então ingressando em novas linhas.
Conheça suas ferramentas e escolha a ferramenta certa para o trabalho.
As ferramentas de processamento de texto mais poderosas e eficientes que conheço são:
Motores Regex:,
///
Retina, Perl, em ordem de troca de potência / concisão.Use se o que você deseja fazer puder ser descrito conscientemente nas substituições de expressões regulares, como esta resposta
Ferramentas de processamento de texto obscuras: gema etc. (tenho certeza de que existem outras, mas são muito obscuras)
Use se eles tiverem um recurso exatamente o que você precisa, que nada mais possui. Como nesta pergunta , com a correspondência recursiva do gema.
Linguagens de golfe com códigos gerais: CJam, Pyth, etc.
Use se estiver explorando alguma sutileza complexa o suficiente para que nenhuma outra ferramenta faça o trabalho ou apenas faça o trabalho mais curto.
Tente muitas abordagens
Isso se aplica a todas as questões de código-golfe, mas especialmente aqui. Você não saberá se uma regularidade é explorável até que você a experimente. Possivelmente em vários idiomas.
fonte