Defina uma sequência de comprimento de pré-acréscimo-acréscimon
para ser uma permutação dos números 1, 2, ..., n
que podem ser gerados pelo seguinte procedimento:
Comece com o número
1
.Para cada número a partir
2
den
, colocar este número para o início ou no final da sequência (quer preceder ou acrescentar que, daí o nome da sequência).
Por exemplo, esta é uma maneira válida de gerar uma sequência de pré-acréscimo-acréscimo de comprimento 4:
1
21 [beginning]
213 [end]
2134 [end]
Sua tarefa é criar um programa ou função que levará um número n
de 3
para 30
como entrada e imprimir ou retornar todas as sequências de comprimento de pré-apêndice a fim n
em ordem lexicográfica (se você estiver produzindo seqüências de caracteres e não listas, os números acima de 9 serão representados como letras a-u
, para preservar o comprimento da string). Por exemplo, é esse pedido para n = 4
:
1234 [RRR]
2134 [LRR]
3124 [RLR]
3214 [LLR]
4123 [RRL]
4213 [LRL]
4312 [RLL]
4321 [LLL]
Em geral, existem 2 permutações de comprimento pré-anexado n-1n
.
Você não pode usar nenhuma função de classificação interna no seu idioma no seu código. O programa mais curto para fazer isso em qualquer idioma vence.
fonte
a-u
. Podemos apenas produzir listas de números?Respostas:
CJam,
22 20 1917 bytesExpansão do código :
Como funciona :
Esta é uma versão de depuração do código:
Vamos ver como ele funciona para entrada
3
:Experimente online aqui
fonte
Haskell, 47 bytes
fonte
f n=[[n:x,x++[n]]|x<-f$n-1]>>=id
(usando a função concat code-golfers>>=id
).f n=[x++[n]|x<-f$n-1]++[n:x|x<-f$n-1]
,f n=map(++[n])(f$n-1)++[n:x|x<-f$n-1]
,f n=map(++[n])(f$n-1)++map(n:)(f$n-1)
,f n=(++[n])#n++(n:)#n;p#i=map p$f$i-1
Python 2, 68
Mostra uma lista de listas de números.
Uma solução recursiva. Para
n==1
saída[[1]]
. Caso contrário, adicionen
no início ou no final de todas(n-1)
aspermutações. A pré-anexação torna a permutação lexicograficamente mais tarde que a anexação, para que as permutações permaneçam ordenadas.O "Booleano"
b
codifica se você deve colocar[n]
no início ou no final. Na verdade, movemos o resto da listax
na expressãox*b+[n]+x*-b
. Colocarb
como-1
ou1
vamos usar flip negando, pois uma lista multiplicada por-1
é a lista vazia.fonte
Pyth, 19
Experimente online aqui
Este é um programa completo que recebe a entrada do stdin.
Isso funciona de maneira semelhante à solução do xnor, mas gera os valores um pouco fora de ordem e, portanto, eles devem ser reordenados. O que acontece em cada nível é que cada lista anterior de valores tem o novo valor adicionado ao final e ao início, e estes são agrupados em duas tuplas, agrupados em uma lista. Por exemplo, a primeira etapa faz isso:
Em seguida, essa lista de tuplas é compactada (e depois somada para remover a lista mais externa). No primeiro caso, isso fornece apenas o valor desembrulhado de cima, pois há apenas um valor na lista.
Passos mostrando 2-> 3:
fonte
Mathematica,
575449 bytesExemplo:
fonte
J, 26 bytes
Aprimoramento de 1 byte graças ao FUZxxl .
fonte
,.
por,"1
um caractere.Pyth,
34333129Basicamente, uma tradução de xnor 's resposta Python . Ainda não sou bom com Pyth, por isso sugestões de melhoria são bem-vindas.
Define uma função
y
para retornar uma lista de listas de números inteiros.Atualização: salvou 2 bytes graças a FryAmTheEggman .
Explicação:
fonte
-b1
pode sertb
,[1_1)
pode ser,1_1
(no entanto, você pode simplesmente largar o colchete próximo, pois só precisa contar os bytes necessários para criar a função, mesmo que você não possa chamá-lo sem fechá-lo), e você não é necessáriob
agrupar uma lista, pois o pyth se converte automaticamente em lista ao adicionar uma lista a um int.[1,-1]
. Posso salvar bytes para codificar algo tão curto, especialmente quando você simplifica a lógica. Eu receboL?]]1<b2sCm,+db+bdytb
Pure Bash, 103
Mais do que eu esperava:
fonte
JavaScript (ES6) 73
80Implementação de JavaScript da boa solução do @ Optimizer.
Recursiva (73):
Iterativo (74):
Teste no console Firefox / FireBug
fonte
Minha solução Java:
fonte
false
por algo como5<4
.