Якщо ви коли-небудь стикалися з японською або східноазіатською культурою, ви напевно зіткнулися з грою Amidakuji:
Як пояснює Вікіпедія , це тип лотереї, намальований на папері і використовується для випадкового вибору перестановки з N елементів.
Наприклад, він може бути використаний для випадкового присвоєння початкової послідовності N людям, або N призів N людям тощо.
Хитрість розуміння того, чому гра являє перестановку, полягає в тому, щоб усвідомити, що кожен горизонтальний хід (який називається "нога") поміняє свої два елементи на місце.
Ця ж сторінка Вікіпедії також пояснює, що кожна перестановка P з N елементів відповідає нескінченній кількості діаграм Амідакуджі. Один (и) з найменшою кількістю горизонтальних штрихів (ніг) називають "праймерами" саме цієї перестановки P.
Ваше завдання - отримати діаграму Amidakuji з 2 або більше вертикальними лініями (у цьому прикладі їх 6) у такому форматі (за вирахуванням літер):
A B C D E F
| | | | | |
|-| |-| |-|
| |-| |-| |
| | | | |-|
| |-| |-| |
| | |-| |-|
| | |-| | |
|-| | |-| |
|-| |-| | |
| |-| | |-|
| | | | | |
B C A D F E
І створити один із його праймес (знову ж таки, мінус літери):
A B C D E F
| | | | | |
|-| | | |-|
| |-| | | |
| | | | | |
B C A D F E
Перший і останній рядки з літерами не є частиною формату. Я додав їх сюди, щоб показати перестановку. Також не потрібно, щоб перший або останній рядки не містили ніг |-|
, а також щоб вихід був максимально компактним.
Цей конкретний вхідний приклад є одним із (нескінченних) уявлень ASCII діаграми Амідакуджі вгорі сторінки Вікіпедії.
Є одне неочевидне правило щодо цих діаграм ASCII: сусідні ноги заборонені.
|-|-| <- NO, this does not represent a single swap!
Вікіпедія пояснює стандартну процедуру отримання простих частот із діаграми, що називається "бульбалізацією", яка складається із застосування наступних спрощень знову і знову:
1) Права вилка вліво:
| |-| |-| |
|-| | -> | |-|
| |-| |-| |
2) Елімінація парних пар:
|-| | |
|-| -> | |
Я не впевнений, чи це пояснення однозначне. Ваш код може використовувати цю техніку або будь-який інший алгоритм, який створює необхідні праймери.
Найкоротший код виграє.
Діють стандартні правила та стандартні надбавки. (Якщо введення недійсне, програма може загорітися. Формати вводу / виводу можуть бути stdin / stdout, аргумент рядків, список рядків, матриця символів, що найкраще працює для вас тощо).