Guest User

Untitled

a guest
Dec 5th, 2024
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.01 KB | None | 0 0
  1. from functools import cmp_to_key
  2.  
  3. def solve_a(path):
  4.     file = open(path)
  5.     lines = file.readlines()
  6.     file.close()
  7.     delimiter_idx = lines.index("\n")
  8.     lines = list(map(lambda line: str(line).removesuffix("\n"), lines))
  9.     rules = list(map(lambda line: tuple(str(line).split('|')), lines[:delimiter_idx]))
  10.     updates = lines[delimiter_idx+1:]
  11.     return sum(map(find_middle, (filter(lambda update: update_correct(update, rules), updates))))
  12.  
  13. def update_correct(update: str, rules: list[tuple[str, ...]]) -> bool:
  14.     pages = update.split(',')
  15.     for i, page in enumerate(pages):
  16.         page_rules = list(filter(lambda rule: tuple(rule)[0] == page, rules))
  17.         for page_rule in page_rules:
  18.             try:
  19.                 second_idx = pages.index(page_rule[1])
  20.                 if i > second_idx:
  21.                     return False
  22.             except ValueError:
  23.                 continue
  24.     return True
  25.  
  26. def find_middle(line: str) -> int:
  27.     values = list(map(lambda l: int(l), line.split(',')))
  28.     return values[len(values)//2]
  29.  
  30.  
  31. precedence = {}
  32.  
  33. def solve_b(path):
  34.     file = open(path)
  35.     lines = file.readlines()
  36.     file.close()
  37.     delimiter_idx = lines.index("\n")
  38.     lines = list(map(lambda line: str(line).removesuffix("\n"), lines))
  39.     rules = list(map(lambda line: tuple(str(line).split('|')), lines[:delimiter_idx]))
  40.     for left, right in rules:
  41.         precedence.setdefault(left, set()).add(right)
  42.     updates = lines[delimiter_idx+1:]
  43.     to_order = list(filter(lambda update: not update_correct(update, rules), updates))
  44.  
  45.     return sum(map(lambda update: find_middle(order(update)), to_order))
  46.  
  47.  
  48.  
  49. def order(update: str) -> str:
  50.     pages = update.split(',')
  51.     return ','.join(sorted(pages, key=cmp_to_key(compare)))
  52.  
  53. def compare(x, y):
  54.     if y in precedence.get(x, set()):
  55.         return -1
  56.     elif x in precedence.get(y, set()):
  57.         return 1
  58.     else:
  59.         return 0
  60.  
  61. if __name__ == '__main__':
  62.     print(solve_a('input'))
  63.     print(solve_b('input'))
Advertisement
Add Comment
Please, Sign In to add comment