bugfix
[krypto.git] / posuny.py
index 85e60a4..ac99e0b 100644 (file)
--- a/posuny.py
+++ b/posuny.py
@@ -1,42 +1,55 @@
+"""Modul pro praci s posuny v abecede."""
+
 import referencni
 from referencni import reference
 from ocesavac import ocesat
 import referencni
 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):
     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 = []
     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))
         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')
     ref = referencni.nacti('bref')
-    text = ocesat(text, False)
     freq = dict()
     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)
         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):
     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
\ No newline at end of file