OEIS tiene una variación (A111439) en la secuencia de Golomb . Como en la secuencia de Golomb, A(n)describe con qué frecuencia naparece 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. nestá 1basado 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

Naparece después de la última ocurrencia de laN-1cual 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 15agota el tiempo de espera en TIO.Explicación
Simplemente siguiendo la definición: en cada etapa, elija el número positivo mínimo
nque satisfaga las restricciones (no es igual a la entrada anterior, y aún no ha ocurridof nveces).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
ncomo entrada y devuelve un entero positivo. Construimos la lista completa de los primerosnelementos de esta secuencia, luego tomamos elLastelemento. La lista se construye comenzando con la lista vacía{}y operando con una funciónnveces 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ónxporx+1el tiempo que la condiciónx==Last@#||#~Count~x==#[[x]]se cumple, en otras palabras, si bienxes el elemento anterior, o bienxya está en la lista el número correcto de veces. Esta función escupe algunos errores, ya que (por ejemplo) no deberíamos llamar alxelemento 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
1a al final de la lista si puede; si no, entonces intenta ay2así hasta que se permita algo.Ahora, comenzamos sembrando los resultados para
1,2,3ser1,2,3. Esto se hace para evitar cualquier problema con la lista de los valores calculados ya es demasiado corto-: I conjetura que sines al menos4entoncesa(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án0indexadas 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=1e intentaremos configurars[m]=1. Cuando eso no funciona, vamost=2y 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
nes8así, 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
nmayor 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-2para todoskde4hastan, inclusivo (y suponga quenes 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 quemaparece", 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 alcanzado0tiempos, ya(n-1)no es igual a0comoa(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
Gcuando 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 deGsignificado, 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
-1lugar den-1guardar un byte, supongo que no.