-
Notifications
You must be signed in to change notification settings - Fork 0
/
21.py
76 lines (75 loc) · 2.14 KB
/
21.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
pwd = 'abcdefgh'
ls = []
with open('21.txt') as f:
for line in f:
l = line.strip().split()
ls.append(l)
if l[0] == 'swap':
if l[1] == 'position':
x, y = int(l[2]), int(l[5])
a = pwd[x]
b = pwd[y]
else:
a, b = l[2], l[5]
pwd = pwd.replace(a, 'x')
pwd = pwd.replace(b, a)
pwd = pwd.replace('x', b)
elif l[0] == 'reverse':
a, b = int(l[2]), int(l[4])
if a == 0:
pwd = pwd[b::-1] + pwd[b+1:]
else:
pwd = pwd[:a] + pwd[b:a-1:-1] + pwd[b+1:]
elif l[0] == 'rotate':
if l[1] == 'left':
a = int(l[2])
elif l[1] == 'right':
a = -int(l[2])
else:
a = pwd.find(l[6])
if a >= 4:
a +=1
a = -((a+1) % len(pwd))
pwd = pwd[a:] + pwd[:a]
elif l[0] == 'move':
a, b = int(l[2]), int(l[5])
c = pwd[a]
pwd = pwd[:a] + pwd[a+1:]
pwd = pwd[:b] + c + pwd[b:]
print('Part 1: ',pwd)
pwd = 'fbgdceah'
for l in ls[::-1]:
if l[0] == 'swap':
if l[1] == 'position':
x, y = int(l[2]), int(l[5])
a = pwd[x]
b = pwd[y]
else:
a, b = l[2], l[5]
pwd = pwd.replace(a, 'x')
pwd = pwd.replace(b, a)
pwd = pwd.replace('x', b)
elif l[0] == 'reverse':
a, b = int(l[2]), int(l[4])
if a == 0:
pwd = pwd[b::-1] + pwd[b+1:]
else:
pwd = pwd[:a] + pwd[b:a-1:-1] + pwd[b+1:]
elif l[0] == 'rotate':
if l[1] == 'left':
a = -int(l[2])
elif l[1] == 'right':
a = int(l[2])
else:
a = pwd.find(l[6])
if a in [2,4,6]:
a = a//2+5
else:
a = a//2+1
pwd = pwd[a:] + pwd[:a]
elif l[0] == 'move':
b, a = int(l[2]), int(l[5])
c = pwd[a]
pwd = pwd[:a] + pwd[a+1:]
pwd = pwd[:b] + c + pwd[b:]
print('Part 2: ',pwd)