Rilevazione dei bordi ASCII ART


19

Come dice il titolo, stavo pensando di contestare in cui bisogna rilevare i bordi di un'arte ASCII.

Il codice dovrebbe accettare un'arte ASCII in bianco e nero come input. A B / W ASCII art è definito come (da me) un ASCII art con un solo tipo di carattere non-bianco-spazi (nel nostro caso: un asteriks *). E poiché l' output produce un'arte ASCII standard ( sono accettati tutti i caratteri ASCII ) che dovrebbe ricordare il contorno del primo.

Lo scopo di utilizzare più di un carattere nell'output è di rendere alcuni bordi più lisci. Ad esempio, si potrebbe lasciare questo input

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

potrebbe diventare:

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

L'input ha \nseparato la stringa come input. Ogni riga ha un massimo di 80caratteri. Il numero di righe non è specificato.

Questo è il mio programma Python3 di esempio:

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))

Ingresso:

Qui sotto ho inserito entrambi gli input dei programmi. È un'ARTE ASCII 80x70. Significa che ha 70 righe di 80 caratteri, ognuna separata da \n.

Questo file di input contiene solo spazi e asterisco *, ha un massimo di 80 colonne come ogni arte ASCII .

Se trovi un'arte più bella fammelo sapere!

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

Uscita possibile:

Un possibile output potrebbe essere:

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

Questo è anche l'output prodotto dallo script sopra. Ovviamente non è il risultato migliore e sono sicuro che uno può facilmente produrne uno più liscio.

È un concorso di popolarità poiché spero che i voti siano proporzionali all'eleganza e alla qualità dei risultati! (Suppongo anche che si possano ottenere buoni risultati combinando aplaye gimp-cli) Non ci sono regole rigide su come dovrebbe essere l'output ... basta usare la tua fantasia!


Si prega di definire l'input che verrà utilizzato in tutte le risposte per confrontarle. Il panda è troppo grande IMHO.
AL

La lunghezza di ciascuna riga dell'ingresso deve essere costante? La prima riga del panda è più corta delle altre (alla fine mancano gli spazi).
AL

Il file di input contiene solo un carattere e spazi?
AL

Grazie per le tue domande, non credo che il panda sia troppo grande: ha 80 colonne come ogni arte ASCII. Non l'ho detto, ma il numero massimo di colonne dovrebbe essere 80. Sì, il file di input contiene solo gli asterischi e lo spazio. Grazie ancora, ho aggiunto queste informazioni alla domanda.
Antonio Ragagnin,

Questo è un panda? Ho pensato che fosse snoopy ....
Justin il

Risposte:


14

GolfScript

Ho pensato che il golf fosse popolare su questo sito, quindi un invio GolfScript si adatta sempre a un concorso di popolarità.

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

Puoi provare il codice con la tua arte ASCII qui . Si noti che è necessario che tutte le linee abbiano la stessa lunghezza.

Esempio:

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

1
Golfscript è sempre rilevante.
Nit

Ah fa sembrare panda infuriato +1 per aver usato più di 1 personaggio.
Magic Octopus Urn,

6

Il codice Python si basa principalmente su regex per eseguire l'attività.

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

*Produzione

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

Un altro

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

5

Pitone

Utilizzo dell'operazione di gradiente per identificare i bordi:

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()

Uscita per banana e panda:

Per creare un output ASCII, la parte dei grafici deve essere sostituita con:

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

Uscita ASCII:

Banana:

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

Panda:

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

Una banana? È un boomerang per me. :)
AL

4

matematica

Supponendo che pandacontenga la stringa originale, quanto segue ottiene i pixel dei bordi del contorno e li sostituisce con "+".

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

panda


Come funziona

Partition[Take[Characters@panda, {61, 5636}], 82] spezza la stringa in righe di caratteri.

Most rimuove i nuovi caratteri di riga.

Image[t]]] converte la matrice di 0 e 1 in un'immagine.

EdgeDetect trova i bordi dell'immagine.

ImageData ottiene la matrice binaria dell'immagine.

/. {1 -> "+", 0 -> " "} sostituisce ogni 0 e 1 con il carattere appropriato.

Grid mostra l'arte di Ascii.


4

Giava

Controlla le righe e le righe se c'è qualcosa in alto, a sinistra, a destra o in basso e in base a quello seleziona un valore dal simbolo che tiene l'array che viene utilizzato per generare nuova arte usando i bordi!

Esempio di output:

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

