Python/ciphers/atbash.py

55 lines
1.4 KiB
Python
Raw Normal View History

"""https://en.wikipedia.org/wiki/Atbash"""
import string
def atbash_slow(sequence: str) -> str:
"""
>>> atbash_slow("ABCDEFG")
'ZYXWVUT'
>>> atbash_slow("aW;;123BX")
'zD;;123YC'
"""
2019-10-05 05:14:13 +00:00
output = ""
for i in sequence:
extract = ord(i)
if 65 <= extract <= 90:
2019-10-05 05:14:13 +00:00
output += chr(155 - extract)
elif 97 <= extract <= 122:
2019-10-05 05:14:13 +00:00
output += chr(219 - extract)
2019-05-26 16:40:04 +00:00
else:
output += i
return output
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(c)] if c in letters else c for c in sequence
)
def benchmark() -> None:
"""Let's benchmark our functions side-by-side..."""
from timeit import timeit
print("Running performance benchmarks...")
setup = "from string import printable ; from __main__ import atbash, atbash_slow"
print(f"> atbash_slow(): {timeit('atbash_slow(printable)', setup=setup)} seconds")
print(f"> atbash(): {timeit('atbash(printable)', setup=setup)} seconds")
2019-05-26 16:40:04 +00:00
2019-10-05 05:14:13 +00:00
if __name__ == "__main__":
for example in ("ABCDEFGH", "123GGjj", "testStringtest", "with space"):
print(f"{example} encrypted in atbash: {atbash(example)}")
benchmark()