From 696c37396b687aff422306adb070dbd52e61d12b Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 4 Mar 2026 22:08:22 +0100 Subject: [PATCH] feat: rehaul of encode function. Now will encode regardless of text length. Will ignore values not in alphabet. Decode works on same logic, but opposite --- src/codewars/kata_cipher_helper.py | 38 ++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/codewars/kata_cipher_helper.py b/src/codewars/kata_cipher_helper.py index 4090d1f..453b679 100644 --- a/src/codewars/kata_cipher_helper.py +++ b/src/codewars/kata_cipher_helper.py @@ -4,15 +4,39 @@ class VigenereCipher(object): self.alphabet = alphabet def encode(self, text): - idx_key = [self.alphabet.index(x) for x in self.key] - idx_text = [self.alphabet.index(x) for x in text] - pos_enc = [sum(x) % len(self.alphabet) for x in zip(idx_key, idx_text)] - return "".join([self.alphabet[x] for x in pos_enc]) + encoded = [] + idx_key = 0 + + for char in text: + if char in self.alphabet: + text_pos = self.alphabet.index(char) + key_char = self.key[idx_key % len(self.key)] + key_pos = self.alphabet.index(key_char) + + pos = (text_pos + key_pos) % len(self.alphabet) + encoded.append(self.alphabet[pos]) + + idx_key += 1 + else: + encoded.append(char) + + return "".join(encoded) def decode(self, text): - pass + decoded = [] + idx_key = 0 + for char in text: + if char in self.alphabet: + text_pos = self.alphabet.index(char) + key_char = self.key[idx_key % len(self.key)] + key_pos = self.alphabet.index(key_char) -test = VigenereCipher("password", "abcdefghijklmnopqrstuvwxyz") + pos = (text_pos - key_pos) % len(self.alphabet) + decoded.append(self.alphabet[pos]) -print(test.encode("codewars")) + idx_key += 1 + else: + decoded.append(char) + + return "".join(decoded)