16 for line in open(filename, "r"):
23 if line == 'your ticket:':
27 elif line == 'nearby tickets:':
32 # we've got a line of data - woo!
34 (rule,data) = line.split(": ")
35 ranges = [[int(a) for a in rule.split("-")] for rule in data.split(" or ")]
40 myticket=[int(a) for a in line.split(",")]
44 tickets.append([int(a) for a in line.split(",")])
46 def check_rules(value):
47 for rule in rules.keys():
48 for valrange in rules[rule]:
49 if value >= valrange[0] and value <= valrange[1]:
53 def get_invalid_fields(ticket):
56 if not check_rules(point):
57 invalid_fields.append(point)
63 print("My ticket: ", ",".join([str(a) for a in myticket]))
64 print("Nearby tickets:")
68 for ticket in tickets:
69 print(",".join([str(a) for a in ticket]))
70 ticket_bad_fields=get_invalid_fields(ticket)
71 if len(ticket_bad_fields) > 0:
72 bad_fields.extend(ticket_bad_fields)
74 valid_tickets.append(ticket)
76 print("Part 1:", sum(bad_fields))
78 possible_fields=[[k for k in rules.keys()] for i in range(len(myticket))]
80 def check_field(field, ranges):
81 print("Field:", field,"\nRanges:", ranges)
82 for valrange in ranges:
83 if field >= valrange[0] and field <= valrange[1]:
88 def check_fields(possible_fields, ticket):
89 print("Check Possible fields:",possible_fields)
90 print("Check ticket:", ticket)
91 for number,field in enumerate(ticket):
93 print(possible_fields[number])
94 for possible_rule in possible_fields[number]:
95 print("Possible rule:", possible_rule)
96 ranges=rules[possible_rule]
97 print("Ranges:", ranges)
98 if check_field(field, ranges):
99 new_possibles.append(possible_rule)
100 possible_fields[number]=new_possibles
102 print(possible_fields)
104 for ticket in valid_tickets:
105 print(possible_fields)
108 check_fields(possible_fields, ticket)
109 if sum([len(fields) for fields in possible_fields]) == len(myticket):
110 # we have all the fields, lets break from our loop
113 # loop until we only have one possible for each field
114 while sum([len(fields) for fields in possible_fields]) != len(myticket):
115 for a,fields in enumerate(possible_fields):
119 for b,fields2 in enumerate(possible_fields):
120 if len(fields2) == 1:
121 if fields2[0] in fields:
122 fields.remove(fields2[0])
125 print(possible_fields)
126 actual_fields=[f[0] for f in possible_fields]
128 # loop through the fields that have 'departure' at the start
130 for a,field in enumerate(actual_fields):
131 if field[:9] == "departure":
134 print("Part 2:", mult)