/ Python / 2017 / 10.py
10.py
 1  from lib import *
 2  
 3  input = read_input(2017, 10).strip()
 4  
 5  
 6  nums = [*range(256)]
 7  pos = 0
 8  skip = 0
 9  
10  
11  def rev(a, b):
12      a %= len(nums)
13      b = (b - a) % len(nums)
14      nums[:] = nums[a:] + nums[:a]
15      nums[:b] = nums[:b][::-1]
16      nums[:] = nums[-a:] + nums[:-a]
17  
18  
19  for length in map(int, input.split(",")):
20      rev(pos, pos + length)
21      pos += length + skip
22      skip += 1
23  
24  print(nums[0] * nums[1])
25  
26  
27  lengths = [*map(ord, input), 17, 31, 73, 47, 23]
28  nums = [*range(256)]
29  pos = 0
30  skip = 0
31  
32  
33  def rev(a, b):
34      a %= len(nums)
35      b = (b - a) % len(nums)
36      nums[:] = nums[a:] + nums[:a]
37      nums[:b] = nums[:b][::-1]
38      nums[:] = nums[-a:] + nums[:-a]
39  
40  
41  for _ in range(64):
42      for length in lengths:
43          rev(pos, pos + length)
44          pos += length + skip
45          skip += 1
46  
47  dense = []
48  for i in range(16):
49      x = 0
50      for j in range(16):
51          x ^= nums[i * 16 + j]
52  
53      dense.append(x)
54  
55  print("".join(f"{x:02x}" for x in dense))