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
1
a3x
, dondex
es el número deseado de términos de secuencia de Kimberling.En cada paso,
n
,TakeDrop
rompe el la lista actual en una lista delante de2n+1
té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.r
esRiffle
'd con el reverso det
y luego se agrega la lista posterior.z
se elimina y se agrega a (AppendTo
) la secuencia creciente de Kimberling.n
se incrementa en1
y 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+1
todas partes y expandiendo las expresiones:Luego, volvió a escribir
b<2*a-1
como-~b<2*a
para guardar un byte de espacio en blanco, y se trasladó al+1
en la selección, la división por 2, y la negación:Entonces,
-b-1
es justo~b
, para que podamos escribir(b,~b)[b%2]
. Esto es equivalente ab^0 if b%2 else b^-1
usar 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
.W
al golf de 4 bytes:VQ+.W<hHyN-~tN/x%Z_2Z2hNN
..W
tiene la forma:.W<condition><apply><start-value>
. Usé el valor inicialhN
, como lo hiciste enKhN
..W
cambia 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éK
conZ
, porque la<apply>
declaración es una función lambda con parámetroZ
. Podemos ignorar el=K
,.W
maneja esto. Reemplaza el valor anterior con el calculado. Al final imprimir+...N
APL,
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ónf
y una entradax
,f⍨x
es 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
f
a cada número entero desde 1 hasta la entrada, produciendo una matriz.¡Guardado 12 bytes gracias a Dennis!
fuente