Вступ
У цьому виклику ви вирішите діагональні перетворення Берроу-Уілера. Ось загальний огляд того, що таке діагональна трансформація Берроса-Уілера. Щоб кодувати повідомлення, спочатку ви повинні гарантувати, що воно має непарну довжину (тобто 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, аргументи програми або параметри функції та декодує її за допомогою цього методу.
Вимоги
Перша програма / функція
- Введення одного рядка, використовуючи будь-який метод, перерахований вище.
- Повинно кодувати рядок, використовуючи діагональний стиль перетворення Берроуса-Уілера.
Друга програма / функція
- Введення одного рядка, використовуючи будь-який метод, перерахований вище.
- Потрібно розшифрувати рядок, використовуючи діагональний стиль перетворення Burrow-Wheeler.
Обмеження
- Ви не можете використовувати будь-які вбудовані або зовнішні функції, які виконують це завдання.
- Стандартні лазівки заборонені.
- Обидві програми / функції повинні бути однаковою мовою.
Оцінка балів
Це кодовий гольф, тому найкоротша програма в байтах виграє.
Якщо мені потрібно додати більше інформації, залиште коментар!