セグメント番号


15

セグメント化された数のシーケンスまたは測定の素数(OEIS A002048)は、各メンバーがで、以前の連続した数の合計で作成できない最小の正の(ゼロより大きい)数であるような数のシーケンスですa(0) = 1

計算するにa(7)は、最初にを計算しa(0->6) = [1, 2, 4, 5, 8, 10, 14]ます。次に、ゼロから開始し、シーケンス内の1つ以上の連続した数字の合計ではない数字が見つかるまで数字を調べます。

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 = ????

連続するサブシーケンスを合計することで15を作成することはできず、シーケンス内の次の番号は15より小さい番号になる可能性があるためです。 a(7) = 15

仕事

あなたの仕事は、(標準的な方法を介して)数を取得し、(標準的な出力方法を介して)このシーケンスのn番目の用語を出力することです。これはコードゴルフであり、そのように得点されます。

テストケース

0 -> 1
1 -> 2
2 -> 4
3 -> 5
4 -> 8
5 -> 10
6 -> 14
7 -> 15
8 -> 16
9 -> 21

回答:


12

Haskell、62 58バイト

@xnorのおかげで-4バイト!

(x:y)#z=x:filter(`notElem`scanl(+)x z)y#(x:z)
([1..]#[]!!)

シーケンスのインデックスは0です。


1
()適切な機能を実現するには、さらに2バイト必要で、最後の行を囲む必要があると思います。部分的に適用されるの!!は演算子セクションであり()、関数にするために囲まなければなりません。それなしでは、欠落した引数を持つ関数(または厳密なHaskellの用語を使用するための「値」)になるだけのスニペットです。
nimi

1
美しい方法!ただし、インポートはやり過ぎのようです。filter(`notElem`scanl(+)x z)yする必要があります。
-xnor

7

Perl、50 49バイト

+1を含む -p

STDINの入力で実行:

segmented.pl <<< 7

segmented.pl

#!/usr/bin/perl -p
${$_-=$\}++for@F;1while${-++$\};++$#F<$_&&redo}{

説明

@F現在の最後の数字で終わる連続した数字の(負の)合計のリストが含まれます。新しい番号が検出されると、リストは0で拡張され、すべての値は不変量を維持したまま新しい番号によって減少します。

グローバル%::@F、ゼロとして認識されたすべての(負の)数値をゼロ以外の値にマッピングするハッシュとして使用されます。

$\は現在の数であり、まだになっていない値に達するまで増加し%::ます。

すべてが発生する順序に少し注意を払うことで、初期化は不要に1なり、自動的に最初の番号になります。

のサイズは@F生成された数であるため、停止条件として使用できます


4

05AB1E17 16 バイト

Xˆ$µ>D¯ŒOså_i¼Dˆ

説明

Xˆ                # initialize global array to [1]
  $               # push 1 and input to stack
   µ              # while counter != input
    >             # increase variable on stack
      ¯ŒO         # list of all sums of consecutive number in global array
     D   så_i     # if current stack value is not in the list
             ¼    # increase counter
              Dˆ  # add current stack value to global array

オンラインでお試しください!

Adnanのおかげで1バイト節約


$の代わりにXs動作しますか?
アドナン

@アドナン:もちろん。私の愚かな。ありがとう!
エミグナ

4

ゼリー14 13 11 バイト

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ

オンラインでお試しください!

使い方

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ  Main link. Argument: n

Ḷ            Unlength; yield [0, ..., n - 1].
 ߀          Recursively map the main link over the range.
   Ẇ         Window; yield all subarrays of consecutive elements of the result.
    ;        Append n to the array of subarrays.
     ḅ1      Convert all subarrays from base 1 to integer.
             This is equivalent to S€ (sum each), but it allows ; to hook.
         $   Combine the previous two links into a monadic chain.
       ‘       Increment all sums.
        ḟ      Filter; remove the original sums from the incremented ones.
          Ṃ  Compute the minimum.

2

Pyth- 19 17バイト

私のすべての暗黙を台無しにした人 (同じバイトはliteralyインクリメント、カウントQ=hQesmaYf!}TsM.:Y

esmaYf!}TsM.:Y)1h

テストスイート


reduceを使用すると、1バイトのみが保存されます。さらに期待される...eu+Gf!}TsM.:G))hQY
ジャクベ

1
@Jakubeマップは通常、次のような自己参照シーケンスでは短くなります
-Maltysen

2

Javascript、125 112 110バイト

@Neilのおかげで2バイト節約

f=n=>{a=[[]];for(i=1,z=0;z<=n;i++)a.some(b=>b.includes(i))||(a[z+1]=[0,...a[z++]||[]].map(v=>i+v));alert(i-1)}

以前の回答

@Neilのおかげで112バイト:

f=n=>{a=[[]];for(i=1,z=0;z<=n;i++)if(!a.some(b=>b.includes(i))){a[z+1]=[0,...a[z++]||[]].map(v=>i+v)}alert(i-1)}

125バイト:

f=n=>{a=[[]];for(i=1,k=z=0;z<=n;i++)if(a.every(b=>b.every(c=>c-i))){a[i]=[i].concat((a[k]||[]).map(v=>i+v));k=i,z++}alert(k)}

1
のためにb.every(c=>c-i)、私はしようとする!b.includes(i)か、おそらく!a.some(b=>b.includes(i))動作します[0,...a[k]||[]].map(v=>i+v)が、代わりになるかもしれません[i].concat((a[k]||[]).map(v=>i+v))。また、本当に必要kですか?
ニール

1
これでif(!...){...}ステートメントは1つだけになったので、おそらく...||(...)orに置き換えることができます...?0:...
ニール

1

Python、113 105 92 80バイト

s=F={1}
x=1
exec"while{x}<=s:x+=1\nF={x+j for j in{0}|F};s|=F\n"*input()
print x

私が保存した最後のバイトは、TonのPerlの答えに触発さFれました@F。私sは基本的に彼と同じことをし%::ます。


1

JavaScript(ES6)、77バイト

(n,a=[],s=a,i=1)=>s[i]?f(n,a,s,i+1):--n?f(n,[0,...a].map(j=>s[j+=i]=j),s,i):i

基本的に、@ TonHospelのPerl回答のアルゴリズムの再帰ポートです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.