A sequência de números segmentados ou números primos de medição ( OEIS A002048 ) é a sequência de números, de modo que cada membro é o menor número positivo (maior que zero) que não pode ser feito da soma dos números consecutivos anteriores a(0) = 1
.
Exemplo
Para calcular a(7)
, primeiro calculamos a(0->6) = [1, 2, 4, 5, 8, 10, 14]
. começamos do zero e examinamos os números até encontrarmos um que não seja a soma de um ou mais números consecutivos na sequência.
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 = ????
Como quinze não podem ser feitos somando qualquer subsequência consecutiva e cada número menor pode ser quinze é o próximo número na sequência. a(7) = 15
Tarefa
Sua tarefa é pegar um número (por meio de métodos padrão) e gerar o enésimo termo nesta sequência (por meio de métodos de saída padrão). Isso é código-golfe e você será pontuado como tal.
Casos de teste
0 -> 1
1 -> 2
2 -> 4
3 -> 5
4 -> 8
5 -> 10
6 -> 14
7 -> 15
8 -> 16
9 -> 21
()
para torná-la uma função adequada. A parcial aplicada!!
é uma seção do operador e deve ser incluída()
para torná-la uma função. Sem ele, é apenas um trecho que só se torna uma função (ou "valor" para usar termos estritos de Haskell) com o argumento ausente.filter(`notElem`scanl(+)x z)y
deveria fazer.Perl,
5049 bytesInclui +1 para
-p
Execute com entrada no STDIN:
segmented.pl
:Explicação
@F
contém a lista de somas (negativas) de números consecutivos que terminam com o último número atual. Quando um novo número é descoberto, a lista é estendida com 0 e todos os valores são diminuídos pelo novo número, mantendo a invariante.Global
%::
é usado como um hash mapeando todos os números (negativos) que foram vistos (através@F
) para um valor diferente de zero.$\
é o número atual e é aumentado até atingir um valor ainda não inserido%::
.Por ter um pouco de cuidado com a ordem em que tudo acontece, nenhuma inicialização é necessária,
1
automaticamente se tornará o primeiro número.Como o tamanho de
@F
é quantos números foram gerados, ele pode ser usado como uma condição de paradafonte
05AB1E ,
1716 bytesExplicação
Experimente online!
Guardado 1 byte graças a Adnan
fonte
$
vez deXs
trabalhar?Geléia ,
141311 bytesExperimente online!
Como funciona
fonte
Pitão -
1917 bytesMaldito seja, alguém estragando todos os meus implícitos. (O mesmo bytes contar, literalmente incrementando
Q
:=hQesmaYf!}TsM.:Y
)Conjunto de Teste .
fonte
eu+Gf!}TsM.:G))hQY
Javascript,
125112110 bytesGuardado 2 bytes graças a @Neil
Respostas anteriores
112 bytes graças a @Neil:
125 bytes:
fonte
b.every(c=>c-i)
, eu tentaria!b.includes(i)
ou possivelmente!a.some(b=>b.includes(i))
funciona, enquanto[0,...a[k]||[]].map(v=>i+v)
pode substituir[i].concat((a[k]||[]).map(v=>i+v))
. Também precisa mesmok
?if(!...){...}
é apenas uma declaração, você provavelmente poderá substituí-la por...||(...)
ou...?0:...
.Python,
1131059280 bytesOs bytes finais que salvei foram inspirados na resposta de Ton Perl: o meu
F
faz a mesma coisa que o dele@F
; o meus
faz essencialmente a mesma coisa que o dele%::
.fonte
JavaScript (ES6), 77 bytes
Basicamente, uma porta recursiva do algoritmo da resposta Perl do @ TonHospel.
fonte