import shared from pprint import pprint as pp import sys OPEN = "([{<" CLOSE = ")]}>" PAIRS = dict(zip(OPEN, CLOSE)) PAIRS.update(zip(CLOSE, OPEN)) BAD_POINTS = dict(zip(CLOSE, [3, 57, 1197, 25137])) GOOD_POINTS = dict(zip(CLOSE, [1, 2, 3, 4])) def load_file(name): with open(name, "r") as f: my_file = [] for line in f: my_file.append(line.rstrip()) return [x for x in my_file] class Syntax: def __init__(self, name): self.parse(name) def parse(self, name): self.mx = load_file(name) self.good_lines = [] def find_all(self): bad_points = 0 all_points = [] for idx, line in enumerate(self.mx): c, bad = self.find_chunks(line) if bad: bad_points += BAD_POINTS[c] else: match_points = 0 for x in c: match_points *= 5 match_points += GOOD_POINTS[x] all_points.append(match_points) mp = list(sorted(all_points)) print(bad_points) # pt1 print(mp[len(mp) // 2]) # pt2 def find_chunks(self, line): unpaired = [] for idx, char in enumerate(line): if char in OPEN: unpaired.append(char) if char in CLOSE: if unpaired[-1] != PAIRS[char]: return char, True unpaired.pop(-1) # Line is good here unpaired = list(reversed(unpaired)) return [PAIRS[u] for u in unpaired], False def main(): s = Syntax(shared.get_fname(10)) s.find_all() if __name__ == "__main__": main()