Python 2.7 - 10971 8077 Bytes
aktualisieren:
LZMA funktioniert eigentlich aus irgendeinem Grund nicht für mich, also ging ich zurück zu Deflate.
Ich habe ein Online-Tool gefunden, mit dem ich das PNG noch weiter komprimieren kann (es wird eine verlustbehaftete Komprimierung angegeben, das Array bleibt jedoch unverändert).
- Ich habe das
__main__.py
Drehbuch ein bisschen mehr gespielt ...
- Ich habe festgestellt, dass ich einen Schritt ausgelassen habe (Extrahieren der Datendateien aus dem ZIP-Archiv).
- DL-Link hinzugefügt (siehe unten)
Die meisten Komprimierungsalgorithmen betrachten Daten als ein eindimensionales Array und können daher die sich wiederholenden zweidimensionalen Zeichen, die im kosmischen Aufruf angezeigt werden, nicht erfassen (IMO erschwert es auch Ausländern, Folgendes zu verstehen: P).
Zuerst habe ich jedes Zeichen als 7 * 5-Array ausgewählt und eine Liste aller eindeutigen Zeichen erstellt (101, wenn ich mich erinnere). Dann habe ich das Bild durchlaufen und als ein Zeichen gefunden wurde, wurden die Position und der Index dieses Zeichens (in der Zeichenliste) aufgezeichnet.
Diese Positionen könnten mit einem einzelnen int dargestellt werden, jedoch mit mehr als 2K Zeichen, und Positionen im Bereich von 0-370966 (divmod-Form) erfordern jeweils bis zu 3 Bytes. Ich habe die Zeichenpositionen jedoch der Reihe nach erfasst und stattdessen die absolute Position in die versetzte Position konvertiert, sodass die meisten Zahlen weniger als 1 Byte betragen. Ich habe diese Liste in utf-8 codiert, um die wenigen Zahlen zu berücksichtigen, die größer als 1 Byte waren
Nachdem ich alle übereinstimmenden Zeichen aufgenommen und entfernt hatte, speicherte ich das PNG mit maximaler Komprimierung. Anschließend habe ich das Python-Rekonstruktionsskript (in umgekehrter Reihenfolge), das PNG, die Chat-Zeichenvorlage und die Zeichenpositionsliste in eine ZIP-Datei gepackt, um die Tatsache zu nutzen, dass Python einen Ordner oder eine ZIP-Datei als Argument verwenden kann Die Ausführung beginnt bei jeder Datei auf der obersten Ebene __main__.py
. Ich habe ein bisschen mit 7z herumgespielt, um die beste Komprimierung zu erzielen, was sich als LZMA mit einem 1M-Diktat und 32-Bit-Wörtern herausstellte.
Hier ist das Decoder-Skript (gespielt, aber mit Kommentaren)
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 zum Download für die Zip-Datei ...
0
, das leere Schnecken Programm druckt1
, und das leere GolfScript Programm druckt eine neue Zeile . Jemand könnte eine 0-Byte-, 373888-Programm-Antwort einreichen :)