Skip to content

Commit 22a4f26

Browse files
committed
initial
1 parent 42e9b09 commit 22a4f26

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

other/frequency_finder.py

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# Frequency Finder
2+
3+
# frequency taken from http://en.wikipedia.org/wiki/Letter_frequency
4+
englishLetterFreq = {'E': 12.70, 'T': 9.06, 'A': 8.17, 'O': 7.51, 'I': 6.97,
5+
'N': 6.75, 'S': 6.33, 'H': 6.09, 'R': 5.99, 'D': 4.25,
6+
'L': 4.03, 'C': 2.78, 'U': 2.76, 'M': 2.41, 'W': 2.36,
7+
'F': 2.23, 'G': 2.02, 'Y': 1.97, 'P': 1.93, 'B': 1.29,
8+
'V': 0.98, 'K': 0.77, 'J': 0.15, 'X': 0.15, 'Q': 0.10,
9+
'Z': 0.07}
10+
ETAOIN = 'ETAOINSHRDLCUMWFGYPBVKJXQZ'
11+
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
12+
13+
def getLetterCount(message):
14+
letterCount = {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E': 0, 'F': 0, 'G': 0, 'H': 0,
15+
'I': 0, 'J': 0, 'K': 0, 'L': 0, 'M': 0, 'N': 0, 'O': 0, 'P': 0,
16+
'Q': 0, 'R': 0, 'S': 0, 'T': 0, 'U': 0, 'V': 0, 'W': 0, 'X': 0,
17+
'Y': 0, 'Z': 0}
18+
for letter in message.upper():
19+
if letter in LETTERS:
20+
letterCount[letter] += 1
21+
22+
return letterCount
23+
24+
def getItemAtIndexZero(x):
25+
return x[0]
26+
27+
def getFrequencyOrder(message):
28+
letterToFreq = getLetterCount(message)
29+
freqToLetter = {}
30+
for letter in LETTERS:
31+
if letterToFreq[letter] not in freqToLetter:
32+
freqToLetter[letterToFreq[letter]] = [letter]
33+
else:
34+
freqToLetter[letterToFreq[letter]].append(letter)
35+
36+
for freq in freqToLetter:
37+
freqToLetter[freq].sort(key = ETAOIN.find, reverse = True)
38+
freqToLetter[freq] = ''.join(freqToLetter[freq])
39+
40+
freqPairs = list(freqToLetter.items())
41+
freqPairs.sort(key = getItemAtIndexZero, reverse = True)
42+
43+
freqOrder = []
44+
for freqPair in freqPairs:
45+
freqOrder.append(freqPair[1])
46+
47+
return ''.join(freqOrder)
48+
49+
def englishFreqMatchScore(message):
50+
'''
51+
>>> englishFreqMatchScore('Hello World')
52+
1
53+
'''
54+
freqOrder = getFrequencyOrder(message)
55+
matchScore = 0
56+
for commonLetter in ETAOIN[:6]:
57+
if commonLetter in freqOrder[:6]:
58+
matchScore += 1
59+
60+
for uncommonLetter in ETAOIN[-6:]:
61+
if uncommonLetter in freqOrder[-6:]:
62+
matchScore += 1
63+
64+
return matchScore
65+
66+
if __name__ == '__main__':
67+
import doctest
68+
doctest.testmod()

0 commit comments

Comments
 (0)