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