Advertisement
Guest User

Untitled

a guest
Jan 5th, 2018
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.39 KB | None | 0 0
  1. def rotate_dir_cw(dr, dc):
  2.     dirs = [(0,1), (1,0), (0,-1), (-1,0)]
  3.     return dirs[(dirs.index((dr,dc)) + 1) % 4]
  4.  
  5. class Cipher:
  6.     def __init__(self, letters, dirs, labels):
  7.         self.letters = letters
  8.         self.grid = [[letters[r*6+c] for c in range(6)] for r in range(6)]
  9.         self.dirs = dirs
  10.         self.labels = labels
  11.  
  12.     def encrypt(self, msg):
  13.         result = ''
  14.  
  15.         for c in msg:
  16.             if c in self.letters:
  17.                 coords = self.get_char_coords(c)
  18.                 tmp = self.get_label(coords)
  19.                 result += tmp + ' '
  20.                 self.next_state(coords)
  21.  
  22.         return result
  23.  
  24.     def next_state(self, coords):
  25.         r,c = coords
  26.         qr, qc = r//3, c//3
  27.         dr, dc = self.dirs[qr][qc]
  28.         sr, sc = (r+dr)%6, (c+dc)%6
  29.         sqr, sqc = sr//3, sc//3
  30.  
  31.         self.grid[r][c], self.grid[sr][sc] = self.grid[sr][sc], self.grid[r][c]
  32.  
  33.         self.rotate_quad_cw(qr, qc)
  34.         if (qr, qc) != (sqr, sqc):
  35.             self.rotate_quad_cw(sqr, sqc)
  36.  
  37.     def rotate_quad_cw(self, qr, qc):
  38.         sr, sc = qr*3, qc*3
  39.  
  40.         new_quad = [[0 for i in range(3)] for j in range(3)]
  41.  
  42.         for r in range(3):
  43.             for c in range(3):
  44.                 new_quad[c][2-r] = self.grid[sr+r][sc+c]
  45.  
  46.         for r in range(3):
  47.             for c in range(3):
  48.                 self.grid[sr+r][sc+c] = new_quad[r][c]
  49.  
  50.         self.dirs[qr][qc] = rotate_dir_cw(*self.dirs[qr][qc])
  51.  
  52.  
  53.     def get_label(self, coords):
  54.         r, c = coords
  55.         return self.labels[0][r] + self.labels[1][c]
  56.  
  57.     def get_char_coords(self, char):
  58.         for r in range(6):
  59.             for c in range(6):
  60.                 if self.grid[r][c] == char:
  61.                     return r, c
  62.         return None
  63.  
  64.     def print_state(self):
  65.         r_labels, c_labels = self.labels
  66.         print('  ' + ' '.join(c_labels))
  67.         for r, row in enumerate(self.grid):
  68.             print(r_labels[r] + ' ' + ' '.join(row))
  69.  
  70.         print(self.dirs)
  71.  
  72. # initial grid configuration
  73. letters = '''
  74.    xcui1o
  75.    pm7zah
  76.    g8v5jf
  77.    tyb0nr
  78.    9ql2w3
  79.    s64dke
  80. '''.replace(' ','').replace('\n', '')
  81.  
  82. # row labels, column labels
  83. labels = ['adfxgv', 'xgfadv']
  84.  
  85. # direction of dot on each quadrant
  86. dirs = [
  87.     [[1,0], [1,0]],
  88.     [[-1,0], [0,1]],
  89. ]
  90.  
  91. cipher = Cipher(letters, dirs, labels)
  92. print(cipher.encrypt('attack at dawn'))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement