Python 2.7 - 10971 8077 байт
Обновить:
LZMA на самом деле почему-то не работает для меня, поэтому я вернулся к Deflate.
Я нашел онлайн-инструмент для сжатия PNG еще больше (говорят, что они используют сжатие с потерями, но массив остается неизменным)
- Я сыграл в гольф
__main__.py
сценарий немного больше ...
- Я обнаружил, что пропускаю шаг (извлечение файлов данных из zip-архива)
- Добавлена ссылка DL (см. Внизу)
Большинство алгоритмов сжатия рассматривают данные как одномерный массив и поэтому не могут захватывать повторяющиеся двумерные символы, отображаемые в космическом вызове (IMO также затрудняет понимание инопланетянами: P).
Сначала я выбрал каждый символ в виде массива 7 * 5 и составил список всех уникальных символов (101, если я помню). Затем я перебрал изображение, и когда символ был найден, положение и индекс этого символа (в списке символов) были записаны.
Эти позиции могут быть представлены одним int, однако с более чем 2K найденными символами, а позиции в диапазоне от 0-370966 (форма divmod) требуют до 3 байтов каждая. Однако я собрал позиции символов по порядку, поэтому вместо этого преобразовал абсолютную позицию в позицию смещения, сделав большинство чисел менее 1 байта. Я закодировал этот список в utf-8, чтобы учесть несколько чисел, которые были больше 1 байта
После записи и удаления всех совпавших символов я сохранил png с максимальным сжатием. Затем я упаковал скрипт реконструкции Python (обратный процесс), png, шаблон chatacter и список позиций персонажей в zip-файл, чтобы воспользоваться тем фактом, что python может использовать папку или zip-файл в качестве аргумента, и он начнет выполнение в любом файле верхнего уровня с именем __main__.py
. Я немного поиграл с 7z, чтобы получить лучшее сжатие, которое оказалось LZMA с 1M dict и 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 программ :)