···11import fileinput
22-from utils import Point
33-44-55-def knot_hash(msg):
66- lengths = [ord(x) for x in msg] + [17, 31, 73, 47, 23]
77- sparse = range(0, 256)
88- pos = 0
99- skip = 0
1010-1111- for _ in range(64):
1212- for l in lengths:
1313- for i in range(l // 2):
1414- x = (pos + i) % len(sparse)
1515- y = (pos + l - i - 1) % len(sparse)
1616- sparse[x], sparse[y] = sparse[y], sparse[x]
1717-1818- pos = pos + l + skip % len(sparse)
1919- skip += 1
2020-2121- sparse = sparse
2222- dense = []
2323-2424- for i in range(16):
2525- res = 0
2626- for j in range(0, 16):
2727- res ^= sparse[(i * 16) + j]
2828-2929- dense.append(res)
3030-3131- return ''.join('%02x' % x for x in dense)
22+from utils import Point, knot_hash
323334345KEY_STRING = fileinput.input()[0].strip()
+3-4
2017/utils.py
···122122 pos = pos + l + skip % len(sparse)
123123 skip += 1
124124125125- sparse = sparse
126126- dense = []
125125+ hash_val = 0
127126128127 for i in range(16):
129128 res = 0
130129 for j in range(0, 16):
131130 res ^= sparse[(i * 16) + j]
132131133133- dense.append(res)
132132+ hash_val += res << ((16 - i - 1) * 8)
134133135135- return ''.join('%02x' % x for x in dense)
134134+ return '%032x' % hash_val
136135137136138137@total_ordering