При сортировке блинов единственной допустимой операцией является обращение элементов некоторого префикса последовательности в обратном порядке. Или подумайте о стопке блинов: вставляем где-то в стопку шпатель и переворачиваем все блины над шпателем.
Например, последовательность 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-сложная задача ). Однако я только что понял, что дешевым решением будет выбрасывать случайные числа, пока вы не получите желаемый результат (тип [new?] Bogosort). Ни один из ответов до сих пор не сделал этого, поэтому я сейчас заявляю, что ваш алгоритм не должен полагаться на какую-либо (псевдо-) случайность .
Пока вы все бьетесь, вот вариант bogopancakesort в 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