Détection de bord ASCII ART


19

Comme le titre l'indique, je pensais à contester dans lequel il fallait détecter les contours d'un art ASCII.

Le code doit accepter un art ASCII N / B en entrée. Un art ASCII N / B est défini comme (par moi) un art ASCII avec un seul type de caractère non blanc (dans notre cas: un astérisque *). Et comme sortie produire un art ASCII standard (tous les caractères ASCII sont acceptés) qui devrait se souvenir du contournement du premier.

Le but d'utiliser plus d'un caractère dans la sortie est de rendre certains bords ssmoother. Par exemple, on pourrait laisser cette entrée

     *** 
   ****
 ******
******
****** 
 ******
   ****
     ***

pourrait devenir:

      ___
    _/   ) 
  _/    /
 /      |
|      /
|      \
 \      |
  `\     |
     \___)

La \nchaîne séparée en entrée comme entrée. Chaque ligne a un maximum de 80caractères. Le nombre de lignes n'est pas spécifié.

Voici mon exemple de programme 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))

Contribution:

Ci-dessous, je mets les deux entrées des programmes. Il s'agit d'un ART ASCII 80x70. Cela signifie qu'il a 70 lignes de 80 caractères, chacune séparée par \n.

Ce fichier d'entrée ne contient que des espaces et l'astérisque *, il a un maximum de 80 colonnes comme tout art ASCII .

Si vous trouvez un plus bel art, faites-le moi savoir!

                                              *************
                                          *****          *****                   
                                     ******                  ***                 
                                    ***                         ****             
                             *********                             **            
                          ***********                               **           
                     ******   *******                                **          
                 *****       *******      ***                         **         
              ****          ********     *****                          *        
             **            *********     *****                    *****  *       
           ***            *********     *******                  ******  **      
          **             **********     *******                  ******   **     
         **              **********    *******                  ********   *     
        *               ***********   ******                    ********   *     
       **              ************   *****                     ********    *    
       *               ************    ***                       ********   *    
      *               *************                               ******    *    
     *                *************                                 ***     *    
    **                *************                                         *    
    *                **************                                         *    
   **                *************                                         **    
   *                 *************                                         **    
  **                *************                                          ***   
 ***                *************                                          ****  
 **                 ************                                           ****  
 **                *************                                           ****  
 **                *************           *****                           ****  
 **                *************          **   **          **              ****  
 **                 ************          *     *         ** **            ****  
 *                  ************          **   **        **   **           ****  
 *                  *************        *******         **   ***          ****  
 *                  ************          *****           *******          ****  
 *                   ************         ***               *****          ****  
**     *             *************                          ****          *****  
**    ***            **************                                      *****   
*    *****            *************                                     ******   
** *******             **************                                  *******   
**********             ***************              *                *********   
**********              *****************          ***             ***********   
***********              *******************                    **************   
***********               **********************            ******************   
************              *****************     **     ***********************   
*************             ******************      ****     *******************   
**************            ******************              ********************   
****************           ******************              *******************   
***************           *******************              *******************   
****************           ******************              ******************    
******************         ******************             *******************    
*******************         *****************             *******************    
*********************      ******************           ********************     
*********************************************          *********************     
**********************************************       ***********************     
************************     *****************      ************************     
 **********************       ******************* **************************     
 *********************        *********************************************      
 *********************        ****************************  ***************      
 ********************         **************************    ***************      
 ********************         *********************         ***************      
 *******************          ********************         ****************      
 ******************           *****************            ****************      
 *****************             ****************            ***************       
 *****************             ****************            ***************       
 *****************             *****************           ***************       
  ****************             *****************           ***************       
   **************              ******************          ***************       
                                 ****************          ****************      
                                  **************            ***************      
                                                             **************      
                                                              ************       

Sortie possible:

Une sortie possible pourrait être:

                                         +++++             ++++
                                    ++++++     ++++++++++     +++
                                   ++      +++++        +++++   +++++
                            ++++++++   +++++                ++++    ++
                         ++++         ++                       ++++  ++
                    ++++++           ++                           ++  ++
                +++++      +++       +   +++++                     ++  ++
             ++++     +++++++       ++  ++   ++                     ++  ++
            ++    +++++   ++        +   +     +                  +++++++ ++
          +++  ++++      ++         +  ++     ++                ++     ++ ++
         ++   ++        ++         ++  +       +                +      ++  ++
        ++  +++         +          +  ++       +               ++      +++  +
       ++  ++          ++          + ++       ++               +        +++ +
      ++ +++          ++           + +      +++                +        + + ++
      +  +            +            + +     ++                  +        ++++ +
     ++ ++           ++            + ++   ++                   ++        + + +
    ++ ++            +             +  +++++                     ++      ++ + +
   ++ ++             +             +                             +++   ++  + +
   +  +             ++             +                               +++++   + +
  ++ ++             +              +                                      ++ +
  +  +              +             ++                                      +  +
 ++ ++             ++             +                                       +  ++
++  +              +             ++                                       +   ++
+   +              +             +                                        +    +
+  ++             ++            ++                                        +    +
+  +              +             +         +++++++                         +    +
+  +              +             +        ++     ++        ++++            +    +
+  +              +             +        +  +++  +       ++  +++          +    +
+  +              ++            +        + ++ ++ +      ++  +  ++         +    +
+ ++               +            ++      ++  +++  +      +  +++  ++        +    +
+ +                +             +      +       ++      +  +++   +        +    +
+ +                +            ++      ++     ++       ++       +        +    +
+ +   +++          ++            ++      +   +++         +++     +       ++    +
  +  ++ ++          +             ++     +++++             +    ++      ++     +
  + ++   ++         +              +                       ++++++      ++     ++
 ++++     +         ++             +++                                ++      +
  +       +          ++              ++            +++              +++       +
          +           +               ++++        ++ ++           +++         +
          ++          ++                 ++++     +   +        ++++           +
           +           ++                   +++++ +++++    +++++              +
           ++           ++                      +++   ++++++                  +
            ++           +                 +++++  +++++                       +
             ++          +                  +  +++    +++++                   +
              +++        +                  ++   ++++++  +                    +
                +        ++                  +           ++                   +
               ++        +                   +            +                   +
                +++      ++                  +           ++                  ++
                  ++      +                  +           +                   +
                   +++    ++                 +         +++                   +
                     ++++++                  +        ++                    ++
                                             ++     +++                     +
                                              +    ++                       +
                        +++++                 ++++++                        +
+                      ++   ++                   +                          +
+                     ++     +                                             ++
+                     +      +                            ++               +
+                    ++      +                          ++++               +
+                    +       +                     ++++++ ++               +
+                   ++       +                    ++      +                +
+                  ++        +                 ++++       +                +
+                 ++         ++                +          +               ++
+                 +           +                ++         +               +
+                 +           +                 +         +               +
++                +           +                 ++        +               +
 ++              ++           +                  +        +               ++
  ++++++++++++++++            +++                +        +                +
                                ++              ++        ++               +
                                 ++++++++++++++++          ++              +
                                                            ++            ++
                                                             ++++++++++++++

C'est également la sortie produite par le script ci-dessus. Bien sûr, ce n'est pas la meilleure sortie et je suis sûr que l'on peut facilement en produire une plus douce.

C'est un concours de popularité puisque j'espère que les votes seront proportionnels à l'élégance et à la qualité des sorties! (Je suppose aussi que de bons résultats peuvent être obtenus en combinant aplayet gimp-cli) Il n'y a pas de règles strictes sur la façon dont la sortie doit être .. utilisez simplement votre fantaisie!


Veuillez définir l'entrée qui sera utilisée dans toutes les réponses pour les comparer. Le panda est trop grand à mon humble avis.
AL

La longueur de chaque ligne de l'entrée doit-elle être constante? La première ligne du panda est plus courte que les autres lignes (il manque des espaces à la fin).
AL

Le fichier d'entrée contient-il un seul caractère et des espaces?
AL

Merci pour vos questions, je ne pense pas que le panda soit trop grand: il a 80 colonnes comme tout art ASCII. Je ne l'ai pas dit, mais le maximum de colonnes devrait être de 80. Oui, le fichier d'entrée ne contient que les astérisques et l'espace. Merci encore, j'ai ajouté ces informations dans la question.
Antonio Ragagnin

C'est un panda? Je pensais que c'était snoopy ....
Justin

Réponses:


14

GolfScript

Je pensais que le golf est populaire sur ce site, donc une soumission GolfScript convient toujours à un concours de popularité.

n%.0=,' '[*]\1$++{0\0++{42=}%[{.}*]);2/}%{.}*]);2/{zip{~+2base' /\-\|/ /\| -   '=}%n+}%

Vous pouvez essayer le code avec votre propre art ascii ici . Notez qu'il est nécessaire que toutes les lignes aient la même longueur.

Exemple:

                                              /------------\                      
                                          /---  ---------   --\                   
                                     /----  ---/         \---  -\                 
                                    /   ---/                 \--\---\             
                             /------   /                        \--  \            
                          /--         /                            \  \           
                     /----  --       |                              \  \          
                 /---  ----/ /       /    /--\                       \  \         
              /--  ---/     /       |    /    \                       \-\\        
             /  --/        /        |    |    |                   /----\\\\       
           /-  /          /         /   /      \                 /     | | \      
          /  -/          /         |    |      |                 |     | \  \     
         /  /            |         |   /       /                /       \ \ |     
        //-/            /          |  /      -/                 |       |  ||     
       / |             /           |  |     /                   |       |  \\\    
       | /             |           |  \    /                    \        \  ||    
      ///             /            |   \--/                      \       /  ||    
     ///              |            |                              \-    /   ||    
    / |               |            |                                \--/    ||    
    | /              /             |                                        ||    
   / |               |             /                                       / |    
   | /               |            |                                        | |    
  / |               /             /                                        |  \   
 /  |               |            |                                         |   \  
 |  /               |            /                                         |   |  
 | |               /            |                                          |   |  
 | |               |            |          /----\                          |   |  
 | |               |            |         /  --  \         /-\             |   |  
 | |               \            |         | /  \ |        /  \-\           |   |  
 | /                |           |         | \  / |       /  /\  \          |   |  
 ||                 |            \       /   --  /       | |  |  \         |   |  
 ||                 |            /       \      /        \  --   |         |   |  
 ||                 \            \        |   -/          \-     |         |   |  
/ |    /\            |            \       \--/              |    /        /    |  
| |   /  \           |             \                        \---/        /     /  
| /  /    \          \             |                                    /     |   
| \/-     |           \             -\                                 /      |   
|         |            |              \             /\               /-       |   
|         |            \               --\         /  \            /-         |   
|          \            \                 --\      \--/         /--           |   
|          |             \                   ---\           /---              |   
|           \             |                 ----\-\    /----                  |   
|            \            |                 \   \-\---\\---                   |   
|             \           |                 |     \---/   /                   |   
|              -\         \                  \            \                   |   
|               /         /                  |             |                  |   
|               \         \                  |             |                  /   
|                -\        |                 |            /                  |    
|                  \       \                 |            |                  |    
|                   -\     /                 |          /-                   /    
|                     -----                  |         /                    |     
|                                             \      /-                     |     
|                        ----                 |     /                       |     
\                       /    \                 --\/-                        |     
 |                     /      |                                             /     
 |                    |       |                            -               |      
 |                    /       |                          -/ |              |      
 |                   |        |                     ----/   |              |      
 |                   /        |                    /       /               |      
 |                  /         |                 --/        |               |      
 |                 /          \                |           |               /      
 |                |            |               |           |              |       
 |                |            |                \          |              |       
 \                |            |                |          |              |       
  \               /            |                 \         |              |       
   \-------------/             \-                |         |               \      
                                 \               /         \               |      
                                  \-------------/           \              |      
                                                             \             /      
                                                              \-----------/       

1
Golfscript est toujours pertinent.
Nit

Ha, cela donne au panda un air enragé +1 pour avoir utilisé plus d'un personnage.
Magic Octopus Urn

6

Le code Python, repose principalement sur l'expression régulière pour effectuer la tâche.

def edge_detect(st): 
    width = len(max(st.split('\n'), key=len))       
    #Pad the image with extra blank lines above and below
    st = '{{0: <{0}}}\n{{1}}\n{{0: <{0}}}'.format(width).format('', st.rstrip('\n'))     
    return re.sub(r"""                     #Match a non space character
                      (?<=\s.{{{0}}})[^\s]|#When the char above is a space  
                      [^\s](?=.{{{0}}}\s) |#When the char below is a space       
                      (?<=\s)[^\s]|        #When the previous char is a space   
                      [^\s](?=\s)          #When the following char is a space   
                   """.format(width),                               
                   '+',                    #Replace it with edge character '+'
                   st,
                   flags=re.X|re.S).replace('*',' ')  # And finally replace all 
                                           # non-space character with spaces

*Production

>>> print edge_detect(st)
                                              +++++++++++++                      
                                          +++++          +++++                   
                                     ++++++                  +++                 
                                    +++                         ++++             
                             +++++++++                             ++            
                          ++++      +                               ++           
                     ++++++   +    ++                                ++          
                 +++++       ++    +      +++                         ++         
              ++++          ++     +     ++  +                          +        
             ++            ++     ++     +   +                    +++++  +       
           +++            ++      +     ++    +                  ++   +  ++      
          ++             ++       +     +    ++                  +    +   ++     
         ++              +        +    ++  +++                  ++     +   +     
        +               ++        +   ++  ++                    +      +   +     
       ++              ++         +   +  ++                     +      +    +    
       +               +          +    +++                       +     ++   +    
      +               ++          +                               +   ++    +    
     +                +           +                                 +++     +    
    ++                +           +                                         +    
    +                ++          ++                                         +    
   ++                +           +                                         ++    
   +                 +          ++                                         ++    
  ++                ++          +                                          + +   
 +++                +          ++                                          +  +  
 ++                 +          +                                           +  +  
 ++                ++          +                                           +  +  
 ++                +           +           +++++                           +  +  
 ++                +           +          ++   ++          ++              +  +  
 ++                 +          +          +     +         ++ ++            +  +  
 +                  +          +          ++   ++        ++   ++           +  +  
 +                  +          ++        ++  +++         ++   + +          +  +  
 +                  +          +          + +++           + +++ +          +  +  
 +                   +          +         +++               +  ++          +  +  
++     +             +           +                          ++++          ++ ++  
++    +++            +            +                                      ++  +   
+    ++  +            +           +                                     ++   +   
++ +++   +             +            +                                  ++    +   
+  +     +             +             +              +                +++     +   
+        +              +              ++          +++             +++       +   
+         +              +                ++                    ++++         +   
+         +               +               ++++++            +++++            +   
+          +              +               +     ++     ++++++                +   
+           +             +                +      ++++     +                 +   
+            +            +                +              ++                 +   
+             ++           +                +              +                 +   
+             +           ++                +              +                ++   
+              +           +                +              +                +    
+                +         +                +             ++                +    
+                 +         +               +             +                ++    
+                   +      ++               +           +++                +     
+                     ++++++                +          ++                  +     
+                      +++++                 +       +++                   +     
+                     ++     +               +      ++                     +     
 +                   ++       +                ++ +++                     ++     
 +                   +        +                   +      ++               +      
 +                  ++        +                        +++  +             +      
 +                  +         +                   ++++++    +             +      
 +                 ++         +                  ++         +             +      
 +                ++          +               ++++         ++             +      
 +               ++           +               +            +             ++      
 +               +             +              +            +             +       
 +               +             +              +            +             +       
 +               +             +               +           +             +       
  +             ++             +               +           +             +       
   ++++++++++++++              +                +          +             +       
                                 +             ++          +              +      
                                  ++++++++++++++            +             +      
                                                             +           ++      
                                                              ++++++++++++  

Un autre

print edge_detect(st)
     +++
   ++ + 
 ++   + 
+    +  
+    +  
 ++   + 
   ++ + 
     +++ 

5

Python

Utilisation de l'opération de dégradé pour identifier les bords:

from numpy import gradient, zeros
import matplotlib.pylab as plt
b = open("file").readlines()
bi = zeros((len(b),len(b[0])))
e = enumerate
for i,l in e(b):
    for j,c in e(l):
        if(c=="*"): bi[i][j]=1
g = gradient(bi,.5,.5)
g = (abs(g[0])+abs(g[1]))>=1.
plt.subplot(2,1,1)
plt.imshow(bi,cmap='Greys'), plt.show()
plt.subplot(2,1,2)
plt.imshow(g*1,cmap='Greys'), plt.show()

Sortie pour la banane et le panda:

Pour faire une sortie ASCII, la partie des tracés doit être remplacée par:

r = range
s = ""
for i in r(len(b)):
    for j in r(len(b[0])):
        if(g[i][j]!=0): 
            s+="*"
        else:
            s+=" " 
    s +="\n"
print s

Sortie ASCII:

Banane:

   *** ** 
 **** **  
***   **  
*    **   
*    **   
***   **  
 **** **  
   *** ** 

Panda:

                                          *************** ****                    
                                     ******   *************  ***                  
                                    ***   *****          ***** *****              
                             ******** *****                  ****  **             
                          ********** **                         ******            
                     ******  *      **                             ****           
                 *****    *****     **    ***                       ****          
              ****   ****** **     **    *****                       ****         
             **  *****     **      **   **   **                   **** * *        
           *******        **       **   **   **                  **********       
          ** **          **       **   **     **                **    ******      
         *****          **        **   **     **                **    ** ****     
        ****            **        **  **    ***                **      ** * *     
       ****            **         ** **    ***                 **      ** ***     
      ****            **          ** **   **                   **      **  ***    
      ***             **          **  *****                     **      ** * *    
     * *             **           **   ***                       ***   **  * *    
    ***              **           **                              ******   * *    
   ****              **           **                                ***    * *    
   * *              **            **                                       * *    
  ****              **           **                                       ****    
  * *               **           **                                       ****    
 ****              **           **                                        ** **   
** **              **           **                                        **  **  
****               **          **                                         **  **  
****              **           **          *****                          **  **  
****              **           **         **   **          **             **  **  
****              **           **        *********        *****           **  **  
****               **          **        * *   * *       *******          **  **  
* *                **          **        *********      **** ****         **  **  
* *                **           **      **  *****       ******* **        **  **  
* *                **          **        **  ***         ** **  **        **  **  
* *    *            **          **       ******           ***   **        **  **  
***   ***           **           **       ***              ******        **   **  
 **  ** **          **            **                        ****        **   **   
** ***   **          **           ***                                  **    **   
 ****    **           **           ***              *                ***     **   
  *      **           **             ****          ***             ****      **   
         **            **             ******      *****         *****        **   
          **            **               *******   ***      *******          **   
          **             **                *   ***     *********             **   
           **            **               **************   *                 **   
            **           **                **   ***  *******                 **   
             ***         **                **     ****   **                  **   
              ***         **                **            **                 **   
              **         **                 **            **                 **   
               ***        **                **            **                **    
                ***       **                **           **                 **    
                  ***      **               **          ***                 **    
                   *********                **         ***                 **     
                     ******                 **       ***                   **     
                        *****                **     ***                    **     
*                      *******               **** ***                      **     
**                    **     **               ******                       **     
**                   **      **                  *        **              **      
**                   **      **                         *****             **      
**                  **       **                    ******* **             **      
**                  **       **                   ******   **             **      
**                 **        **                ****       **              **      
**                **         **               ****        **              **      
**               **           **              **          **             **       
**               **           **              **          **             **       
**               **           **               **         **             **       
 **              **           **               **         **             **       
  ****************            ***               **        **             **       
   **************              ***              **        **              **      
                                 ****************          **             **      
                                  **************            **            **      
                                                             **          **       

Une banane? C'est un boomerang pour moi. :)
AL

4

Mathematica

En supposant qu'il pandacontient la chaîne d'origine, ce qui suit obtient les pixels des bords du contour et les remplace par "+".

t = (Most /@ Partition[Take[Characters@panda, {61, 5636}], 82]) /. {"*" -> 1, " " -> 0};
Grid[ImageData[EdgeDetect[Image[t]]] /. {1 -> "+", 0 -> " "}, Spacings -> 0]

Panda


Comment ça fonctionne

Partition[Take[Characters@panda, {61, 5636}], 82] décompose la chaîne en lignes de caractères.

Most supprime les nouveaux caractères de ligne.

Image[t]]] convertit la matrice des 0 et des 1 en une image.

EdgeDetect trouve les bords de l'image.

ImageData obtient la matrice binaire de l'image.

/. {1 -> "+", 0 -> " "} remplace chaque 0 et 1 par le caractère approprié.

Grid affiche l'art Ascii.


4

Java

Cela vérifie les lignes et les lignes s'il y a quelque chose en haut, à gauche, à droite ou en bas et en fonction de cela, choisit une valeur à partir du symbole de maintien du tableau qui est utilisé pour générer de nouveaux arts en utilisant des bords!

Exemple de sortie:

                                              /^^^^^^^^^^^\                      
                                          /^^^/          \_^^\                   
                                     /^^^^/                  \^\                 
                                    / /                         /^^\             
                             /^^^^^^ /                             \\            
                          /^^_      |                               \\           
                     /^^^^/   |     /                                \\          
                 /^^^/       /     |      /^\                         \\         
              /^^/          /      |     /   \                          /        
             //            /       /     |   |                    /^^^\  /       
           /^/            /       |     /     \                  /    |  \\      
          //             /        |     |     /                  |    |   \\     
         //              |        |    /    _/                  /      \   |     
        /               /         |   /    /                    |      |   \     
       //              /          |   \   /                     \      |    /    
       \               |          |    \_/                       \      \   |    
      /               /           |                               \_   /    |    
     /                |           |                                 \_/     |    
    //                |           |                                         |    
    |                /            /                                         |    
   //                |           |                                         /|    
   |                 |           /                                         ||    
  /|                /           |                                          | \   
 / /                |           /                                          |  \  
 ||                 |          |                                           |  |  
 ||                /           |                                           |  |  
 ||                |           |           /^^^\                           |  |  
 ||                \           |          //   \\          /\              |  |  
 |/                 |          |          |     |         // /\            |  |  
 |                  |          |          |\   //        /|   |\           |  |  
 |                  |           \        /  ^^^/         \|   | \          |  |  
 |                  \          |          |  _/           \^^^  |          |  |  
 |                   |          \         \_/               |   /          |  |  
/|     /             |           \                          \__/          /   /  
|/    / \            \            \                                      /   |   
|    /   \            \           |                                     /    |   
|\ /^    |             |           ^\                                  /     |   
| ^      |             \             \              /                /^      |   
|        |              \             ^^\          /_\             /^        |   
|         \              \               ^^\                    /^^          |   
|         |               |                _^^^\            /^^^             |   
|          \              |               |     /\     /^^^^                 |   
|           \             |                \      /^^\     |                 |   
|            \            \                |              /                  |   
|             ^\           |                \              |                 |   
|             |           /                 |              |                 /   
|              \           |                |              |                |    
|               ^\         \                |             /                 |    
|                 \         |               |             |                 /    
|                  ^\      /                |           /^                 |     
|                    ^^^^^^                 |          /                   |     
|                       _____                \       /^                    |     
\                      /     \               |      /                      |     
 |                    /       |               ^^\ /^                       /     
 |                   |        |                  ^        __              |      
 |                   /        |                         _/  |             |      
 |                  |         |                    ____/    |             |      
 |                  /         |                   /         |             |      
 |                 /          |                __/         /              |      
 |                /           \               |            |              /      
 |               |             |              |            |             |       
 |               |             |              |            |             |       
 \               |             |               \           |             |       
  \              /             |               |           |             |       
   \____________/              \_               \          |             |       
                                 \              /          \              \      
                                  \____________/            \             |      
                                                             \            /      
                                                              \__________/       
     /^\
   /^ | 
 /^   / 
/    |  
\    |  
 \_   \ 
   \_ | 
     \_\

Code:

package com.ruuhkis.asciiedge;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ASCIIEdge {

    public static void main(String[] args) {
        try {
            if (args.length > 0) {
                for (String arg : args) {
                    new ASCIIEdge().detach(new FileInputStream(new File(arg)));
                }
            } else {
                new ASCIIEdge().detach(new FileInputStream(new File("art.txt")));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private void detach(InputStream is) throws IOException {
        BufferedReader bw = new BufferedReader(new InputStreamReader(is));

        StringBuilder artBuilder = new StringBuilder(100);

        int longestLineLength = 0;
        int numLines = 0;

        String line = null;

        while ((line = bw.readLine()) != null) {
            artBuilder.append(line + System.getProperty("line.separator"));

            if (line.length() > longestLineLength) {
                longestLineLength = line.length();
            }

            numLines++;

        }

        bw.close();

        char[][] artBuffer = new char[numLines][longestLineLength];

        String[] lines = artBuilder.toString().split(
                System.getProperty("line.separator"));

        for (int i = 0; i < lines.length; i++) {
            lines[i].getChars(0, lines[i].length(), artBuffer[i], 0);
            for (int j = lines[i].length(); j < longestLineLength; j++) {
                artBuffer[i][j] = ' ';
            }
        }

        detach(artBuffer, longestLineLength, numLines);
    }

    private void detach(char[][] artBuffer, int longestLineLength, int numLines) {
        char[][] outputBuffer = new char[numLines][longestLineLength];
        for (int i = 0; i < numLines; i++) {
            for (int j = 0; j < longestLineLength; j++) {
                ;

                int horizontalEdge = isHorizontalEdge(artBuffer[i], j,
                        longestLineLength);
                int verticalEdge = isVerticalEdge(artBuffer, i, j, numLines);

                char[][] result = { { '/', '^', '\\' }, { '|', ' ', '|' },
                        { '\\', '_', '/' } };

                outputBuffer[i][j] = result[verticalEdge + 1][horizontalEdge + 1];
                ;

            }

            System.out.println(outputBuffer[i]);
        }
    }

    private int isVerticalEdge(char[][] chars, int row, int col, int numLines) {
        boolean canBeEdge = chars[row][col] != ' ';
        boolean upperEdge = row - 1 < 0 || chars[row - 1][col] == ' ';
        boolean lowerEdge = row + 1 >= numLines || chars[row + 1][col] == ' ';

        return (canBeEdge && (upperEdge || lowerEdge)) ? upperEdge ? -1 : 1 : 0;
    }

    private int isHorizontalEdge(char[] chars, int index, int length) {
        boolean canBeEdge = chars[index] != ' ';
        boolean leftEdge = index - 1 < 0 || chars[index - 1] == ' ';
        boolean rightEdge = index + 1 > length - 1 || chars[index + 1] == ' ';
        return (canBeEdge && (leftEdge || rightEdge)) ? leftEdge ? -1 : 1 : 0;
    }

}

Ps. première minuterie ici, ne soyez pas brutal: D Pps. que Panda ressemble à son triste :(


Je vous assure qu'aucun pandas n'a été blessé lors de la réalisation de cet art ASCII
Antonio Ragagnin

2

Python (ascii -> image -> filtre de bord -> ascii)

J'ai un peu triché, j'ai converti le texte ascii en une image et j'ai exécuté un filtre de détection de bord PIL dessus. Ensuite, j'ai inversé l'image et reconverti en texte ascii:

from PIL import Image, ImageFilter, ImageOps
import random
from bisect import bisect

greyscale = [" "," ",".,-","_ivc=!/|\\~","gjez2]/(YL)t[+T7Vf","mdK4ZGbNDXY5P*Q","W8KMA","#%$"]
zonebounds=[36,72,108,144,180,216,252]

f=open('input.txt', 'r')
lines=f.readlines()
f.close()

width=82
height=len(lines)

im = Image.new("RGB", (width,height), "white")
pixels = im.load()

y=0
for line in lines:
    x=0
    for px in line:
        if px != ' ' and x < width:
            pixels[x,y] = (0,0,0)
        x+=1
    y+=1

im=im.resize((width, height),Image.BILINEAR)
im=im.convert("L")
im=im.filter(ImageFilter.FIND_EDGES)
im=ImageOps.invert(im)

str=""
for y in range(0,im.size[1]):
    for x in range(0,im.size[0]):
        lum=255-im.getpixel((x,y))
        row=bisect(zonebounds,lum)
        possibles=greyscale[row]
        str=str+possibles[random.randint(0,len(possibles)-1)]
    str=str+"\n"
print str

Voici le résultat:

$#$$#%$$$$$$%%$$$%$$$$%$###%%#%%%$##$$$%%#$#%#              $%%%%$$%$###$$%%%##%##
%                                   $%%$$$     %#$%$$$#$$     $%#               # 
%                                  %%      $%$#$        $$$$%   %#%#%           # 
%                           %$#$%%$$   #%$$%                %%%%    %$          # 
$                        #$$$         %$                       $###  #%         $ 
%                   #%$#$#           $%                           %#  #$        # 
#               #%$%#      $##       $   $%%$%                     $$  $%       # 
%            $%#%     $##%$%$       ##  $%   %#                     $$  %$      $ 
%           %$    %$%$$   %#        $   #     #                  $#$#$$$ $$     % 
%         $%#  $##%      ##         #  #%     %$                #$     #% %%    % 
%        #$   #$        %$         %$  #       %                $      $$  $$   # 
#       $%  $%#         %          #  ##       #               $%      %#%  $   # 
%      #%  #%          %#          # $$       $%               $        $$# $   % 
%     #% $$%          %%           % $      $%#                #        % $ ##  $ 
%     $  %            #            # %     %%                  %        #$#$ #  # 
%    $% $%           #%            % %$   #%                   %%        # $ %  % 
$   $$ %$            %             #  %#$%%                     ##      $$ # $  % 
#  $% #$             $             $                             #$$   $%  % $  $ 
%  %  %             #%             #                               %$#%#   $ $  % 
# $$ #%             $              #                                      ## #  % 
$ %  #              $             #$                                      #  $  % 
%$$ ##             %#             %                                       $  $$ # 
$$  %              #             $%                                       #   #$% 
$   $              %             %                                        %    $# 
$  %#             #%            $%                                        #    #$ 
%  %              #             $         #%$##%$                         %    %# 
$  $              #             $        $%     $#        %#%%            #    %% 
#  %              #             #        %  $%$  %       %%  %%#          %    $# 
%  #              #%            #        # ## $# #      %#  %  %$         $    #$ 
$ $%               %            $%      $%  $$$  %      $  #$#  %#        %    #$ 
# %                $             $      #       $%      $  #$%   %        $    $$ 
% %                $            $%      %#     ##       $$       $        #    ## 
% #   ###          %#            #%      $   %%$         #$%     #       %#    %% 
  #  %% $#          #             ##     ##%$#             #    %#      $$     %# 
  % %%   $$         %              %                       ##$%$#      %%     #%% 
 #%$%     #         #$             ##%                                %#      % % 
  %       %          %%              $#            %#%              $%$       $ % 
          $           #               $$$%        #$ %$           %##         $ # 
          #%          $%                 %$#%     %   $        %%$#           # $ 
           %           ##                   #%##$ #$#$$    %#%%%              % % 
           $%           $%                      $##   %##$$%                  # % 
            %#           %                 ##$##  ##$#$                       % # 
             $%          #                  %  %#$    $$#%#                   # % 
              #%%        %                  ##   %$##$%  #                    # $ 
                %        %$                  $           %$                   % % 
               %%        #                   $            %                   $ # 
                %%#      #%                  #           ##                  $$ $ 
                  %$      $                  %           #                   %  % 
                   %##    #%                 $         %#$                   #  # 
                     %#$##%                  $        #%                    %$  $ 
                                             $$     #%$                     $   # 
                                              #    ##                       #   $ 
                        #%%$%                 $%#%$%                        %   $ 
#                      $%   %$                   #                          %   $ 
#                     %#     #                                             $#   % 
%                     #      %                            $#               $    $ 
%                    %#      #                          #$#%               $    % 
$                    $       #                     %%%$#$ #$               %    # 
$                   $%       $                    %%      $                $    % 
#                  #$        %                 #%#%       %                $    % 
%                 $%         ##                #          %               #$    $ 
%                 #           #                %$         %               #     # 
$                 #           $                 #         #               %     % 
%$                #           $                 %$        %               $     # 
##%              #%           %                  #        $               %$    % 
# ##%#%$$#%#%$$#%#            #%$                #        %                #    % 
#                               ##              ##        $#               $    # 
%                                $##$#%$#$$$#$$%%          $$              #    % 
$#%#$#$$#$##$%#$%#$$$$%#$#%%#$%#$$#%%%%$%%$%$#%$##%%$#$$##%#$%            #$%$$$$$

Sources citées (pour la conversion de l'image en niveaux de gris en ascii): http://stevendkay.wordpress.com/2009/09/08/generating-ascii-art-from-photographs-in-python/


Je l'aime! J'ai essayé une fois de le faire uniquement en utilisant des commandes: convert(pour convertir l'art ASCII en image); GIMP-ligne de commande (pour effectuer la détection des bords); et aplay(pour rendre l'image dans l'art ASCII). mais a échoué: p (et bienvenue à Codegolf)
Antonio Ragagnin

2
Merci! Je me suis dit, comment puis-je tirer parti de tout le travail qui a déjà été effectué sur la convolution d'image avec un minimum de retouches. Je voulais aussi sortir plus d'un type de caractère pour "mélanger" les lignes de texte, cela lui donne une sensation plus rétro. Les artistes ascii dessinaient avec des programmes de peinture de texte et utilisaient différents symboles pour créer des motifs comme celui-ci. Sur une note connexe, il y avait aussi une version de Quake qui a redessiné les pixels en ascii. C'était très surréaliste.
blakesteel

1

k4

c'est une version paresseuse qui trouve juste les bords, elle n'essaye pas de trouver la forme dominante et de choisir un caractère approprié

l '"algo" consiste simplement à trouver toutes les cellules qui diffèrent de celle à gauche ou au-dessus, puis d'utiliser la magie du langage de tableau pour transformer la matrice booléenne en art ASCII

il y a un hack mineur pour garnir le début de tout avec un espace supplémentaire, ou il considérerait la gauche et le haut comme des "bords" - de cette façon, il le fait toujours, mais je peux simplement le laisser plus tard

$ cat o.k
f:{(1_~~':" ",)'x}
g:{(f x)|+f@+x}
h:{-1" +"g@0:`$,/$x;}

