Problema
Supponi di avere N pile da S 1 a S N , dove ogni S k (k = 1 a N) contiene N copie del numero k.
Ad esempio, quando N = 3 le pile si presentano così:
1 2 3 <- top of stack
1 2 3
1 2 3 <- bottom of stack
=======
1 2 3 <- stack index
Qui ci sono 3 stack indicizzati come 1, 2 e 3 e ognuno contiene N istanze del proprio indice.
L'obiettivo è riorganizzare le pile N in modo tale che ognuna di esse contenga identicamente i numeri da 1 a N in ordine dall'alto verso il basso.
ad es. per N = 3 l'obiettivo è riordinare le pile in:
1 1 1
2 2 2
3 3 3
=======
1 2 3
L'unica azione che puoi eseguire con le pile è prendere il numero più alto da una delle pile (saltar fuori) e posizionarlo immediatamente sopra una pila diversa (spingere) . Questo è soggetto a queste disposizioni:
Un numero può essere inserito in una pila solo se è inferiore o uguale al numero in cima a quella pila.
ad es. a
1
può essere inserito in una pila con a1
,2
o3
nella parte superiore, ma a2
può essere inserito in una pila con una2
o3
(o superiore) nella parte superiore.Ciò ha l'effetto che le pile aumentano sempre monotonicamente dall'alto verso il basso.
Qualsiasi pila non vuota può essere espulsa e, supponendo che il proiettile precedente sia soddisfatto, qualsiasi pila può essere spinta verso.
Qualsiasi numero può essere inserito in una pila vuota.
Le pile non hanno limiti di altezza massima.
Le pile non possono essere create o distrutte, ce ne sono sempre N.
Questa sfida consiste nel decidere quali pop e push fare per completare lo scambio di stack, non necessariamente con il minor numero di mosse, ma in modo sicuro.
(Fare pratica con un mazzo di carte è un buon modo per farsi un'idea del problema.)
Sfida
Scrivi un programma o una funzione che accetta un numero intero positivo N, garantito che sia 3 o superiore. Stampa o restituisci una stringa che denota tutte le azioni pop-push richieste per riorganizzare le pile dallo stato iniziale:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
=============
1 2 3 4 5
(N = 5 casi)
Allo stato finale:
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
=============
1 2 3 4 5
Ogni riga nell'output deve contenere due numeri separati da uno spazio. Il primo numero è l'indice dello stack da cui eseguire il pop-up e il secondo numero è l'indice dello stack da spingere. L'esecuzione delle azioni di tutte le linee in ordine dovrebbe disporre correttamente le pile senza infrangere alcuna regola.
Ad esempio, ecco un potenziale output valido per il caso N = 3:
1 2 [move the top number on stack 1 to the top of stack 2]
1 2 [repeat]
1 2 [repeat]
3 1 [move the top number on stack 3 to the top of stack 1]
2 3 [etc.]
2 3
2 3
2 1
2 1
2 1
3 1
3 1
3 1
3 2
1 2
1 2
1 2
1 3
2 3
2 3
2 3
1 2
3 2
3 1
Gli appunti
Non è necessario che l' output sia ottimale , ma solo corretto. cioè non è necessario minimizzare il numero di pop e push.
- Quindi andrebbe bene se, diciamo, qualche mossa fosse ripetutamente fatta e immediatamente invertita.
- Popping e spingere allo stesso stack in una mossa, ad esempio
2 2
, è anche permesso (anche se ovviamente inutile).
L'output non necessità di essere deterministico e finito.
Ricorda che gli stack hanno l'indicizzazione basata su 1. L'indicizzazione basata su 0 non è consentita.
Ovviamente N maggiore di 9 dovrebbe funzionare allo stesso modo di una singola cifra N.
Se lo si desidera, è possibile utilizzare due caratteri ASCII stampabili non digitabili al posto di spazi e nuove righe. Una nuova riga finale (o sostituto nuova riga) nell'output va bene.
punteggio
Vince il codice più breve in byte. Tiebreaker è la risposta più votata.
Punti brownie senza valore se puoi mostrare che il tuo algoritmo è ottimale.
-._(._.)_.-
N=3
ottimale?