CMU Coding Bootcamp
1from math import ceil
2from string import ascii_lowercase
3
4def getIndex(row: int, col: int, rows: int) -> int:
5 return col*rows + row
6
7
8def getRowAndCol(x: int, rows: int) -> tuple[int, int]:
9 return x // rows, x % rows
10
11
12def encodeRouteCipher(message: str, rows: int) -> str:
13 row_len = ceil(len(message) / rows)
14 missing_chars = row_len * rows - len(message)
15 message += "".join(reversed(ascii_lowercase))[:missing_chars]
16 encoded_string = ""
17 for i in range(len(message)):
18 row, col = getRowAndCol(i, row_len)
19 encoded_string += message[getIndex(row, col, rows)]
20 encoded_message = f"{rows}"
21 for i in range(0, rows):
22 if i % 2 == 0:
23 encoded_message += encoded_string[i*row_len:(i+1)*row_len]
24 else:
25 encoded_message += encoded_string[i*row_len:(i+1)*row_len][::-1]
26 return encoded_message
27
28
29def decodeRouteCipher(encodedMessage: str) -> str:
30 decoded_message = ""
31 rows = int(encodedMessage[0])
32 encoded_string = encodedMessage[1:]
33 row_len = ceil(len(encoded_string) / rows)
34 decoded_string = ""
35 for i in range(rows):
36 if i % 2 == 0:
37 decoded_string += encoded_string[i*row_len:(i+1)*row_len]
38 else:
39 decoded_string += encoded_string[i*row_len:(i+1)*row_len][::-1]
40 for i in range(len(decoded_string)):
41 row, col = getRowAndCol(i, rows)
42 decoded_message += decoded_string[getIndex(row, col, row_len)]
43 return decoded_message.rstrip(ascii_lowercase)
44
45
46print("Testing encodeRouteCipher()...", end="")
47assert encodeRouteCipher("ASECRETMESSAGE", 4) == "4AREGESESETSzyAMC"
48assert encodeRouteCipher("ASECRETMESSAGE", 3) == "3ACTSGESMRSEEEAz"
49assert encodeRouteCipher("ASECRETMESSAGE", 5) == "5AESATSEMGEECRSz"
50assert encodeRouteCipher("ANOTHERSECRET", 4) == "4AHETzCENORRyxEST"
51
52
53print("Testing decodeRouteCipher()...", end="")
54assert decodeRouteCipher("4AREGESESETSzyAMC") == "ASECRETMESSAGE"
55assert decodeRouteCipher("3ACTSGESMRSEEEAz") == "ASECRETMESSAGE"
56assert decodeRouteCipher("5AESATSEMGEECRSz") == "ASECRETMESSAGE"
57assert decodeRouteCipher("4AHETzCENORRyxEST") == "ANOTHERSECRET"
58message = "SECRETSTUFFGOESHERE"
59encodedMessage = encodeRouteCipher(message, 6)
60plaintext = decodeRouteCipher(encodedMessage)
61assert plaintext == message
62print("Passed!")