У сортуванні млинців єдиною дозволеною операцією є повернення елементів деякого префіксу послідовності. Або придумайте стопку млинців: ми вставляємо десь у стопку шпатель і перевертаємо всі млинці над шпателем.
Наприклад, послідовність 6 5 4 1 2 3
можна сортувати, спочатку прогортаючи перші 6
елементи (всю послідовність), даючи проміжний результат 3 2 1 4 5 6
, а потім гортаючи перші 3
елементи, доходячи до 1 2 3 4 5 6
.
Оскільки існує лише одна операція, весь процес сортування може бути описаний послідовністю цілих чисел, де кожне ціле число - це кількість елементів / млинців, які повинні включати pr flip. У наведеному вище прикладі послідовність сортування була б 6 3
.
Інший приклад: 4 2 3 1
можна сортувати за 4 2 3 2
. Ось проміжні результати:
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
Завдання:
Напишіть програму, яка містить список цілих чисел та друкує дійсну послідовність сортування млинців.
Список для сортування може бути списком, відокремленим пробілом від stdin, або аргументами командного рядка. Роздрукувати список, проте це зручно, доки він дещо читабельний.
Це кодегольф!
Редагувати:
Як я вже говорив у коментарях, вам не потрібно оптимізувати вихід (пошук найкоротшої послідовності є важким для NP ). Однак я просто зрозумів, що дешевим рішенням буде викинути випадкові числа, поки ви не отримаєте бажаного результату ([новий?] Тип богосорту). Жоден із відповідей поки що цього не зробив, тому я заявляю, що ваш алгоритм не повинен покладатися на будь-яку (псевдо-) випадковість .
Поки ви все б’єте себе, ось варіант богопанкексарт в Ruby 2.0 (60 символів), щоб втерти його в:
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
замість4 2 3 1