Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import re
- re_MARKER = re.compile("\(([0-9]+)x([0-9]+)\)(.+)")
- class CompressedString(object):
- def __init__(self, s):
- self.s = s
- def __len__(self):
- return len(self.decompress())
- def __str__(self):
- return self.decompress()
- def __repr__(self):
- return self.s
- def decompress(self):
- out = ""
- s = self.s
- while True:
- m = re_MARKER.search(s)
- if not m:
- out += s
- break #append the rest of s
- out += self.s[:m.start()]
- d = decompress(s[m.start():])
- out += d[0]
- s = d[1]
- return out
- def decompress(s):
- """please start with a (NxM) group"""
- m = re_MARKER.match(s)
- if not m: raise ValueError
- m = m.groups()
- if int(m[0]) > len(m[2]): raise IndexError
- return (m[2][:int(m[0])]*int(m[1]), m[2][int(m[0]):])
- debug_total = 0
- def super_decompress(s):
- global debug_total
- m = re_MARKER.search(s)
- if not m: return len(s)
- l = m.start()
- m = m.groups()
- p1 = s[l:]
- unparsed = ''
- while True:
- if re_MARKER.match(p1):
- p = decompress(p1)
- p1 = p[0]
- unparsed = p[1] + unparsed
- else:
- debug_total += len(p1)
- l += len(p1)
- p1 = unparsed
- unparsed = ''
- if not re_MARKER.match(p1):
- if p1:
- l += super_decompress(p1)
- break
- return l
- def main():
- global debug_total
- with open("input.txt", 'r') as f:
- l = f.readline().strip("\r\n")
- print "Part 1 solution:", len(CompressedString(l))
- try:
- print "Part 2 solution:", super_decompress(l)
- except KeyboardInterrupt:
- print debug_total
- if __name__ == "__main__": main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement