advent-of-code/2016-python2/output/day_21.py

65 lines
2 KiB
Python
Raw Normal View History

import re
from itertools import permutations
from output import ints
def solve(data):
data = [line.strip() for line in data.splitlines()]
p1 = scramble(data, "abcdefgh")
p2 = unscramble(data, "fbgdceah")
return p1, p2
def scramble(data, subject):
r_swap = r"(?:letter|position) (.)"
for line in data:
if line.startswith("rotate right"):
x = ints(line)[0]
subject = subject[-x:] + subject[:-x]
if line.startswith("rotate left"):
x = ints(line)[0]
subject = subject[x:] + subject[:x]
if line.startswith("rotate based"):
x = re.findall(r"letter (.)", line)[0]
i = subject.index(x)
j = i + 1 % len(subject)
subject = subject[-j:] + subject[:-j]
if i >= 4:
subject = subject[-1:] + subject[:-1]
if line.startswith("swap letter"):
x, y = re.findall(r_swap, line)
subject = subject.replace(y, "#")
subject = subject.replace(x, y)
subject = subject.replace("#", x)
if line.startswith("swap position"):
x, y = ints(line)
v1, v2 = subject[x], subject[y]
subject = subject[:x] + v2 + subject[x + 1 :]
subject = subject[:y] + v1 + subject[y + 1 :]
if line.startswith("move"):
x, y = ints(line)
v = subject[x]
subject = subject[:x] + subject[x + 1 :]
subject = subject[:y] + v + subject[y:]
if line.startswith("reverse"):
x, y = ints(line)
subject = subject[:x] + subject[x : y + 1][::-1] + subject[y + 1 :]
return subject
def unscramble(data, T):
for candidate in ["".join(c) for c in permutations(T)]:
if scramble(data, candidate) == T:
return candidate
if __name__ == "__main__":
with open("./input/21.txt", "r") as f:
inp = f.read().strip()
p1, p2 = solve(inp)
print(p1)
print(p2)