Если вы когда-либо знакомились с культурой Японии или Восточной Азии, вы наверняка столкнулись с игрой Amidakuji:
Как объясняет Википедия , это тип лотереи, нарисованный на бумаге и используемый для случайного выбора перестановки из N предметов.
Например, его можно использовать для случайного назначения стартовой последовательности для N человек или для N призов для N человек и так далее.
Хитрость в понимании того, почему игра представляет собой перестановку, состоит в том, чтобы понять, что каждый горизонтальный удар (называемый «ногой») меняет свои два элемента на месте.
На той же странице Википедии также объясняется, что каждая перестановка P из N элементов соответствует бесконечному числу диаграмм Амидакудзи. Один (ие) с наименьшим количеством горизонтальных штрихов (ножек) называются «простыми числами» этой конкретной перестановки P.
Ваша задача - получить диаграмму Амидакудзи с 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, строковый аргумент, список строк, матрица символов, все, что вам подходит, и т. Д.)