tło
Sztuka ASCII to praktyka tworzenia obrazów przy użyciu tekstu ASCII do kształtowania kształtów.
Aliasing to efekt utworzony przez duże „piksele” grafiki ASCII, które mają wielkość znaków. Obraz staje się blokujący i trudny do zobaczenia. Wygładzanie usuwa ten efekt, tworząc gradient i zmiękczając twarde krawędzie sztuki ASCII.
Wyzwanie
Twoim wyzwaniem jest napisanie możliwie najkrótszego programu, który weźmie kawałek ASCII i wyświetli wersję, która została wygładzona.
Jaki rodzaj antyaliasingu?
Cała sztuka ASCII będzie się składać z dwóch rodzajów symboli: spacji i spacji. Dla każdego znaku niebiałego twój program musi ustalić, czy znajduje się w pozycji, w której należy go wygładzić. Jeśli tak, musisz zastąpić go prawidłowym znakiem. Jeśli tak nie jest, postać pozostaje ta sama.
Skąd wiesz, czy postać wymaga wygładzenia? Odpowiedź zależy od postaci, które znajdują się bezpośrednio powyżej, poniżej, lewej i prawej strony znaku ( nie przekątnych ). Oto wykres, kiedy wymagane jest wygładzanie, gdzie ?
i x
może oznaczać dowolny znak inny niż biały.
x? -> d?
? ?
?x -> ?b
? ?
? ?
?x -> ?F
? ?
x? -> Y?
x -> ; Note: This character has been changed from _ to ;
? ?
? ?
x -> V
?x -> ?>
x? -> <?
x -> @
Dane wejściowe (i przykładowa grafika ASCII sprzed antyaliasingu)
Najpierw będą dwa wiersze wprowadzania (do STDIN), liczba H, po której następuje liczba W. Następnie pojawią się H wiersze o dokładnie W znakach (z wyjątkiem nowej linii). Te kolejne wiersze będą sztuką ASCII, którą należy wygładzić. Oto przykładowe dane wejściowe (nie piękne, ale testowe):
7
9
888888
888888
999 98 7
666666
666666
6666
6
Wyjście (i przykładowa sztuka antyaliasingu)
Twój program powinien wypisać do STDOUT grafikę ASCII (o tych samych wymiarach), która została wygładzona. Oto dane wyjściowe dla powyższego wejścia. Zwróć uwagę, jak znaki obramowania są traktowane jako graniczące białe znaki.
d8888>
d8888F
<99 98 @
Y6666b
Y6666>
Y66F
V
To może nie wyglądać tak dobrze (ze względu na odstępy między wierszami w bloku kodu), lepiej wygląda z większą grafiką ASCII, a jakość zależy od dokładnej użytej czcionki.
Inny przykład
Wkład
12
18
xx xxx xxx
xxxx xxx xxx
xxxxxx xxx xxx
xxx xxx xxx xxx
xxxx xxx xxx xxx
xxxxxx xxx xxx
xxxx xxx xxx
x xx xxx xxx x
xx xxx xxx xx
xxx xxx xxx xxx
xxxx xxx xxx xx
xxxxx xxx xxx x
Wydajność
db <xb <xb
dxxb Yxb Yxb
dxxxxb Yxb Yxb
dxx xxb xxb xxb
Yxxb xxF xxF xxF
YxxxxF dxF dxF
YxxF dxF dxF
; YF dxF dxF ;
xb dxF dxF dx
xxb <xF <xF <xx
xxxb Yxb Yxb Yx
Yxxx> Yx> Yx> V
Reguły, ograniczenia i uwagi
Twój program powinien być napisany tylko drukowalnymi znakami ASCII, abyśmy mogli tworzyć z nich dzieła sztuki. Poza tym obowiązują standardowe zasady gry w golfa kodowego.
źródło
_
stał się,;
ponieważ działa lepiej.Odpowiedzi:
Rubinowy,
180168 znakówKolejna implementacja Rubiego, która przyjmuje podejście zip. Drugi przykład możesz zobaczyć online .
Edycja: użycie
readlines
zapisuje 12 znaków.źródło
Rubinowy
275265263261258254244243214212207Próbka 1: http://ideone.com/PfNMA
Próbka 2: http://ideone.com/sWijD
źródło
0..h-1
można zapisać jako0...h
. 3)G=[];h.times{G<<gets}
można zapisać jakoG=readlines
, podobnie jak w kodzie C #. 4) Po kroku 3. zmienna h staje się bezużyteczna, wartości h i w są używane tylko raz, więch=gets.to_i;w=gets.to_i;H=(0..h-1);W=(0..w-1)
można je zapisać jakoH=0...gets.to_i;W=0...gets.to_i
. 5) W tym przypadkuand
można zapisać jako&&
, który nie potrzebuje przestrzeni wokół. 6) Masz dodatkowy; i policzyłeś nowy wiersz na końcu pliku, które nie są konieczne. Oznacza to 214 znaków: ideone.com/CiW0lH=0..gets.to_i
kiedy napisałem kod, ale wydaje się, że nie działał (oczywiście musiał być z innych powodów).map
zamiasteach
2)z=->...
zamiastdef z...end
.map
zamiasteach
zmiany. Jednak w przypadku składni lambda myślę, że wymagałoby to użyciaz
formyz.call(args)
zamiast formyz(args)
, co zwiększyłoby liczbę znaków. Daj mi znać, jeśli coś mi umknie.[]
użycia lambda .JavaScript, 410 znaków:
bez golfa:
Oryginalny,
440 znaków:NB Zakładam, że pierwsze dwa wiersze wejściowe są w rzeczywistości nieistotne, a rozmiar kolejnych wierszy jest prawidłowy. Liczę też, że może uda mi się odciąć jeszcze kilka znaków, kiedy będę miał szansę!
źródło
m={22:"b",28:"d",13:"Y",7:"F",20:";",5:"V",6:">",12:"<",4:"@"}
indeksu następnie przekonwertować M zparseInt()
:m[parseInt(y[d](''),2)]
. Zmniejsza to rozmiar do 373 znaków.Python, 259 znaków
Program odczytuje dane wejściowe w jednym ciągu
I
(ze spacjami oddzielającymi linie), zamyka listę 5 krotek zawierających znak i cztery otaczające go znaki, a następnie wyszukuje wynikowy znak za pomocą indeksowania łańcucha.źródło
PHP -
359330282268257 znakówźródło
\r\n
. Zaktualizowałem swój kod do pracy z EOL w stylu uniksowym\n
.Python,
246241WC i test na próbce 2, różnej od wydajności rozwiązania Ruby u góry:
źródło
C #
591563źródło