h@*.z.x
\\
$ 

plus ou moins la même sortie que l'échantillon dans la spécification

le voici sur le boomerang / banane:

$ cat b.txt
     ***
   ****
 ******
******
******
 ******
   ****
     ***
$ q o.k -q b.txt
     +++
   ++  +
 ++    +
+     +
+     +
++    ++
 +++   +
   +++ +
$ 

1

Python

Il s'agit d'une version Python très simple du filtre "passe-haut" :). Il vérifie si un pixel est au moins entouré de ses 4 côtés. C'est l'un de mes premiers codes Python, alors soyez subtil ...

import sys
s = open("ascii.txt",'r').read().split("\n")
def px(x,y):
  try:
    v = s[x][y]
  except IndexError:
    v = ' '
  return v
def r(x,y):
  return '{:<3}'.format(s[x][y-1:y+2])
def v(x,y):
  return (px(x,y)==' ' or r(x,y)=='***' and px(x-1,y)=='*' and px(x+1,y)=='*') and ' ' or '*'
for row in range(len(s)):
  for cell in range(len(s[row])):
    sys.stdout.write(v(row,cell))
  print

Production:

                                              *************
                                          *****          *****                   
                                     ******                  ***                 
                                    * *                         ****             
                             ******* *                             **            
                          ****      *                               **           
                     ******   *     *                                **          
                 *****       *     *      ***                         **         
              ****          *      *     *   *                          *        
             **            *       *     *   *                    *****  *       
           ***            *       *     *     *                  *    *  **      
          **             *        *     *     *                  *    *   **     
         **              *        *    *    **                  *      *   *     
        *               *         *   *    *                    *      *   *     
       **              *          *   *   *                     *      *    *    
       *               *          *    ***                       *      *   *    
      *               *           *                               **   *    *    
     *                *           *                                 ***     *    
    **                *           *                                         *    
    *                *            *                                         *    
   **                *           *                                         **    
   *                 *           *                                         **    
  **                *           *                                          * *   
 * *                *           *                                          *  *  
 **                 *          *                                           *  *  
 **                *           *                                           *  *  
 **                *           *           *****                           *  *  
 **                *           *          **   **          **              *  *  
 **                 *          *          *     *         ** **            *  *  
 *                  *          *          **   **        **   **           *  *  
 *                  *           *        *  ****         **   * *          *  *  
 *                  *          *          *  **           ****  *          *  *  
 *                   *          *         ***               *   *          *  *  
