Skip to content

Instantly share code, notes, and snippets.

@cosinekitty
Created April 28, 2020 23:06
Show Gist options
  • Select an option

  • Save cosinekitty/d38f82982d5e8ad49dd44e76a477bb1b to your computer and use it in GitHub Desktop.

Select an option

Save cosinekitty/d38f82982d5e8ad49dd44e76a477bb1b to your computer and use it in GitHub Desktop.
Third decompressor: independent Huffman trees based on preceding symbols
#!/usr/bin/env python3
Repeat=((5,4),((((10,(11,(1,((((15,((((18,19),17),16),0)),14),13),12)))),8),6),(3,((9,2),7))))
Tail=(((5,(6,(7,(8,(((((((16,(17,((20,23),(15,18)))),14),13),12),11),10),9))))),2),(1,(4,3)))
Char=[(((('o','i'),('v','p')),(('x','g'),(('c','m'),('s','d')))),(((('l','w'),('r','e')),(('b','h'),('u','a'))),((('j','t'),('y','f')),(('n','q'),('z','k'))))),
((('r',('s',('p','i'))),(('b',((((('j','a'),('q','o')),'h'),'k'),('y','u'))),(('d','g'),('m',(('f','w'),('v',('z','x'))))))),((('c','e'),'l'),('n','t'))),
((((('y',(('t',('f','h')),('d',('w',('k','v'))))),(((('c','j'),('n',(('p','g'),'m'))),'s'),'b')),'o'),('a','e')),((('r','u'),'i'),'l')),
((('i',(('r','l'),'u')),'e'),(('h',('k','o')),('a',('t',(((((((('w','v'),('g','f')),('z','p')),'n'),(('d','m'),('b','q'))),'c'),'s'),'y'))))),
((((('n',(('t',('v','p')),('b','w'))),'l'),(('s','y'),('u',(('f',(((('q','k'),'z'),'j'),'c')),'g')))),'a'),('e',((((('h','m'),'d'),'r'),'o'),'i'))),
(('r',((('c',('i',('v',('k',('z',('j','q')))))),'t'),('l','a'))),(('n',(('m',('p',('w','f'))),((('g','y'),('b',('x','h'))),('e',('u','o'))))),('s','d'))),
(((('y','t'),'e'),'i'),(('u','o'),((((('s',('h',('g',(('j','v'),'k')))),(('n',('d','m')),(('w','c'),('b','p')))),'r'),'l'),('f','a')))),
((('a',((((('p','d'),'t'),'m'),'s'),'u')),'e'),(('i',('h','y')),(('o','r'),(('n',((('f',('c',((('v','z'),'j'),'k'))),('w','b')),'g')),'l')))),
((('y',('t',('m',(('f',('d','p')),('s','b'))))),'e'),(('a',(('l','r'),(('n',('w',(('g',((('q','j'),('z','v')),'k')),('h','c')))),'u'))),('o','i'))),
((('t','c'),('s',('l','d'))),(('o',(('v',('m','g')),('e',('r','f')))),(((('p','u'),(('k',('i',('x',('q',(('y','j'),('w','h')))))),('b','z'))),'a'),'n'))),
(('o','u'),(('e',((('p',('h',('j','n'))),((('d','c'),('r','l')),(('y','f'),('m','b')))),'i')),'a')),
(('i',((('u',('k','p')),'y'),('l',(('m',('d',('j',(('q','v'),'g')))),'o')))),((((('t','r'),'n'),'s'),((('b','w'),(('c','f'),'h')),'a')),'e')),
(('y','e'),(('l',((('s','t'),('d',('m',('g','b')))),('u',(('n',('k',('h',(('q',(('x','z'),'j')),'r')))),(('p','c'),('f',('w','v'))))))),('i',('o','a')))),
((('o',('y',(('n',(('r','w'),((('k',('g','j')),'h'),(('q','v'),'d')))),'m'))),'a'),('e',('i',((('s',('l',('f',('t','c')))),'b'),('p','u'))))),
((('i',(('u',('k',('f',('z',('x','q'))))),'d')),'e'),((((((('w',('v','j')),'l'),'y'),((('h','b'),('m',('p','r'))),'n')),'c'),'t'),((('s','o'),'a'),'g'))),
(((('t','p'),((('v',((('j','q'),'h'),'x')),'o'),'m')),(('s','l'),'r')),('n',((('d',('a','b')),('c',(('f','k'),(('z','y'),'e')))),(('g',('w','i')),'u')))),
((('a','o'),(('r',('y',(((('j',(('z','v'),'g')),'c'),('w','b')),(('n',('d','k')),('m','f'))))),('s','l'))),(('i',('t',('p','u'))),('e','h'))),
(((('c',('q','s')),'a'),((('o','f'),'e'),'i')),'u'),
((('y',('t',('r','n'))),('o',((('b','k'),(('v','f'),'p')),(('l','g'),'m')))),(('a','e'),((((((('j',(('x','z'),'q')),'w'),'h'),'c'),'d'),('s','u')),'i'))),
(('s',('e',(('n','p'),(('y',(('d',('r',(('z','j'),'v'))),('w',('g','f')))),'l')))),(('i',('m',('c','o'))),(('h',(((('b','q'),'k'),'u'),'a')),'t'))),
((('a',(('t',(('f','m'),(('b',((('q','k'),'d'),'g')),'n'))),'h')),'e'),('i',((('l',(('c',('w',((('j','v'),'p'),'z'))),'s')),'y'),('o',('u','r'))))),
((('l',(('d',(('v','x'),(('z',('j',('h',('w','q')))),'f'))),'t')),('r',('n',('i','a')))),(('m',(('c',('b','p')),((((('u','y'),'k'),'o'),'g'),'e'))),'s')),
(('i',(((('r',(('v','n'),(('s',(('w','d'),'g')),((('f','t'),('c','b')),'l')))),('y','u')),'o'),'a')),'e'),
(('a',('n','i')),((((('m','f'),'r'),(('t','d'),'h')),(((('c','p'),'b'),'l'),('s',(('y','k'),('w',(('u',('j','z')),'g')))))),('e','o'))),
((('y',(('c',(('v',('q',('x','z'))),'m')),('l','p'))),('a',('u','o'))),((((('f','h'),(('s','w'),(('r','b'),('g','n')))),'t'),'e'),'i')),
(((((('u','f'),'g'),'n'),('p',('b',(('z',((('q',('y','j')),'v'),'k')),'x')))),('l','s')),((('i',('d',('h','w'))),('e','m')),((('o','r'),'c'),('t','a')))),
('e',('a',((((('h',(('k',('c','m')),('n','v'))),'u'),'y'),'o'),(((((('w','t'),(('r','s'),'g')),('b','d')),'l'),'z'),'i'))))]
NumWords=67527
Bits=r'''
jjrxjKEZCmGXB+t9Gk7LMZ4Xakdfap+zMdsvBxrrTe89J/Tg72Ltj29f+iqXHkFEx/pZJFzUpWwXmNSr
NI56alK+/JOywenkkfu7tn/29RpY+722862WmuGs5IY0VMb2F+elz+V7CGK/HH3vDNwjhxc5NrrXv+l7
zcOYsm2nQ2+3z+dMropCWsdHypf4ZjiTEdDruajWUuvpe01597d2OQ9H3cceYa+mXamrBLS/9p3hk0Oz
...
MekoDN1j7nt8F//CXch19XtejTkvVz7z4DtZMjpFiH7O7e95xymf8VB1gjS7jAcM0T+Mu99sSyLp+/90
XCroTpP0Lz3e993Yyd265sax6VPM/HUW7lzIx54GSsOKVadJ2tKKwVoyMWQ8aPlxC889djZrR3tLDHal
NCDb/IRaq7/YBPR4U+F542hqSKDWIx7rSWwSJ4R2+nb
'''
class BitReader:
def __init__(self, encoded):
self.encoded = encoded.replace('\n', '')
self.position = 0
self.accum = 0
self.nbits = 0
def GetNextBit(self):
if self.nbits == 0:
c = self.encoded[self.position]
self.position += 1
self.accum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.index(c)
self.nbits = 6
bit = 1 & (self.accum >> 5)
self.accum = 0b111111 & (self.accum << 1)
self.nbits -= 1
return bit
def Huffman(reader, node):
while isinstance(node, tuple):
node = node[reader.GetNextBit()]
return node
def Expand():
reader = BitReader(Bits)
pw = ''
wlist = []
for w in range(NumWords):
repeatLen = Huffman(reader, Repeat)
tailLen = Huffman(reader, Tail)
if repeatLen == 0:
i = 0
else:
i = ord(pw[repeatLen-1]) - ord('`')
w = pw[:repeatLen]
for _ in range(tailLen):
c = Huffman(reader, Char[i])
w += c
i = ord(c) - ord('`')
wlist.append(w)
pw = w
return '\n'.join(wlist)
if __name__ == "__main__":
print(Expand())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment