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

56 lines
1.6 KiB
Python
Raw Normal View History

2021-11-01 16:40:46 +01:00
from solutions import BaseSolution
class Solution(BaseSolution):
2025-05-06 20:14:58 +02:00
input_file = "16.txt"
2021-11-01 16:40:46 +01:00
def __str__(self):
2025-05-06 20:14:58 +02:00
return "Day 16: Permutation Promenade"
2021-11-01 16:40:46 +01:00
def _move(self, programs, m, i):
l = len(programs)
2025-05-06 20:14:58 +02:00
if m == "s":
2021-11-01 16:40:46 +01:00
r = int(i)
2025-05-06 20:14:58 +02:00
return programs[-r:] + programs[: l - r]
if m == "x":
x, y = [int(s) for s in i.split("/")]
2021-11-01 16:40:46 +01:00
z = programs[x]
programs[x] = programs[y]
programs[y] = z
return programs
2025-05-06 20:14:58 +02:00
if m == "p":
xp, yp = i.split("/")
2021-11-01 16:40:46 +01:00
x = programs.index(xp)
y = programs.index(yp)
z = programs[x]
programs[x] = programs[y]
programs[y] = z
return programs
def _dance(self, programs, moves):
for m in moves:
programs = self._move(programs, m[0], m[1:])
return programs
def solve(self, puzzle_input, n=16):
programs = [chr(c) for c in range(97, 97 + n)]
2025-05-06 20:14:58 +02:00
moves = puzzle_input.split(",")
return "".join(self._dance(programs, moves))
2021-11-01 16:40:46 +01:00
def solve_again(self, puzzle_input, n=16):
2025-05-06 20:14:58 +02:00
moves = puzzle_input.split(",")
2021-11-01 16:40:46 +01:00
initial = [chr(c) for c in range(97, 97 + n)]
programs = list(self.solve(puzzle_input))
dances = 1
while not programs == initial:
programs = self._dance(programs, moves)
dances += 1
2025-05-06 20:14:58 +02:00
for _ in range(10**9 % dances):
2021-11-01 16:40:46 +01:00
programs = self._dance(programs, moves)
2025-05-06 20:14:58 +02:00
return "".join(programs)
2021-11-01 16:40:46 +01:00
2025-05-06 20:14:58 +02:00
if __name__ == "__main__":
2021-11-01 16:40:46 +01:00
solution = Solution()
solution.show_results()