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