Шифр перестановки EntwicklerHeld

Я пытаюсь улучшить свои навыки кодирования на entwicklerheld.de и прямо сейчас я пытаюсь решить задачу перестановочного шифра:

Рассмотрим шифр, в котором открытый текст записывается сверху вниз и по диагонали в последовательных столбцах. Задается количество рядов или рельсов. Достигнув нижнего рельса, траверсируем по диагонали вверх, а после достижения верхнего рельса снова происходит смена направления. Таким образом, алфавиты [так в оригинале] сообщения записываются зигзагообразным образом. После написания каждого алфавита отдельные строки объединяются для получения зашифрованного текста.

Дано простое текстовое «кодирование» и количество рельсов 2. Простой текст теперь расположен зигзагообразным образом, как описано выше. Закодированный текст получается путем объединения строк одна за другой.

Таким образом, функция encrypt() должна возвращать шифр "cdnoig".

Для целых предложений или текстов используется та же процедура, что и для отдельных слов. Единственное, что здесь следует отметить, это то, что пробелы также считаются одним символом.

Дан простой текст «ранжировать код» и количество рельсов 2. Ваша функция должна вернуть шифр "rn h oeaktecd". Это должно работать и с другими примерами с двумя рельсами.

Шифрование очень просто с многомерным массивом.

Мой вопрос

Я застрял в части расшифровки.

Моя идея состоит в том, чтобы построить массив с 0 и 1 (чтобы показать, где должен быть символ). Затем заполните каждый массив (строка 1... строка 2... строка 3) символами в порядке зашифрованного текста.

Затем я перебираю массив в третий раз, чтобы прочитать слово зигзагом.

Я не знаю, но очень странно перебирать массив 3 раза. Может быть, есть зигзагообразный алгоритм или что-то в этом роде?

Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

Community 08.11.2022 09:24

Пожалуйста, добавьте к вашему вопросу описание задачи и минимальный код. Я не хочу переходить на другой веб-сайт только для того, чтобы понять вопрос, и если ссылка прерывается, ваш вопрос недействителен.

Alois Christen 08.11.2022 10:57
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сначала определить генератор, который дает сопоставление для каждого индекса с индексом, из которого должен быть взят символ во время шифрования. Но этому генератору не нужно было бы вводить обычный текст, только его длину. Поскольку этот генератор просто создает индексы, его также можно использовать для расшифровки.

Мне было неясно, относится ли вопрос только к случаю, когда количество рельсов равно 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)

Другие вопросы по теме