part2.py 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import argparse
  2. import functools
  3. parser = argparse.ArgumentParser()
  4. parser.add_argument("ifile", type=argparse.FileType('r'))
  5. args = parser.parse_args()
  6. ILLEGAL_CHARS = {
  7. ')': '(',
  8. ']': '[',
  9. '}': '{',
  10. '>': '<'
  11. }
  12. def protoBalance(stack, char):
  13. if stack is None:
  14. return None
  15. if char not in ILLEGAL_CHARS.keys():
  16. return stack + [char]
  17. else:
  18. prev = stack[-1]
  19. if prev != ILLEGAL_CHARS[char]:
  20. return None
  21. return stack[:-1]
  22. filelines = args.ifile.readlines()
  23. protoLines = filter(lambda line: functools.reduce(protoBalance, line, []) is not None, map(str.strip, filelines))
  24. COMPLETION_CHARS = {
  25. '{': ('}', 3),
  26. '(': (')', 1),
  27. '[': (']', 2),
  28. '<': ('>', 4)
  29. }
  30. def protoComplete(seq: str):
  31. stack = functools.reduce(lambda stack, char: stack + [char] if char in COMPLETION_CHARS.keys() else stack[:-1], seq, [])
  32. return functools.reduce(lambda acc, val: acc * 5 + COMPLETION_CHARS[val][1], reversed(stack), 0)
  33. scores = list(map(protoComplete, protoLines))
  34. scores.sort()
  35. print(scores[int(len(scores) / 2)])