OEIS tiene una variación (A111439) en la secuencia de Golomb . Como en la secuencia de Golomb, A(n)
describe con qué frecuencia n
aparece en la secuencia. Pero además, no hay dos números consecutivos pueden ser idénticos. Al construir la secuencia, A(n)
siempre se elige como el entero positivo más pequeño que no viola estas dos propiedades. Debido a números idénticos consecutivos no permitidos, la serie se tambalea ligeramente hacia arriba y hacia abajo a medida que crece. Aquí están los primeros 100 términos:
1, 2, 3, 2, 3, 4, 3, 4, 5, 6, 5, 6, 5, 6, 7, 6, 7, 8, 7, 8, 9, 8, 9, 8, 9,
10, 9, 10, 9, 10, 11, 10, 11, 10, 11, 10, 11, 12, 11, 12, 13, 12, 13, 12,
13, 12, 13, 12, 13, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 16, 15,
16, 17, 16, 17, 16, 17, 16, 17, 16, 17, 18, 17, 18, 17, 18, 19, 18, 19, 18,
19, 18, 19, 18, 19, 18, 19, 20, 19, 20, 21, 20, 21, 20, 21, 20, 21, 20
La lista completa de los primeros 10,000 números se puede encontrar en OEIS .
El desafío es escribir un programa o función que compute A(n)
, dado n
. n
está 1
basado para garantizar que la propiedad autodescriptiva funcione.
Reglas
Puede escribir un programa o una función y utilizar cualquiera de nuestros métodos estándar para recibir entradas y proporcionar salidas.
Puede usar cualquier lenguaje de programación , pero tenga en cuenta que estas lagunas están prohibidas de forma predeterminada.
Este es el código de golf , por lo que gana la respuesta válida más corta, medida en bytes .
Casos de prueba
n A(n)
1 1
4 2
10 6
26 10
100 20
1000 86
1257 100
10000 358
N
aparece después de la última ocurrencia de laN-1
cual mide el número de bamboleosN
).Respuestas:
Haskell , 67 bytes
Define una función
f
. Pruébalo en línea! Es muy lento, la informáticaf 15
agota el tiempo de espera en TIO.Explicación
Simplemente siguiendo la definición: en cada etapa, elija el número positivo mínimo
n
que satisfaga las restricciones (no es igual a la entrada anterior, y aún no ha ocurridof n
veces).fuente
Mathematica,
6968 bytes¡Gracias a Martin Ender por encontrar un –1 byte extra para mí!
Función sin nombre que toma un entero positivo
n
como entrada y devuelve un entero positivo. Construimos la lista completa de los primerosn
elementos de esta secuencia, luego tomamos elLast
elemento. La lista se construye comenzando con la lista vacía{}
y operando con una funciónn
veces en una fila (víaNest
).La función en cuestión es
{##&@@#,1//.x_/;x==Last@#||#~Count~x==#[[x]]->x+1}&
, que toma una lista parcial de valores de secuencia (esencialmente##&@@#
) y le agrega el siguiente valor. El siguiente valor se calcula a partir dex=1
, a continuación, varias veces la sustituciónx
porx+1
el tiempo que la condiciónx==Last@#||#~Count~x==#[[x]]
se cumple, en otras palabras, si bienx
es el elemento anterior, o bienx
ya está en la lista el número correcto de veces. Esta función escupe algunos errores, ya que (por ejemplo) no deberíamos llamar alx
elemento th de la lista inicial{}
; sin embargo, los valores son todos correctos.fuente
Python 2,
9986 bytes¡Gracias a @Dennis por varias mejoras por un total de 13 bytes!
El programa funciona de manera bastante ingenua: realiza un seguimiento de la lista de valores que se determinó hasta ahora y busca agregar el siguiente valor. Intenta agregar
1
a al final de la lista si puede; si no, entonces intenta ay2
así hasta que se permita algo.Ahora, comenzamos sembrando los resultados para
1,2,3
ser1,2,3
. Esto se hace para evitar cualquier problema con la lista de los valores calculados ya es demasiado corto-: I conjetura que sin
es al menos4
entoncesa(n)
es estrictamente menor quen
. (En este programa,s[n]
es igual aa(n)
. Nuestra lista en realidad se inicializa[0,1,2,3]
porque las listas están0
indexadas en Python. Entonces, por ejemploa(1)=s[1]=1
, ya(2)=s[2]=2
).Entonces, digamos que estamos tratando de determinar
s[m]
, lo que significa que nuestra lista ya incluyes[0], s[1], ..., s[m-1]
. Comenzaremos ent=1
e intentaremos configurars[m]=1
. Cuando eso no funciona, vamost=2
y tratamos de configurars[m]=2
. Cada vez que incrementamost
, verificamos sis.count(t)==s[t]
... pero el lado derecho no producirá un error siempre y cuando nunca tengamos que llegar tan altot=m
. La conjetura dice que nunca tenemos que hacerlo, ya que el primer valor que calculamos es en realidads[4]
.Esta implementación calcula 3 valores más de la secuencia de los que necesita. Por ejemplo, si
n
es8
así, calcularás[11]
antes de devolver el valor des[8]
.Me alegraría ver una prueba de la conjetura. Creo que se puede probar por inducción (¿fuerte?).
Editar: Aquí hay una prueba de la conjetura . De hecho, demostramos una forma ligeramente más fuerte de la declaración, ya que no implica trabajo adicional.
Teorema: para todo
n
mayor o igual que4
, el términoa(n)
es menor o igual que(n-2)
.Prueba (por Inducción Fuerte): (Base
n=4
): La afirmación es verdadera paran=4
, desde entoncesa(4) = 2 = 4-2
.Ahora suponga que
a(k)
es menor o igual quek-2
para todosk
de4
hastan
, inclusivo (y suponga quen
es al menos4
). En particular, esto significa que todos los términos anteriores de la secuencia eran como máximo(n-2)
. Necesitamos demostrar quea(n+1)
será como mucho(n-1)
. Ahora, por definición,a(n)
es el entero positivo más pequeño que no viola ninguna de las condiciones, por lo que solo debemos mostrar que el valor(n-1)
no violará ninguna de las condiciones.El valor
(n-1)
no violará la condición de "no repeticiones consecutivas", porque según la hipótesis de inducción, la entrada anterior era como máximo(n-2)
. Y no violará la condición "a(m)
es el número de veces quem
aparece", a menos que(n-1)
ya se haya alcanzadoa(n-1)
veces. Pero por la fuerte suposición de inducción,(n-1)
anteriormente se había alcanzado0
tiempos, ya(n-1)
no es igual a0
comoa(m)
es positivo para todosm
.Por
a(n+1)
lo tanto, es menor o igual quen-1 = (n+1)-2
, según se desee. QEDfuente
Jalea , 17 bytes
Los últimos tres casos de prueba son demasiado para TIO. He verificado 1000 y 1257 localmente.
Pruébalo en línea! o verificar los primeros 100 términos .
Cómo funciona
fuente
Python 2 ,
7774 bytesEsta es una implementación recursiva del algoritmo de @ mathmandan .
La implementación es O (demente) : la entrada 9 tarda 2 segundos localmente, la entrada 10 52 segundos y la entrada 11 17 minutos y 28 segundos. Sin embargo, si se declara como una función regular en lugar de una lambda, la memorización se puede utilizar para verificar los casos de prueba.
Pruébalo en línea!
Tenga en cuenta que incluso con memoization, TIO no puede cómputo f (1257) o F (10,000) (ambos verifican localmente).
fuente
05AB1E ,
3231 bytesPruébalo en línea!
Explicación
Técnicamente estamos en bucle
G
cuando agregamos N a la lista global, pero todos los bucles en 05AB1E usan la misma variable N como índice, por lo que el bucle interno[...]
ha sobrescrito el N deG
significado, podemos agregarlo fuera del bucle.Los problemas con bucles anidados y condicionales nos impiden hacer esto dentro del bucle.
fuente
Befunge,
141136 bytesPruébalo en línea!
Debido a las limitaciones de memoria de Befunge, no es realmente práctico realizar un seguimiento de todas las entradas de entradas anteriores en la secuencia, por lo que esta solución utiliza un algoritmo con una huella de memoria más baja que calcula los valores más directamente.
Dicho esto, todavía estamos limitados por el tamaño de la celda, que en el intérprete de referencia Befunge-93 es un valor de 8 bits con signo, por lo que el número par más alto admitido en la secuencia es
A(1876) = 126
, y el número impar más alto esA(1915) = 127
.Si desea probar valores más grandes, deberá usar un intérprete con un tamaño de celda más grande. Eso debería incluir la mayoría de las implementaciones de Befunge-98 (¡ Pruébelo en línea! ).
fuente
Python 2, 117 bytes
Meh No es tan corto. La solución iterativa simple.
Pruébalo en línea
Aquí hay un intento realmente malo de una solución recursiva (129 bytes):
fuente
-1
lugar den-1
guardar un byte, supongo que no.