-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."""
+
+import referencni
+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