Python 2.7- 10971 8077字节
更新:
大多数压缩算法将数据视为一维数组,因此无法捕获显示在宇宙调用中的重复二维字符(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
,空的Snails程序打印1
,空的GolfScript程序打印换行符。 。有人可能会提交一个0字节的373888程序答案:)