Вступление
В этом задании вы будете решать диагональные преобразования Барроуза-Уилера. Вот общий обзор диагонального преобразования Барроуза-Уилера. Для кодирования сообщения сначала необходимо убедиться, что оно нечетной длины (т. Е. 5, 7, 9 и т. Д.). Затем вы делаете сетку, с n
помощью n
, где n
длина сообщения. Первая строка - это оригинальное сообщение. Каждая строка после этого является строкой над ней, но смещается на 1 символ влево, а первый символ перемещается назад. Например:
Hello World
ello WorldH
llo WorldHe
lo WorldHel
o WorldHell
WorldHello
WorldHello
orldHello W
rldHello Wo
ldHello Wor
dHello Worl
Затем вы берете каждую букву от диагонали NW до SE и помещаете ее в новую строку:
Hello World H
ello WorldH l
llo WorldHe o
lo WorldHel W
o WorldHell r
WorldHello d
WorldHello e
orldHello W l
rldHello Wo (space)
ldHello Wor o
dHello Worl l
Ваше кодированное сообщение HloWrdel ol
. Для декодирования сначала возьмите длину закодированного сообщения, добавьте 1 и разделите на 2. Позволяет позвонить по этому номеру x
. Теперь, когда мы знаем x
, начиная с первой буквы, каждая буква идет x
после последней и повторяется. Например:
H l o W r d e l o l
1
Then...
H l o W r d e l o l
1 2
And again...
H l o W r d e l o l
1 3 2
Until you get...
H l o W r d e l o l
1 3 5 7 9 11 2 4 6 8 10
Теперь просто переставьте буквы в правильном порядке, чтобы получить Hello World
!
Вызов
Ваша задача - написать две программы, функции или одну из них. Однако оба должны использовать один и тот же язык. Первая программа примет строку в качестве ввода через STDIN, аргументы программы или параметры функции и закодирует ее, используя этот метод. Вторая программа примет строку в качестве ввода через STDIN, аргументы программы или параметры функции и расшифрует ее, используя этот метод.
Требования
Первая программа / функция
- Ввод одной строки с использованием любого метода, перечисленного выше.
- Необходимо кодировать строку с использованием диагонального стиля преобразования Берроуза-Уилера.
Вторая программа / функция
- Ввод одной строки с использованием любого метода, перечисленного выше.
- Необходимо декодировать строку с использованием диагонального стиля преобразования Берроуза-Уилера.
Ограничения
- Вы не можете использовать любые встроенные или внешние функции, которые выполняют эту задачу.
- Стандартные лазейки не допускаются.
- Обе программы / функции должны быть на одном языке.
счет
Это код гольф, поэтому самая короткая программа в байтах выигрывает .
Если мне нужно добавить больше информации, оставьте комментарий!