Se hai mai avuto esposizione alla cultura giapponese o dell'Asia orientale, avrai sicuramente incontrato il gioco Amidakuji:
Come spiega Wikipedia , è un tipo di lotteria disegnata su carta e utilizzata per selezionare casualmente una permutazione di N oggetti.
Ad esempio, può essere utilizzato per assegnare in modo casuale una sequenza iniziale a N persone, oppure N premi a N persone e così via.
Il trucco per capire perché il gioco rappresenta una permutazione è rendersi conto che ogni colpo orizzontale (chiamato "gamba") scambia i suoi due oggetti in posizione.
La stessa pagina di Wikipedia spiega anche che ogni permutazione P di N elementi corrisponde a un numero infinito di diagrammi di Amidakuji. Quelli con il minor numero di tratti orizzontali (gambe) sono chiamati "numeri primi" di quella particolare permutazione P.
Il tuo compito è quello di ricevere un diagramma Amidakuji con 2 o più linee verticali (in questo esempio sono 6) in questo formato (meno le lettere):
A B C D E F
| | | | | |
|-| |-| |-|
| |-| |-| |
| | | | |-|
| |-| |-| |
| | |-| |-|
| | |-| | |
|-| | |-| |
|-| |-| | |
| |-| | |-|
| | | | | |
B C A D F E
E produce uno dei suoi numeri primi (di nuovo, meno le lettere):
A B C D E F
| | | | | |
|-| | | |-|
| |-| | | |
| | | | | |
B C A D F E
La prima e l'ultima riga con le lettere non fanno parte del formato. Li ho aggiunti qui per mostrare la permutazione. Inoltre, non è necessario che la prima o l'ultima riga non contengano gambe |-|
, né che l'output sia il più compatto possibile.
Questo particolare esempio di input è una delle (infinite) rappresentazioni ASCII del diagramma di Amidakuji nella parte superiore della pagina di Wikipedia.
C'è una regola non ovvia su questi diagrammi ASCII: le gambe adiacenti sono vietate.
|-|-| <- NO, this does not represent a single swap!
Wikipedia spiega una procedura standard per ottenere un numero primo da un diagramma, chiamato "bubblization", che consiste nell'applicare ripetutamente le seguenti semplificazioni:
1) Forcella destra a sinistra:
| |-| |-| |
|-| | -> | |-|
| |-| |-| |
2) Eliminare i doppi:
|-| | |
|-| -> | |
Non sono sicuro che questa spiegazione sia inequivocabile. Il codice può utilizzare quella tecnica o qualsiasi altro algoritmo che produce i numeri primi richiesti.
Il codice più corto vince.
Si applicano le norme e le indennità standard. (Se l'input non è valido, il programma potrebbe prendere fuoco. I formati di input / output possono essere stdin / stdout, argomento stringa, elenco di righe, matrice di caratteri, qualunque cosa funzioni meglio per te, ecc.)