Я пытаюсь улучшить свои навыки кодирования на entwicklerheld.de и прямо сейчас я пытаюсь решить задачу перестановочного шифра:
Рассмотрим шифр, в котором открытый текст записывается сверху вниз и по диагонали в последовательных столбцах. Задается количество рядов или рельсов. Достигнув нижнего рельса, траверсируем по диагонали вверх, а после достижения верхнего рельса снова происходит смена направления. Таким образом, алфавиты [так в оригинале] сообщения записываются зигзагообразным образом. После написания каждого алфавита отдельные строки объединяются для получения зашифрованного текста.
Дано простое текстовое «кодирование» и количество рельсов 2. Простой текст теперь расположен зигзагообразным образом, как описано выше. Закодированный текст получается путем объединения строк одна за другой.
Таким образом, функция
encrypt()
должна возвращать шифр "cdnoig".Для целых предложений или текстов используется та же процедура, что и для отдельных слов. Единственное, что здесь следует отметить, это то, что пробелы также считаются одним символом.
Дан простой текст «ранжировать код» и количество рельсов 2. Ваша функция должна вернуть шифр "rn h oeaktecd". Это должно работать и с другими примерами с двумя рельсами.
Шифрование очень просто с многомерным массивом.
Я застрял в части расшифровки.
Моя идея состоит в том, чтобы построить массив с 0 и 1 (чтобы показать, где должен быть символ). Затем заполните каждый массив (строка 1... строка 2... строка 3) символами в порядке зашифрованного текста.
Затем я перебираю массив в третий раз, чтобы прочитать слово зигзагом.
Я не знаю, но очень странно перебирать массив 3 раза. Может быть, есть зигзагообразный алгоритм или что-то в этом роде?
Пожалуйста, добавьте к вашему вопросу описание задачи и минимальный код. Я не хочу переходить на другой веб-сайт только для того, чтобы понять вопрос, и если ссылка прерывается, ваш вопрос недействителен.
Вы можете сначала определить генератор, который дает сопоставление для каждого индекса с индексом, из которого должен быть взят символ во время шифрования. Но этому генератору не нужно было бы вводить обычный текст, только его длину. Поскольку этот генератор просто создает индексы, его также можно использовать для расшифровки.
Мне было неясно, относится ли вопрос только к случаю, когда количество рельсов равно 2. С некоторой дополнительной логикой это можно сделать и для любого большего количества рельсов.
Вот как это может выглядеть:
# This generator can be used for encryption and decryption:
def permutation(size, numrails):
period = numrails * 2 - 2
yield from range(0, size, period) # top rail
# Following yield-from statement only needed when number of rails > 2
yield from (
index
for rail in range(1, numrails - 1)
for pair in zip(range(rail, size, period),
range(rail + period - rail*2, size + period, period))
for index in pair
if index < size
)
yield from range(numrails - 1, size, period) # bottom rail
def encrypt(plain, numrails):
n = len(plain)
return "".join([plain[i] for i in permutation(n, numrails)])
def decrypt(encrypted, numrails):
n = len(encrypted)
plain = [None] * n
for source, target in enumerate(permutation(n, numrails)):
plain[target] = encrypted[source]
return "".join(plain)
Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.