aocpy/2017/d16.py

61 lines
1.3 KiB
Python
Raw Normal View History

2024-05-29 08:35:48 +02:00
from lib import LETTERS_LOWER, str_to_int, str_to_ints
def one_cycle(xs, insts):
for inst in insts:
if inst.startswith("s"):
v = str_to_int(inst)
if v != 0:
xs = xs[-v:] + xs[:len(xs) - v]
elif inst.startswith("x"):
a, b = str_to_ints(inst)
xs[a], xs[b] = xs[b], xs[a]
elif inst.startswith("p"):
la, lb = inst[1], inst[3]
a, b = xs.index(la), xs.index(lb)
xs[a], xs[b] = xs[b], xs[a]
else:
assert False
return xs
def part_1(data):
xs = list(LETTERS_LOWER[:16])
insts = data.split(",")
xs = one_cycle(xs, insts)
r = "".join(xs)
print(r)
def part_2(data):
repeat = 10**9
xs = list(LETTERS_LOWER[:16])
insts = data.split(",")
cycle = 0
seen = {}
for i in range(repeat):
xs = one_cycle(xs, insts)
xst = tuple(xs)
if not xst in seen:
seen[xst] = i
else:
cycle = (i - seen[xst])
break
xs = list(LETTERS_LOWER[:16])
repeat %= cycle
for i in range(repeat):
xs = one_cycle(xs, insts)
r = "".join(xs)
print(r)
def main():
data = open(0).read().strip()
part_1(data)
part_2(data)
if __name__ == "__main__":
main()