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
Respostas:
GolfScript, 34/21 caracteres
(Obrigado @ PeterTaylor por cortar 4 caracteres)
Teste online
Uma versão menor, com 21 caracteres, funciona apenas para listas com itens exclusivos
Teste online
Ambas as versões produzem soluções abaixo do ideal.
Explicação para a solução mais curta:
Isso usa um algoritmo diferente para a maioria dos outros postados. Basicamente, ele pega o menor elemento da lista e, com dois movimentos, move-o para a frente, preservando a ordem dos outros elementos.
Para mover o enésimo elemento para a frente:
Ele repete esta operação para cada elemento em ordem e termina com uma lista classificada inversa. Em seguida, vira a lista inteira para deixá-la totalmente classificada.
De fato, o algoritmo é uma variação de uma solução Python de 90 caracteres (a minha, é claro):
fonte
&
nenhum lugar; portanto, poderá substituirs
enquanto&
e remover o espaço em branco.^
como uma variável no desafio de fibonacci;) Obrigado pela dica!3 2 1
recebo o131211
que não está correto.2 1 1
não podem mais ser classificadas.Python,
9190 caracteresVire a maior panqueca para o topo e depois vire a pilha inteira. Retire a maior panqueca do fundo e repita.
i
é o índice da maior panqueca.L=L[:i:-1]+L[:i]
virai+1
panquecas, viralen(L)
panquecas e depois derruba a última panqueca.fonte
print
costuma processar a saída ilegível (1 byte salvos :)Ruby 1.9 -
1098879 caracteresVersão muito mais compacta baseada na ótima solução python de Keith:
Versão original:
Se você não se importa com operações espúrias (inverter pilhas do tamanho 1 ou inverter a mesma pilha duas vezes seguidas), você pode torná-la um pouco menor (96 caracteres):
Toma a lista não classificada como argumentos da linha de comando. Exemplo de uso:
fonte
GolfScript,
3129 caracteresOutra solução GolfScript também pode ser testada online .
Versão anterior:
Como funciona: vira o maior item para o topo e depois para o último lugar na lista. Como agora está na posição correta, podemos removê-lo da lista.
fonte
Perl,
103100 caracteresEspera entrada na linha de comando.
As soluções que imprime são decididamente abaixo do ideal. (Eu tinha um programa com uma saída muito melhor, há cerca de 24 caracteres ....)
A lógica é meio interessante. Começa catalogando o índice de cada item, se estivesse em ordem classificada. Em seguida, itera através deste catálogo da direita para a esquerda. Portanto, aplicar um flip envolve o ajuste de índices abaixo do valor de corte, em vez de realmente mover os valores. Após algumas finalizações, eu também consegui salvar alguns caracteres fazendo os dois movimentos por iteração simultaneamente.
fonte
Python 2 (254)
A pesquisa BFS simples, algumas coisas estão embutidas, provavelmente poderia ser mais compactada sem alterar o estilo de pesquisa. Espero que isso mostre talvez como começar a jogar um pouco (demais para ser um simples comentário).
Usar:
(2 espaços = tabulação)
fonte
sys.exit()
por1/0
(no codegolf, você nunca se importa com o que é impresso no stderr ...).print s[::-1];1/0
para raspar alguns caracteres.4 2 3 1
give2 3 2 4
, que na verdade é inválido.4 2 3 1
->2 4 3 1
->3 4 2 1
->4 3 2 1
->1 2 3 4
Python2: 120
Não é eficiente: ele não encontrará a melhor sequência de classificação, e a sequência fornecida pode até conter no-ops (ou seja, inverter apenas o primeiro elemento), no entanto, a saída é válida.
A saída é fornecida no formato:
Que deve ser lido como a sequência de inversões:
n_1 n_2 n_3 n_4 n_5 n_6 ...
. Se você deseja obter uma saída como:n_1 n_2 n_3 n_4 n_5 n_6 ...
Basta adicionar uma vírgula na
print
declaração.fonte
[:i][::-1]
->[i-1::-1]
,[:u][::-1]
->[u-1::-1]
, economiza 2 caracteresL[:i]=L[i-1::-1];L[:u]=[u-1::-1]
economiza mais 3 caracteresPython - 282 caracteres
Meu primeiro código de golfe; Não tenho ilusões de que vou ganhar , mas me diverti muito. Dar a todos os nomes de um personagem com certeza torna assustador ler, deixe-me dizer! Isso é executado na linha de comando, exemplo de implementação abaixo:
Não há nada de especial ou inventivo na maneira como eu lutei com isso, mas as perguntas frequentes sugerem a publicação de uma versão sem golf para os leitores interessados, então fiz isso abaixo:
O algoritmo básico que usei é o mencionado no artigo wiki vinculado na pergunta :
fonte
t=p[:x]
t=t[::-1]
(16 + indentação) pode ser reduzido parat=p[:x][::-1]
(13) ou mesmot=p[x-1::-1]
(12). Tudo em linha, você pode:p=p[x-1::-1]+p[x:]
len(a)-n
torna-se-n
;p=p[-n-1::-1]+p[-n:]
. Mais golfe usando as operações certas:p=p[~n::-1]+p[-n:]
map(int,sys.argv[1:])
faça o que suas 6 primeiras linhas fazem agora.i=x=g=0
funciona, mas você deve cortar a quantidade de variáveis de qualquer maneira. Vou dar-lhe uma coisa, porém: Esta é a entrada de um python de que eu entendo o mínimo: DC # -
264 259 252237 caracteresUsa o algoritmo mais simples e produz saída correta sem inversões redundantes. Poderia raspar 7 caracteres se eu permitisse incluir 1 (não flips) na saída, mas isso é feio.
Eu recorri ao uso
goto
para o máximo de golfe. Também salvou alguns caracteres, permitindo a execução de não flips (mas não os imprime).Melhoria mais recente: manter a matriz de entrada como seqüências de caracteres em vez de converter em ints.
Ungolfed:
Aqui está a minha solução inicial, sem uso de golfe (264 caracteres jogados):
fonte
Haskell ,
7271 bytesExperimente online! Encontra o máximo, vira-o para trás e classifica recursivamente a lista restante.
Edit: -1 byte graças ao BMO
fonte
Perl 5.10 (ou superior), 66 bytes
Inclui
+3
para-n
ouse 5.10.0
trazer a linguagem para nível perl 5.10 é considerado livreExecute com a entrada como uma linha no STDIN:
Classifica a lista localizando repetidamente qualquer inversão, invertendo-a para a frente e depois invertendo e invertendo tudo de volta à sua antiga posição. E isso é equivalente a trocar a inversão, então eu não preciso inverter (o que é estranho nas strings, pois inverte os dígitos dos valores que convertem, por exemplo,
12
em21
)fonte
C # - 229
versão legível
fonte