Python 2.7 - 10971 8077 byte
aggiornare:
LZMA in realtà per qualche motivo non funziona per me, quindi sono tornato a Deflate.
Ho trovato uno strumento online per comprimere ulteriormente il PNG (dicono che usano la compressione con perdita, ma l'array rimane invariato)
- Ho giocato
__main__.py
un po 'di più sulla sceneggiatura ...
- Ho scoperto che stavo omettendo un passaggio (estrazione dei file di dati dall'archivio zip)
- Aggiunto link DL (vedi in basso)
La maggior parte degli algoritmi di compressione considera i dati come un array monodimensionale e quindi non è in grado di catturare i caratteri bidimensionali ripetuti visualizzati nella chiamata cosmica (l'IMO rende anche più difficile la comprensione degli alieni: P).
Innanzitutto, ho selezionato ogni personaggio come un array 7 * 5 e ho creato un elenco di tutti i personaggi unici (101 se ricordo). Quindi ho ripetuto l'immagine e, quando è stato trovato un personaggio, sono stati registrati la posizione e l'indice di quel personaggio (nell'elenco dei personaggi).
Tali posizioni potrebbero essere rappresentate con un singolo int, tuttavia con più di 2K caratteri trovati e posizioni che vanno da 0-370966 (modulo divmod) richiedono fino a 3 byte ciascuno. Tuttavia, ho raccolto le posizioni dei caratteri in ordine, quindi ho convertito la posizione assoluta in posizione offset, rendendo la maggior parte dei numeri inferiore a 1 byte. Ho codificato questo elenco in utf-8 per tenere conto dei pochi numeri che erano maggiori di 1 byte
Dopo aver registrato e rimosso tutti i caratteri corrispondenti, ho salvato il png con la massima compressione. Ho quindi impacchettato lo script di ricostruzione di Python (invertire lo stesso processo), il png, il modello di chatacter e l'elenco delle posizioni dei personaggi in un file zip per sfruttare il fatto che python può prendere una cartella o un file zip come argomento, e inizierà l'esecuzione in qualsiasi file di livello superiore denominato __main__.py
. Ho giocato un po 'con 7z per ottenere la migliore compressione, che si è rivelata LZMA con un dict 1M e parole a 32 bit.
ecco lo script del decodificatore (golf ma con commenti ancora)
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 per il download per il file zip ...
0
, il programma Snails vuoto stampa1
e il programma GolfScript vuoto stampa una nuova riga . Qualcuno potrebbe inviare una risposta da 0 byte, 373888 programma :)