python - AttributeError in python3 -
i want adapt this code work in persian text.
i changed can seen in code bellow in english_frequency
, orda
changed. but, has error uppercase
in line:
cleaned = [ord(c) c in input.upper() if c.isupper()].
can me adapt it?
from string import ascii_uppercase operator import itemgetter def vigenere_decrypt(target_freqs, input): nchars = len(ascii_uppercase) orda = ord('ا') sorted_targets = sorted(target_freqs) def frequency(input): result = [[c, 0.0] c in ascii_uppercase] c in input: result[c - orda][1] += 1 return result def correlation(input): result = 0.0 freq = frequency(input) freq.sort(key=itemgetter(1)) i, f in enumerate(freq): result += f[1] * sorted_targets[i] return result cleaned = [ord(c) c in input.upper() if c.isupper()] best_len = 0 best_corr = -100.0 # assume if there less 20 characters # per column, key's long guess in xrange(2, len(cleaned) // 20): pieces = [[] _ in xrange(i)] j, c in enumerate(cleaned): pieces[j % i].append(c) # correlation seems increase smaller # pieces/longer keys, weigh against them little corr = -0.5 * + sum(correlation(p) p in pieces) if corr > best_corr: best_len = best_corr = corr if best_len == 0: return ("text short analyze", "") pieces = [[] _ in xrange(best_len)] i, c in enumerate(cleaned): pieces[i % best_len].append(c) freqs = [frequency(p) p in pieces] key = "" fr in freqs: fr.sort(key=itemgetter(1), reverse=true) m = 0 max_corr = 0.0 j in xrange(nchars): corr = 0.0 c = orda + j frc in fr: d = (ord(frc[0]) - c + nchars) % nchars corr += frc[1] * target_freqs[d] if corr > max_corr: m = j max_corr = corr key += chr(m + orda) r = (chr((c - ord(key[i % best_len]) + nchars) % nchars + orda) i, c in enumerate(cleaned)) return (key, "".join(r)) def main(): encoded = "بفعاع پهيتش غعهدد ذصلدي هزفضر کنهرظ ضذکاح يصتمد فهزگع " english_frequences = [ 14, 4.2, 0.7, 5.2, 0.1, 1.2, 0.4, 1, 1.4, 7.5, 0.1, 8.5, 2.1, 0.1, 3.3, 2.6, 0.7, 0.3, 0.6, 0.2, 1.5, 0.2, 1.6, 1.2, 3, 1.7, 2.7, 5.7, 7.1, 6, 5.7, 9.1] (key, decoded) = vigenere_decrypt(english_frequences, encoded) print ("key:", key) print ("\ntext:", decoded) main()
this python 2 code, , running using python 3 interpreter.
use python 2.
also, compared the original, ruined indentation of many blocks.
Comments
Post a Comment