Finished
1import random
2import string
3
4
15class Cipher:
26 def __init__(self, key=None):
3 pass
7 if key is None:
8 # Edge Case: No key provided - generate a random key of at least 100 lowercase letters
9 self.key = ''.join(random.choices(string.ascii_lowercase, k=100))
10 else:
11 # Edge Case: Empty key - not explicitly handled in requirements but we'll treat as invalid
12 if not key:
13 raise ValueError("Key must not be empty")
14 # Edge Case: Key with non-lowercase letters
15 if not all(c.islower() for c in key):
16 raise ValueError("Key must contain only lowercase letters")
17 self.key = key
418
519 def encode(self, text):
6 pass
20 # Edge Case: Empty plaintext
21 if not text:
22 return ""
23
24 result = []
25 key_length = len(self.key)
26
27 for i, char in enumerate(text):
28 # Edge Case: Non-letter characters in plaintext
29 if not char.isalpha():
30 result.append(char)
31 continue
32
33 # Edge Case: Uppercase letters in plaintext
34 is_upper = char.isupper()
35 char = char.lower()
36
37 key_char = self.key[i % key_length]
38 shift = ord(key_char) - ord('a')
39 char_code = ord(char) - ord('a')
40 new_code = (char_code + shift) % 26
41 new_char = chr(new_code + ord('a'))
42
43 # Preserve original case
44 if is_upper:
45 new_char = new_char.upper()
46
47 result.append(new_char)
48
49 return ''.join(result)
50
51 # Handled Edge Cases: empty plaintext, non-letter characters in plaintext, uppercase letters in plaintext
752
853 def decode(self, text):
9 pass
54 # Edge Case: Empty ciphertext
55 if not text:
56 return ""
57
58 result = []
59 key_length = len(self.key)
60
61 for i, char in enumerate(text):
62 # Edge Case: Non-letter characters in ciphertext
63 if not char.isalpha():
64 result.append(char)
65 continue
66
67 # Edge Case: Uppercase letters in ciphertext
68 is_upper = char.isupper()
69 char = char.lower()
70
71 key_char = self.key[i % key_length]
72 shift = ord(key_char) - ord('a')
73 char_code = ord(char) - ord('a')
74 # Add 26 before modulo to handle negative results correctly
75 new_code = (char_code - shift + 26) % 26
76 new_char = chr(new_code + ord('a'))
77
78 # Preserve original case
79 if is_upper:
80 new_char = new_char.upper()
81
82 result.append(new_char)
83
84 return ''.join(result)
85
86 # Handled Edge Cases: empty ciphertext, non-letter characters in ciphertext, uppercase letters in ciphertext
Test NameStatus
test_can_decode
Pass
test_can_encode
Pass
test_is_reversible
Pass
test_key_is_made_only_of_lowercase_letters
Pass

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