Defina una secuencia de longitud de anteponer-agregarn
para que sea una permutación de los números 1, 2, ..., n
que se pueden generar mediante el siguiente procedimiento:
Comience con el número
1
.Para cada número de
2
an
, colocar este número al principio o al final de la secuencia (ya sea prepend o append , de ahí el nombre de la secuencia).
Por ejemplo, esta es una forma válida de generar una secuencia de anteponer-agregar de longitud 4:
1
21 [beginning]
213 [end]
2134 [end]
Su tarea es crear un programa o función que tome un número n
de 3
a 30
como entrada, e imprima o devuelva todas las secuencias de longitud de anteponer y agregar n
en orden lexicográfico (si está generando cadenas y no listas, los números superiores a 9 se representarán como letras a-u
, para preservar la longitud de la cadena). Por ejemplo, este es el orden para n = 4
:
1234 [RRR]
2134 [LRR]
3124 [RLR]
3214 [LLR]
4123 [RRL]
4213 [LRL]
4312 [RLL]
4321 [LLL]
En general, hay 2 n-1 antemutaciones de longitud de anexión n
.
No puede usar ninguna función de clasificación incorporada en su idioma en su código. El programa más corto para hacer esto en cualquier idioma gana.
fuente
a-u
. ¿Podemos simplemente generar listas de números?Respuestas:
CJam,
22 20 1917 bytesExpansión de código :
Cómo funciona :
Esta es una versión de depuración del código:
Veamos cómo funciona para la entrada
3
:Pruébalo en línea aquí
fuente
Haskell, 47 bytes
fuente
f n=[[n:x,x++[n]]|x<-f$n-1]>>=id
(utilizando la función concat de golfistas de código>>=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
Pitón 2, 68
Emite una lista de listas de números.
Una solución recursiva. Para
n==1
, salida[[1]]
. De lo contrario, agreguen
al inicio o al final de todas las(n-1)
permutaciones. La preparación previa hace que la permutación sea lexicográfica más tarde que la adición, por lo que las permutaciones permanecen ordenadas.El "booleano"
b
codifica si se debe poner[n]
al principio o al final. En realidad, movemos el resto de la listax
en la expresiónx*b+[n]+x*-b
. Ponerb
como-1
o1
permite usar flip negando, ya que una lista multiplicada por-1
es la lista vacía.fuente
Pyth, 19
Pruébalo en línea aquí
Este es un programa completo que toma información de stdin.
Esto funciona de manera similar a la solución de xnor, pero genera los valores un poco fuera de orden, por lo que deben reordenarse. Lo que sucede en cada nivel es que cada lista de valores anterior tiene el nuevo valor agregado al final y al principio y cada uno está envuelto en una tupla de 2 que está envuelta en una lista. Por ejemplo, el primer paso hace esto:
Luego, esta lista de tuplas se comprime (y luego se suma para eliminar la lista más externa). En el primer caso, esto solo da el valor sin envolver de arriba, ya que solo hay un valor en la lista.
Pasos que muestran 2-> 3:
fuente
Mathematica,
575449 bytesEjemplo:
fuente
J 26 bytes
Mejora de 1 byte gracias a FUZxxl .
fuente
,.
por,"1
un personaje.Pyth
34333129Básicamente una traducción de la respuesta Python de xnor . Todavía no soy bueno con Pyth, así que las sugerencias de mejora son bienvenidas.
Define una función
y
para devolver una lista de listas de enteros.Actualización: Guardado 2 bytes gracias a FryAmTheEggman .
Explicación:
fuente
-b1
puede sertb
,[1_1)
puede ser,1_1
(sin embargo, solo puede soltar el corchete cerrado ya que solo necesita contar los bytes necesarios para realizar la función, aunque no podrá llamarlo sin cerrarlo), y usted no necesitab
ajustarse en una lista, ya que pyth se convierte automáticamente en lista cuando agrega una lista a un int.[1,-1]
. Puedo guardar bytes para codificar algo tan corto, especialmente cuando simplifica la lógica. Me saleL?]]1<b2sCm,+db+bdytb
Pure Bash, 103
Más de lo que esperaba:
fuente
JavaScript (ES6) 73
80Implementación de JavaScript de la buena solución de @ Optimizer.
Recursivo (73):
Iterativo (74):
Prueba en la consola Firefox / FireBug
fuente
Mi solución Java:
fuente
false
por algo como5<4
.