Напишіть програму, яка займає два рядки введення та використовує перший як основну фразу для шифрування другого згідно з технікою шифрування Playfair.
Wikipedia детально описує шифрування Playfair , але щоб уникнути неоднозначності, ось короткий підсумок:
1. Створіть ключову таблицю:
Замініть всі випадки J
у ключовій фразі на I
, а потім зніміть усі символи, що не бувають алфавітом, та повторювані символи. Вставте в таблицю шифрування 5 × 5, заповнивши клітини рештою алфавіту (за винятком того J
, що нам не подобається J
).
Приклад:
S T A C K
O V E R F
Stack Overflow --> STACKOVERFLW --> L W B D G
H I M N P
Q U X Y Z
2. Підготуйте повідомлення для шифрування
Замініть кожен J
на I
, зніміть усі символи, X
що не містять алфавіту, і розділіть на пари, використовуючи клавішу "А", щоб двічі перебити будь-які пари, що містять одну й ту саму букву. Якщо ви закінчилися з непарною кількістю літер, додайте X
їх наприкінці. (Примітка: Цифри повинні бути викладені в повному обсязі - ONE
, TWO
, THREE
і т.д. , - але ви можете припустити , що це вже зроблено для вас.)
Приклад:
In:
The cat crept into the crypt, crapped, and crept out again.
Out:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
3. Шифрування
Зашифруйте кожну пару літер по черзі. Якщо вони знаходяться в різних рядках і стовпцях ключової таблиці, замініть кожну букву з того самого рядка в стовпці, де знайдена інша літера (наприклад, VM
⇒ EI
, LZ
⇒ GQ
). Якщо вони знаходяться в одному рядку (або стовпці), виберіть два символи відразу праворуч (або внизу), обернувшись за необхідності (наприклад, OE
⇒ VR
, ZG
⇒ KP
).
Приклад:
In:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
Out:
SI RA CA RD FM VU IC VS MO RD ZN AK EC MZ MF BC YN RD FM SV TV KB TM MY
Рядок, створений цим процесом, - це зашифроване повідомлення, яке має виводити ваша програма.
Правила:
- Текст і ключ введення можуть бути отримані з
stdin
аргументів командного рядка або інших подібних джерел. Введення жорсткого коду заборонено. - Ваша програма повинна приймати як верхній, так і нижній регістр тексту прохідної фрази та повідомлення.
- Зашифрований вихід може мати верхній або нижній регістр.
- Ваша програма повинна приймати ключові фрази довжиною принаймні 64 символи та тексти повідомлень не менше 16 Кб.
- Вам не потрібно обробляти вхід, який не є ASCII.
- Ви можете проігнорувати можливість пари листів,
XX
що виникають під час шифрування. - Немає необхідності додавати пробіли до виходу програми.
- Ваша відповідь повинна містити приклад повідомлення, ключової фрази та зашифрованого виводу, створеного вашою програмою.
- Це виклик для гольфу з кодом, тому відповідь з найкоротшим кодом (у байтах) виграє.
ПРИМІТКА. Будь ласка, пам’ятайте, що вам потрібно ламати послідовні букви, лише якщо вони з’являються в одній парі . Так, наприклад,
MASSACHUSETTS
слід зашифрувати якMA SX SA CH US ET TS
- подвійнийS
має бути розділений, але подвійнийT
- ні.
J
" Ви чимаєте подібні настрої щодо APL?