**     *             *           *                          ****          *   *  
**    * *            *            *                                      *   *   
*    *   *            *           *                                     *    *   
** **    *             *           **                                  *     *   
* *      *             *             *              *                **      *   
*        *              *             ***          ***             **        *   
*         *              *               ***                    ***          *   
*         *               *                *****            ****             *   
*          *              *               *     **     *****                 *   
*           *             *                *      ****     *                 *   
*            *            *                *              *                  *   
*             **           *                *              *                 *   
*             *           *                 *              *                 *   
*              *           *                *              *                *    
*               **         *                *             *                 *    
*                 *         *               *             *                 *    
*                  **      *                *           **                 *     
*                    ******                 *          *                   *     
*                       *****                *       **                    *     
*                      *     *               *      *                      *     
 *                    *       *               *** **                       *     
 *                   *        *                  *        **              *      
 *                   *        *                         **  *             *      
 *                  *         *                    *****    *             *      
 *                  *         *                   *         *             *      
 *                 *          *                ***         *              *      
 *                *           *               *            *              *      
 *               *             *              *            *             *       
 *               *             *              *            *             *       
 *               *             *               *           *             *       
  *              *             *               *           *             *       
   **************              **               *          *             *       
                                 *              *          *              *      
                                  **************            *             *      
                                                             *            *      
                                                              ************   

