Python 2.7 - 10971 8077 bytes
actualizar:
LZMA en realidad por alguna razón no funciona para mí, así que volví a Deflate.
Encontré una herramienta en línea para comprimir el PNG aún más (dicen que usan compresión con pérdida, pero la matriz permanece sin cambios)
- Golfé el
__main__.py
guión un poco más ...
- Descubrí que estaba omitiendo un paso (extraer los archivos de datos del archivo zip)
- Enlace DL agregado (ver abajo)
La mayoría de los algoritmos de compresión consideran los datos como una matriz unidimensional y, por lo tanto, no pueden capturar los caracteres bidimensionales repetidos que se muestran en la llamada cósmica (la OMI también dificulta que los extraterrestres entiendan también: P).
Primero, seleccioné cada personaje como una matriz de 7 * 5 e hice una lista de todos los personajes únicos (101 si recuerdo). Luego iteré sobre la imagen, y cuando se encontró un personaje, se registraron la posición y el índice de ese personaje (en la lista de personajes).
Esas posiciones podrían representarse con un solo int, sin embargo, con más de 2K caracteres encontrados, y las posiciones que van desde 0-370966 (forma divmod) requieren hasta 3 bytes cada una. Sin embargo, recolecté las posiciones de los caracteres en orden, por lo que convertí la posición absoluta en posición de desplazamiento, haciendo que la mayoría de los números sean menos de 1 byte. Codifiqué esta lista en utf-8 para tener en cuenta los pocos números que eran mayores que 1 byte
Después de grabar y eliminar todos los caracteres coincidentes, guardé el png con la máxima compresión. Luego empaqueté el script de reconstrucción de Python (revertir el mismo proceso), png, la plantilla de caracteres y la lista de posición de caracteres en un archivo zip para aprovechar el hecho de que Python puede tomar una carpeta o archivo zip como argumento, y comenzará la ejecución en cualquier archivo en el nivel superior nombrado __main__.py
. Jugué un poco con 7z para obtener la mejor compresión, que resultó ser LZMA con palabras de 1M y 32 bits.
Aquí está la secuencia de comandos del decodificador (golfed pero con comentarios todavía)
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()
enlace para descargar el archivo zip ...
0
el programa Snails vacío1
y el programa GolfScript vacío imprime una nueva línea . Alguien podría enviar una respuesta de 0 bytes y 373888 programas :)