Nell'ordinamento dei pancake l'unica operazione consentita è di invertire gli elementi di alcuni prefissi della sequenza. Oppure, pensa a una pila di pancake: inseriamo una spatola da qualche parte nella pila e capovolgiamo tutte le frittelle sopra la spatola.
Ad esempio, la sequenza 6 5 4 1 2 3
può essere ordinata capovolgendo prima i primi 6
elementi (l'intera sequenza), ottenendo il risultato intermedio 3 2 1 4 5 6
e quindi capovolgendo i primi 3
elementi, arrivando a 1 2 3 4 5 6
.
Poiché esiste una sola operazione, l'intero processo di ordinamento può essere descritto da una sequenza di numeri interi, in cui ogni numero intero è il numero di elementi / pancake da includere pr flip. Per l'esempio sopra, la sequenza di ordinamento sarebbe 6 3
.
Un altro esempio: 4 2 3 1
può essere ordinato con 4 2 3 2
. Ecco i risultati intermedi:
4 2 3 1
flip 4: 1 3 2 4
flip 2: 3 1 2 4
flip 3: 2 1 3 4
flip 2: 1 2 3 4
L'obiettivo:
Scrivi un programma che prende un elenco di numeri interi e stampa una sequenza di ordinamento pancake valida.
L'elenco da ordinare può essere un elenco separato da spazi da stdin o argomenti della riga di comando. Stampa l'elenco comunque è conveniente, purché sia in qualche modo leggibile.
Questo è codegolf!
Modificare:
Come ho detto nei commenti, non è necessario ottimizzare l'output (trovare la sequenza più breve è NP-difficile ). Tuttavia , mi sono appena reso conto che una soluzione economica sarebbe quella di lanciare numeri casuali fino a ottenere il risultato desiderato (un [nuovo?] Tipo di bogosort). Nessuna delle risposte finora ha fatto questo, quindi ora dichiaro che il tuo algoritmo non dovrebbe fare affidamento su alcuna (pseudo-) casualità .
Mentre ti prendi tutti a calci, ecco una variante di bogopancakesort in Ruby 2.0 (60 caratteri), per strofinarla:
a=$*.map &:to_i
a=a[0,p(v=rand(a.size)+1)].reverse+a[v..-1]while a!=a.sort
4 3 2 1
invece di4 2 3 1