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 \n
chaîne séparée en entrée comme entrée. Chaque ligne a un maximum de 80
caractè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 aplay
et gimp-cli
) Il n'y a pas de règles strictes sur la façon dont la sortie doit être .. utilisez simplement votre fantaisie!
la source
Réponses:
GolfScript
Je pensais que le golf est populaire sur ce site, donc une soumission GolfScript convient toujours à un concours de popularité.
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:
la source
Le code Python, repose principalement sur l'expression régulière pour effectuer la tâche.
*Production
Un autre
la source
Python
Utilisation de l'opération de dégradé pour identifier les bords:
Sortie pour la banane et le panda:
Pour faire une sortie ASCII, la partie des tracés doit être remplacée par:
Sortie ASCII:
Banane:
Panda:
la source
Mathematica
En supposant qu'il
panda
contient la chaîne d'origine, ce qui suit obtient les pixels des bords du contour et les remplace par "+".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.la source
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:
Ps. première minuterie ici, ne soyez pas brutal: D Pps. que Panda ressemble à son triste :(
la source
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:
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/
la source
convert
(pour convertir l'art ASCII en image);GIMP
-ligne de commande (pour effectuer la détection des bords); etaplay
(pour rendre l'image dans l'art ASCII). mais a échoué: p (et bienvenue à Codegolf)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
plus ou moins la même sortie que l'échantillon dans la spécification
le voici sur le boomerang / banane:
la source
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 ...
Production:
la source
<!-- language: lang-py -->
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.
Usage:
Rscript script.r input_.txt
Production
la source