Si alguna vez has tenido alguna exposición a la cultura japonesa o del este asiático, seguramente habrás encontrado el juego Amidakuji:
Como explica Wikipedia , es un tipo de lotería dibujada en papel y utilizada para seleccionar aleatoriamente una permutación de N elementos.
Por ejemplo, puede usarse para asignar aleatoriamente una secuencia inicial a N personas, o N premios a N personas, y así sucesivamente.
El truco para comprender por qué el juego representa una permutación es darse cuenta de que cada golpe horizontal (llamado "pierna") intercambia sus dos elementos en su lugar.
La misma página de Wikipedia también explica que cada permutación P de N elementos corresponde a un número infinito de diagramas Amidakuji. Los que tienen el menor número de trazos horizontales (patas) se denominan "primos" de esa permutación particular P.
Su tarea es recibir un diagrama Amidakuji con 2 o más líneas verticales (en este ejemplo son 6) en este formato (menos las letras):
A B C D E F
| | | | | |
|-| |-| |-|
| |-| |-| |
| | | | |-|
| |-| |-| |
| | |-| |-|
| | |-| | |
|-| | |-| |
|-| |-| | |
| |-| | |-|
| | | | | |
B C A D F E
Y produzca uno de sus números primos (de nuevo, menos las letras):
A B C D E F
| | | | | |
|-| | | |-|
| |-| | | |
| | | | | |
B C A D F E
La primera y la última línea con las letras no forman parte del formato. Los he agregado aquí para mostrar la permutación. También se no requiere que las primeras o últimas líneas no contienen piernas |-|
, ni que la salida sea lo más compacto posible.
Este ejemplo de entrada particular es una de las representaciones ASCII (infinitas) del diagrama de Amidakuji en la parte superior de la página de Wikipedia.
Hay una regla no obvia sobre estos diagramas ASCII: las patas adyacentes están prohibidas.
|-|-| <- NO, this does not represent a single swap!
Wikipedia explica un procedimiento estándar para obtener un primo de un diagrama, llamado "bubblization", que consiste en aplicar las siguientes simplificaciones una y otra vez:
1) Horquilla derecha a izquierda:
| |-| |-| |
|-| | -> | |-|
| |-| |-| |
2) Eliminación de dobles:
|-| | |
|-| -> | |
No estoy seguro de si esa explicación es inequívoca. Su código puede usar esa técnica o cualquier otro algoritmo que produzca los primos necesarios.
El código más corto gana.
Se aplican reglas estándar y derechos de emisión estándar. (Si la entrada no es válida, su programa puede incendiarse. Los formatos de entrada / salida pueden ser stdin / stdout, argumento de cadena, lista de líneas, matriz de caracteres, lo que sea mejor para usted, etc.)