Python 2.7 - 10971 8077 bytes
atualizar:
LZMA, na verdade, por algum motivo, não funciona para mim, então voltei para Deflate.
Encontrei uma ferramenta on - line para compactar ainda mais o PNG (eles dizem que usam compressão com perda, mas a matriz permanece inalterada)
- Joguei o
__main__.py
roteiro um pouco mais ...
- Descobri que estava omitindo uma etapa (extraindo os arquivos de dados do arquivo zip)
- Link DL adicionado (veja abaixo)
A maioria dos algoritmos de compactação considera os dados como uma matriz unidimensional e, portanto, não pode capturar os caracteres bidimensionais repetidos exibidos na chamada cósmica (o IMO também dificulta a compreensão dos alienígenas: P).
Primeiro, selecionei cada caractere como uma matriz 7 * 5 e fiz uma lista de todos os caracteres únicos (101 se bem me lembro). Então eu iterava sobre a imagem e, quando um caractere era encontrado, a posição e o índice desse caractere (na lista de caracteres) eram registrados.
Essas posições podem ser representadas com um único int, no entanto, com mais de 2 K caracteres encontrados, e as posições que variam de 0-370966 (formato divmod) requerem até 3 bytes cada. No entanto, coletei as posições dos caracteres em ordem, então converti a posição absoluta em posição de deslocamento, tornando a maioria dos números menor que 1 byte. Codifiquei esta lista no utf-8 para explicar os poucos números maiores que 1 byte
Após gravar e remover todos os caracteres correspondentes, salvei o png com a compactação máxima. Em seguida, empacotei o script de reconstrução python (reverter o mesmo processo), o png, o modelo do chatacter e a lista de posições dos caracteres em um arquivo zip para aproveitar o fato de que o python pode usar uma pasta ou arquivo zip como argumento e começará a execução em qualquer arquivo no nível superior nomeado __main__.py
. Eu brinquei um pouco com 7z para obter a melhor compactação, que acabou sendo LZMA com um ditado de 1M e palavras de 32 bits.
aqui está o script do decodificador (golfe, mas com comentários ainda)
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 para fazer o download do arquivo zip ...
0
, o programa Snails vazio é impresso1
e o programa GolfScript vazio imprime uma nova linha . Alguém pode encaminhar uma resposta, 0-byte, 373.888-programa :)