X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=cipher.py;h=11bdde67916ca1303a1c6ce6d1318001d5233061;hb=ba564e2f791642443a7c28ff8fa5a0b194866819;hp=2386ae802f35d7e274fc7719827212362b5d032f;hpb=d65c25e16129ca94e4f007614d539856b1879694;p=cipher-training.git diff --git a/cipher.py b/cipher.py index 2386ae8..11bdde6 100644 --- a/cipher.py +++ b/cipher.py @@ -1,16 +1,9 @@ import string import collections -import logging import math from itertools import zip_longest, cycle, chain from language_models import * -logger = logging.getLogger(__name__) -logger.addHandler(logging.FileHandler('cipher.log')) -logger.setLevel(logging.WARNING) -#logger.setLevel(logging.INFO) -#logger.setLevel(logging.DEBUG) - modular_division_table = [[0]*26 for _ in range(26)] for a in range(26): @@ -99,7 +92,7 @@ def deduplicate(text): return list(collections.OrderedDict.fromkeys(text)) -def caesar_encipher_letter(letter, shift): +def caesar_encipher_letter(accented_letter, shift): """Encipher a letter, given a shift amount >>> caesar_encipher_letter('a', 1) @@ -118,7 +111,12 @@ def caesar_encipher_letter(letter, shift): 'y' >>> caesar_encipher_letter('a', -1) 'z' + >>> caesar_encipher_letter('A', 1) + 'B' + >>> caesar_encipher_letter('é', 1) + 'f' """ + letter = unaccent(accented_letter) if letter in string.ascii_letters: if letter in string.ascii_uppercase: alphabet_start = ord('A') @@ -150,6 +148,8 @@ def caesar_encipher(message, shift): 'cdezab' >>> caesar_encipher('ab cx yz', 2) 'cd ez ab' + >>> caesar_encipher('Héllo World!', 2) + 'Jgnnq Yqtnf!' """ enciphered = [caesar_encipher_letter(l, shift) for l in message] return ''.join(enciphered) @@ -163,10 +163,12 @@ def caesar_decipher(message, shift): 'abc' >>> caesar_decipher('cd ez ab', 2) 'ab cx yz' + >>> caesar_decipher('Jgnnq Yqtnf!', 2) + 'Hello World!' """ return caesar_encipher(message, -shift) -def affine_encipher_letter(letter, multiplier=1, adder=0, one_based=True): +def affine_encipher_letter(accented_letter, multiplier=1, adder=0, one_based=True): """Encipher a letter, given a multiplier and adder >>> ''.join([affine_encipher_letter(l, 3, 5, True) \ @@ -176,6 +178,7 @@ def affine_encipher_letter(letter, multiplier=1, adder=0, one_based=True): for l in string.ascii_uppercase]) 'FILORUXADGJMPSVYBEHKNQTWZC' """ + letter = unaccent(accented_letter) if letter in string.ascii_letters: if letter in string.ascii_uppercase: alphabet_start = ord('A') @@ -290,7 +293,7 @@ def keyword_encipher(message, keyword, wrap_alphabet=0): """ cipher_alphabet = keyword_cipher_alphabet_of(keyword, wrap_alphabet) cipher_translation = ''.maketrans(string.ascii_lowercase, cipher_alphabet) - return message.lower().translate(cipher_translation) + return unaccent(message).lower().translate(cipher_translation) def keyword_decipher(message, keyword, wrap_alphabet=0): """Deciphers a message with a keyword substitution cipher.