Python 2.7 - 10971 8077 octets
mise à jour:
LZMA en fait pour une raison quelconque ne fonctionne pas pour moi, donc je suis retourné à Deflate.
J'ai trouvé un outil en ligne pour compresser encore plus le PNG (ils disent qu'ils utilisent la compression avec perte, mais le tableau reste inchangé)
- J'ai joué au
__main__.py
script un peu plus ...
- J'ai trouvé que j'omettais une étape (extraire les fichiers de données de l'archive zip)
- Lien DL ajouté (voir en bas)
La plupart des algorithmes de compression considèrent les données comme un tableau unidimensionnel et ne peuvent donc pas capturer les caractères répétitifs bidimensionnels affichés dans l'appel cosmique (IMO rend également plus difficile la compréhension des extraterrestres: P).
Tout d'abord, j'ai sélectionné chaque caractère comme un tableau 7 * 5 et fait une liste de tous les caractères uniques (101 si je me souviens). Ensuite, j'ai parcouru l'image, et lorsqu'un caractère a été trouvé, la position et l'index de ce caractère (dans la liste des caractères) ont été enregistrés.
Ces positions pourraient être représentées avec un seul int, mais avec plus de 2K caractères trouvés, et les positions allant de 0 à 370966 (forme divmod) nécessitent jusqu'à 3 octets chacune. Cependant, j'ai collecté les positions des caractères dans l'ordre, donc j'ai plutôt converti la position absolue en position décalée, ce qui rend la plupart des nombres inférieurs à 1 octet. J'ai encodé cette liste en utf-8 pour tenir compte des quelques nombres supérieurs à 1 octet
Après avoir enregistré et supprimé tous les caractères correspondants, j'ai enregistré le png avec une compression maximale. J'ai ensuite empaqueté le script de reconstruction python (inverser le même processus), le png, le modèle chatacter et la liste de position des caractères dans un fichier zip pour profiter du fait que python peut prendre un dossier ou un fichier zip comme argument, et il commencera son exécution dans n'importe quel fichier du niveau supérieur nommé__main__.py
. J'ai joué un peu avec 7z pour obtenir la meilleure compression, qui s'est avérée être LZMA avec un dict 1M et des mots 32 bits.
voici le script du décodeur (joué au golf mais avec des commentaires quand même)
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()
lien à télécharger pour le fichier zip ...
0
, le programme Snails vide imprime1
et le programme GolfScript vide imprime une nouvelle ligne . Quelqu'un peut soumettre une réponse de 0 octet, programme 373888 :)