La séquence de nombres segmentés ou nombres premiers de mesure ( OEIS A002048 ) est la séquence de nombres telle que chaque membre est le plus petit nombre positif (supérieur à zéro) qui ne peut pas être composé d'une somme de nombres consécutifs antérieurs, avec a(0) = 1
.
Exemple
Pour calculer, a(7)
nous calculons d'abord a(0->6) = [1, 2, 4, 5, 8, 10, 14]
. nous partons ensuite de zéro et parcourons les nombres jusqu'à ce que nous trouvions celui qui n'est pas la somme d'un ou plusieurs nombres consécutifs dans la séquence.
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 = ????
Puisque quinze ne peut pas être fait en additionnant une sous-séquence consécutive et chaque nombre plus petit peut être quinze est le nombre suivant dans la séquence. a(7) = 15
Tâche
Votre tâche consiste à prendre un nombre (via les méthodes standard) et à sortir le nième terme dans cette séquence (via les méthodes de sortie standard). C'est du golf de code et vous serez noté comme tel.
Cas de test
0 -> 1
1 -> 2
2 -> 4
3 -> 5
4 -> 8
5 -> 10
6 -> 14
7 -> 15
8 -> 16
9 -> 21
()
pour en faire une fonction appropriée. Le partiel appliqué!!
est une section opérateur et doit être inclus()
pour en faire une fonction. Sans cela, c'est juste un extrait qui ne devient qu'une fonction (ou "valeur" pour utiliser des termes Haskell stricts) avec l'argument manquant.filter(`notElem`scanl(+)x z)y
devrait faire.Perl,
5049 octetsComprend +1 pour
-p
Exécuter avec entrée sur STDIN:
segmented.pl
:Explication
@F
contient la liste des sommes (négatives) de nombres consécutifs qui se terminent par le dernier nombre actuel. Lorsqu'un nouveau nombre est découvert, la liste est étendue avec 0, puis toutes les valeurs sont diminuées par le nouveau nombre maintenant l'invariant.Global
%::
est utilisé comme un hachage mappant tous les nombres (négatifs) qui ont été vus (à travers@F
) à une valeur non nulle.$\
est le nombre actuel et est augmenté jusqu'à ce qu'il atteigne une valeur qui n'est pas encore entrée%::
.En faisant un peu attention à l'ordre dans lequel tout se passe, aucune initialisation n'est nécessaire,
1
deviendra automatiquement le premier numéro.Puisque la taille de
@F
est le nombre de nombres générés, elle peut être utilisée comme condition d'arrêtla source
05AB1E ,
1716 octetsExplication
Essayez-le en ligne!
1 octet enregistré grâce à Adnan
la source
$
lieu deXs
travailler?Gelée ,
141311 octetsEssayez-le en ligne!
Comment ça fonctionne
la source
Pyth -
1917 octetsMerde par un qui ruine tous mes implicits. (Octets même chef d' accusation, literaly incrémenter
Q
:=hQesmaYf!}TsM.:Y
)Suite de tests .
la source
eu+Gf!}TsM.:G))hQY
Javascript,
125112110 octetsSauvegardé 2 octets grâce à @Neil
Réponses précédentes
112 octets grâce à @Neil:
125 octets:
la source
b.every(c=>c-i)
, j'essaierais!b.includes(i)
ou peut-être!a.some(b=>b.includes(i))
travailler, alors que[0,...a[k]||[]].map(v=>i+v)
pourrait remplacer[i].concat((a[k]||[]).map(v=>i+v))
. De plus, avez-vous vraiment besoink
?if(!...){...}
n’êtes qu’une seule instruction, vous pouvez probablement la remplacer par...||(...)
ou...?0:...
.Python,
1131059280 octetsLes derniers octets que j'ai enregistrés ont été inspirés par la réponse Perl de Ton: mon
F
fait la même chose que la sienne@F
; mons
fait essentiellement la même chose que la sienne%::
.la source
JavaScript (ES6), 77 octets
Fondamentalement, un port récursif de l'algorithme de la réponse Perl de @ TonHospel.
la source