Python

Шифрование строки. Python

Компания по защите интеллектуальной собственности решила повысить уровень защищенности своих операционных систем путем шифрования всех сообщений, передаваемых внутри ее локальных сетей. Любое допустимое в компании сообщение представляет собой строку S = s1s2…sn (1  n  255). Шифрование сообщения осуществляется в K фаз (1  K  100), K задаётся с клавиатуры. На каждой фазе строка S заменяется строкой, в которой сначала располагаются все буквы строки S (первый блок), стоящие на позициях с номерами, делящимися на 2, 3, или 5, а затем – все остальные буквы (второй блок). Относительный порядок букв в каждом из двух блоков остается неизменным. Например, строка S = ‘abcdefgh’ на первой фазе шифруется в строку S = ‘bcdefhag’. Если осуществляется вторая фаза шифрования, то строка S примет вид S = ‘cdefhgba’ и т. д. Напишите программу, осуществляющую шифрование строки S.
Входные данные
Натуральное число k – количество фаз шифрования.
Строка, которую надо зашифровать.
Выходные данные
Программа выводит зашифрованную строку.
Пример
Входные данные
3
Хлеб – всему голова.
Выходные данные
б –вегл. алсвоеуХ ом
Этот алгоритм вообще обратим? Или тут, как в анекдоте:
-- А расшифровывать потом как?
-- А такой задачи не стояло.

Как-то так можно, по крайней мере, на приведённых данных работает:
 rounds = int(input())
message = input()

followers = { 0 } | { i - 1 for i in range(7, len(message)) if (i % 2) and (i % 3) and (i % 5) }
leaders = sorted(set(range(1, len(message))) - followers)
followers = sorted(followers)

mess = message
for r in range(rounds):
mess = "".join([mess[i] for i in leaders] + [mess[i] for i in followers])
print(mess)

P.S. Два примера ниже написаны не на Питоне, а на Паскале, хотя и в питоновом синтаксисе. Но даже и в стиле Паскаля они написаны так, что старик Вирт в свой 89-й день рождения (т.е. сегодня), наверное, беспрерывно икает: "Вы что там творите, черти, разве я вас этому учил?"
Николай Буйницкий
Николай Буйницкий
54 053
Лучший ответ
 def encrypt(k, s): 
result = s
for x in range(k):
left, right = [], []
for i in range(len(result)):
j = i + 1
if j % 2 == 0 or j % 3 == 0 or j % 5 == 0:
left += [result[i]]
else:
right += [result[i]]
result = ''.join(left + right)
return result
print(encrypt(int(input()), input()))
 3  
Хлеб – всему голова.
б –вегл. алсвоеуХ ом
 phases, message = int(input()), input() 

for _ in range(phases):
block1, block2 = "", ""
for j in range(len(message)):
if (j+1) % 2 == 0 or (j+1) % 3 == 0 or (j+1) % 5 == 0:
block1 += message[j]
else:
block2 += message[j]
message = block1 + block2

print(message)
Николай Буйницкий Я знал, я знал, что это произойдёт. Во-первых, кто-то обязательно будет в каждом цикле считать остатки от деления. Во-вторых, это будет код на Паскале. Оба предчувствия сбылись.
Ну чем я не прорицатель?