Python 2.7 - 10971 8077 байт
оновлення:
LZMA чомусь не працює для мене, тому я повернувся до Дефляту.
Я знайшов онлайн-інструмент для ще більшого стиснення PNG (вони кажуть, що вони використовують стиснення втрат, але масив залишається незмінним)
- Я розіграв
__main__.py
сценарій трохи більше ...
- Я виявив, що пропускаю крок (витяг файлів даних із zip архіву)
- Додано посилання DL (див. Внизу)
Більшість алгоритмів стиснення розглядають дані як 1-мірний масив, і тому не можуть зафіксувати повторювані двовимірні символи, відображені в космічному виклику (IMO також ускладнює розуміння прибульців також: P).
По-перше, я обрав кожного символу як масив 7 * 5 і склав список всіх унікальних символів (якщо я пам'ятаю 101). Потім я переглянув зображення, і коли знайдено символу, було записано положення та індекс цього символу (у списку символів).
Ці позиції можуть бути представлені однією цілою, однак із знайденими понад 2 К символів, а позиції, що знаходяться в межах від 0-370966 (форма dividmod), потребують до 3 байт. Однак я зібрав позиції символів для того, щоб замість цього перетворити абсолютну позицію на зміщення, зробивши більшість цифр менше 1 байта. Я зашифрував цей список у utf-8 для врахування кількох чисел, що перевищували 1 байт
Після запису та видалення всіх відповідних символів я зберег png з максимальним стисненням. Потім я запакував сценарій відновлення python (зворотній той самий процес), png, шаблон chatacter та список позицій символів, все в zip-файл, щоб скористатися тим фактом, що python може приймати папку або zip-файл як аргумент, і він почне виконання у будь-якому файлі найвищого імені __main__.py
. Я трохи розігрувався з 7z, щоб отримати найкращу компресію, яка виявилася LZMA з диктатом 1 М та 32-бітовими словами.
ось сценарій декодера (гольф, але з коментарями все ще)
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()
посилання для завантаження zip-файлу ...
0
, порожня програма « Равлики »1
та порожня програма GolfScript друкує новий рядок . Хтось може подати відповідь на програму 0-байт, 373888 :)