def chain_add(seq, end):
for i in range(end - len(seq)):
seq += chr(48+(ord(seq[i])+ord(seq[i+1]))%32%10)
return seq
def sequent(seq):
res = [0]*len(seq);seq=list(seq)
for z in range(len(seq)):
b = min(range(len(seq)),key=lambda i:seq[i])
res[b] = z
seq[b] = "~"
return res
def transpose(text, keys):
columns = ['']*len(keys)
for t in range(len(text)):
columns[t%len(keys)] += text[t]
res = [0]*len(keys)
for index in range(len(keys)):
res[keys[index]] = columns[index]
return''.join(res)
def untranspose(text, keys, disrupt=False):
columns = []
for j in range(len(keys)):
columns += [[]]
num_rows, len_last = divmod(len(text),len(keys))
num_rows += 1
if len_last == 0:
len_last = len(keys)
text_index = 0
for j in range(len(keys)):
ind = keys.index(j)
columns[ind] += list(text[text_index:text_index+num_rows-(ind>=len_last)])
text_index += num_rows-(ind>=len_last)
rows = []
for k in range(num_rows):
rows += [[]]
for j in columns:
rows[k] += j[k:k+1]
if disrupt:
undisrupt = []
current_row = 0
stop_key = 0
stop_index = keys.index(stop_key)
while current_row < num_rows:
undisrupt += rows[current_row][:stop_index]
rows[current_row] = rows[current_row][stop_index:]
stop_index += 1
current_row += 1
if stop_index > len(keys):
stop_key = (stop_key + 1) % len(keys)
stop_index = keys.index(stop_key)
for i in rows:
undisrupt += i
return ''.join(undisrupt)
else:
return ''.join(''.join(i) for i in rows)
def uncheckerboard(message, seq, word):
trans = {seq[-2:]:".", seq[-1]*2:"#"};x=64;res='';j=z=0
while x<90:
x += 1
v = chr(x)
if v in word:
trans[seq[word.index(v)]] = v
else:
trans[seq[z-2] + seq[j]] = v
j += z
z = (z+1) % 2
num = False
end = -1
h = ''
for j in range(len(message)):
if end>=0 and j<end+2:
continue
else:
end = -1
if num:
end = message.index(seq[-1]*2,j+1)
res += message[j:end]+"#"
num = 0
else:
k = message[j]
if h:
res += trans[h+k]
if trans[h+k] == "#":
num = 1
h = ''
elif k in seq[:-2]:
res += trans[k]
else:
h = k
begin = res.index("..") + 2
return res[begin:] + res[:begin]
def decode(message, keyword, phrase, date, agent):
mkey = -int(date[-1])
message = message.split()
m_id = message[mkey]
message = ''.join(message[:mkey] + message[mkey+1:])
s1 = sequent(phrase[:10])
s2 = sequent(phrase[10:20])
b = ''.join(str((int(m_id[i])-int(date[i]))%10) for i in range(5))
a = chain_add(b, 10)
g = ''.join(str((int(a[i])+int(s1[i]))%10) for i in range(10))
t = ''.join(str(s2[int(g[i])]) for i in range(10))
u = chain_add(t,60)[10:]
p = agent+int(u[-2])
q = agent+int(u[-1])
seqT = sequent(t)
v = transpose(u,seqT)
k1 = sequent(v[:p])
k2 = sequent(v[p:p+q])
c = ''.join(str(i)for i in sequent(u[40:]))
z = untranspose(message,k2,1)
y = untranspose(z,k1)
x = uncheckerboard(y,c,keyword)
return x
print(decode("47642 81712 53404 93122 46041 91626 16481 62272 29202 40665 00520 24222 44459 91848 22524 81583 45414 47921 31439 09454 11145 29696 36485",
"SENATORI",
"THEFIRSTPRINCIPLEISTHATYOUMUSTNOTFOOLYOURSELFANDYOUARETHEEASIESTPERSONTOFOOL",
"3172016",
9))