Pouvez-vous s'il vous plaît ajouter la sortie?
AL

1
Wow, merci pour le formatage. Impossible de trouver la mise en surbrillance Python. Sortie ajoutée.
avall

Je vous en prie. :) AFAIK, la mise en évidence nécessite d'utiliser l'extension de fichier de la langue:<!-- language: lang-py -->
AL

1

R

Pour chaque point de la matrice, masquez le caractère s'il est entouré d'astérisques à droite, à gauche, en haut et en bas. C'est naïf mais ça marche très bien.

text = scan(commandArgs(T)[1], what='raw', sep="\n", quiet=T)

height = length(text); width = max(sapply(text, nchar))

mat_2 = mat = matrix(unlist(strsplit(text, '')), height, width, byrow=T)

for (y in 1:nrow(mat_2)) {
    for (x in 1:ncol(mat_2)) {
        if (
            ((x < ncol(mat)) && (mat[y, x + 1] == '*')) # right
            &&
            ((x > 1) && (mat[y, x - 1] == '*')) # left
            &&
            ((y > 1) && (mat[y - 1, x] == '*')) # top
            &&
            ((y < nrow(mat)) && (mat[y + 1, x] == '*')) # bottom
        ) {
            mat_2[y,x] = ' '
        }
    }
}

for (a in 1:nrow(mat_2)) {
    cat(paste(mat_2[a,], collapse=""), "\n")
}

