import re # Import Regex tools import string # Import string tools import collections ciphertext = input("Please type in your cipher text:") # Set variable cipertext to the input from user. shiftNum = input("Please enter the shift used:") # Get input ciphertext = re.sub (r'([^a-zA-Z ]+?)', '', ciphertext) # Remove all non-letters. ciphertext = ciphertext.lower() # Make it all lowercase. https://www.geeksforgeeks.org/isupper-islower-lower-upper-python-applications/ letters = list(string.ascii_lowercase) # Use a list of lowercase letters. https://stackoverflow.com/questions/43918437/how-to-iterate-through-the-alphabet letterCount = 0 # Set variable for keeping track of which letter in the ciphertext we're on. letterPos = 0 # Set variable for keeping track of the letter's position in the alphabet. answer = "" # The solution. for c in ciphertext: # For every letter in the ciphertext #Upletters = list(string.ascii_uppercase) while letterPos < 26: # While the letter's position in the alphabet is less than 26 (and thus valid), continue. if ciphertext[letterCount] == letters[letterPos]: # Match the letter in the ciphertext to a letter in the alphabet and once they match, continue. letter = int(letterPos) + int(shiftNum) # Take the position of the letter and the shift number and add them for the enciphered letter. if letter > 25: # If the enciphered letter's position is not valid because it is too high, fix it by rotating around the alphabet. letter = letter - 26 if letter < 0: letter = letter + 26 # If the enciphered letter's position is not valid because it is too low, fix it by rotating around the alphabet. answer = answer + letters[letter] # Add letters together to get the enciphered text. letterPos = letterPos + 1 # Iterate through letter positions in the alphabet. (neccessary to find one that matches.) if letterPos > 25: # If the letter position letterPos = letterPos - 26 letterCount = letterCount + 1 def freq(): print(collections.Counter(answer).most_common()[0][0]) # Find most common letter https://stackoverflow.com/questions/47251934/how-to-count-the-most-frequent-letter-in-a-string print("\nYour enciphered text is: " + answer) # NOTE TO SELF: catch spaces for nice formatting in answer. freq() ''' On line #4 Regex This feeds a regex to re.sub literally "If it doesn't match letters or spaces, convert it to nothing, process this variable." Scrub extranous info or typos. r marks it as a string literal (no escaping needed) [] indicates a set of characters, special characters become normal. ^ = start of the string. In a set like this, it matches anything that is not in the string. a-z matches lowercase letters. Z-Z matches caps letters matches a space +? essential means "try to match this till you can't" More info: https://docs.python.org/3/library/re.html ''' ''' ### Stackoverflow thanks to: First char of string: https://stackoverflow.com/questions/48973202/how-to-get-first-char-of-string-in-python Length of string: https://stackoverflow.com/questions/4967580/how-to-get-the-size-of-a-string-in-python Regex to scrub var of extranous info/symbols: https://stackoverflow.com/questions/44315941/regex-to-strip-all-numbers-and-special-characters-but-space-and-letters Proper syntax for if blocks: https://stackoverflow.com/questions/37376516/python-check-if-multiple-variables-have-the-same-value https://www.tutorialspoint.com/python/python_if_else.htm Find substring in a string: https://stackoverflow.com/questions/3437059/does-python-have-a-string-contains-substring-method '''