stupid decompression algorithm
This commit is contained in:
parent
22249dd6e4
commit
1c41b9aab1
44
09-2.py
44
09-2.py
@ -1,28 +1,34 @@
|
|||||||
# Python!
|
# Python!
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
class compression_group:
|
||||||
|
def __init__(self, match_object):
|
||||||
|
self.length, self.reps = [int(x) for x in match_object.groups()]
|
||||||
|
self.marker_start, self.body_start = match_object.span()
|
||||||
|
self.end = self.body_start + self.length
|
||||||
|
|
||||||
|
|
||||||
with open('09.txt') as file:
|
with open('09.txt') as file:
|
||||||
compressed = file.read().rstrip('\n')
|
compressed = file.read().rstrip('\n')
|
||||||
|
|
||||||
|
|
||||||
def split_groups(sequence)
|
|
||||||
groups = []
|
|
||||||
while sequence:
|
|
||||||
marker = marker_exp.match(sequence)
|
|
||||||
stop = marker.span()[1] + int(marker.groups()[0])
|
|
||||||
groups.append(sequence[:stop])
|
|
||||||
sequence = sequence[stop:]
|
|
||||||
return groups
|
|
||||||
|
|
||||||
|
|
||||||
marker_exp = re.compile('\((\d*)x(\d*)\)')
|
marker_exp = re.compile('\((\d*)x(\d*)\)')
|
||||||
|
char_exp = re.compile('[\(\)\dx]')
|
||||||
|
|
||||||
sections = split_groups(compressed)
|
markers = marker_exp.finditer(compressed)
|
||||||
|
groups = [compression_group(m) for m in markers]
|
||||||
for section in sections:
|
|
||||||
subgroups = []
|
|
||||||
while marker_exp.findall(subgroups) > 1:
|
|
||||||
subgroups = split_groups(section)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
characters = 0
|
||||||
|
index = 0
|
||||||
|
for i, c in enumerate(compressed):
|
||||||
|
if not char_exp.match(c):
|
||||||
|
current_groups = []
|
||||||
|
multiplier = 1
|
||||||
|
for group in groups:
|
||||||
|
if group.body_start <= i < group.end:
|
||||||
|
multiplier *= group.reps
|
||||||
|
current_groups.append(group)
|
||||||
|
elif current_groups and i > current_groups[0].end:
|
||||||
|
break
|
||||||
|
characters += multiplier
|
||||||
|
|
||||||
|
print(characters)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user