Secuencias
Se le da cuatro secuencias de números, numerados 1
a través 4
.
OEIS La ubicación de
0
's cuando los números naturales se enumeran en binario. Aquí hay un ejemplo de cómo calcular la secuencia:0,1,10,11,100,101,110,111 ^ ^ ^^ ^ ^ 0 3 78 10 14
El inicio de la secuencia es así:
0, 3, 7, 8, 10, 14, 19, 20, 21, 23, 24, 27, 29, 31, 36, 37, 40, 45, 51, ...
OEIS Esta secuencia incluye el primer número natural, omite los siguientes dos, luego incluye los siguientes tres, luego omite los siguientes cuatro y continúa.
0, 3, 4, 5, 10, 11, 12, 13, 14, 21, 22, 23, 24, 25, 26, 27, 36, ...
OEIS Enteros positivos donde tanto el número de
0
's como el número de1
' s en la representación binaria del número son potencias de2
.2, 4, 5, 6, 9, 10, 12, 16, 23, 27, 29, 30, 33, 34, 36, 39,
OEIS La secuencia Q de Hofstadter .
a (1) = a (2) = 1;
a (n) = a (na (n-1)) + a (na (n-2)) para n> 2.1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 6, 8, 8, 8, 10, 9, 10, 11, 11, 12, 12, 12, 12, 16, 14, ...
Poco se demuestra rigurosamente acerca de esta secuencia, pero existen muchos resultados empíricos. Uno es particularmente importante, y puede suponer que es válido para toda la serie:
Este artículo observó que los elementos de la serie se pueden agrupar en generaciones. Si los numeramos comenzando en 1, entonces la generación k contiene exactamente 2 k elementos. La propiedad relevante es que todos los números de la generación k se obtienen sumando dos números de las generaciones k-1 y / o k-2 , pero nunca de generaciones anteriores. Puede usar esta observación (y solo esta) para poner un límite inferior en los elementos restantes de la secuencia.
Desafío
Su desafío es imprimir los primeros x
números en la intersección de las secuencias de entrada dadas.
Entrada: dos números separados por un espacio en STDIN
. El primer número es un número entero de 1
al 15
incluido donde cada bit corresponde a una secuencia. El bit más bajo corresponde a la secuencia 1
y el más alto corresponde a la secuencia 4
. El segundo es la cantidad de números x
,, para generar STDIN
.
Salida: los primeros x
números que se cruzan con las secuencias de entrada dadas. Imprima los números STDOUT
con cualquier espacio en blanco o puntuación clara como delimitador (espacios, tabulaciones, líneas nuevas, comas, dos puntos, puntos, etc.).
Ejemplos
1. Imprima los primeros 3
números que están en cada secuencia.
Entrada: 15 3
Salida: 10,23,40
2. Imprima los primeros 12
números en el número de secuencias 1
y 4
.
Entrada: 9 12
Salida: 3,8,10,14,19,20,21,23,24,31,37,40
3. Imprima los primeros 10
números en secuencia 2
.
Entrada: 2 10
Salida: 0,3,4,5,10,11,12,13,14,21
4. Imprima los primeros 6
números en secuencias 3
y 4
.
Entrada: 12 6
Salida: 2,4,5,6,9,10
Detalles
- Puede imprimir la salida a medida que avanza o todo de una vez al final.
¡Muchas gracias a todos los que ayudaron con esto en el chat! Esta pregunta se benefició enormemente de estar en la caja de arena .
fuente
12 5
ejemplo hasta el mismo índice, entonces10
sí aparece antes9
en la intersección ... como, ¿cómo, al pasar por las secuencias, decidirías omitir el9
número 3 como una posible intersección? Como si el # 3 tuviera7
, entonces se le requeriría que lo omita ya que eso no aparece en el # 4x
?Respuestas:
Haskell,
495442402Se desempeña razonablemente bien. Aquí hay un par de ejemplos de OP:
fuente
Python 3,
590639 caracteresEsta es la solución directa: use generadores para definir cada una de las secuencias infinitas, y siempre que la intersección no sea lo suficientemente grande, agregue un paso a cada secuencia.
Para tener en cuenta la secuencia de Hofstadter que no aumenta monotónicamente: en cada paso genero el doble para esa secuencia, por ejemplo, 1, luego 2, 4, 8, 16, 32, etc. Creo que satisface el límite establecido en la pregunta , y todavía es lo suficientemente rápido para todos los casos de prueba presentados allí.
fuente
from itertools import count as C
->from itertools import*
C=count
,def s(i):return D(i)==1
->s=lambda i:D(i)==1
(ni siquiera creo que esta función lo haga más corto ...),"{0:04b}".format(int(L)))if U>'0'
->"{0:04b}".format(int(L)))if'0'<U
C #, 1923
Probablemente no sea el programa más corto, pero el desafío me pareció interesante, así que aquí está mi solución.
Ejecutar los 4 con 35 Números (15 35) lleva unos 5 segundos.
Puede probarlo aquí , pero tenga en cuenta que si desea OEIS4, la cantidad de dígitos que desea debe ser pequeña o netfiddle se queda sin memoria.
Golfed
Legible
Explicación
Esto hace uso de Bigtime de evaluación perezosa, lo que hace que sea bastante rápido. También fui flojo haciendo cualquier "bitlogic" usando el método Convert.ToString (número, 2) de frameworks. Esto convierte cualquier número en su representación binray como una cadena.
Tuve que escribir mi propio método para intersecar las secuencias, ya que la intersección del método Linq calcula la intersección de la secuencia completa, y eso era literalmente imposible.
fuente