fork(1) download
  1. def chain_add(seq, end):
  2. for i in range(end - len(seq)):
  3. seq += chr(48+(ord(seq[i])+ord(seq[i+1]))%32%10)
  4. return seq
  5.  
  6. def sequent(seq):
  7. res = [0]*len(seq);seq=list(seq)
  8. for z in range(len(seq)):
  9. b = min(range(len(seq)),key=lambda i:seq[i])
  10. res[b] = z
  11. seq[b] = "~"
  12. return res
  13.  
  14. def transpose(text, keys):
  15. columns = ['']*len(keys)
  16. for t in range(len(text)):
  17. columns[t%len(keys)] += text[t]
  18. res = [0]*len(keys)
  19. for index in range(len(keys)):
  20. res[keys[index]] = columns[index]
  21. return''.join(res)
  22.  
  23. def untranspose(text, keys, disrupt=False):
  24. columns = []
  25. for j in range(len(keys)):
  26. columns += [[]]
  27. num_rows, len_last = divmod(len(text),len(keys))
  28. num_rows += 1
  29. if len_last == 0:
  30. len_last = len(keys)
  31. text_index = 0
  32. for j in range(len(keys)):
  33. ind = keys.index(j)
  34. columns[ind] += list(text[text_index:text_index+num_rows-(ind>=len_last)])
  35. text_index += num_rows-(ind>=len_last)
  36. rows = []
  37. for k in range(num_rows):
  38. rows += [[]]
  39. for j in columns:
  40. rows[k] += j[k:k+1]
  41. if disrupt:
  42. undisrupt = []
  43. current_row = 0
  44. stop_key = 0
  45. stop_index = keys.index(stop_key)
  46. while current_row < num_rows:
  47. undisrupt += rows[current_row][:stop_index]
  48. rows[current_row] = rows[current_row][stop_index:]
  49. stop_index += 1
  50. current_row += 1
  51. if stop_index > len(keys):
  52. stop_key = (stop_key + 1) % len(keys)
  53. stop_index = keys.index(stop_key)
  54. for i in rows:
  55. undisrupt += i
  56. return ''.join(undisrupt)
  57. else:
  58. return ''.join(''.join(i) for i in rows)
  59.  
  60. def uncheckerboard(message, seq, word):
  61. trans = {seq[-2:]:".", seq[-1]*2:"#"};x=64;res='';j=z=0
  62. while x<90:
  63. x += 1
  64. v = chr(x)
  65. if v in word:
  66. trans[seq[word.index(v)]] = v
  67. else:
  68. trans[seq[z-2] + seq[j]] = v
  69. j += z
  70. z = (z+1) % 2
  71. num = False
  72. end = -1
  73. h = ''
  74. for j in range(len(message)):
  75. if end>=0 and j<end+2:
  76. continue
  77. else:
  78. end = -1
  79. if num:
  80. end = message.index(seq[-1]*2,j+1)
  81. res += message[j:end]+"#"
  82. num = 0
  83. else:
  84. k = message[j]
  85. if h:
  86. res += trans[h+k]
  87. if trans[h+k] == "#":
  88. num = 1
  89. h = ''
  90. elif k in seq[:-2]:
  91. res += trans[k]
  92. else:
  93. h = k
  94. begin = res.index("..") + 2
  95. return res[begin:] + res[:begin]
  96.  
  97. def decode(message, keyword, phrase, date, agent):
  98. mkey = -int(date[-1])
  99. message = message.split()
  100. m_id = message[mkey]
  101. message = ''.join(message[:mkey] + message[mkey+1:])
  102.  
  103. s1 = sequent(phrase[:10])
  104. s2 = sequent(phrase[10:20])
  105. b = ''.join(str((int(m_id[i])-int(date[i]))%10) for i in range(5))
  106. a = chain_add(b, 10)
  107. g = ''.join(str((int(a[i])+int(s1[i]))%10) for i in range(10))
  108. t = ''.join(str(s2[int(g[i])]) for i in range(10))
  109. u = chain_add(t,60)[10:]
  110. p = agent+int(u[-2])
  111. q = agent+int(u[-1])
  112. seqT = sequent(t)
  113. v = transpose(u,seqT)
  114. k1 = sequent(v[:p])
  115. k2 = sequent(v[p:p+q])
  116. c = ''.join(str(i)for i in sequent(u[40:]))
  117. z = untranspose(message,k2,1)
  118. y = untranspose(z,k1)
  119. x = uncheckerboard(y,c,keyword)
  120. return x
  121.  
  122. 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",
  123. "SENATORI",
  124. "THEFIRSTPRINCIPLEISTHATYOUMUSTNOTFOOLYOURSELFANDYOUARETHEEASIESTPERSONTOFOOL",
  125. "3172016",
  126. 9))
  127.  
Runtime error #stdin #stdout #stderr 0.01s 9992KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Traceback (most recent call last):
  File "./prog.py", line 126, in <module>
  File "./prog.py", line 119, in decode
  File "./prog.py", line 94, in uncheckerboard
ValueError: substring not found