47 lines
1.4 KiB
Python
47 lines
1.4 KiB
Python
from solutions import BaseSolution
|
|
|
|
|
|
class Solution(BaseSolution):
|
|
input_file = '10.txt'
|
|
list = []
|
|
l = 0
|
|
skip_size = 0
|
|
pos = 0
|
|
|
|
def __str__(self):
|
|
return 'Day 10: Knot Hash'
|
|
|
|
def reset(self, l=256):
|
|
self.list = list(range(l))
|
|
self.l = l
|
|
self.skip_size = 0
|
|
self.pos = 0
|
|
|
|
def reverse(self, sublist_length):
|
|
sublist = []
|
|
for i in range(sublist_length):
|
|
sublist.append(self.list[(self.pos + i) % self.l])
|
|
for i, n in enumerate(reversed(sublist)):
|
|
self.list[(self.pos + i) % self.l] = n
|
|
self.pos = (self.pos + sublist_length + self.skip_size) % self.l
|
|
self.skip_size += 1
|
|
|
|
def solve(self, puzzle_input, r=256):
|
|
self.reset(r)
|
|
for sublist_length in map(int, puzzle_input.split(',')):
|
|
self.reverse(sublist_length)
|
|
return self.list[0] * self.list[1]
|
|
|
|
def solve_again(self, puzzle_input, r=256):
|
|
puzzle_input = [ord(c) for c in puzzle_input] + [17, 31, 73, 47, 23]
|
|
self.reset(r)
|
|
for _ in range(64):
|
|
for sublist_length in puzzle_input:
|
|
self.reverse(sublist_length)
|
|
dense_hash = [eval('^'.join(list(map(str, self.list[seq:seq+16])))) for seq in range(0, r, 16)]
|
|
return ''.join(['{:x}'.format(int(i)).zfill(2) for i in dense_hash])
|
|
|
|
|
|
if __name__ == '__main__':
|
|
solution = Solution()
|
|
solution.show_results()
|