from math import ceil from string import ascii_lowercase def getIndex(row: int, col: int, rows: int) -> int: return col * rows + row def getRowAndCol(x: int, rows: int) -> tuple[int, int]: return x // rows, x % rows def encodeRouteCipher(message: str, rows: int) -> str: row_len = ceil(len(message) / rows) missing_chars = row_len * rows - len(message) message += "".join(reversed(ascii_lowercase))[:missing_chars] encoded_string = "" for i in range(len(message)): row, col = getRowAndCol(i, row_len) encoded_string += message[getIndex(row, col, rows)] encoded_message = f"{rows}" for i in range(0, rows): if i % 2 == 0: encoded_message += encoded_string[i * row_len : (i + 1) * row_len] else: encoded_message += encoded_string[i * row_len : (i + 1) * row_len][::-1] return encoded_message def decodeRouteCipher(encodedMessage: str) -> str: decoded_message = "" rows = int(encodedMessage[0]) encoded_string = encodedMessage[1:] row_len = ceil(len(encoded_string) / rows) decoded_string = "" for i in range(rows): if i % 2 == 0: decoded_string += encoded_string[i * row_len : (i + 1) * row_len] else: decoded_string += encoded_string[i * row_len : (i + 1) * row_len][::-1] for i in range(len(decoded_string)): row, col = getRowAndCol(i, rows) decoded_message += decoded_string[getIndex(row, col, row_len)] return decoded_message.rstrip(ascii_lowercase) print("Testing encodeRouteCipher()...", end="") assert encodeRouteCipher("ASECRETMESSAGE", 4) == "4AREGESESETSzyAMC" assert encodeRouteCipher("ASECRETMESSAGE", 3) == "3ACTSGESMRSEEEAz" assert encodeRouteCipher("ASECRETMESSAGE", 5) == "5AESATSEMGEECRSz" assert encodeRouteCipher("ANOTHERSECRET", 4) == "4AHETzCENORRyxEST" print("Testing decodeRouteCipher()...", end="") assert decodeRouteCipher("4AREGESESETSzyAMC") == "ASECRETMESSAGE" assert decodeRouteCipher("3ACTSGESMRSEEEAz") == "ASECRETMESSAGE" assert decodeRouteCipher("5AESATSEMGEECRSz") == "ASECRETMESSAGE" assert decodeRouteCipher("4AHETzCENORRyxEST") == "ANOTHERSECRET" message = "SECRETSTUFFGOESHERE" encodedMessage = encodeRouteCipher(message, 6) plaintext = decodeRouteCipher(encodedMessage) assert plaintext == message print("Passed!")