index koinc. s mezerami
[krypto.git] / posuny.py
1 import referencni
2 from referencni import reference
3 from ocesavac import ocesat
4
5 ABECEDA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
6
7 def posun(char, pos=1):
8     if 65 <= ord(char) < 91 - pos:
9         return chr(ord(char) + pos)
10     if ord(char) < 91 and ord(char) >= 91 - pos:
11         return chr(ord(char) + pos - 26)
12     else:
13         return char
14
15 def vsechny(zprava):
16     posunuty = zprava.upper()
17     analyza = []
18     for i in range(26):
19         posunuty = map(posun, posunuty)
20         analyza.append(''.join(posunuty))
21     return analyza
22
23 def eu_vzdalenost(v1, v2):
24     return sum([(x - y)**2 for (x, y) in zip(v1, v2)])
25
26 def nejlepsi(text):
27     ref = referencni.nacti('bref')
28     freq = dict()
29     for char in ocesat(text, False):
30         freq[char] = freq.get(char, 0) + 1
31     celkem = sum(freq.values())
32     frekv = [float(freq.get(char, 0))/celkem for char in ABECEDA]
33     vzdalenost = eu_vzdalenost(frekv, ref.frekvence)
34     posunuti = 0
35     for i in range(1, 26):
36         frekv = [frekv[25]] + frekv[:-1]
37         v2 = eu_vzdalenost(frekv, ref.frekvence)
38         if v2 < vzdalenost:
39             vzdalenost = v2
40             posunuti = i
41     return (posunuti, ''.join([posun(char, posunuti) for char in text.upper()]))