La secuencia de números segmentados o números primos de medición ( OEIS A002048 ) es la secuencia de números de manera que cada miembro es el número positivo más pequeño (mayor que cero) que no se puede hacer de una suma de números consecutivos anteriores, con a(0) = 1
.
Ejemplo
Para calcular a(7)
primero calculamos a(0->6) = [1, 2, 4, 5, 8, 10, 14]
. entonces comenzamos desde cero y pasamos por los números hasta encontrar uno que no es la suma de uno o más números consecutivos en la secuencia.
1 = 1
2 = 2
3 = 1 + 2
4 = 4
5 = 5
6 = 2 + 4
7 = 1 + 2 + 4
8 = 8
9 = 4 + 5
10 = 10
11 = 2 + 4 + 5
12 = 1 + 2 + 4 + 5
13 = 5 + 8
14 = 14
15 = ????
Dado que no se pueden hacer quince sumando ninguna subsecuencia consecutiva y cada número más pequeño puede ser quince es el siguiente número en la secuencia. a(7) = 15
Tarea
Su tarea es tomar un número (a través de métodos estándar) y generar el enésimo término en esta secuencia (a través de métodos de salida estándar). Este es el código de golf y se le puntuará como tal.
Casos de prueba
0 -> 1
1 -> 2
2 -> 4
3 -> 5
4 -> 8
5 -> 10
6 -> 14
7 -> 15
8 -> 16
9 -> 21
()
para que sea una función adecuada. El parcial aplicado!!
es una sección del operador y debe encerrarse()
para que sea una función. Sin él, es solo un fragmento que solo se convierte en una función (o "valor" para usar términos estrictos de Haskell) con el argumento que falta.filter(`notElem`scanl(+)x z)y
debería hacer.Perl,
5049 bytesIncluye +1 para
-p
Ejecutar con entrada en STDIN:
segmented.pl
:Explicación
@F
contiene la lista de sumas (negativas) de números consecutivos que terminan con el último número actual. Cuando se descubre un nuevo número, la lista se extiende con 0 y luego todos los valores se reducen por el nuevo número que mantiene el invariante.Global
%::
se utiliza como un hash que asigna todos los números (negativos) que se han visto (hasta@F
) a un valor distinto de cero.$\
es el número actual y se incrementa hasta que alcanza un valor que aún no está en%::
.Al tener un poco de cuidado con el orden en que sucede todo, no se necesita inicialización,
1
se convertirá automáticamente en el primer número.Dado que el tamaño de
@F
cuántos números se han generado, se puede usar como una condición de detenciónfuente
05AB1E ,
1716 bytesExplicación
Pruébalo en línea!
Guardado 1 byte gracias a Adnan
fuente
$
lugar deXs
trabajar?Jalea ,
141311 bytesPruébalo en línea!
Cómo funciona
fuente
Pyth -
1917 bytesMaldita sea, arruinando todas mis implicidades. (El mismo número de bytes, literalmente incrementándose
Q
:=hQesmaYf!}TsM.:Y
)Banco de pruebas .
fuente
eu+Gf!}TsM.:G))hQY
Javascript,
125112110 bytesGuardado 2 bytes gracias a @Neil
Respuestas anteriores
112 bytes gracias a @Neil:
125 bytes:
fuente
b.every(c=>c-i)
, lo intentaría!b.includes(i)
o posiblemente!a.some(b=>b.includes(i))
funcione, mientras que[0,...a[k]||[]].map(v=>i+v)
podría reemplazarlo[i].concat((a[k]||[]).map(v=>i+v))
. ¿También realmente necesitask
?if(!...){...}
es solo una declaración, probablemente podría reemplazarla con...||(...)
o...?0:...
.Python,
1131059280 bytesLos bytes finales que guardé se inspiraron en la respuesta de Perl de Ton: mi
F
hace lo mismo que el suyo@F
; mis
hace esencialmente lo mismo que el suyo%::
.fuente
JavaScript (ES6), 77 bytes
Básicamente, un puerto recursivo del algoritmo de la respuesta Perl de @ TonHospel.
fuente