-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday_22.py
95 lines (79 loc) · 2.34 KB
/
day_22.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
import re
from datetime import datetime
from functools import lru_cache
time_start = datetime.now()
with open('day_22.input', 'r') as file:
lines = file.readlines()
number_pattern = r"^[0-9]+"
start_secretes = [int(v) for result in lines for v in re.findall(number_pattern, result)]
def calculate_secret(secret: int):
step1 = (secret ^ (secret * 64)) % 16777216
step2 = (step1 ^ (step1 // 32)) % 16777216
step3 = (step2 ^ (step2 * 2048)) % 16777216
return step3
def calculate_secret_dept(secret, dept, seq):
prev = secret % 10
for i in range(dept):
secret = calculate_secret(secret)
cur = secret % 10
seq[0].append(cur)
seq[1].append(cur - prev)
prev = cur
return secret
# Part1
total = 0
seq_array = []
for secret in start_secretes:
seq = ([], [])
result = calculate_secret_dept(secret, 2000, seq)
total += result
seq_array.append(seq)
print("part1", total)
print("part1 time: ", datetime.now() - time_start)
# for each secret and array of tuples (banana price, difference)
# print(seq_array)
# print(len(seq_array))
# print(len(seq_array[0]))
# Build data to calculate bananas
price_dict = {i: set() for i in range(10)}
seq_dicts = []
# BananaPrices, Difference
for bps, diff in seq_array:
seq_dict = {}
for i in range(0, len(bps), 1):
if i + 4 > len(bps):
continue
key = str(diff[i:i + 4])
value = bps[i + 3]
# Only first occurrence
if key not in seq_dict:
seq_dict[key] = value
price_dict[value].add(key)
seq_dicts.append(seq_dict)
def get_seq_total(seq):
total = 0
for seq_dict in seq_dicts:
if seq in seq_dict:
total += seq_dict[seq]
return total
# Now check what sequence gives most banana
def check_most_bananas():
best = 0
size = len(seq_dicts)
for b in range(9, -1, -1):
for seq in price_dict[b]:
total = get_seq_total(seq)
if total > best:
# print(seq)
best = total
if size * b <= total:
print("Skip rest")
return best
return best
print("part2", check_most_bananas())
# start = 123
# for i in range(10):
# start = calculate_secret(start)
# print(start)
print("Total time: ", datetime.now() - time_start)
#Total time: 0:00:30.041562