X-Git-Url: http://git.tomasm.cz/krypto.git/blobdiff_plain/72abf0def8914771af7171eb8f4e3913842d1071..refs/heads/jakobsen2:/posuny.py?ds=sidebyside diff --git a/posuny.py b/posuny.py index f6956e8..fd08e8c 100644 --- a/posuny.py +++ b/posuny.py @@ -1,15 +1,54 @@ -def posun(char): - if 65 <= ord(char) < 90: - return chr(ord(char) + 1) - if ord(char) == 90: - return 'A' +"""Modul pro praci s posuny v abecede.""" + +from referencni import reference +from ocesavac import ocesat +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: + 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) \ No newline at end of file + return analyza + +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): + 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) + posunuti = 0 + for i in range(1, 26): + frekv = [frekv[25]] + frekv[:-1] + nova_vzdalenost = eu_vzdalenost(frekv, ref.frekvence) + if nova_vzdalenost < vzdalenost: + vzdalenost = nova_vzdalenost + posunuti = i + return posunuti