From: Tomas Musil Date: Thu, 22 Mar 2012 11:53:30 +0000 (+0100) Subject: Nejlepsi posun integrovan do robota X-Git-Url: http://git.tomasm.cz/krypto.git/commitdiff_plain/31b480a285bb43eb2d8254292a2c3619372c4354 Nejlepsi posun integrovan do robota --- diff --git a/posuny.py b/posuny.py index 85e60a4..7145900 100644 --- 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()])) diff --git a/robot.py b/robot.py index ee100cf..bebce87 100755 --- 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))