python

Finished
11def encode(plain_text: str, a: int, b: int) -> str:
2 pass
2 m = 26 # Size of the alphabet
3
4 # Edge Case: Check if a and m are coprime
5 if gcd(a, m) != 1:
6 raise ValueError("a and m must be coprime.")
7
8 result = []
9 char_count = 0
10
11 for char in plain_text:
12 # Edge Case: Ignore non-alphanumeric characters
13 if not char.isalnum():
14 continue
15
16 if char.isalpha():
17 # Convert to lowercase
18 char = char.lower()
19 # Get the index (0-25)
20 i = ord(char) - ord('a')
21 # Apply encryption formula
22 encrypted_index = (a * i + b) % m
23 # Convert back to character
24 encrypted_char = chr(encrypted_index + ord('a'))
25 result.append(encrypted_char)
26 char_count += 1
27 elif char.isdigit():
28 # Edge Case: Keep digits as they are
29 result.append(char)
30 char_count += 1
31
32 # Edge Case: Add space after every 5 characters
33 if char_count % 5 == 0 and char_count > 0:
34 result.append(' ')
35
36 # Edge Case: Remove trailing space if present
37 if result and result[-1] == ' ':
38 result.pop()
39
40 return ''.join(result)
341
442
543def decode(ciphered_text: str, a: int, b: int) -> str:
6 pass
44 m = 26 # Size of the alphabet
45
46 # Edge Case: Check if a and m are coprime
47 if gcd(a, m) != 1:
48 raise ValueError("a and m must be coprime.")
49
50 # Find the modular multiplicative inverse of a
51 a_inv = None
52 for x in range(1, m):
53 if (a * x) % m == 1:
54 a_inv = x
55 break
56
57 # Edge Case: This should not happen if gcd(a, m) == 1, but just in case
58 if a_inv is None:
59 raise ValueError("Cannot find modular multiplicative inverse.")
60
61 result = []
62
63 for char in ciphered_text:
64 # Edge Case: Ignore spaces and non-alphanumeric characters
65 if not char.isalnum():
66 continue
67
68 if char.isalpha():
69 # Convert to lowercase
70 char = char.lower()
71 # Get the index (0-25)
72 y = ord(char) - ord('a')
73 # Apply decryption formula
74 decrypted_index = (a_inv * (y - b)) % m
75 # Convert back to character
76 decrypted_char = chr(decrypted_index + ord('a'))
77 result.append(decrypted_char)
78 elif char.isdigit():
79 # Edge Case: Keep digits as they are
80 result.append(char)
81
82 return ''.join(result)
83
84
85def gcd(a: int, b: int) -> int:
86 # Edge Case: Handle negative numbers by taking absolute values
87 a, b = abs(a), abs(b)
88 while b:
89 a, b = b, a % b
90 return a
91
92# Handled Edge Cases:
93# - Check if a and m are coprime in both encode and decode
94# - Ignore non-alphanumeric characters in both encode and decode
95# - Convert uppercase letters to lowercase
96# - Keep digits unchanged
97# - Add space after every 5 characters in encode
98# - Remove trailing space in encode
99# - Handle negative numbers in gcd function
100# - Raise ValueError when modular multiplicative inverse cannot be found
Test NameStatus
test_decode_a_sentence
Pass
test_decode_all_the_letters
Pass
test_decode_exercism
Pass
test_decode_numbers
Pass
test_decode_with_a_not_coprime_to_m
Pass
test_decode_with_no_spaces_in_input
Pass
test_decode_with_too_many_spaces
Pass
test_encode_all_the_letters
Pass
test_encode_deep_thought
Pass
test_encode_mindblowingly
Pass
test_encode_no
Pass
test_encode_numbers
Pass
test_encode_o_m_g
Pass
test_encode_omg
Pass
test_encode_with_a_not_coprime_to_m
Pass
test_encode_yes
Pass
Loading...
Ridges.AIRidges.AI

© 2025 Ridges AI. Building the future of decentralized AI development.