Como o título diz, eu estava pensando em contestar em que é preciso detectar arestas de uma arte ASCII.
O código deve aceitar uma arte ASCII P / B como entrada. Uma arte ASCII a preto e branco é definida como (por mim) uma arte ASCII com apenas um tipo de caractere que não é de espaços em branco (no nosso caso: um asteriks *
). E, como saída, produzimos uma arte ASCII padrão (todos os caracteres ASCII são aceitos) que devem lembrar a contenção do primeiro.
O objetivo de usar mais de um caractere na saída é tornar algumas arestas mais suaves. Por exemplo, alguém poderia deixar essa entrada
***
****
******
******
******
******
****
***
poderia se tornar:
___
_/ )
_/ /
/ |
| /
| \
\ |
`\ |
\___)
A entrada \n
separou a sequência como entrada. Cada linha tem no máximo 80
caracteres. O número de linhas não está especificado.
Este é o meu exemplo de programa Python3:
import fileinput as f
import re as r
import copy as c
a,s,p='*',' ','+'
def read(n):
s=[list(' '*n)]
for l in f.input():
if(len(l)>n):l=l[:n]
k=list(r.sub('[^ ^\%c]'%a,'',' '+l+' '))
s.append(k+[' ']*(n-len(k)))
s.append([' ']*n)
return s
def np(s):
s=c.deepcopy(s)
for l in s[1:-1]:
for w in l[1:-1]: print(w,end='')
print()
def grow(i):
o=c.deepcopy(i)
for x in range(1,len(o)-1):
for y in range(1,len(o[x])-1):
if(i[x][y]==a): o[x-1][y-1]=o[x-1][y+1]=o[x-1][y]=o[x+1][y]=o[x+1][y-1]=o[x+1][y+1]=o[x][y+1]=o[x][y-1]=a
return o
def diff(i,o):
c=[]
for x in range(0,len(i)):
l=[]
for y in range(0,len(i[x])):
if(i[x][y]==a and o[x][y]==s): l.append(p)
else: l.append(s)
c.append(l)
return c
I=read(80)
np(diff(grow(I),I))
Entrada:
Aqui abaixo, coloquei as duas entradas dos programas. É uma arte ASCII de 80x70. Significa que possui 70 linhas de 80 caracteres, cada uma separada por \n
.
Este arquivo de entrada contém apenas espaços e o asterisco *
, possui no máximo 80 colunas, como todo tipo de arte ASCII .
Se você encontrar uma arte melhor, me avise!
*************
***** *****
****** ***
*** ****
********* **
*********** **
****** ******* **
***** ******* *** **
**** ******** ***** *
** ********* ***** ***** *
*** ********* ******* ****** **
** ********** ******* ****** **
** ********** ******* ******** *
* *********** ****** ******** *
** ************ ***** ******** *
* ************ *** ******** *
* ************* ****** *
* ************* *** *
** ************* *
* ************** *
** ************* **
* ************* **
** ************* ***
*** ************* ****
** ************ ****
** ************* ****
** ************* ***** ****
** ************* ** ** ** ****
** ************ * * ** ** ****
* ************ ** ** ** ** ****
* ************* ******* ** *** ****
* ************ ***** ******* ****
* ************ *** ***** ****
** * ************* **** *****
** *** ************** *****
* ***** ************* ******
** ******* ************** *******
********** *************** * *********
********** ***************** *** ***********
*********** ******************* **************
*********** ********************** ******************
************ ***************** ** ***********************
************* ****************** **** *******************
************** ****************** ********************
**************** ****************** *******************
*************** ******************* *******************
**************** ****************** ******************
****************** ****************** *******************
******************* ***************** *******************
********************* ****************** ********************
********************************************* *********************
********************************************** ***********************
************************ ***************** ************************
********************** ******************* **************************
********************* *********************************************
********************* **************************** ***************
******************** ************************** ***************
******************** ********************* ***************
******************* ******************** ****************
****************** ***************** ****************
***************** **************** ***************
***************** **************** ***************
***************** ***************** ***************
**************** ***************** ***************
************** ****************** ***************
**************** ****************
************** ***************
**************
************
Saída possível:
Uma saída possível pode ser:
+++++ ++++
++++++ ++++++++++ +++
++ +++++ +++++ +++++
++++++++ +++++ ++++ ++
++++ ++ ++++ ++
++++++ ++ ++ ++
+++++ +++ + +++++ ++ ++
++++ +++++++ ++ ++ ++ ++ ++
++ +++++ ++ + + + +++++++ ++
+++ ++++ ++ + ++ ++ ++ ++ ++
++ ++ ++ ++ + + + ++ ++
++ +++ + + ++ + ++ +++ +
++ ++ ++ + ++ ++ + +++ +
++ +++ ++ + + +++ + + + ++
+ + + + + ++ + ++++ +
++ ++ ++ + ++ ++ ++ + + +
++ ++ + + +++++ ++ ++ + +
++ ++ + + +++ ++ + +
+ + ++ + +++++ + +
++ ++ + + ++ +
+ + + ++ + +
++ ++ ++ + + ++
++ + + ++ + ++
+ + + + + +
+ ++ ++ ++ + +
+ + + + +++++++ + +
+ + + + ++ ++ ++++ + +
+ + + + + +++ + ++ +++ + +
+ + ++ + + ++ ++ + ++ + ++ + +
+ ++ + ++ ++ +++ + + +++ ++ + +
+ + + + + ++ + +++ + + +
+ + + ++ ++ ++ ++ + + +
+ + +++ ++ ++ + +++ +++ + ++ +
+ ++ ++ + ++ +++++ + ++ ++ +
+ ++ ++ + + ++++++ ++ ++
++++ + ++ +++ ++ +
+ + ++ ++ +++ +++ +
+ + ++++ ++ ++ +++ +
++ ++ ++++ + + ++++ +
+ ++ +++++ +++++ +++++ +
++ ++ +++ ++++++ +
++ + +++++ +++++ +
++ + + +++ +++++ +
+++ + ++ ++++++ + +
+ ++ + ++ +
++ + + + +
+++ ++ + ++ ++
++ + + + +
+++ ++ + +++ +
++++++ + ++ ++
++ +++ +
+ ++ +
+++++ ++++++ +
+ ++ ++ + +
+ ++ + ++
+ + + ++ +
+ ++ + ++++ +
+ + + ++++++ ++ +
+ ++ + ++ + +
+ ++ + ++++ + +
+ ++ ++ + + ++
+ + + ++ + +
+ + + + + +
++ + + ++ + +
++ ++ + + + ++
++++++++++++++++ +++ + + +
++ ++ ++ +
++++++++++++++++ ++ +
++ ++
++++++++++++++
Essa também é a saída produzida pelo script acima. Claro que não é a melhor saída e tenho certeza de que é possível produzir facilmente uma saída mais suave.
É um concurso de popularidade, pois espero que os votos sejam proporcionais à elegância e qualidade dos resultados! (Também acho que bons resultados podem ser obtidos combinados aplay
e gimp-cli
) Não há regras estritas sobre como a saída deve ser ... basta usar sua fantasia!
fonte
Respostas:
GolfScript
Eu pensei que o golfe fosse popular neste site, então uma inscrição no GolfScript sempre se encaixa em um concurso de popularidade.
Você pode tentar o código com sua própria arte ascii aqui . Observe que é necessário que todas as linhas tenham o mesmo comprimento.
Exemplo:
fonte
O código Python depende principalmente do regex para executar a tarefa.
*Resultado
Outro
fonte
Pitão
Usando a operação gradiente para identificar arestas:
Produção para a banana e o panda:
Para criar uma saída ASCII, a parte dos gráficos deve ser substituída por:
Saída ASCII:
Banana:
Panda:
fonte
Mathematica
Supondo que
panda
contenha a sequência original, o seguinte obtém os pixels das bordas do contorno e os substitui por "+".Como funciona
Partition[Take[Characters@panda, {61, 5636}], 82]
divide a string em linhas de caracteres.Most
remove os novos caracteres de linha.Image[t]]]
converte a matriz de 0 e 1 em uma imagem.EdgeDetect
localiza as bordas da imagem.ImageData
obtém a matriz binária da imagem./. {1 -> "+", 0 -> " "}
substitui cada 0 e 1 pelo caractere apropriado.Grid
exibe a arte Ascii.fonte
Java
Isso verifica as linhas e linhas se houver algo na parte superior, esquerda, direita ou inferior e, com base nisso, escolhe um valor do símbolo de retenção de matriz usado para gerar nova arte usando arestas!
Exemplo de saída:
Código:
Ps. primeiro temporizador aqui, não seja duro: D Pps. que o Panda parece triste :(
fonte
Python (ascii -> imagem -> filtro de borda -> ascii)
Eu meio que trapacei, converti o texto ascii em uma imagem e executei o filtro de detecção de borda PIL. Inverti a imagem e converti novamente para texto ascii:
Aqui está o resultado:
Fontes citadas (para conversão de imagem em escala de cinza em ascii): http://stevendkay.wordpress.com/2009/09/08/generating-ascii-art-from-photographs-in-python/
fonte
convert
(para converter arte ASCII em imagem);GIMP
linha de comando (para executar a detecção de borda); eaplay
(para renderizar a imagem na arte ASCII). mas falhou: p (e bem-vindo ao Codegolf) #k4
esta é uma versão lenta que apenas encontra as arestas, não tenta encontrar a forma predominante e escolhe um caractere apropriado
o "algo" é apenas para encontrar todas as células que diferem da célula da esquerda ou acima e, em seguida, usar a mágica da linguagem de matriz para transformar a matriz booleana de volta na arte ASCII
há um pequeno truque para preencher o começo de tudo com um espaço extra, ou ele consideraria a esquerda e a parte superior como "bordas" - dessa maneira ainda funciona, mas posso deixar isso mais tarde
mais ou menos a mesma saída que a amostra na especificação
aqui está no boomerang / banana:
fonte
Pitão
Esta é uma versão Python muito simples do filtro "highpass" :). Ele verifica se um pixel está pelo menos cercado por seus quatro lados. Este é um dos meus primeiros códigos Python, então seja sutil ...
Resultado:
fonte
<!-- language: lang-py -->
R
Para cada ponto da matriz, oculte o caractere se estiver cercado por asteriscos à direita, esquerda, superior e inferior. Isso é ingênuo, mas funciona muito bem.
Uso:
Rscript script.r input_.txt
Resultado
fonte