Python 2.7 - 10971 8077 bajtów
aktualizacja:
LZMA faktycznie z jakiegoś powodu nie działa dla mnie, więc wróciłem do Deflate.
Znalazłem narzędzie online do jeszcze bardziej kompresowania PNG (mówią, że używają kompresji stratnej, ale tablica pozostaje niezmieniona)
- Grałem
__main__.py
trochę w golfa ...
- Odkryłem, że pomijam krok (rozpakowywanie plików danych z archiwum zip)
- Dodano łącze DL (patrz poniżej)
Większość algorytmów kompresji patrzy na dane jako tablicę jednowymiarową, a zatem nie może uchwycić powtarzających się dwuwymiarowych znaków wyświetlanych w wywołaniu kosmicznym (IMO utrudnia także obcym zrozumienie: P).
Najpierw wybrałem każdy znak jako tablicę 7 * 5 i sporządziłem listę wszystkich unikalnych znaków (101, jeśli pamiętam). Następnie iterowałem obraz, a gdy znaleziono znak, zapisywano jego pozycję i indeks (na liście znaków).
Pozycje te mogą być reprezentowane pojedynczą liczbą całkowitą, jednak z znalezionymi ponad 2K znakami, a pozycje w zakresie od 0-370966 (forma divmod) wymagają do 3 bajtów każda. Zebrałem jednak pozycje znaków w kolejności, więc zamiast tego przekonwertowałem pozycję bezwzględną na pozycję przesunięcia, dzięki czemu większość liczb jest mniejsza niż 1 bajt. Zakodowałem tę listę w utf-8, aby uwzględnić kilka liczb, które były większe niż 1 bajt
Po nagraniu i usunięciu wszystkich dopasowanych znaków zapisałem png z maksymalną kompresją. Następnie spakowałem skrypt rekonstrukcji Pythona (odwróć ten sam proces), png, szablon chatacter i listę pozycji znaków - wszystko w pliku zip, aby skorzystać z faktu, że python może wziąć folder lub plik zip jako argument, i rozpocznie wykonywanie od dowolnego pliku na najwyższym poziomie o nazwie __main__.py
. Bawiłem się trochę z 7z, aby uzyskać najlepszą kompresję, która okazała się być LZMA z dykta 1M i 32-bitowymi słowami.
oto skrypt dekodera (grał w golfa, ale wciąż ma komentarze)
import sys,zipfile as z
z.ZipFile(sys.argv[0]).extractall() #extract data files from zip to cwd
from numpy import*
o=open #next line overwrites open, which I need
from PIL.Image import*
from scipy.ndimage import*
a=imread('p')[:,:,0]/255 #read image file
a[:2414,0]=0 #draw vertical borders
a[2541:,0]=0
a[2412:,-1]=0
a[:2287,-1]=0
for x in range(0,2921,127):a[[x,x+126],:]=0 #draw horizontal borders
with o('c','rb') as f:t=f.read();C=[int(i)for c in t for i in'{0:08b}'.format(ord(c))] #read character template file and convert to list of bytes
C=array(C[:-1]).reshape([101,7,5]) #re-slice (extra 0 appended to make even number of bytes) and re-shape
with o('l','rb') as f:L=array([ord(x)for x in f.read().decode('utf_8')]).reshape([2158,2]) #read decode and reshape positional list
p=0 #relative position accumulator
for e in L:p+=e[0];x,y=p%127,p/127;a[y:y+7,x:x+5]=C[e[1]] #divmod for x,y position and paste character template onto array at position
i=fromarray(a*255)
i.show()
link do pobrania pliku zip ...
0
, pusty program Snails drukuje1
, a pusty program GolfScript drukuje nowy wiersz . Ktoś może przesłać 0-bajtową, 373888-programową odpowiedź :)