Advertisement
Guest User

Untitled

a guest
Dec 15th, 2020
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.36 KB | None | 0 0
  1. from copy import deepcopy
  2.  
  3. inpt = open("input.txt").read().split("\n\n")
  4.  
  5. constraints = list(map(lambda x: x.split(": ")[1].split(" or "), inpt[0].split('\n')))
  6. your_ticket = list(map(int, inpt[1].split("\n")[1].split(',')))
  7.  
  8. nearby_tickets = inpt[2].split('\n')[1:]
  9.  
  10. valid_tickets = set(nearby_tickets)
  11.  
  12. total_error_rate = 0
  13.  
  14. for nearby_ticket in nearby_tickets:
  15. ticket_nums = list(map(int, nearby_ticket.split(",")))
  16.  
  17. for num in ticket_nums:
  18. for constraint in constraints:
  19.  
  20. con1 = list(map(int, constraint[0].split("-")))
  21. con2 = list(map(int, constraint[1].split("-")))
  22.  
  23.  
  24. if con1[0] <= num <= con1[1] or con2[0] <= num <= con2[1]:
  25. break
  26. else:
  27. total_error_rate += num
  28. valid_tickets.remove(nearby_ticket)
  29. break
  30.  
  31.  
  32. name_to_constraint = {con.split(': ')[0]: con.split(": ")[1].split(" or ") for con in inpt[0].split('\n')}
  33. possible_vals = [set(name_to_constraint.keys()) for i in range(len(name_to_constraint))]
  34.  
  35. changed = True
  36. while changed:
  37. changed = False
  38.  
  39. for ticket in valid_tickets:
  40. ticket_fields = list(map(int, ticket.split(",")))
  41.  
  42. for pos, field in enumerate(ticket_fields):
  43. possibles = possible_vals[pos]
  44.  
  45. for constraint in possibles.copy():
  46. con1 = list(map(int, name_to_constraint[constraint][0].split("-")))
  47. con2 = list(map(int, name_to_constraint[constraint][1].split("-")))
  48.  
  49. if con1[0] <= field <= con1[1] or con2[0] <= field <= con2[1]:
  50. continue
  51. else:
  52. possibles.remove(constraint)
  53. changed = True
  54.  
  55. if not changed:
  56. for possibles in possible_vals:
  57. if len(possibles) == 1:
  58. field = next(iter(possibles))
  59.  
  60. for possibles1 in possible_vals:
  61. if possibles1 is not possibles:
  62. try:
  63. possibles1.remove(field)
  64. changed = True
  65. except Exception:
  66. continue
  67.  
  68.  
  69. vals = 1
  70. count = 0
  71.  
  72.  
  73. for pos, field in enumerate(possible_vals):
  74. f = next(iter(field))
  75. if "departure" in f:
  76. vals *= your_ticket[pos]
  77. count += 1
  78.  
  79. print(vals)
  80. print(count)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement