Browse Source

Solve 2016 day 21

Taddeus Kroes 6 năm trước cách đây
mục cha
commit
7f880a3030
2 tập tin đã thay đổi với 147 bổ sung0 xóa
  1. 47 0
      2016/21_scramble.py
  2. 100 0
      2016/input/21

+ 47 - 0
2016/21_scramble.py

@@ -0,0 +1,47 @@
+#!/usr/bin/env python3
+import sys
+from collections import deque
+
+def scramble(password, instructions, unscramble=False):
+    pw = deque(password)
+    if unscramble:
+        instructions = reversed(instructions)
+    for words in instructions:
+        if words[0] == 'swap':
+            index = pw.index if words[1] == 'letter' else int
+            i = index(words[2])
+            j = index(words[5])
+            pw[i], pw[j] = pw[j], pw[i]
+        elif words[0] == 'rotate':
+            if words[1] == 'based':
+                i = pw.index(words[-1])
+                if unscramble:
+                    oldi = i
+                    while (2 * oldi + 1 + (oldi >= 4)) % len(pw) != i:
+                        oldi = (oldi - 1) % len(pw)
+                        pw.rotate(-1)
+                    continue
+                index = i + 1 + (i >= 4)
+            elif words[1] == 'left':
+                index = -int(words[2])
+            else:
+                index = int(words[2])
+            pw.rotate(-index if unscramble else index)
+        elif words[0] == 'reverse':
+            start, end = map(int, words[2::2])
+            while start < end:
+                pw[start], pw[end] = pw[end], pw[start]
+                start += 1
+                end -= 1
+        elif words[0] == 'move':
+            src, dst = map(int, words[2::3])
+            if unscramble:
+                src, dst = dst, src
+            letter = pw[src]
+            del pw[src]
+            pw.insert(dst, letter)
+    return ''.join(pw)
+
+instructions = [line.split() for line in sys.stdin]
+print(scramble('abcdefgh', instructions))
+print(scramble('fbgdceah', instructions, True))

+ 100 - 0
2016/input/21

@@ -0,0 +1,100 @@
+rotate right 3 steps
+swap position 7 with position 0
+rotate left 3 steps
+reverse positions 2 through 5
+move position 6 to position 3
+reverse positions 0 through 4
+swap position 4 with position 2
+rotate based on position of letter d
+rotate right 0 steps
+move position 7 to position 5
+swap position 4 with position 5
+swap position 3 with position 5
+move position 5 to position 3
+swap letter e with letter f
+swap position 6 with position 3
+swap letter a with letter e
+reverse positions 0 through 1
+reverse positions 0 through 4
+swap letter c with letter e
+reverse positions 1 through 7
+rotate right 1 step
+reverse positions 6 through 7
+move position 7 to position 1
+move position 4 to position 0
+move position 4 to position 6
+move position 6 to position 3
+swap position 1 with position 6
+swap position 5 with position 7
+swap position 2 with position 5
+swap position 6 with position 5
+swap position 2 with position 4
+reverse positions 2 through 6
+reverse positions 3 through 5
+move position 3 to position 5
+reverse positions 1 through 5
+rotate left 1 step
+move position 4 to position 5
+swap letter c with letter b
+swap position 2 with position 1
+reverse positions 3 through 4
+swap position 3 with position 4
+reverse positions 5 through 7
+swap letter b with letter d
+reverse positions 3 through 4
+swap letter c with letter h
+rotate based on position of letter b
+rotate based on position of letter e
+rotate right 3 steps
+rotate right 7 steps
+rotate left 2 steps
+move position 6 to position 1
+reverse positions 1 through 3
+rotate based on position of letter b
+reverse positions 0 through 4
+swap letter g with letter c
+move position 1 to position 5
+rotate right 4 steps
+rotate left 2 steps
+move position 7 to position 2
+rotate based on position of letter c
+move position 6 to position 1
+swap letter f with letter g
+rotate right 6 steps
+swap position 6 with position 2
+reverse positions 2 through 6
+swap position 3 with position 1
+rotate based on position of letter h
+reverse positions 2 through 5
+move position 1 to position 3
+rotate right 1 step
+rotate right 7 steps
+move position 6 to position 3
+rotate based on position of letter h
+swap letter d with letter h
+rotate left 0 steps
+move position 1 to position 2
+swap letter a with letter g
+swap letter a with letter g
+swap position 4 with position 2
+rotate right 1 step
+rotate based on position of letter b
+swap position 7 with position 1
+rotate based on position of letter e
+move position 1 to position 4
+move position 6 to position 3
+rotate left 3 steps
+swap letter f with letter g
+swap position 3 with position 1
+swap position 4 with position 3
+swap letter f with letter c
+rotate left 3 steps
+rotate left 0 steps
+rotate right 3 steps
+swap letter d with letter e
+swap position 2 with position 7
+move position 3 to position 6
+swap position 7 with position 1
+swap position 3 with position 6
+rotate left 5 steps
+swap position 2 with position 6