advent-of-code/2017-python/solutions/day_10.py

50 lines
1.5 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()