Como dice el título, estaba pensando en disputar en el que uno debe detectar los bordes de un arte ASCII.
El código debe aceptar un arte ASCII B / N como entrada. Un arte ASCII en B / N se define como (por mí) un arte ASCII con un solo tipo de carácter que no son espacios en blanco (en nuestro caso: un asterisco *
). Y como salida produce un arte ASCII estándar ( se aceptan todos los caracteres ASCII ) que debe recordar el contorno del primero.
El propósito de usar más de un carácter en la salida es hacer que algunos bordes sean más suaves. Por ejemplo, uno podría dejar que esta entrada
***
****
******
******
******
******
****
***
podría convertirse en:
___
_/ )
_/ /
/ |
| /
| \
\ |
`\ |
\___)
La entrada \n
separó la cadena como entrada. Cada línea tiene un máximo de 80
caracteres. El número de filas no está especificado.
Este es mi programa Python3 de muestra:
import fileinput as f
import re as r
import copy as c
a,s,p='*',' ','+'
def read(n):
s=[list(' '*n)]
for l in f.input():
if(len(l)>n):l=l[:n]
k=list(r.sub('[^ ^\%c]'%a,'',' '+l+' '))
s.append(k+[' ']*(n-len(k)))
s.append([' ']*n)
return s
def np(s):
s=c.deepcopy(s)
for l in s[1:-1]:
for w in l[1:-1]: print(w,end='')
print()
def grow(i):
o=c.deepcopy(i)
for x in range(1,len(o)-1):
for y in range(1,len(o[x])-1):
if(i[x][y]==a): o[x-1][y-1]=o[x-1][y+1]=o[x-1][y]=o[x+1][y]=o[x+1][y-1]=o[x+1][y+1]=o[x][y+1]=o[x][y-1]=a
return o
def diff(i,o):
c=[]
for x in range(0,len(i)):
l=[]
for y in range(0,len(i[x])):
if(i[x][y]==a and o[x][y]==s): l.append(p)
else: l.append(s)
c.append(l)
return c
I=read(80)
np(diff(grow(I),I))
Entrada:
Aquí debajo pongo ambas entradas de los programas. Es un ARTE ASCII 80x70. Significa que tiene 70 líneas de 80 caracteres, cada una separada por \n
.
Este archivo de entrada contiene solo espacios y el asterisco *
, tiene un máximo de 80 columnas como cada arte ASCII .
Si encuentras un mejor arte, ¡házmelo saber!
*************
***** *****
****** ***
*** ****
********* **
*********** **
****** ******* **
***** ******* *** **
**** ******** ***** *
** ********* ***** ***** *
*** ********* ******* ****** **
** ********** ******* ****** **
** ********** ******* ******** *
* *********** ****** ******** *
** ************ ***** ******** *
* ************ *** ******** *
* ************* ****** *
* ************* *** *
** ************* *
* ************** *
** ************* **
* ************* **
** ************* ***
*** ************* ****
** ************ ****
** ************* ****
** ************* ***** ****
** ************* ** ** ** ****
** ************ * * ** ** ****
* ************ ** ** ** ** ****
* ************* ******* ** *** ****
* ************ ***** ******* ****
* ************ *** ***** ****
** * ************* **** *****
** *** ************** *****
* ***** ************* ******
** ******* ************** *******
********** *************** * *********
********** ***************** *** ***********
*********** ******************* **************
*********** ********************** ******************
************ ***************** ** ***********************
************* ****************** **** *******************
************** ****************** ********************
**************** ****************** *******************
*************** ******************* *******************
**************** ****************** ******************
****************** ****************** *******************
******************* ***************** *******************
********************* ****************** ********************
********************************************* *********************
********************************************** ***********************
************************ ***************** ************************
********************** ******************* **************************
********************* *********************************************
********************* **************************** ***************
******************** ************************** ***************
******************** ********************* ***************
******************* ******************** ****************
****************** ***************** ****************
***************** **************** ***************
***************** **************** ***************
***************** ***************** ***************
**************** ***************** ***************
************** ****************** ***************
**************** ****************
************** ***************
**************
************
Salida posible:
Un posible resultado podría ser:
+++++ ++++
++++++ ++++++++++ +++
++ +++++ +++++ +++++
++++++++ +++++ ++++ ++
++++ ++ ++++ ++
++++++ ++ ++ ++
+++++ +++ + +++++ ++ ++
++++ +++++++ ++ ++ ++ ++ ++
++ +++++ ++ + + + +++++++ ++
+++ ++++ ++ + ++ ++ ++ ++ ++
++ ++ ++ ++ + + + ++ ++
++ +++ + + ++ + ++ +++ +
++ ++ ++ + ++ ++ + +++ +
++ +++ ++ + + +++ + + + ++
+ + + + + ++ + ++++ +
++ ++ ++ + ++ ++ ++ + + +
++ ++ + + +++++ ++ ++ + +
++ ++ + + +++ ++ + +
+ + ++ + +++++ + +
++ ++ + + ++ +
+ + + ++ + +
++ ++ ++ + + ++
++ + + ++ + ++
+ + + + + +
+ ++ ++ ++ + +
+ + + + +++++++ + +
+ + + + ++ ++ ++++ + +
+ + + + + +++ + ++ +++ + +
+ + ++ + + ++ ++ + ++ + ++ + +
+ ++ + ++ ++ +++ + + +++ ++ + +
+ + + + + ++ + +++ + + +
+ + + ++ ++ ++ ++ + + +
+ + +++ ++ ++ + +++ +++ + ++ +
+ ++ ++ + ++ +++++ + ++ ++ +
+ ++ ++ + + ++++++ ++ ++
++++ + ++ +++ ++ +
+ + ++ ++ +++ +++ +
+ + ++++ ++ ++ +++ +
++ ++ ++++ + + ++++ +
+ ++ +++++ +++++ +++++ +
++ ++ +++ ++++++ +
++ + +++++ +++++ +
++ + + +++ +++++ +
+++ + ++ ++++++ + +
+ ++ + ++ +
++ + + + +
+++ ++ + ++ ++
++ + + + +
+++ ++ + +++ +
++++++ + ++ ++
++ +++ +
+ ++ +
+++++ ++++++ +
+ ++ ++ + +
+ ++ + ++
+ + + ++ +
+ ++ + ++++ +
+ + + ++++++ ++ +
+ ++ + ++ + +
+ ++ + ++++ + +
+ ++ ++ + + ++
+ + + ++ + +
+ + + + + +
++ + + ++ + +
++ ++ + + + ++
++++++++++++++++ +++ + + +
++ ++ ++ +
++++++++++++++++ ++ +
++ ++
++++++++++++++
Este es también el resultado producido por el script anterior. Por supuesto, no es el mejor resultado y estoy seguro de que uno puede producir fácilmente uno más suave.
Es un concurso de popularidad ya que, ¡espero que los votos sean proporcionales a la elegancia y la calidad de los resultados! (También supongo que se pueden obtener buenos resultados combinando aplay
y gimp-cli
) No hay reglas estrictas sobre cómo debería ser la salida ... ¡solo use su fantasía!
fuente
Respuestas:
GolfScript
Pensé que el golf es popular en este sitio, por lo que una presentación de GolfScript siempre se ajusta a un concurso de popularidad.
Puedes probar el código con tu propio arte ascii aquí . Tenga en cuenta que se requiere que todas las líneas tengan la misma longitud.
Ejemplo:
fuente
El código Python, se basa principalmente en expresiones regulares para hacer la tarea.
*Salida
Otro
fuente
Pitón
Uso de la operación de gradiente para identificar bordes:
Salida para el plátano y el panda:
Para hacer una salida ASCII, la parte de los gráficos debe reemplazarse con:
Salida ASCII:
Plátano:
Panda:
fuente
Mathematica
Suponiendo que
panda
contiene la cadena original, lo siguiente obtiene los píxeles de los bordes del contorno y los reemplaza con "+".Cómo funciona
Partition[Take[Characters@panda, {61, 5636}], 82]
rompe la cadena en líneas de caracteres.Most
elimina los nuevos caracteres de línea.Image[t]]]
convierte la matriz de 0 y 1 en una imagen.EdgeDetect
encuentra los bordes de la imagen.ImageData
Obtiene la matriz binaria de la imagen./. {1 -> "+", 0 -> " "}
reemplaza cada 0 y 1 con el carácter apropiado.Grid
muestra el arte Ascii.fuente
Java
¡Esto verifica líneas y filas si hay algo en la parte superior, izquierda, derecha o inferior y, en función de eso, selecciona un valor del símbolo de retención de matriz que se utiliza para generar un nuevo arte usando bordes!
Salida de ejemplo:
Código:
PD. primer temporizador aquí, no seas rudo: D Pps. que Panda parece triste :(
fuente
Python (ascii -> imagen -> filtro de borde -> ascii)
Hice trampa, convertí el texto ascii en una imagen y ejecuté el filtro de detección de borde PIL en él. Luego, invertí la imagen y la convertí de nuevo a texto ascii:
Aquí está el resultado:
Fuentes citadas (para la conversión de imagen en escala de grises a ASCII): http://stevendkay.wordpress.com/2009/09/08/generating-ascii-art-from-photographs-in-python/
fuente
convert
(para convertir el arte ASCII en imagen);GIMP
-command-line (para realizar la detección de bordes); yaplay
(para representar la imagen en el arte ASCII). pero falló: p (y bienvenido a Codegolf)k4
Esta es una versión perezosa que solo encuentra los bordes, no trata de encontrar la forma predominante y elegir un personaje apropiado
el "algo" es solo para encontrar todas las celdas que difieren de la que está a la izquierda o arriba, luego usa la magia de lenguaje de matriz para convertir la matriz booleana de nuevo en arte ASCII
hay un truco menor para rellenar el comienzo de todo con un espacio adicional, o consideraría que la izquierda y la parte superior son "bordes", de esta manera todavía lo hace, pero puedo dejarlo más tarde
más o menos la misma salida que la muestra en la especificación
aquí está en el boomerang / banana:
fuente
Pitón
Esta es una versión muy simple de Python del filtro de "paso alto" :). Comprueba si un píxel está rodeado al menos por sus 4 lados. Este es uno de mis primeros códigos de Python, así que sé sutil ...
Salida:
fuente
<!-- language: lang-py -->
R
Para cada punto de la matriz, oculte el carácter si está rodeado de asteriscos a la derecha, izquierda, arriba y abajo. Esto es ingenuo pero funciona muy bien.
Uso:
Rscript script.r input_.txt
Salida
fuente