From 059a90a065294ee8b33caf926d190b7bf2f5b6fb Mon Sep 17 00:00:00 2001 From: mateuszz0000 Date: Wed, 20 May 2020 06:42:26 +0200 Subject: [PATCH 1/2] Update atbash --- ciphers/atbash.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/ciphers/atbash.py b/ciphers/atbash.py index 4cf003859856..fa10327dc9e8 100644 --- a/ciphers/atbash.py +++ b/ciphers/atbash.py @@ -1,15 +1,22 @@ -def atbash(): - output = "" - for i in input("Enter the sentence to be encrypted ").strip(): - extract = ord(i) - if 65 <= extract <= 90: - output += chr(155 - extract) - elif 97 <= extract <= 122: - output += chr(219 - extract) - else: - output += i - print(output) +""" https://en.wikipedia.org/wiki/Atbash """ +import string + + +def atbash(sequence: str) -> str: + """ + >>> atbash("ABCDEFG") + 'ZYXWVUT' + + >>> atbash("aW;;123BX") + 'zD;;123YC' + """ + letters = string.ascii_letters + letters_reversed = string.ascii_lowercase[::-1] + string.ascii_uppercase[::-1] + return "".join( + letters_reversed[letters.index(_)] if _ in letters else _ for _ in sequence + ) if __name__ == "__main__": - atbash() + for sequence in ["ABCDEFGH", "123GGjj", "testStringtest", "with space"]: + print(f"{sequence} encrypted in atbash: {atbash(sequence)}") From bfee6d3b0919bfa5eb5557e5113ab9861e3e4b15 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Wed, 20 May 2020 08:12:00 +0200 Subject: [PATCH 2/2] Add benchmark() to quantify the performance improvement --- ciphers/atbash.py | 48 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/ciphers/atbash.py b/ciphers/atbash.py index fa10327dc9e8..c17d1e34f37a 100644 --- a/ciphers/atbash.py +++ b/ciphers/atbash.py @@ -2,6 +2,26 @@ import string +def atbash_slow(sequence: str) -> str: + """ + >>> atbash_slow("ABCDEFG") + 'ZYXWVUT' + + >>> atbash_slow("aW;;123BX") + 'zD;;123YC' + """ + output = "" + for i in sequence: + extract = ord(i) + if 65 <= extract <= 90: + output += chr(155 - extract) + elif 97 <= extract <= 122: + output += chr(219 - extract) + else: + output += i + return output + + def atbash(sequence: str) -> str: """ >>> atbash("ABCDEFG") @@ -13,10 +33,34 @@ def atbash(sequence: str) -> str: letters = string.ascii_letters letters_reversed = string.ascii_lowercase[::-1] + string.ascii_uppercase[::-1] return "".join( - letters_reversed[letters.index(_)] if _ in letters else _ for _ in sequence + letters_reversed[letters.index(c)] if c in letters else c for c in sequence + ) + + +def benchmark() -> None: + """Let's benchmark them side-by-side...""" + from timeit import timeit + + print("Running performance benchmarks...") + print( + "> atbash_slow()", + timeit( + "atbash_slow(printable)", + setup="from string import printable ; from __main__ import atbash_slow", + ), + "seconds", + ) + print( + "> atbash()", + timeit( + "atbash(printable)", + setup="from string import printable ; from __main__ import atbash", + ), + "seconds", ) if __name__ == "__main__": - for sequence in ["ABCDEFGH", "123GGjj", "testStringtest", "with space"]: + for sequence in ("ABCDEFGH", "123GGjj", "testStringtest", "with space"): print(f"{sequence} encrypted in atbash: {atbash(sequence)}") + benchmark()