Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Vigenere Cipher by chunshar
def decode_vigenere(old_decrypted, old_encrypted, new_encrypted):
convert = lambda x: [ord(c) - ord('A') for c in x]
revert = lambda x: ''.join(chr(c + ord('A')) for c in x)
old_d = convert(old_decrypted)
old_e = convert(old_encrypted)
new_e = convert(new_encrypted)
key = [(y - x) % 26 for x, y in zip(old_d, old_e)]
if len(new_e) > len(old_e):
for i in range(len(key)):
if key[:i+1] == key[i+1:(i+1)*2]:
key = key[:i+1] * (len(new_e) // len(key[:i+1]) + 1)
break
new_d = [(y - x) % 26 for x, y in zip(key, new_e)]
return revert(new_d)
#These "asserts" using only for self-checking and not necessary for auto-testing
if __name__ == '__main__':
assert decode_vigenere('DONTWORRYBEHAPPY',
'FVRVGWFTFFGRIDRF',
'DLLCZXMFVRVGWFTF') == "BEHAPPYDONTWORRY", "CHECKIO"
assert decode_vigenere('HELLO', 'OIWWC', 'ICP') == "BYE", "HELLO"
assert decode_vigenere('LOREMIPSUM',
'OCCSDQJEXA',
'OCCSDQJEXA') == "LOREMIPSUM", "DOLORIUM"
Oct. 4, 2018