Dans le tri des crêpes, la seule opération autorisée consiste à inverser les éléments d'un préfixe de la séquence. Ou, pensez à une pile de crêpes: nous insérons une spatule quelque part dans la pile et retournons toutes les crêpes au-dessus de la spatule.
Par exemple, la séquence 6 5 4 1 2 3
peut être triée en retournant d'abord les premiers 6
éléments (la séquence entière), donnant le résultat intermédiaire 3 2 1 4 5 6
, puis en retournant les premiers 3
éléments, pour arriver à 1 2 3 4 5 6
.
Comme il n'y a qu'une seule opération, l'ensemble du processus de tri peut être décrit par une séquence d'entiers, où chaque entier est le nombre d'éléments / crêpes à inclure pr flip. Pour l'exemple ci-dessus, la séquence de tri serait 6 3
.
Autre exemple: 4 2 3 1
peut être trié avec 4 2 3 2
. Voici les résultats intermédiaires:
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
La tâche:
Écrivez un programme qui prend une liste d'entiers et imprime une séquence de tri de crêpes valide.
La liste à trier peut être soit une liste séparée par des espaces de stdin, soit des arguments de ligne de commande. Imprimez la liste mais c'est pratique, tant qu'elle est quelque peu lisible.
C'est du codegolf!
Modifier:
Comme je l'ai dit dans les commentaires, vous n'avez pas besoin d'optimiser la sortie (trouver la séquence la plus courte est NP-difficile ). Cependant , je viens de réaliser qu'une solution bon marché serait de jeter des nombres aléatoires jusqu'à ce que vous obteniez le résultat souhaité (un [nouveau?] Type de bogosort). Aucune des réponses n'a jusqu'à présent fait cela, donc je déclare maintenant que votre algorithme ne devrait pas s'appuyer sur un (pseudo) hasard .
Pendant que vous vous frappez tous, voici une variante de bogopancakesort dans Ruby 2.0 (60 caractères), pour le frotter:
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
au lieu de4 2 3 1