Skip to content

Instantly share code, notes, and snippets.

@Taiiwo
Last active August 29, 2015 14:25
Show Gist options
  • Save Taiiwo/aa85fb57995a902dc043 to your computer and use it in GitHub Desktop.
Save Taiiwo/aa85fb57995a902dc043 to your computer and use it in GitHub Desktop.
def compress(data):
# format data
data = data.replace(" ", "")
data = data.replace("\n", "")
# find an unused pattern
i = 0;
while i < len(data):
pattern = bin(i)[2:]
if pattern not in data and pattern[0] != '0':
break
i += 1;
# Now we have the shortest unused pattern
# return pattern
#echoLength = len(data) / len(pattern)
highest = [False, False]
_highest = highest
a = len(pattern)
b = 0
_dataAb = len(data[b:b+a])
oneMatched = False
while a < (len(data) / 4) + 1:
for b in xrange(len(data) - a):
echo = data[b:b+a]
c = data.count(echo)
if c > 1:
oneMatched = True
compression = ((len(echo) * c) - (len(pattern) * c)) - 32
if c > 1:
if compression > highest[1] or not highest[1]:
if data.replace(echo, pattern).replace(pattern, echo) ==\
data and echo[0] != '0':
print "c: %s | a %s" % \
(c,data.replace(echo, pattern).count(pattern))
highest[0] = echo
highest[1] = compression
if a > _dataAb:
# echo length went up by one
if not oneMatched:
break
oneMatched = False
_dataAb = a
a += 1
if highest[0]:
print "replaced %s with %s %s times saving %s bytes" % \
(highest[0], pattern, data.count(highest[0]), highest[1])
"""
data = ( \
"0" * (16 - len(pattern)) + pattern) + \
("0" * (16 - len(highest[0])) + highest[0]) + \
data.replace(highest[0], pattern
)
"""
data = data.replace(highest[0], pattern)
return (pattern, highest[0], data)
else:
return ("", "", data)
def decompress(pattern, echo, data):
#pattern = data[0:16]
#echo = data[17:32]
#data = data[33:]
print pattern
print echo
return data.replace(pattern, echo)
if __name__ == "__main__":
#data = "0111100010101010011000011101011000110110101010010101110110001110110001010110000000001000101100101111101110111111110111010011111111011010001101001011011110101010100011100011001001110110100001011100100100000111001010111101001110000001111100010000011000000100001011111111001010011010101011111010110010000100010101000111000101001111011001011011101010000011100010011011001001000010111000100101001011100100000111101001110101101010110011011010101101111011100001111000110100000001010101110110110111001000010111000100000101100011001000100000101011001101111011001000000010010110011001011110000001000011011100100101011100010000000111011000011100101011000000010000110010010011111001010010000101110111100001100100000011101100010011010010011110000100111100101010101111100001100101111111101100000111011110011000111000001110011001100011001010010110010011100101000110101001011101010101111100011000111000100001111100111111001100110101011101011110101110001001110001110111011110000000001011011011100101010010101010001110001100001010010100010000100000001001101010000110001010001111000011101000001010101011000111000100001101000010100001110111010100000110011001100001100100100010110000100010100000010000101000010011011110110110101100010101011010101110011110101011010000000011110100101101011010100101101001010101100110011101001011010110010110111110111111011000001000011001100110000011000110110101100011011100111001100001110010000010001011000000010110001111100001000100100101101101100011110001011011011010011000100010110010011100011000010111001011110011100001000100101101010001001110101000011001110001111110010000100011100101110001100010100111100011011110111010111010010110100110001010011111001111101100011111010101111111001000010011010000100110001001001011001010011011000111101111100111101100010001110001000100010111000010001001100010100111101010110110111111011100010100111010001010010111000100110011110000000100001111011011111000100011001010101110010010110010111000001111011111000011001010001010000110010001001011101111011100000011011010010110010110011100000111101110000011111100000100010001101000010001100011110110000101001101110010101001110000010000010001101110010001100011000100110110100100001000010111101100000011100011110100000110011111101101110110111011110010101011110111000110000001001100111011101110000011011100000100011110110000110011010110010100110101011000100101100111111100101110101110010001000001010101101110101011100011101110010001110010101000111110101101010100001110001001110011111000011100010111010010100100010001000010111110110010111101011111011101001101001111010000111010011101111111100100011111011100011010111000001000001000010110111010001101011111110011001001010100011110101111010001101111010000101100110001001100100001010110001100111010001011011010011011100000000000111011111110011101000001001111100011101000100010111101100101001111011011111001110001011111011010100001111111100011111100000000011101011110001001010011111111110110011110011110011110000101011100010101100001101000011111101001100010100000111100101011001011101001000110101011010111100110000000101100000110110100111100000001100100100010111110011000000011100101110010100000001110000100110011110010010011001000010110101010001011100100111001101000001011101100101000111010010000011110111010110011110010011100111101100100010000001110110001111110111111001010101011011100111110011110100011000000001111100100001110000001011000001101111100011100011011111011001100001011010101111101010111110010011100001011100111000101000000001001010011100010010010101001100010101011111001111100100100111111000101100000100110100001110011011101011000001101010011011110110001110111011100100011010101111000000000000101100011111101001101001000000001000101010011101101111101101100100110001000000011011000100101000101110011111111100100000010101111111110100011011001010010000001001000101000000010010100010010000100001111111010101010111110111110110110101101011011110010001001011011000110110011111001001101101111101"
data = """
01001100 01101111 01110010 01100101 01101101 00100000 01101001 01110000 01110011 01110101 01101101 00100000 01100100 01101111 01101100 01101111 01110010 00100000 01110011 01101001 01110100 00100000 01100001 01101101 01100101 01110100 00101100 00100000 01100011 01101111 01101110 01110011 01100101 01100011 01110100 01100101 01110100 01110101 01110010 00100000 01100001 01100100 01101001 01110000 01101001 01110011 01100011 01101001 01101110 01100111 00100000 01100101 01101100 01101001 01110100 00101100 00100000 01110011 01100101 01100100 00100000 01100100 01101111 00100000 01100101 01101001 01110101 01110011 01101101 01101111 01100100 00100000 01110100 01100101 01101101 01110000 01101111 01110010 00100000 01101001 01101110 01100011 01101001 01100100 01101001 01100100 01110101 01101110 01110100 00100000 01110101 01110100 00100000 01101100 01100001 01100010 01101111 01110010 01100101 00100000 01100101 01110100 00100000 01100100 01101111 01101100 01101111 01110010 01100101 00100000 01101101 01100001 01100111 01101110 01100001 00100000 01100001 01101100 01101001 01110001 01110101 01100001 00101110 00100000 01010101 01110100 00100000 01100101 01101110 01101001 01101101 00100000 01100001 01100100 00100000 01101101 01101001 01101110 01101001 01101101 00100000 01110110 01100101 01101110 01101001 01100001 01101101 00101100 00100000 01110001 01110101 01101001 01110011 00100000 01101110 01101111 01110011 01110100 01110010 01110101 01100100 00100000 01100101 01111000 01100101 01110010 01100011 01101001 01110100 01100001 01110100 01101001 01101111 01101110 00100000 01110101 01101100 01101100 01100001 01101101 01100011 01101111 00100000 01101100 01100001 01100010 01101111 01110010 01101001 01110011 00100000 01101110 01101001 01110011 01101001 00100000 01110101 01110100 00100000 01100001 01101100 01101001 01110001 01110101 01101001 01110000 00100000 01100101 01111000 00100000 01100101 01100001 00100000 01100011 01101111 01101101 01101101 01101111 01100100 01101111 00100000 01100011 01101111 01101110 01110011 01100101 01110001 01110101 01100001 01110100 00101110 00100000 01000100 01110101 01101001 01110011 00100000 01100001 01110101 01110100 01100101 00100000 01101001 01110010 01110101 01110010 01100101 00100000 01100100 01101111 01101100 01101111 01110010 00100000 01101001 01101110 00100000 01110010 01100101 01110000 01110010 01100101 01101000 01100101 01101110 01100100 01100101 01110010 01101001 01110100 00100000 01101001 01101110 00100000 01110110 01101111 01101100 01110101 01110000 01110100 01100001 01110100 01100101 00100000 01110110 01100101 01101100 01101001 01110100 00100000 01100101 01110011 01110011 01100101 00100000 01100011 01101001 01101100 01101100 01110101 01101101 00100000 01100100 01101111 01101100 01101111 01110010 01100101 00100000 01100101 01110101 00100000 01100110 01110101 01100111 01101001 01100001 01110100 00100000 01101110 01110101 01101100 01101100 01100001 00100000 01110000 01100001 01110010 01101001 01100001 01110100 01110101 01110010 00101110 00100000 01000101 01111000 01100011 01100101 01110000 01110100 01100101 01110101 01110010 00100000 01110011 01101001 01101110 01110100 00100000 01101111 01100011 01100011 01100001 01100101 01100011 01100001 01110100 00100000 01100011 01110101 01110000 01101001 01100100 01100001 01110100 01100001 01110100 00100000 01101110 01101111 01101110 00100000 01110000 01110010 01101111 01101001 01100100 01100101 01101110 01110100 00101100 00100000 01110011 01110101 01101110 01110100 00100000 01101001 01101110 00100000 01100011 01110101 01101100 01110000 01100001 00100000 01110001 01110101 01101001 00100000 01101111 01100110 01100110 01101001 01100011 01101001 01100001 00100000 01100100 01100101 01110011 01100101 01110010 01110101 01101110 01110100 00100000 01101101 01101111 01101100 01101100 01101001 01110100 00100000 01100001 01101110 01101001 01101101 00100000 01101001 01100100 00100000 01100101 01110011 01110100 00100000 01101100 01100001 01100010 01101111 01110010 01110101 01101101 00101110
"""
#data = "1" * 100
data = data.replace(" ", "")
data = data.replace("\n", "")
oData = data
_datalen = len(data)
dataF = data
pattern, echo, data = compress(data)
if len(data) < len(dataF):
dataF = data
print dataF
print len(dataF)
print "saved %s bytes. ratio: %s" % \
(_datalen - len(dataF), len(dataF) / float(_datalen))
if decompress(pattern, echo, data) == oData:
print "Compression Successful!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment