2018-09-22 23:42:18 +00:00
import re # Import Regex tools
import string # Import string tools
2018-09-23 02:40:39 +00:00
import collections
2018-09-22 23:42:18 +00:00
ciphertext = input ( " Please type in your cipher text: " ) # Set variable cipertext to the input from user.
2018-09-23 02:40:39 +00:00
shiftNum = input ( " Please enter the shift used: " ) # Get input
2018-09-22 23:42:18 +00:00
ciphertext = re . sub ( r ' ([^a-zA-Z ]+?) ' , ' ' , ciphertext ) # Remove all non-letters.
2018-09-23 02:40:39 +00:00
ciphertext = ciphertext . lower ( ) # Make it all lowercase. https://www.geeksforgeeks.org/isupper-islower-lower-upper-python-applications/
2018-09-22 23:42:18 +00:00
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)
2018-09-23 02:40:39 +00:00
while letterPos < 26 : # While the letter's position in the alphabet is less than 26 (and thus valid), continue.
2018-09-22 23:42:18 +00:00
if ciphertext [ letterCount ] == letters [ letterPos ] : # Match the letter in the ciphertext to a letter in the alphabet and once they match, continue.
2018-09-23 02:40:39 +00:00
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.
2018-09-22 23:42:18 +00:00
letter = letter - 26
if letter < 0 :
2018-09-23 02:40:39 +00:00
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.
2018-09-22 23:42:18 +00:00
2018-09-23 02:40:39 +00:00
letterPos = letterPos + 1 # Iterate through letter positions in the alphabet. (neccessary to find one that matches.)
if letterPos > 25 : # If the letter position
2018-09-22 23:42:18 +00:00
letterPos = letterPos - 26
letterCount = letterCount + 1
2018-09-23 02:40:39 +00:00
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 ( " \n Your enciphered text is: " + answer ) # NOTE TO SELF: catch spaces for nice formatting in answer.
freq ( )
2018-09-22 23:42:18 +00:00
'''
2018-09-23 02:40:39 +00:00
On line #4 Regex
2018-09-22 23:42:18 +00:00
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
'''