Dalam menyortir pancake , satu-satunya operasi yang diizinkan adalah membalik elemen dari beberapa awalan urutan. Atau, pikirkan tumpukan pancake: Kami memasukkan spatula di suatu tempat di tumpukan dan membalik semua pancake di atas spatula.
Sebagai contoh, urutan 6 5 4 1 2 3
dapat diurutkan dengan pertama membalik 6
elemen pertama (seluruh urutan), menghasilkan hasil antara 3 2 1 4 5 6
, dan kemudian membalik 3
elemen pertama , sampai pada 1 2 3 4 5 6
.
Karena hanya ada satu operasi, seluruh proses penyortiran dapat dijelaskan oleh urutan bilangan bulat, di mana setiap bilangan bulat adalah jumlah elemen / pancake untuk menyertakan pr flip. Untuk contoh di atas, urutan pengurutannya adalah 6 3
.
Contoh lain: 4 2 3 1
bisa disortir dengan 4 2 3 2
. Inilah hasil antara:
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
Tugas:
Tulis program yang mengambil daftar bilangan bulat dan mencetak urutan penyortiran pancake yang valid.
Daftar untuk disortir dapat berupa daftar yang dipisahkan spasi dari stdin, atau argumen baris perintah. Cetak daftar itu bagaimanapun nyaman, asalkan terbaca.
Ini adalah codegolf!
Edit:
Seperti yang saya katakan di komentar, Anda tidak perlu mengoptimalkan output (menemukan urutan terpendek adalah NP-hard ). Namun , saya baru menyadari bahwa solusi yang murah adalah membuang angka acak sampai Anda mendapatkan hasil yang diinginkan (jenis bogosort [baru?]). Sejauh ini tidak ada jawaban yang telah melakukan ini, jadi saya sekarang menyatakan bahwa algoritma Anda tidak harus bergantung pada keacakan (pseudo-) .
Saat Anda semua menendang diri sendiri, inilah varian bogopancakeort di Ruby 2.0 (60 karakter), untuk digosokkan ke:
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
bukan4 2 3 1