Advertisement
Guest User

cryptology25_frequency_analysis.py

a guest
Feb 18th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.59 KB | None | 0 0
  1. from string import ascii_uppercase
  2.  
  3. ETAOIN = 'ETAOINSHRDLCUMWFGYPBVKJXQZ'
  4.  
  5. def get_letter_count(text):
  6.     letter_count = {
  7.         'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E': 0,
  8.         'F': 0, 'G': 0, 'H': 0, 'I': 0, 'J': 0,
  9.         'K': 0, 'L': 0, 'M': 0, 'N': 0, 'O': 0,
  10.         'P': 0, 'Q': 0, 'R': 0, 'S': 0, 'T': 0,
  11.         'U': 0, 'V': 0, 'W': 0, 'X': 0, 'Y': 0,
  12.         'Z': 0
  13.     }
  14.  
  15.     for letter in text.upper():
  16.         if letter in LETTERS:
  17.             letter_count[letter] += 1
  18.  
  19.     return letter_count
  20.  
  21. def get_zero_item(items):
  22.     return items[0]
  23.  
  24. def get_freq_order(text):
  25.     letter_to_freq = get_letter_count(text)
  26.  
  27.     freq_to_letter = {}
  28.     for letter in LETTERS:
  29.         if letter_to_freq[letter] not in freq_to_letter:
  30.             freq_to_letter[letter_to_freq[letter]] = [letter]
  31.         else:
  32.             freq_to_letter[letter_to_freq[letter]].append(letter)
  33.  
  34.     for freq in freq_to_letter:
  35.         freq_to_letter[freq].sort(key=ETAOIN.find, reverse=True)
  36.         freq_to_letter[freq] = ''.join(freq_to_letter[freq])
  37.  
  38.     freq_pairs = list(freq_to_letter.items())
  39.     freq_pairs.sort(key=get_zero_item, reverse=True)
  40.  
  41.     freq_order = []
  42.     for freq_pair in freq_pairs:
  43.         freq_order.append(freq_pair[1])
  44.  
  45.     return ''.join(freq_order)
  46.  
  47.  
  48. def get_freq_score(text):
  49.     freq_order = get_freq_order(text)
  50.     score = 0
  51.     for common_letter in ETAOIN[:6]:
  52.         if common_letter in freq_order[:6]:
  53.             score += 1
  54.     for uncommon_letter in ETAOIN[-6:]:
  55.         if uncommon_letter in freq_order[-6:]:
  56.             score += 1
  57.  
  58.     return score
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement