Se você já teve alguma exposição à cultura japonesa ou do leste asiático, certamente encontrará o jogo Amidakuji:
Como a Wikipedia explica , é um tipo de loteria desenhada no papel e usada para selecionar aleatoriamente uma permutação de N itens.
Por exemplo, pode ser usado para atribuir aleatoriamente uma sequência inicial a N pessoas, ou N prêmios a N pessoas, e assim por diante.
O truque para entender por que o jogo representa uma permutação é perceber que todo golpe horizontal (chamado de "perna") troca seus dois itens no lugar.
A mesma página da Wikipedia também explica que cada item de permutação P de N corresponde a um número infinito de diagramas de Amidakuji. Aqueles com o menor número de traços horizontais (pernas) são chamados de "primos" dessa permutação específica P.
Sua tarefa é receber um diagrama Amidakuji com 2 ou mais linhas verticais (neste exemplo, são 6) neste formato (menos as letras):
A B C D E F
| | | | | |
|-| |-| |-|
| |-| |-| |
| | | | |-|
| |-| |-| |
| | |-| |-|
| | |-| | |
|-| | |-| |
|-| |-| | |
| |-| | |-|
| | | | | |
B C A D F E
E produza um de seus primos (novamente, menos as letras):
A B C D E F
| | | | | |
|-| | | |-|
| |-| | | |
| | | | | |
B C A D F E
A primeira e a última linha com as letras não fazem parte do formato. Eu os adicionei aqui para mostrar a permutação. Também não é necessário que a primeira ou a última linha não contenha pernas |-|
, nem que a saída seja o mais compacta possível.
Este exemplo de entrada específico é uma das representações (infinitas) ASCII do diagrama Amidakuji na parte superior da página da Wikipedia.
Há uma regra não óbvia sobre esses diagramas ASCII: pernas adjacentes são proibidas.
|-|-| <- NO, this does not represent a single swap!
A Wikipedia explica um procedimento padrão para obter um primo de um diagrama, chamado "bubblization", que consiste em aplicar as seguintes simplificações repetidamente:
1) Forquilha direita para forquilha esquerda:
| |-| |-| |
|-| | -> | |-|
| |-| |-| |
2) Eliminando duplas:
|-| | |
|-| -> | |
Não tenho certeza se essa explicação é inequívoca. Seu código pode usar essa técnica ou qualquer outro algoritmo que produza os números primos necessários.
O menor código vence.
Regras e subsídios padrão se aplicam. (Se a entrada não for válida, seu programa poderá pegar fogo. Os formatos de entrada / saída podem ser stdin / stdout, argumento de string, lista de linhas, matriz de caracteres, o que for melhor para você etc.)