|
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