Introducción
Por supuesto, tenemos muchos desafíos de secuencia , así que aquí hay otro.
La secuencia de Kimberling ( A007063 ) es la siguiente:
1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28, 22, ...
Esto se produce barajando la iteración normal:
[1] 2 3 4 5 6 7 8
El primer término de la secuencia es 1. Después de eso, reorganizamos la secuencia hasta que se usen todos los términos de la izquierda. La mezcla tiene el patrón right - left - right - left - .... Como no hay términos a la izquierda del 1, no hay barajado. Obtenemos lo siguiente:
2 [3] 4 5 6 7 8 9
En el i ª iteración, descartamos la i º elemento y ponerlo en nuestra secuencia. Esta es la segunda iteración, por lo que descartamos el segundo elemento. La secuencia se convierte en: 1, 3. Para nuestra próxima iteración, vamos a barajar la iteración actual con el patrón anterior. Tomamos el primer elemento que no utilice a la derecha de la i º artículo. Esto pasa a ser 4. Agregaremos esto a nuestra nueva iteración:
4
Ahora vamos a dar el primer elemento que no utilice a la izquierda del i ésimo elemento. Esto es 2. Agregaremos esto a nuestra nueva iteración:
4 2
Dado que no existen elementos que quedan en la parte izquierda de la i º artículo, voy a anexar el resto de la secuencia de la nueva iteración:
4 2 [5] 6 7 8 9 10 11 ...
Esta es nuestra tercera iteración, por lo que descartaremos el tercer elemento, que es 5. Este es el tercer elemento de nuestra secuencia:
1, 3, 5
Para obtener la siguiente iteración, simplemente repita el proceso. He hecho un gif si no está claro:
El gif me llevó más tiempo que escribir la publicación real
Tarea
- Dado un número entero no negativo n , genera los primeros n términos de la secuencia
- Puede proporcionar una función o un programa
- Este es el código de golf , por lo que gana el envío con la menor cantidad de bytes.
Casos de prueba:
Input: 4
Output: 1, 3, 5, 4
Input: 8
Output: 1, 3, 5, 4, 10, 7, 15, 8
Input: 15
Output: 1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28
Nota: Las comas en la salida no son necesarias. Puede, por ejemplo, usar nuevas líneas o generar una lista, etc.


Respuestas:
Pyth, 22 bytes
Pruébelo en línea: demostración
Simplemente realiza la técnica de barajado descrita en el OP.
Explicación:
fuente
Julia,
7871 bytesEsta es una función sin nombre que acepta un entero y devuelve una matriz de enteros. Para llamarlo, asígnelo a una variable.
El enfoque aquí es el mismo que el descrito en OEIS.
Sin golf:
¡Guardado 7 bytes gracias a Mauris!
fuente
Mathematica 130 bytes
Comenzamos con una lista que consiste en el rango de
1a3x, dondexes el número deseado de términos de secuencia de Kimberling.En cada paso,
n,TakeDroprompe el la lista actual en una lista delante de2n+1términos (donde se realiza el trabajo) y la lista trasero (que será más tarde se unió a la lista de reelaborado frontal). La lista frontal coincide con el siguiente patrón,{t___,z,r___}donde z es el término de Kimberling en el centro de la lista frontal.resRiffle'd con el reverso dety luego se agrega la lista posterior.zse elimina y se agrega a (AppendTo) la secuencia creciente de Kimberling.nse incrementa en1y la lista actual es procesada por la misma función a través deNest.Ejemplo
fuente
Python 2, 76 bytes
Explicación
¡Esta es la fórmula OEIS después de muchas transformaciones de golf! Funcionó maravillosamente . El código original era
Primero lo eliminé
i, reemplazándolo pora+1todas partes y expandiendo las expresiones:Luego, volvió a escribir
b<2*a-1como-~b<2*apara guardar un byte de espacio en blanco, y se trasladó al+1en la selección, la división por 2, y la negación:Entonces,
-b-1es justo~b, para que podamos escribir(b,~b)[b%2]. Esto es equivalente ab^0 if b%2 else b^-1usar el operador XOR, o alternativamenteb^b%-2.fuente
Pyth,
2925 bytesJakube guardó 4 bytes, pero ya no tengo idea de cómo leer el código.
Aquí está la vieja solución:
Traducción de mi respuesta de Python. No soy muy bueno en Pyth, así que tal vez todavía hay formas de acortar esto.
fuente
.Wal golf de 4 bytes:VQ+.W<hHyN-~tN/x%Z_2Z2hNN..Wtiene la forma:.W<condition><apply><start-value>. Usé el valor inicialhN, como lo hiciste enKhN..Wcambia este valor siempre que<condition>sea verdadero. Usé la misma condición que tú<hHyN. La condición es una función lambda con el parámetroH, por lo que el valor actual (en su códigoK) esH. Y también utilicé la misma<apply>declaración que usted, solo reemplacéKconZ, porque la<apply>declaración es una función lambda con parámetroZ. Podemos ignorar el=K,.Wmaneja esto. Reemplaza el valor anterior con el calculado. Al final imprimir+...NAPL,
5644 bytesEste es un tren monádico sin nombre que acepta un número entero a la derecha y devuelve una matriz. Es aproximadamente el mismo enfoque que mi respuesta de Julia .
La función más interna es una función diádica recursiva que devuelve el n º plazo en la secuencia Kimberling, dada n como izquierda idénticos y argumentos adecuados.
Con eso en la mano, podemos obtener términos individuales de la secuencia. Sin embargo, el problema se convierte en que esta es una función diádica , lo que significa que requiere argumentos en ambos lados. Ingrese el
⍨operador! Dada una funciónfy una entradax,f⍨xes lo mismo quex f x. Entonces, en nuestro caso, refiriéndonos a la función mencionada anteriormentef, podemos construir el siguiente tren monádico:Aplicamos
fa cada número entero desde 1 hasta la entrada, produciendo una matriz.¡Guardado 12 bytes gracias a Dennis!
fuente