Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for ADFGVX Cipher by gyahun_dash
from itertools import accumulate, chain, product, zip_longest
import re
def getkey(keyword):
return sorted(set(keyword), key=keyword.index)
def gettable(alphabet):
return dict(zip(alphabet, (a + b for a, b in product('ADFGVX', repeat=2))))
def encode(message, secret_alphabet, keyword):
key = getkey(keyword)
table = gettable(secret_alphabet)
fracs = ''.join(map(table.get, re.sub(r'[^0-9a-z]', '', message.lower())))
folded = re.findall(r'.{{,{}}}'.format(len(key)), fracs)
cols = dict(zip(key, map(''.join, zip_longest(*folded, fillvalue=''))))
return ''.join(map(cols.get, sorted(cols)))
def decode(message, secret_alphabet, keyword):
key = getkey(keyword)
order = sorted(key)
q, r = divmod(len(message), len(key))
inds = [0] + list(accumulate(q + (key.index(k) < r) for k in order))
cols = dict(zip(order, (message[i: j] for i, j in zip(inds, inds[1:]))))
fracs = ''.join(chain(*zip_longest(*map(cols.get, key), fillvalue='')))
invtable = {v: k for k, v in gettable(secret_alphabet).items()}
return ''.join(map(invtable.get, re.findall(r'..', fracs)))
Sept. 17, 2014
Comments: