diff --git a/python/oct2/level4/routeCipher2.py b/python/oct2/level4/routeCipher2.py new file mode 100644 index 0000000..4330a35 --- /dev/null +++ b/python/oct2/level4/routeCipher2.py @@ -0,0 +1,66 @@ +from math import ceil + + +def f(row: int, col: int, rows: int) -> int: + return col*rows + row + + +def i_f(x: int, rows: int) -> tuple[int, int]: + return x // rows, x % rows + + +def encodeRouteCipher(message: str, rows: int) -> str: + cur_char = "z" + row_len = ceil(len(message) / rows) + while len(message) % rows != 0: + message += cur_char + cur_char = chr(ord(cur_char) - 1) + encoded_string = "" + for i in range(len(message)): + row, col = i_f(i, row_len) + encoded_string += message[f(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 = i_f(i, rows) + decoded_message += decoded_string[f(row, col, row_len)] + while decoded_message[-1].islower(): + decoded_message = decoded_message[:-1] + return decoded_message + + +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!")