-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfive.py
114 lines (106 loc) · 2.69 KB
/
five.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import re
from functools import cmp_to_key
eg = """47|53
97|13
97|61
97|47
75|29
61|13
75|53
29|13
97|29
53|29
61|53
97|53
61|29
47|13
75|47
97|75
47|61
75|61
47|29
75|13
53|13
75,47,61,53,29
97,61,53,29,13
75,29,13
75,97,47,61,53
61,13,29
97,13,75,29,47
"""
def one(source):
rules = {}
count = 0
is_rules = True
for line in source.splitlines():
if line == "":
is_rules = False
continue
if is_rules:
key = line.split('|')[1]
rule = rules.get(key, [])
rule.append(line.split('|')[0])
rules[key] = rule
else:
valid = True
update = line.split(",")
for i in range(0, len(update)):
item = update[i]
for j in range(i, len(update)):
if item in rules and update[j] in rules[item]:
#print(f"{update} failed on {item}: {rules[item]}")
valid = False
break
if valid:
count += int(update[int(len(update)/2)])
print(f"{count}")
one(eg)
print("---")
with open("five.txt", "r") as file:
one(file.read())
print("---")
def fix(update, rules):
for i in range(0, len(update)):
item = update[i]
for j in range(i, len(update)):
if item in rules and update[j] in rules[item]:
update[j], update[i] = update[i], update[j]
print(f"swapped {update[j]} and {update[i]}: {update}")
def cmp(a, b, rules):
if a in rules and b in rules[a]:
return 1
if b in rules and a in rules[b]:
return -1
return 0
def two(source):
rules = {}
count = 0
is_rules = True
for line in source.splitlines():
if line == "":
is_rules = False
continue
if is_rules:
key = line.split('|')[1]
rule = rules.get(key, [])
rule.append(line.split('|')[0])
rules[key] = rule
else:
update = line.split(",")
invalid = False
for i in range(0, len(update)):
item = update[i]
for j in range(i, len(update)):
if item in rules and update[j] in rules[item]:
#print(f"{update} failed on {item}: {rules[item]}")
invalid = True
break
if invalid:
fixed = sorted(update, key=cmp_to_key(lambda a, b: cmp(a, b, rules)))
#print(f"sorted: {fixed}")
count += int(fixed[int(len(fixed)/2)])
print(f"{count}")
two(eg)
print("---")
with open("five.txt", "r") as file:
two(file.read())