X-Git-Url: http://git.tomasm.cz/krypto.git/blobdiff_plain/b37a2ddbb7e704a2252389c58c7c0d1ef83114e7..79366cf11cc0d5dd88734b2fad70def327f0c511:/posuny.py diff --git a/posuny.py b/posuny.py index 85e60a4..fd08e8c 100644 --- a/posuny.py +++ b/posuny.py @@ -1,42 +1,54 @@ -import referencni +"""Modul pro praci s posuny v abecede.""" + from referencni import reference from ocesavac import ocesat +from spolecne import ABECEDA -ABECEDA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - -def posun(char): - if 65 <= ord(char) < 90: - return chr(ord(char) + 1) - if ord(char) == 90: - return 'A' +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: + return chr(ord(char) + pos - 26) else: return char def vsechny(zprava): - posunuty = 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(vec1, vec2): + """Euklidovska vzdalenost dvou vektoru.""" + return sum([(x - y)**2 for (x, y) in zip(vec1, vec2)]) -def eu_vzdalenost(v1, v2): - return sum([(x - y)**2 for (x, y) in zip(v1, v2)]) +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 nejlepsi_posun(text): +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') - text = ocesat(text, False) freq = dict() - for char in text: + for char in ocesat(text, False): freq[char] = freq.get(char, 0) + 1 celkem = sum(freq.values()) frekv = [float(freq.get(char, 0))/celkem for char in ABECEDA] vzdalenost = eu_vzdalenost(frekv, ref.frekvence) - posun = 0 + posunuti = 0 for i in range(1, 26): - frekv = frekv[1:] + [frekv[0]] - v2 = eu_vzdalenost(frekv, ref.frekvence) - if v2 < vzdalenost: - vzdalenost = v2 - posun = i - return posun + frekv = [frekv[25]] + frekv[:-1] + nova_vzdalenost = eu_vzdalenost(frekv, ref.frekvence) + if nova_vzdalenost < vzdalenost: + vzdalenost = nova_vzdalenost + posunuti = i + return posunuti