Zadanie
Napisać program lub funkcji, które ma obraz szerokości w
i wysokości h
, oraz dwie liczby całkowite a <= w/2
i b <= h/2
, i wysyła ASCII sztuki reprezentację obrazu o wymiarach a
x b
.
Sztuka ascii powinna zostać wygenerowana poprzez następujące kroki (lub inny proces z tymi samymi danymi wyjściowymi):
Zmiana rozmiaru
w
xh
obraz do2a
x2b
. Kolor piksela(x, y)
w obrazie o zmienionym rozmiarze powinien być równy średniej kolorów wszystkich pikseli z oryginalnego obrazu w prostokącie z następującymi narożnikami:(floor[x * w/2a], floor[y * h/2b]) (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
Obraz o zmienionym rozmiarze należy desaturować, biorąc średnią składową koloru czerwonego, zielonego i niebieskiego i ustawiając każdy składnik na tę średnią.
Znak powinien zostać wyprowadzony dla każdego bloku pikseli 2x2, zgodnie z poniższymi zasadami:
- Niech
e = 3 - floor[color/64]
, gdzie kolor odnosi się do czerwonej składowej koloru lewego górnego piksela (w zakresie 0..255). Niechf
,g
ih
odwołaj się do tej wartości, ale odpowiednio dla pikseli z prawej górnej, lewej dolnej i prawej dolnej. - Pozwolić
z
być średniae
,f
,g
,h
. - Wypisuje znak odpowiadający poniższemu (biały oznacza piksel, gdzie
3 - floor[color/64]
jest zero, a szary oznacza niezerowe). - = Wyjdź spację (
)
- lub = Dane wyjściowe,
"
jeślie (or f) >= 2
i'
inaczej. - lub = Dane wyjściowe,
,
jeślig (or h) >= 2
i.
inaczej. - lub = Dane wyjściowe
-
- lub = Dane wyjściowe
;
- = Wyjście
\
- = Wyjście
/
- = Wyjście
J
- = Wyjście
L
- = Wyjście
7
- = Wyjście
P
-
z = 1
: Wyjście*
.z = 2
: WyjścieC
.z = 3
: Wyjście#
.
- Niech
Inne uwagi: Wszystkie średnie wykonane w powyższych krokach powinny wykorzystywać dzielenie liczb całkowitych (tj. Zaokrąglanie w kierunku 0).
Możesz użyć biblioteki do odczytu obrazów, ale biblioteki nie mogą być użyte do zmiany rozmiaru i desaturacji.
Wejście
Twój program pobierze trzy części danych:
- Obraz. Ten obraz może być w dowolnym wybranym przez ciebie formacie (np. PNG, PPM)
- Szerokość sztuki ascii (w liczbie znaków)
- Wysokość sztuki ascii (w liczbie znaków)
Dane wejściowe mogą być odczytywane przez STDIN, przekazywane jako argument wiersza poleceń, przechowywane jako zmienna itp.
Wynik
Twój program wyświetli obraz ascii wygenerowany z obrazu i poprzez proces opisany powyżej. Każda linia musi mieć tę samą szerokość (szerokość przekazywana jako dane wejściowe) i nie można dodawać ani usuwać żadnych dodatkowych spacji. Ostatni wiersz może mieć końcowy znak nowej linii, ale nie jest to obowiązkowe. Puste linie (linie tylko spacje) nie mogą być pomijane.
Przykłady
Wszystkie zdjęcia zostały pobrane z Wikipedii i udostępnione jako własność publiczna. Twój program powinien działać dla wszystkich obrazów i prawidłowych danych wejściowych.
Szerokość = 52, Wysokość = 25:
.-- *** - ----. - ********** L .-- .-- 7 ---- P- .JOT****************. . ********* \. , ****************** L \ J ********** ”. - **********************. J L/ JOT*********************; ./**************.L ; ********************* PJ **************; 7; . ********************** ”. *************** ;; * ; **********************; ***************; J *. *********************** ******* P ******** '**; C ********************* C ******* P; *******. **; C ********************** J ***************; **; DO*********************; ****************. **; ********************** „*************** P; ** J ********************* P *************** / *** . ********************** 7 ************* „J **; ; ******************** C „” P *********** PJ *** ” „7 ****************** C” „********** P. ** C; „* C *************”; ********* - J ** CP „* C ********** P 7 ** 7 ** P / - **** P - * CCCCC * P- „7 ******** P” „---” --- ”
Szerokość: 70, Wysokość: 3:
---------------------------. .---------------- J ***************************** P -J ***************** ***/JOT**; ---------- ********* P --------- '-------------------- - „
Szerokość: 50, Wysokość: 25:
.JOT--- .J * P --- J * L--. J *** „L-J *********** - J L ; ***** ”.J ********************** J **** 7 ************************ P. ** CC *; . ********* LJ *********** P- ** C * P 'J ********************** - 7 * C * L **********************; J * C **; ************************; JC ** C **. ; ; ******** CCC * C ** CCCC ** „7 ***** L. 7 ***** CCCCCC **** CC **” - *****. -J - ** C * C * CC ****** CC * ” ; ** CC ***; „** CCC ***** CCCC *; „- **** - - *** CCCCC *** - „------”
Szerokość: 26, Wysokość: 17:
-, L J - ** L .C # J '; * PL, C # " .PP 7. JC7P ;; * J ;; , C'C; JOT; CC; L C "# * L 7-P; *; PC 7CL *** J * PC '# „7 # C * C # P”; P JC # C- J # CCC # L .JC # CJCC ## C; ; # - - #, CCC # CCCCCCCC ; * .- -.C; ; CCCCCCCCCCCC ; **** J ** L; CCCCCCCCCCCC ; *******; „CCCCCCCCCCCP „*******” CCCCCCCCCCC ” „* P-7 *” „CCCCP” - „---
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź.
źródło
Odpowiedzi:
JavaScript
752, 701Przykłady:
Cytryny:
Spuds:
Smoking:
źródło
IDL 8.3,
588597588 bajtówDostaję nieco inne wartości niż ty, nie jestem pewien, dlaczego ... Zrobiłem podział liczb całkowitych na wszystko. Ale poza tym działa wspaniale ... czy te wyniki są akceptowalne?Teraz znacznie lepiej, choć z jakiegoś powodu wciąż nie jest identyczna.Przypadki testowe:
źródło