En la clasificación de panqueques, la única operación permitida es invertir los elementos de algún prefijo de la secuencia. O piense en una pila de panqueques: insertamos una espátula en algún lugar de la pila y volteamos todos los panqueques por encima de la espátula.
Por ejemplo, la secuencia 6 5 4 1 2 3
se puede ordenar primero volteando los primeros 6
elementos (la secuencia completa), obteniendo el resultado intermedio 3 2 1 4 5 6
, y luego volteando los primeros 3
elementos, llegando a 1 2 3 4 5 6
.
Como solo hay una operación, todo el proceso de clasificación se puede describir mediante una secuencia de números enteros, donde cada número entero es el número de elementos / panqueques para incluir pr flip. Para el ejemplo anterior, la secuencia de clasificación sería 6 3
.
Otro ejemplo: 4 2 3 1
se puede ordenar con 4 2 3 2
. Aquí están los resultados intermedios:
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 tarea:
Escriba un programa que tome una lista de enteros e imprima una secuencia de clasificación de panqueques válida.
La lista para ordenar puede ser una lista separada por espacios de stdin o argumentos de línea de comando. Imprima la lista, sin embargo, es conveniente, siempre que sea algo legible.
¡Esto es codegolf!
Editar:
Como dije en los comentarios, no es necesario optimizar la salida (encontrar la secuencia más corta es NP-hard ). Sin embargo , me di cuenta de que una solución barata sería arrojar números aleatorios hasta obtener el resultado deseado (¿un [nuevo?] Tipo de bogosort). Ninguna de las respuestas hasta ahora ha hecho esto, por lo que ahora declaro que su algoritmo no debe basarse en ninguna (pseudo-) aleatoriedad .
Mientras todos se patean, aquí hay una variante bogopancakesortort en Ruby 2.0 (60 caracteres), para frotarlo:
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
lugar de4 2 3 1