Codice:

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. primo timer qui, non essere difficile: D Pps. che Panda sembra triste :(


Ti assicuro che nessun panda è stato danneggiato durante la realizzazione di questa arte ASCII
Antonio Ragagnin,

2

Python (ascii -> immagine -> filtro bordo -> ascii)

Ho un po 'tradito, ho convertito il testo ASCII in un'immagine e ho eseguito il filtro di rilevamento del bordo PIL su di esso. Quindi, ho invertito l'immagine e convertito nuovamente in testo 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

Ecco il risultato:

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

Fonti citate (per la conversione in scala di grigi dell'immagine in ascii): http://stevendkay.wordpress.com/2009/09/08/generating-ascii-art-from-photographs-in-python/


Mi piace! Una volta ho provato a farlo solo usando i comandi: convert(per convertire l'arte ASCII in immagine); GIMP-command-line (per eseguire il rilevamento dei bordi); e aplay(per rendere l'immagine nell'arte ASCII). ma fallito: p (e benvenuto su Codegolf)
Antonio Ragagnin,

2
Grazie! Ho pensato a me stesso, come posso sfruttare tutto il lavoro che è già stato condotto sulla convoluzione dell'immagine con una rielaborazione minima. Volevo anche produrre più di un tipo di carattere per "fondere" le righe di testo, questo gli conferiva un aspetto più retrò. Gli artisti Ascii erano soliti disegnare con programmi di pittura del testo e usare simboli diversi per creare modelli come questo. Su una nota correlata, c'era anche una versione di Quake che ridisegnava i pixel in ascii. È stato molto surreale.
Blakesteel,

1

k4

questa è una versione pigra che trova solo i bordi, non cerca di trovare la forma prevalente e scegliere un carattere appropriato

"algo" è solo per trovare tutte le celle che differiscono da quella a sinistra o in alto, quindi usare la magia del linguaggio array per trasformare la matrice booleana in arte ASCII

c'è un piccolo trucco per riempire l'inizio di tutto con uno spazio extra, o considererebbe la parte superiore e sinistra come "spigoli" - in questo modo lo fa ancora, ma posso semplicemente abbandonarlo più tardi

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

h@*.z.x
\\
$ 

più o meno lo stesso output del campione nelle specifiche

eccolo sul boomerang / banana:

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

1

Pitone

Questa è una versione Python molto semplice del filtro "passa-alto" :). Verifica se almeno un pixel è circondato dai suoi 4 lati. Questo è uno dei miei primi codici Python in assoluto, quindi per favore sii sottile ...

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

Produzione:

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

Potete per favore aggiungere l'output?
AL

1
Caspita, grazie per la formattazione. Impossibile trovare l'evidenziazione di Python. Uscita aggiunta.
avall

Prego. :) AFAIK, l'evidenziazione richiede di utilizzare l'estensione del file della lingua:<!-- language: lang-py -->
AL

1

R

Per ogni punto della matrice, nascondi il personaggio se è circondato da asterischi a destra, a sinistra, in alto e in basso. Questo è ingenuo ma funziona molto bene.

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")
}

Uso: Rscript script.r input_.txt

Produzione

                                              *************                       
                                          *****          *****                    
                                     ******                  ***                  
                                    * *                         ****              
                             ******* *                             **             
                          ****      *                               **            
                     ******   *     *                                **           
                 *****       *     *      ***                         **          
              ****          *      *     *   *                          *         
             **            *       *     *   *                    *****  *        
           ***            *       *     *     *                  *    *  **       
          **             *        *     *     *                  *    *   **      
         **              *        *    *    **                  *      *   *      
        *               *         *   *    *                    *      *   *      
       **              *          *   *   *                     *      *    *     
       *               *          *    ***                       *      *   *     
      *               *           *                               **   *    *     
     *                *           *                                 ***     *     
    **                *           *                                         *     
    *                *            *                                         *     
   **                *           *                                         **     
   *                 *           *                                         **     
  **                *           *                                          * *    
 * *                *           *                                          *  *   
 **                 *          *                                           *  *   
 **                *           *                                           *  *   
 **                *           *           *****                           *  *   
 **                *           *          **   **          **              *  *   
 **                 *          *          *     *         ** **            *  *   
 *                  *          *          **   **        **   **           *  *   
 *                  *           *        *  ****         **   * *          *  *   
 *                  *          *          *  **           ****  *          *  *   
 *                   *          *         ***               *   *          *  *   
**     *             *           *                          ****          *   *   
**    * *            *            *                                      *   *    
*    *   *            *           *                                     *    *    
** **    *             *           **                                  *     *    
* *      *             *             *              *                **      *    
*        *              *             ***          ***             **        *    
*         *              *               ***                    ***          *    
*         *               *                *****            ****             *    
*          *              *               *     **     *****                 *    
*           *             *                *      ****     *                 *    
*            *            *                *              *                  *    
*             **           *                *              *                 *    
*             *           *                 *              *                 *    
*              *           *                *              *                *     
*               **         *                *             *                 *     
*                 *         *               *             *                 *     
*                  **      *                *           **                 *      
*                    ******                 *          *                   *      
*                       *****                *       **                    *      
*                      *     *               *      *                      *      
 *                    *       *               *** **                       *      
 *                   *        *                  *        **              *       
 *                   *        *                         **  *             *       
 *                  *         *                    *****    *             *       
 *                  *         *                   *         *             *       
 *                 *          *                ***         *              *       
 *                *           *               *            *              *       
 *               *             *              *            *             *        
 *               *             *              *            *             *        
 *               *             *               *           *             *        
  *              *             *               *           *             *        
   **************              **               *          *             *        
                                 *              *          *              *       
                                  **************            *             *       
                                                             *            *       
                                                              ************  
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.