Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def rotate_dir_cw(dr, dc):
- dirs = [(0,1), (1,0), (0,-1), (-1,0)]
- return dirs[(dirs.index((dr,dc)) + 1) % 4]
- class Cipher:
- def __init__(self, letters, dirs, labels):
- self.letters = letters
- self.grid = [[letters[r*6+c] for c in range(6)] for r in range(6)]
- self.dirs = dirs
- self.labels = labels
- def encrypt(self, msg):
- result = ''
- for c in msg:
- if c in self.letters:
- coords = self.get_char_coords(c)
- tmp = self.get_label(coords)
- result += tmp + ' '
- self.next_state(coords)
- return result
- def next_state(self, coords):
- r,c = coords
- qr, qc = r//3, c//3
- dr, dc = self.dirs[qr][qc]
- sr, sc = (r+dr)%6, (c+dc)%6
- sqr, sqc = sr//3, sc//3
- self.grid[r][c], self.grid[sr][sc] = self.grid[sr][sc], self.grid[r][c]
- self.rotate_quad_cw(qr, qc)
- if (qr, qc) != (sqr, sqc):
- self.rotate_quad_cw(sqr, sqc)
- def rotate_quad_cw(self, qr, qc):
- sr, sc = qr*3, qc*3
- new_quad = [[0 for i in range(3)] for j in range(3)]
- for r in range(3):
- for c in range(3):
- new_quad[c][2-r] = self.grid[sr+r][sc+c]
- for r in range(3):
- for c in range(3):
- self.grid[sr+r][sc+c] = new_quad[r][c]
- self.dirs[qr][qc] = rotate_dir_cw(*self.dirs[qr][qc])
- def get_label(self, coords):
- r, c = coords
- return self.labels[0][r] + self.labels[1][c]
- def get_char_coords(self, char):
- for r in range(6):
- for c in range(6):
- if self.grid[r][c] == char:
- return r, c
- return None
- def print_state(self):
- r_labels, c_labels = self.labels
- print(' ' + ' '.join(c_labels))
- for r, row in enumerate(self.grid):
- print(r_labels[r] + ' ' + ' '.join(row))
- print(self.dirs)
- # initial grid configuration
- letters = '''
- xcui1o
- pm7zah
- g8v5jf
- tyb0nr
- 9ql2w3
- s64dke
- '''.replace(' ','').replace('\n', '')
- # row labels, column labels
- labels = ['adfxgv', 'xgfadv']
- # direction of dot on each quadrant
- dirs = [
- [[1,0], [1,0]],
- [[-1,0], [0,1]],
- ]
- cipher = Cipher(letters, dirs, labels)
- print(cipher.encrypt('attack at dawn'))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement