Skip to content

fix atbash.py at ruff #12804 #12806

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 45 additions & 21 deletions ciphers/atbash.py
Original file line number Diff line number Diff line change
@@ -1,54 +1,78 @@
"""https://en.wikipedia.org/wiki/Atbash"""

import string
from timeit import timeit # Moved to top-level as required


def atbash_slow(sequence: str) -> str:
"""
Atbash cipher implementation using ordinal values.
Encodes/decodes by reversing the alphabet.

Check failure on line 11 in ciphers/atbash.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

ciphers/atbash.py:11:1: W293 Blank line contains whitespace
>>> atbash_slow("ABCDEFG")
'ZYXWVUT'

Check failure on line 14 in ciphers/atbash.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

ciphers/atbash.py:14:1: W293 Blank line contains whitespace
>>> 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
for char in sequence:
code = ord(char)
if 65 <= code <= 90: # Uppercase A-Z
output += chr(155 - code)
elif 97 <= code <= 122: # Lowercase a-z
output += chr(219 - code)
else: # Non-alphabetic characters
output += char
return output


def atbash(sequence: str) -> str:
"""
Optimized Atbash cipher implementation using string translation.
More efficient than ordinal-based approach.

Check failure on line 34 in ciphers/atbash.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

ciphers/atbash.py:34:1: W293 Blank line contains whitespace
>>> atbash("ABCDEFG")
'ZYXWVUT'

Check failure on line 37 in ciphers/atbash.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

ciphers/atbash.py:37:1: W293 Blank line contains whitespace
>>> atbash("aW;;123BX")
'zD;;123YC'
"""
# Create translation tables
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
)
reversed_letters = string.ascii_lowercase[::-1] + string.ascii_uppercase[::-1]

Check failure on line 44 in ciphers/atbash.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

ciphers/atbash.py:44:1: W293 Blank line contains whitespace
# Create translation mapping
translation = str.maketrans(letters, reversed_letters)

Check failure on line 47 in ciphers/atbash.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

ciphers/atbash.py:47:1: W293 Blank line contains whitespace
# Apply translation to each character
return sequence.translate(translation)


def benchmark() -> None:
"""Let's benchmark our functions side-by-side..."""
from timeit import timeit

"""
Performance comparison of both Atbash implementations.
Measures execution time using Python's timeit module.
"""
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")
setup = (
"from string import printable; "
"from __main__ import atbash, atbash_slow"
)
# Time the slow implementation
slow_time = timeit("atbash_slow(printable)", setup=setup)
print(f"> atbash_slow(): {slow_time:.6f} seconds")

Check failure on line 65 in ciphers/atbash.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

ciphers/atbash.py:65:1: W293 Blank line contains whitespace
# Time the optimized implementation
fast_time = timeit("atbash(printable)", setup=setup)
print(f"> atbash(): {fast_time:.6f} seconds")


if __name__ == "__main__":
for example in ("ABCDEFGH", "123GGjj", "testStringtest", "with space"):
# Test examples
examples = ("ABCDEFGH", "123GGjj", "testStringtest", "with space")
for example in examples:
print(f"{example} encrypted in atbash: {atbash(example)}")

Check failure on line 76 in ciphers/atbash.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

ciphers/atbash.py:76:1: W293 Blank line contains whitespace
# Run performance comparison
benchmark()
Loading