Usage: Rscript script.r input_.txt

Production

                                              *************                       
                                          *****          *****                    
                                     ******                  ***                  
                                    * *                         ****              
                             ******* *                             **             
                          ****      *                               **            
                     ******   *     *                                **           
                 *****       *     *      ***                         **          
              ****          *      *     *   *                          *         
             **            *       *     *   *                    *****  *        
           ***            *       *     *     *                  *    *  **       
          **             *        *     *     *                  *    *   **      
         **              *        *    *    **                  *      *   *      
        *               *         *   *    *                    *      *   *      
       **              *          *   *   *                     *      *    *     
       *               *          *    ***                       *      *   *     
      *               *           *                               **   *    *     
     *                *           *                                 ***     *     
    **                *           *                                         *     
    *                *            *                                         *     
   **                *           *                                         **     
   *                 *           *                                         **     
  **                *           *                                          * *    
 * *                *           *                                          *  *   
 **                 *          *                                           *  *   
 **                *           *                                           *  *   
 **                *           *           *****                           *  *   
 **                *           *          **   **          **              *  *   
 **                 *          *          *     *         ** **            *  *   
 *                  *          *          **   **        **   **           *  *   
 *                  *           *        *  ****         **   * *          *  *   
 *                  *          *          *  **           ****  *          *  *   
 *                   *          *         ***               *   *          *  *   
