Na classificação de panquecas, a única operação permitida é reverter os elementos de algum prefixo da sequência. Ou pense em uma pilha de panquecas: inserimos uma espátula em algum lugar da pilha e viramos todas as panquecas acima da espátula.
Por exemplo, a sequência 6 5 4 1 2 3
pode ser classificada primeiro invertendo os primeiros 6
elementos (a sequência inteira), produzindo o resultado intermediário 3 2 1 4 5 6
e, em seguida, invertendo os primeiros 3
elementos, chegando a 1 2 3 4 5 6
.
Como existe apenas uma operação, todo o processo de classificação pode ser descrito por uma sequência de números inteiros, em que cada número inteiro é o número de elementos / panquecas para incluir o pr flip. Para o exemplo acima, a sequência de classificação seria 6 3
.
Outro exemplo: 4 2 3 1
pode ser classificado com 4 2 3 2
. Aqui estão os resultados intermediários:
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
A tarefa:
Escreva um programa que pegue uma lista de números inteiros e imprima uma sequência de classificação de panqueca válida.
A lista a ser classificada pode ser uma lista separada por espaço de stdin ou argumentos de linha de comando. Imprima a lista no entanto, é conveniente, desde que seja um pouco legível.
Isso é codegolf!
Editar:
Como eu disse nos comentários, você não precisa otimizar a saída (encontrar a sequência mais curta é difícil para o NP ). No entanto , acabei de perceber que uma solução barata seria lançar números aleatórios até obter o resultado desejado (um [novo?] Tipo de bogosort). Nenhuma das respostas até agora o fez, então declaro que seu algoritmo não deve se basear em nenhuma (pseudo-) aleatoriedade .
Enquanto todos se divertem, aqui está uma variante bogopancakesort no Ruby 2.0 (60 caracteres), para esfregar:
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
, em vez de4 2 3 1