lepsi formatovani indexu
[krypto.git] / posuny.py
1 """Modul pro praci s posuny v abecede."""
2
3 import referencni
4 from referencni import reference
5 from ocesavac import ocesat
6 from spolecne import ABECEDA
7
8 def posun(char, pos=1):
9     """Pokud dostane velke pismeno, vrati pismeno ktere je od nej vzdaleno
10     'pos' mist v abecede. Jinak vrati puvodni pismeno."""
11     if 65 <= ord(char) < 91 - pos:
12         return chr(ord(char) + pos)
13     if ord(char) < 91 and ord(char) >= 91 - pos:
14         return chr(ord(char) + pos - 26)
15     else:
16         return char
17
18 def vsechny(zprava):
19     """Pro danou zpravu (libovolny text vsetne zvlastnich znaku) vrati
20     vsechny jeji posuny v abecede."""
21     posunuty = zprava.upper()
22     analyza = []
23     for _ in range(26):
24         posunuty = [posun(char) for char in  posunuty]
25         analyza.append(''.join(posunuty))
26     return analyza
27
28 def eu_vzdalenost(vec1, vec2):
29     """Euklidovska vzdalenost dvou vektoru."""
30     return sum([(x - y)**2 for (x, y) in zip(vec1, vec2)])
31
32 def nejlepsi(text):
33     """Vrati text (neocesany) posunuty tak, aby mel frekvence znaku co
34     nejblizsi cestine bez mezer."""
35     posunuti = nej_posun(text)
36     return (posunuti, ''.join([posun(char, posunuti) for char in text.upper()]))
37
38 def nej_posun(text):
39     """Vrati pocet znaku v abecede, o ktere by se mel text posunout, aby mel
40     frekvence znaku co nejblize cestine bez mezer."""
41     ref = referencni.nacti('bref')
42     freq = dict()
43     for char in ocesat(text, False):
44         freq[char] = freq.get(char, 0) + 1
45     celkem = sum(freq.values())
46     frekv = [float(freq.get(char, 0))/celkem for char in ABECEDA]
47     vzdalenost = eu_vzdalenost(frekv, ref.frekvence)
48     posunuti = 0
49     for i in range(1, 26):
50         frekv = [frekv[25]] + frekv[:-1]
51         nova_vzdalenost = eu_vzdalenost(frekv, ref.frekvence)
52         if nova_vzdalenost < vzdalenost:
53             vzdalenost = nova_vzdalenost
54             posunuti = i
55     return posunuti