-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay10.py
60 lines (50 loc) · 1.54 KB
/
Day10.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
# AOC17 day 10
from functools import reduce
from KnotHash import KnotHash
def knot_hash(nums, spans):
pos = 0
skip_size = 0
for span in spans:
reversed_values = []
for i in range(span):
reversed_values.append(nums[(pos + i) % len(nums)])
reversed_values.reverse()
for i in range(span):
nums[(pos + i) % len(nums)] = reversed_values[i]
pos = (pos + span + skip_size) % len(nums)
skip_size += 1
def sparse_hash(nums, spans):
pos = 0
skip_size = 0
for span in spans * 64:
reversed_values = []
for i in range(span):
reversed_values.append(nums[(pos + i) % len(nums)])
reversed_values.reverse()
for i in range(span):
nums[(pos + i) % len(nums)] = reversed_values[i]
pos = (pos + span + skip_size) % len(nums)
skip_size += 1
def dense_hash(nums):
xord = []
for i in range(16):
xord.append(reduce(lambda x, y: x ^ y, nums[i * 16:i * 16 + 16], 0))
dense = ""
for n in xord:
h = hex(n)[2:]
if len(h) == 1:
h = "0" + h
dense += h
return dense
def load_data(f_name):
with open(f_name, "r") as f:
data_read = f.read()
return data_read
def run():
data = load_data("Day10.txt")
spans = list(map(int, data.split(",")))
nums = list(range(256))
knot_hash(nums, spans)
print(f"The result of multiplying the first two numbers is {nums[0] * nums[1]}")
kh = KnotHash(data)
print(f"The dense hash is {kh.hex()}")