Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First - Fix solution in Speedy category for Vigenere Cipher by yarmak_vladislav
# migrated from python 2.7
from string import uppercase
from itertools import cycle
backward_table = dict( (char, n) for n, char in enumerate(uppercase) )
def map_chars(chars):
return list(map(backward_table.__getitem__, chars))
def decode_vigenere(old_decrypted, old_encrypted, new_encrypted):
alphabet_power = len(uppercase)
old_orig_vector = map_chars(old_decrypted)
old_crypted_vector = map_chars(old_encrypted)
new_encrypted_vector = map_chars(new_encrypted)
key = [(O_C[1]-O_C[0]) % alphabet_power for O_C in zip(old_orig_vector, old_crypted_vector)]
s1 = s2 = 0
L = len(key)
period = None
for i in range(L):
s1 += key[i]
s2 += key[-i - 1]
if s1 == s2:
period = key[:i+1]
if period * (L / (i+1) ) + period[:L % (i + 1)] == key:
break
else:
period = None
if period is None:
period = key
print("".join(map(uppercase.__getitem__, key)), "".join(map(uppercase.__getitem__, period)))
decoded = [(C_K[0]-C_K[1]) % alphabet_power for C_K in zip(new_encrypted_vector, cycle(period))]
return "".join(map(uppercase.__getitem__, decoded))
#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"
Nov. 9, 2014
Comments: