from solutions import BaseSolution class Solution(BaseSolution): input_file = "16.txt" def __str__(self): return "Day 16: Permutation Promenade" def _move(self, programs, m, i): l = len(programs) if m == "s": r = int(i) return programs[-r:] + programs[: l - r] if m == "x": x, y = [int(s) for s in i.split("/")] z = programs[x] programs[x] = programs[y] programs[y] = z return programs if m == "p": xp, yp = i.split("/") 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)] moves = puzzle_input.split(",") return "".join(self._dance(programs, moves)) def solve_again(self, puzzle_input, n=16): moves = puzzle_input.split(",") 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 for _ in range(10**9 % dances): programs = self._dance(programs, moves) return "".join(programs) if __name__ == "__main__": solution = Solution() solution.show_results()