tło
PICASCII to zgrabne narzędzie, które konwertuje obrazy do sztuki ASCII.
Osiąga różne stopnie jasności, używając następujących dziesięciu znaków ASCII:
@#+';:,.`
Powiemy, że te znaki (elementy postaci) mają jasność od 1 (znak) do 10 (spacja).
Poniżej można zobaczyć wyniki konwersji małego kodu, flagi walijskiej, przeładowanego fraktala, dużego pstrąga i małego golfa, wyświetlanych z poprawną czcionką:
Możesz zobaczyć obrazy w tym skrzypce i pobrać je z Dysku Google .
Zadanie
Podczas gdy końcowe wyniki PICASCII są przyjemne wizualnie, wszystkie pięć obrazów łącznie waży 153.559 bajtów. Jak bardzo można skompresować te obrazy, jeśli chcemy poświęcić część ich jakości?
Twoim zadaniem jest napisanie programu, który akceptuje obraz artystyczny ASCII, taki jak powyższy i minimalną jakość jako dane wejściowe, i drukuje stratną kompresję obrazu - w postaci pełnego programu lub funkcji zwracającej pojedynczy ciąg znaków - który spełnia wymóg jakości.
Oznacza to, że nie musisz pisać osobnego dekompresora; musi być wbudowany w każdy skompresowany obraz.
Oryginalny obraz będzie składał się z znaków o jasności od 1 do 10, oddzielonych liniami do linii o tej samej długości. Skompresowany obraz musi mieć te same wymiary i używać tego samego zestawu znaków.
W przypadku nieskompresowanego obrazu składającego się z n znaków, jakość skompresowanej wersji obrazu jest zdefiniowana jako
gdzie c i to jasność i- tego znaku wyjściowego skompresowanego obrazu, a u i jasność i- tego znaku wyjściowego skompresowanego obrazu.
Punktacja
Twój kod będzie uruchamiany z pięcioma obrazami z góry jako wejściowymi i minimalnymi ustawieniami jakości 0,50, 0,60, 0,70, 0,80 i 0,90 dla każdego z obrazów.
Twój wynik jest średnią geometryczną rozmiarów wszystkich skompresowanych obrazów, tj. Dwudziestego piątego pierwiastka iloczynu długości wszystkich dwudziestu pięciu skompresowanych obrazów.
Najniższy wynik wygrywa!
Dodatkowe zasady
Twój kod musi działać w przypadku dowolnych obrazów, a nie tylko tych używanych do oceniania.
Oczekuje się, że zoptymalizujesz swój kod pod kątem przypadków testowych, ale program, który nawet nie próbuje kompresować dowolnych obrazów, nie otrzyma ode mnie opinii.
Twój kompresor może używać wbudowanych kompresorów strumienia bajtów (np. Gzip), ale musisz sam je wdrożyć dla skompresowanych obrazów.
Wbudowane zwykle używane w dekompresorach strumienia bajtów (np. Konwersja bazy, dekodowanie długości przebiegu) są dozwolone.
Kompresor i skompresowane obrazy nie muszą być w tym samym języku.
Musisz jednak wybrać jeden język dla wszystkich skompresowanych obrazów.
Do każdego skompresowanego obrazu obowiązują standardowe reguły gry w golfa.
Weryfikacja
Stworzyłem skrypt CJam, aby łatwo zweryfikować wszystkie wymagania jakościowe i obliczyć wynik zgłoszenia.
Możesz pobrać interpreter Java tutaj lub tutaj .
e# URLs of the uncompressed images.
e# "%s" will get replaced by 1, 2, 3, 4, 5.
"file:///home/dennis/codegolf/53199/original/image%s.txt"
e# URLs of the compressed images (source code).
e# "%s-%s" will get replaced by "1-50", "1-60", ... "5-90".
"file:///home/dennis/codegolf/53199/code/image%s-%s.php"
e# URLs of the compressed images (output).
"file:///home/dennis/codegolf/53199/output/image%s-%s.txt"
e# Code
:O;:C;:U;5,:)
{
5,5f+Af*
{
C[IQ]e%g,X*:X;
ISQS
[U[I]e%O[IQ]e%]
{g_W=N&{W<}&}%
_Nf/::,:=
{
{N-"@#+';:,.` "f#}%z
_::m2f#:+\,81d*/mq1m8#
_"%04.4f"e%S
@100*iQ<"(too low)"*
}{
;"Dimension mismatch."
}?
N]o
}fQ
}fI
N"SCORE: %04.4f"X1d25/#e%N
Przykład
Bash → PHP, wynik 30344.0474
cat
Osiąga 100% jakości dla wszystkich nakładów.
$ java -jar cjam-0.6.5.jar vrfy.cjam 1 50 1.0000 1 60 1.0000 1 70 1.0000 1 80 1.0000 1 90 1.0000 2 50 1.0000 2 60 1.0000 2 70 1.0000 2 80 1.0000 2 90 1.0000 3 50 1.0000 3 60 1.0000 3 70 1.0000 3 80 1.0000 3 90 1.0000 4 50 1.0000 4 60 1.0000 4 70 1.0000 4 80 1.0000 4 90 1.0000 5 50 1.0000 5 60 1.0000 5 70 1.0000 5 80 1.0000 5 90 1.0000 SCORE: 30344.0474
źródło
Odpowiedzi:
Java → CJam, wynik 17 4417.89
Wymaga słoika CJam w ścieżce klasy. Jeśli podasz mu 2 argumenty wiersza poleceń (nazwę i jakość pliku), dopisze „.cjam” do nazwy pliku i zapisze tam skompresowany obraz. W przeciwnym razie oblicza swój wynik na 5 obrazach testowych, które, jak się zakłada, znajdują się w bieżącym katalogu. Program automatycznie weryfikuje również każdy skompresowany obraz. W razie jakichkolwiek rozbieżności możesz ponownie sprawdzić obliczenia wyniku.
Stosowane techniki (jak dotąd) to: skalowanie do połowy (poziomo, pionowo lub oba), jeśli nie obniża to zbytnio jakości, niestandardowo zakodowany RLE i konwersja bazy, aby spakować więcej danych do każdego znaku, pozostając w zakres ASCII do wydruku.
źródło
javac -cp cjam-0.6.5.jar Compress.java
, alejava -cp cjam-0.6.5.jar Compress
mówiError: Could not find or load main class Compress
ijava Compress
nie znajduje klasy CJam.-cp .:cjam-0.6.5.jar
(w windoze myślę, że potrzebujesz średnika zamiast dwukropka)Python 3.5 (główny i wyjściowy) (obecnie niekonkurencyjny)
Wszystkiego najlepszego, wyzwanie! Oto twój prezent: odpowiedź!
EDYCJA: Przekształcono dane wyjściowe na kod Pythona, poprawiono stopień kompresji (nieznacznie) EDYCJA 2: Sprawiło, że drukowało się na surowo, gdy
size
ma 1. Poprawiony wynik, ale wynik należy ponownie obliczyć. EDIT3: @Dennis wskazał, że wciąż mam błędy do naprawienia, więc oznaczyłem odpowiedź jako niekonkurencyjnąKod:
Ta odpowiedź mogłaby przydać wiele ulepszeń, więc prawdopodobnie będę pracować nad nią więcej w weekend.
Jak to działa:
size
.size
i spróbuj ponownie.Ten algorytm działa dobrze dla niskiej jakości (0,5, 0,6), ale nie działa zbyt dobrze na obrazach o wyższej jakości (w rzeczywistości się zawęża). Jest również bardzo powolny.
Tutaj mam wszystkie wygenerowane pliki, więc nie będziesz musiał ponownie ich generować.
źródło
comping
powinien byćcompimg
), którą naprawiłem, aby uruchomić program. O ile nie popełniłem błędu podczas uruchamiania kodu, wymiary niektórych generowanych obrazów są niepoprawne (np.image2.txt
Ma 33 164 bajtów, aleimage2-50.0.txt
ma 33 329), a inne nie generują tego samego pliku podczas uruchamiania generowanych programów (image3-50.0.txt
ma jakość 0,5110 , ale uruchomienie wygenerowanego programu skutkuje jakością 0,4508 ).image3-50.0.py
z Twojego Dropboksa i jest on zgodny z plikiem, który wygenerowałem.