aktualizace todo listu
[krypto.git] / posuny.py
index f6956e8..07879a3 100644 (file)
--- a/posuny.py
+++ b/posuny.py
@@ -1,15 +1,41 @@
-def posun(char):
-    if 65 <= ord(char) < 90:
-        return chr(ord(char) + 1)
-    if ord(char) == 90:
-        return 'A'
+import referencni
+from referencni import reference
+from ocesavac import ocesat
+
+ABECEDA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+
+def posun(char, pos=1):
+    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
+    posunuty = zprava.upper()
     analyza = []
     for i in range(26):
         posunuty = map(posun, posunuty)
         analyza.append(''.join(posunuty))
     analyza = []
     for i in range(26):
         posunuty = map(posun, posunuty)
         analyza.append(''.join(posunuty))
-    return '\n'.join(analyza)
\ No newline at end of file
+    return analyza
+
+def eu_vzdalenost(v1, v2):
+    return sum([(x - y)**2 for (x, y) in zip(v1, v2)])
+
+def nejlepsi(text):
+    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]
+        v2 = eu_vzdalenost(frekv, ref.frekvence)
+        if v2 < vzdalenost:
+            vzdalenost = v2
+            posunuti = i
+    return (posunuti, ''.join([posun(char, posunuti) for char in text.upper()]))