X-Git-Url: http://git.tomasm.cz/krypto.git/blobdiff_plain/31b480a285bb43eb2d8254292a2c3619372c4354..refs/heads/jakobsen2:/posuny.py diff --git a/posuny.py b/posuny.py index 7145900..fd08e8c 100644 --- a/posuny.py +++ b/posuny.py @@ -1,10 +1,12 @@ -import referencni +"""Modul pro praci s posuny v abecede.""" + from referencni import reference from ocesavac import ocesat - -ABECEDA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +from spolecne import ABECEDA def posun(char, pos=1): + """Pokud dostane velke pismeno, vrati pismeno ktere je od nej vzdaleno + 'pos' mist v abecede. Jinak vrati puvodni pismeno.""" if 65 <= ord(char) < 91 - pos: return chr(ord(char) + pos) if ord(char) < 91 and ord(char) >= 91 - pos: @@ -13,17 +15,28 @@ def posun(char, pos=1): return char def vsechny(zprava): + """Pro danou zpravu (libovolny text vsetne zvlastnich znaku) vrati + vsechny jeji posuny v abecede.""" posunuty = zprava.upper() analyza = [] - for i in range(26): - posunuty = map(posun, posunuty) + for _ in range(26): + posunuty = [posun(char) for char in posunuty] analyza.append(''.join(posunuty)) - return '\n'.join(analyza) + return analyza -def eu_vzdalenost(v1, v2): - return sum([(x - y)**2 for (x, y) in zip(v1, v2)]) +def eu_vzdalenost(vec1, vec2): + """Euklidovska vzdalenost dvou vektoru.""" + return sum([(x - y)**2 for (x, y) in zip(vec1, vec2)]) def nejlepsi(text): + """Vrati text (neocesany) posunuty tak, aby mel frekvence znaku co + nejblizsi cestine bez mezer.""" + posunuti = nej_posun(text) + return (posunuti, ''.join([posun(char, posunuti) for char in text.upper()])) + +def nej_posun(text): + """Vrati pocet znaku v abecede, o ktere by se mel text posunout, aby mel + frekvence znaku co nejblize cestine bez mezer.""" ref = referencni.nacti('bref') freq = dict() for char in ocesat(text, False): @@ -34,8 +47,8 @@ def nejlepsi(text): posunuti = 0 for i in range(1, 26): frekv = [frekv[25]] + frekv[:-1] - v2 = eu_vzdalenost(frekv, ref.frekvence) - if v2 < vzdalenost: - vzdalenost = v2 + nova_vzdalenost = eu_vzdalenost(frekv, ref.frekvence) + if nova_vzdalenost < vzdalenost: + vzdalenost = nova_vzdalenost posunuti = i - return (posunuti, ''.join([posun(char, posunuti) for char in text.upper()])) + return posunuti