|
1 | 1 | # Frequency Finder
|
2 | 2 |
|
| 3 | +import string |
| 4 | + |
3 | 5 | # frequency taken from http://en.wikipedia.org/wiki/Letter_frequency
|
4 |
| -englishLetterFreq = { |
| 6 | +english_letter_freq = { |
5 | 7 | "E": 12.70,
|
6 | 8 | "T": 9.06,
|
7 | 9 | "A": 8.17,
|
|
33 | 35 | LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
34 | 36 |
|
35 | 37 |
|
36 |
| -def getLetterCount(message): |
37 |
| - letterCount = { |
38 |
| - "A": 0, |
39 |
| - "B": 0, |
40 |
| - "C": 0, |
41 |
| - "D": 0, |
42 |
| - "E": 0, |
43 |
| - "F": 0, |
44 |
| - "G": 0, |
45 |
| - "H": 0, |
46 |
| - "I": 0, |
47 |
| - "J": 0, |
48 |
| - "K": 0, |
49 |
| - "L": 0, |
50 |
| - "M": 0, |
51 |
| - "N": 0, |
52 |
| - "O": 0, |
53 |
| - "P": 0, |
54 |
| - "Q": 0, |
55 |
| - "R": 0, |
56 |
| - "S": 0, |
57 |
| - "T": 0, |
58 |
| - "U": 0, |
59 |
| - "V": 0, |
60 |
| - "W": 0, |
61 |
| - "X": 0, |
62 |
| - "Y": 0, |
63 |
| - "Z": 0, |
64 |
| - } |
| 38 | +def get_letter_count(message: str) -> dict[str, int]: |
| 39 | + letter_count = {letter: 0 for letter in string.ascii_uppercase} |
65 | 40 | for letter in message.upper():
|
66 | 41 | if letter in LETTERS:
|
67 |
| - letterCount[letter] += 1 |
| 42 | + letter_count[letter] += 1 |
68 | 43 |
|
69 |
| - return letterCount |
| 44 | + return letter_count |
70 | 45 |
|
71 | 46 |
|
72 |
| -def getItemAtIndexZero(x): |
| 47 | +def get_item_at_index_zero(x: tuple) -> str: |
73 | 48 | return x[0]
|
74 | 49 |
|
75 | 50 |
|
76 |
| -def getFrequencyOrder(message): |
77 |
| - letterToFreq = getLetterCount(message) |
78 |
| - freqToLetter = {} |
| 51 | +def get_frequency_order(message: str) -> str: |
| 52 | + letter_to_freq = get_letter_count(message) |
| 53 | + freq_to_letter: dict[int, list[str]] = { |
| 54 | + freq: [] for letter, freq in letter_to_freq.items() |
| 55 | + } |
79 | 56 | for letter in LETTERS:
|
80 |
| - if letterToFreq[letter] not in freqToLetter: |
81 |
| - freqToLetter[letterToFreq[letter]] = [letter] |
82 |
| - else: |
83 |
| - freqToLetter[letterToFreq[letter]].append(letter) |
| 57 | + freq_to_letter[letter_to_freq[letter]].append(letter) |
| 58 | + |
| 59 | + freq_to_letter_str: dict[int, str] = {} |
84 | 60 |
|
85 |
| - for freq in freqToLetter: |
86 |
| - freqToLetter[freq].sort(key=ETAOIN.find, reverse=True) |
87 |
| - freqToLetter[freq] = "".join(freqToLetter[freq]) |
| 61 | + for freq in freq_to_letter: |
| 62 | + freq_to_letter[freq].sort(key=ETAOIN.find, reverse=True) |
| 63 | + freq_to_letter_str[freq] = "".join(freq_to_letter[freq]) |
88 | 64 |
|
89 |
| - freqPairs = list(freqToLetter.items()) |
90 |
| - freqPairs.sort(key=getItemAtIndexZero, reverse=True) |
| 65 | + freq_pairs = list(freq_to_letter_str.items()) |
| 66 | + freq_pairs.sort(key=get_item_at_index_zero, reverse=True) |
91 | 67 |
|
92 |
| - freqOrder = [] |
93 |
| - for freqPair in freqPairs: |
94 |
| - freqOrder.append(freqPair[1]) |
| 68 | + freq_order: list[str] = [freq_pair[1] for freq_pair in freq_pairs] |
95 | 69 |
|
96 |
| - return "".join(freqOrder) |
| 70 | + return "".join(freq_order) |
97 | 71 |
|
98 | 72 |
|
99 |
| -def englishFreqMatchScore(message): |
| 73 | +def english_freq_match_score(message: str) -> int: |
100 | 74 | """
|
101 |
| - >>> englishFreqMatchScore('Hello World') |
| 75 | + >>> english_freq_match_score('Hello World') |
102 | 76 | 1
|
103 | 77 | """
|
104 |
| - freqOrder = getFrequencyOrder(message) |
105 |
| - matchScore = 0 |
106 |
| - for commonLetter in ETAOIN[:6]: |
107 |
| - if commonLetter in freqOrder[:6]: |
108 |
| - matchScore += 1 |
| 78 | + freq_order = get_frequency_order(message) |
| 79 | + match_score = 0 |
| 80 | + for common_letter in ETAOIN[:6]: |
| 81 | + if common_letter in freq_order[:6]: |
| 82 | + match_score += 1 |
109 | 83 |
|
110 |
| - for uncommonLetter in ETAOIN[-6:]: |
111 |
| - if uncommonLetter in freqOrder[-6:]: |
112 |
| - matchScore += 1 |
| 84 | + for uncommon_letter in ETAOIN[-6:]: |
| 85 | + if uncommon_letter in freq_order[-6:]: |
| 86 | + match_score += 1 |
113 | 87 |
|
114 |
| - return matchScore |
| 88 | + return match_score |
115 | 89 |
|
116 | 90 |
|
117 | 91 | if __name__ == "__main__":
|
|
0 commit comments