21_scramble.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/usr/bin/env python3
  2. import sys
  3. from collections import deque
  4. def scramble(password, instructions, unscramble=False):
  5. pw = deque(password)
  6. if unscramble:
  7. instructions = reversed(instructions)
  8. for words in instructions:
  9. if words[0] == 'swap':
  10. index = pw.index if words[1] == 'letter' else int
  11. i = index(words[2])
  12. j = index(words[5])
  13. pw[i], pw[j] = pw[j], pw[i]
  14. elif words[0] == 'rotate':
  15. if words[1] == 'based':
  16. i = pw.index(words[-1])
  17. if unscramble:
  18. oldi = i
  19. while (2 * oldi + 1 + (oldi >= 4)) % len(pw) != i:
  20. oldi = (oldi - 1) % len(pw)
  21. pw.rotate(-1)
  22. continue
  23. index = i + 1 + (i >= 4)
  24. elif words[1] == 'left':
  25. index = -int(words[2])
  26. else:
  27. index = int(words[2])
  28. pw.rotate(-index if unscramble else index)
  29. elif words[0] == 'reverse':
  30. start, end = map(int, words[2::2])
  31. while start < end:
  32. pw[start], pw[end] = pw[end], pw[start]
  33. start += 1
  34. end -= 1
  35. elif words[0] == 'move':
  36. src, dst = map(int, words[2::3])
  37. if unscramble:
  38. src, dst = dst, src
  39. letter = pw[src]
  40. del pw[src]
  41. pw.insert(dst, letter)
  42. return ''.join(pw)
  43. instructions = [line.split() for line in sys.stdin]
  44. print(scramble('abcdefgh', instructions))
  45. print(scramble('fbgdceah', instructions, True))