**     *             *           *                          ****          *   *   
**    * *            *            *                                      *   *    
*    *   *            *           *                                     *    *    
** **    *             *           **                                  *     *    
* *      *             *             *              *                **      *    
*        *              *             ***          ***             **        *    
*         *              *               ***                    ***          *    
*         *               *                *****            ****             *    
*          *              *               *     **     *****                 *    
*           *             *                *      ****     *                 *    
*            *            *                *              *                  *    
*             **           *                *              *                 *    
*             *           *                 *              *                 *    
*              *           *                *              *                *     
*               **         *                *             *                 *     
*                 *         *               *             *                 *     
*                  **      *                *           **                 *      
*                    ******                 *          *                   *      
*                       *****                *       **                    *      
*                      *     *               *      *                      *      
 *                    *       *               *** **                       *      
 *                   *        *                  *        **              *       
 *                   *        *                         **  *             *       
 *                  *         *                    *****    *             *       
 *                  *         *                   *         *             *       
 *                 *          *                ***         *              *       
 *                *           *               *            *              *       
 *               *             *              *            *             *        
 *               *             *              *            *             *        
 *               *             *               *           *             *        
  *              *             *               *           *             *        
   **************              **               *          *             *        
                                 *              *          *              *       
                                  **************            *             *       
                                                             *            *       
                                                              ************  
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.