Jak mówi tytuł, zastanawiałem się nad konkursem, w którym trzeba wykryć krawędzie sztuki ASCII.
Kod powinien akceptować obraz czarno-biały ASCII jako dane wejściowe. B / W ASCII Art jest zdefiniowany jako (przeze mnie) na sztuki ASCII tylko z jednym rodzajem charakterze non-biało-przestrzenie (w naszym przypadku: gwiazdką *
). I jako wynik generuj standardową grafikę ASCII (wszystkie znaki ASCII są akceptowane), która powinna pamiętać kontur pierwszego.
Celem użycia więcej niż jednego znaku na wyjściu jest uczynienie niektórych krawędzi ssmoother. Na przykład można pozwolić na to wejście
***
****
******
******
******
******
****
***
może stać się:
___
_/ )
_/ /
/ |
| /
| \
\ |
`\ |
\___)
Wejście \n
oddzielone ciąg jako wejście. Każda linia ma maksymalną liczbę 80
znaków. Liczba wierszy nie jest określona.
To jest mój przykładowy program 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))
Wejście:
Tutaj poniżej umieszczam oba wejścia programów. To jest sztuka 80x70 ASCII. Oznacza to, że ma 70 wierszy po 80 znaków, z których każdy jest oddzielony \n
.
Ten plik wejściowy zawiera tylko spacje i gwiazdkę *
, ma maksymalnie 80 kolumn jak każda sztuka ASCII .
Jeśli znajdziesz ładniejszą sztukę, daj mi znać!
*************
***** *****
****** ***
*** ****
********* **
*********** **
****** ******* **
***** ******* *** **
**** ******** ***** *
** ********* ***** ***** *
*** ********* ******* ****** **
** ********** ******* ****** **
** ********** ******* ******** *
* *********** ****** ******** *
** ************ ***** ******** *
* ************ *** ******** *
* ************* ****** *
* ************* *** *
** ************* *
* ************** *
** ************* **
* ************* **
** ************* ***
*** ************* ****
** ************ ****
** ************* ****
** ************* ***** ****
** ************* ** ** ** ****
** ************ * * ** ** ****
* ************ ** ** ** ** ****
* ************* ******* ** *** ****
* ************ ***** ******* ****
* ************ *** ***** ****
** * ************* **** *****
** *** ************** *****
* ***** ************* ******
** ******* ************** *******
********** *************** * *********
********** ***************** *** ***********
*********** ******************* **************
*********** ********************** ******************
************ ***************** ** ***********************
************* ****************** **** *******************
************** ****************** ********************
**************** ****************** *******************
*************** ******************* *******************
**************** ****************** ******************
****************** ****************** *******************
******************* ***************** *******************
********************* ****************** ********************
********************************************* *********************
********************************************** ***********************
************************ ***************** ************************
********************** ******************* **************************
********************* *********************************************
********************* **************************** ***************
******************** ************************** ***************
******************** ********************* ***************
******************* ******************** ****************
****************** ***************** ****************
***************** **************** ***************
***************** **************** ***************
***************** ***************** ***************
**************** ***************** ***************
************** ****************** ***************
**************** ****************
************** ***************
**************
************
Możliwe wyjście:
Możliwym wynikiem może być:
+++++ ++++
++++++ ++++++++++ +++
++ +++++ +++++ +++++
++++++++ +++++ ++++ ++
++++ ++ ++++ ++
++++++ ++ ++ ++
+++++ +++ + +++++ ++ ++
++++ +++++++ ++ ++ ++ ++ ++
++ +++++ ++ + + + +++++++ ++
+++ ++++ ++ + ++ ++ ++ ++ ++
++ ++ ++ ++ + + + ++ ++
++ +++ + + ++ + ++ +++ +
++ ++ ++ + ++ ++ + +++ +
++ +++ ++ + + +++ + + + ++
+ + + + + ++ + ++++ +
++ ++ ++ + ++ ++ ++ + + +
++ ++ + + +++++ ++ ++ + +
++ ++ + + +++ ++ + +
+ + ++ + +++++ + +
++ ++ + + ++ +
+ + + ++ + +
++ ++ ++ + + ++
++ + + ++ + ++
+ + + + + +
+ ++ ++ ++ + +
+ + + + +++++++ + +
+ + + + ++ ++ ++++ + +
+ + + + + +++ + ++ +++ + +
+ + ++ + + ++ ++ + ++ + ++ + +
+ ++ + ++ ++ +++ + + +++ ++ + +
+ + + + + ++ + +++ + + +
+ + + ++ ++ ++ ++ + + +
+ + +++ ++ ++ + +++ +++ + ++ +
+ ++ ++ + ++ +++++ + ++ ++ +
+ ++ ++ + + ++++++ ++ ++
++++ + ++ +++ ++ +
+ + ++ ++ +++ +++ +
+ + ++++ ++ ++ +++ +
++ ++ ++++ + + ++++ +
+ ++ +++++ +++++ +++++ +
++ ++ +++ ++++++ +
++ + +++++ +++++ +
++ + + +++ +++++ +
+++ + ++ ++++++ + +
+ ++ + ++ +
++ + + + +
+++ ++ + ++ ++
++ + + + +
+++ ++ + +++ +
++++++ + ++ ++
++ +++ +
+ ++ +
+++++ ++++++ +
+ ++ ++ + +
+ ++ + ++
+ + + ++ +
+ ++ + ++++ +
+ + + ++++++ ++ +
+ ++ + ++ + +
+ ++ + ++++ + +
+ ++ ++ + + ++
+ + + ++ + +
+ + + + + +
++ + + ++ + +
++ ++ + + + ++
++++++++++++++++ +++ + + +
++ ++ ++ +
++++++++++++++++ ++ +
++ ++
++++++++++++++
Jest to również wynik wygenerowany przez powyższy skrypt. Oczywiście nie jest to najlepszy wynik i jestem pewien, że można łatwo uzyskać płynniejszy efekt.
To konkurs popularności, ponieważ mam nadzieję, że głosy będą proporcjonalne do elegancji i jakości wyników! (Również myślę, że dobre wyniki można uzyskać łącząc aplay
i gimp-cli
) Nie ma ścisłych zasad, jak powinien wyglądać wynik ... po prostu użyj swojej fantazji!
źródło
Odpowiedzi:
GolfScript
Myślałem, że golf jest popularny na tej stronie, więc przesłanie GolfScript zawsze pasuje do konkursu popularności.
Możesz wypróbować kod z własną sztuką ascii tutaj . Pamiętaj, że wymagane jest, aby wszystkie linie miały tę samą długość.
Przykład:
źródło
Kod Python polega przede wszystkim na wyrażeniach regularnych.
*Wynik
Inny
źródło
Pyton
Za pomocą operacji gradientu do identyfikacji krawędzi:
Wyjście dla banana i pandy:
Aby utworzyć wynik ASCII, część wykresów należy zastąpić:
Wyjście ASCII:
Banan:
Panda:
źródło
Matematyka
Zakładając, że
panda
zawiera oryginalny ciąg, następujący wynik otrzymuje piksele krawędzi konturu i zastępuje je „+”.Jak to działa
Partition[Take[Characters@panda, {61, 5636}], 82]
dzieli ciąg na linie znaków.Most
usuwa nowe znaki wiersza.Image[t]]]
konwertuje macierz zer i jedynek na obraz.EdgeDetect
znajduje krawędzie obrazu.ImageData
uzyskuje binarną macierz obrazu./. {1 -> "+", 0 -> " "}
zamienia każde 0 i 1 odpowiednim znakiem.Grid
wyświetla sztukę Ascii.źródło
Jawa
Sprawdza linie i wiersze, jeśli jest coś na górze, po lewej, po prawej lub na dole, i na tej podstawie wybiera wartość z symbolu trzymającego tablicę, który jest używany do generowania nowej sztuki za pomocą krawędzi!
Przykładowe dane wyjściowe:
Kod:
Ps. pierwszy raz tutaj, nie bądź szorstki: D Pps. że Panda wygląda na smutną :(
źródło
Python (ascii -> obraz -> filtr krawędzi -> ascii)
W pewien sposób oszukiwałem, przekonwertowałem tekst ascii na obraz i uruchomiłem na nim filtr wykrywania krawędzi PIL. Następnie odwróciłem obraz i przekonwertowałem z powrotem na tekst ascii:
Oto wynik:
Źródła cytowane (do konwersji obrazu w skali szarości na ascii): http://stevendkay.wordpress.com/2009/09/08/generating-ascii-art-from-photographs-in-python/
źródło
convert
(aby przekonwertować grafikę ASCII na obraz);GIMP
-polecenie linii (w celu wykrycia krawędzi); orazaplay
(w celu renderowania obrazu w sztuce ASCII). ale nie powiodło się: p (i witamy w Codegolf)k4
jest to leniwa wersja, która po prostu znajduje krawędzie, nie próbuje znaleźć dominującego kształtu i wybrać odpowiedniej postaci
„algo” polega na znalezieniu wszystkich komórek, które różnią się od tej po lewej lub powyżej, a następnie użyj magii języka tablicowego, aby przekształcić macierz boolowską z powrotem w sztukę ASCII
jest niewielki hack, aby uzupełnić początek wszystkiego dodatkowym miejscem, lub uznałby lewą i górną za „krawędzie” - w ten sposób nadal, ale mogę to po prostu zostawić później
mniej więcej taki sam wynik jak próbka w specyfikacji
tutaj jest na bumerangu / bananie:
źródło
Pyton
To bardzo prosta wersja Pythona filtru „górnoprzepustowego” :). Sprawdza, czy piksel jest przynajmniej otoczony czterema bokami. To jeden z moich pierwszych kodów Python, więc proszę, bądź subtelny ...
Wynik:
źródło
<!-- language: lang-py -->
R
Dla każdego punktu w macierzy ukryj postać, jeśli jest otoczona gwiazdkami po prawej, lewej, górnej i dolnej części. To naiwne, ale działa bardzo dobrze.
Stosowanie:
Rscript script.r input_.txt
Wynik
źródło