Nejlepsi posun integrovan do robota
authorTomas Musil <tomik.musil@gmail.com>
Thu, 22 Mar 2012 11:53:30 +0000 (12:53 +0100)
committerTomas Musil <tomik.musil@gmail.com>
Thu, 22 Mar 2012 11:53:30 +0000 (12:53 +0100)
posuny.py
robot.py

index 85e60a4..7145900 100644 (file)
--- a/posuny.py
+++ b/posuny.py
@@ -4,16 +4,16 @@ from ocesavac import ocesat
 
 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):
+    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
+    posunuty = zprava.upper()
     analyza = []
     for i in range(26):
         posunuty = map(posun, posunuty)
@@ -23,20 +23,19 @@ def vsechny(zprava):
 def eu_vzdalenost(v1, v2):
     return sum([(x - y)**2 for (x, y) in zip(v1, v2)])
 
-def nejlepsi_posun(text):
+def nejlepsi(text):
     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]]
+        frekv = [frekv[25]] + frekv[:-1]
         v2 = eu_vzdalenost(frekv, ref.frekvence)
         if v2 < vzdalenost:
             vzdalenost = v2
-            posun = i
-    return posun
+            posunuti = i
+    return (posunuti, ''.join([posun(char, posunuti) for char in text.upper()]))
index ee100cf..bebce87 100755 (executable)
--- a/robot.py
+++ b/robot.py
@@ -127,7 +127,10 @@ if mod_x:
     analyza.append(jakobsen.desifruj(zprava, './bref'))
 
 # Posuny v abecede
-# TODO najit nejvhodnejsi posuny a vypsat jenom ty
+(posun, posunuty_text) = posuny.nejlepsi(zprava)
+analyza.append("\nNejlepsi posun ({0}):".format(posun))
+analyza.append(posunuty_text)
+
 if 'P' in opsny or 'A' in opsny:
     analyza.append("\nPosuny v abecede:")
     analyza.append(posuny.vsechny(zprava))