シーケンスにない整数の合計のシーケンス


28

バックグラウンド

次のように定義されたシーケンスを検討してください。

  • 最初の要素は0です。
  • 2番目の要素は4です。
  • 3番目の要素以降、その値は次のように計算できます。
    • 0からシーケンスの前の要素までの整数のセット(包括的または排他的、重要ではありません)を取得します。
    • シーケンスの前の方で既に出現した整数をセットから削除します。
    • セットの残りの要素を一緒に追加します。それがあなたが望む値です。

興味深いことに、このシーケンスはまだOEIS上にないようです。

タスク

入力として整数nを取り、シーケンスのn番目の要素を出力するプログラムまたは関数を作成します。

テストケース

シーケンスの最初のいくつかの要素は次のとおりです。

  • 0
  • 4
  • 6(1 + 2 + 3)
  • 11(1 + 2 + 3 + 5)
  • 45(1 + 2 + 3 + 5 + 7 + 8 + 9 + 10)
  • 969(1 + 2 + 3 + 5 + 7…10 + 12…44)
  • 468930(1 + 2 + 3 + 5 + 7…10 + 12…44 + 46…968)

明確化

  • あなたのプログラムは、無制限に大きな整数を持ち、無制限の量のメモリにアクセスする言語のバリアントで実行される場合、理論的には任意のnを処理できるはずです。(bignumのない言語が468930をはるかに超える可能性は低いですが、答えをハードコーディングすることは言い訳になりません。)
  • シーケンスに対して0ベースまたは1ベースのインデックスを選択できます(たとえば、n = 1が最初の要素を返すか、n = 2が2番目の要素を返すか、n = 0が最初の要素を返すかどうかはユーザー次第です)、n = 1、2番目の要素など)。
  • 使用するアルゴリズムにもその効率にも要件はありません。シーケンスの定義を(実際には非効率的であっても)直接実装できます。また、同じ結果をもたらす別のアルゴリズムを実装することもできます。

勝利条件

これはであるため、バイト単位で測定した最短の正しいプログラムが勝ちます。


1
入力を取得する代わりに、無限の出力を許可しないのはなぜですか?
ジョンドヴォルザーク

2
@JanDvorak:それは、すべてのプログラムがすべての用語を生成するアルゴリズムを使用することを強制するためです。質問を記述するこの方法では、回答者がそれを実行するかどうか、または閉形式の数式を使用するかどうか(答えがある場合)に任せます。したがって、質問を解決するための戦略の選択肢が増えます。

1
0,4は奇妙なオフセットであるので、私は順序がないあると仮定したい
boboquackは

1
@boboquack(0,3)、(0,2)、(1,4)または同様のバリエーションでは、シーケンスは数用語後に一定になります。
デニス

[math]タグはこれに意味がありますか?
mbomb007

回答:


10

ゼリー13 12 9バイト

rSạo4¥ð@¡

0ベースのインデックスを使用します。

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

使い方

rSạo4¥ð@¡  Main link. No arguments. Implicit argument: 0

      ð    Collect everything to the left into a chain and start a new, dyadic one.
           The arity of the first chain is unknown at this point, as it isn't
           prefixed by ø, µ, or ð.
       @   Swap the arguments of the first chain. Swapping  arguments is only
           implemented for dyadic links, so this makes the chain dyadic.
        ¡  Read an integer n from STDIN and execute the chain n times. Taking the
           argument swap into account, the chain is executed first with 0 as left
           and right argument, then with the previous right argument as left
           argument and the previous return value as right argument.
           The return value of the last call is the return value of the quicklink
           and becomes the implicit output.

           Let's call the left argument x and the right argument y.
r            Range; yield [x, ..., y].
 S           Compute the sum of all integers in the range.
     ¥       Convert the two atoms to the left into a dyadic chain, and call that
             chain with arguments x and y.
   o4          Take the logical OR of x and 4, replacing a 0 with 4 and leaving
               positive integers untouched.
  ạ          Take the absolute difference of the sum to the left and the result of
             the logical OR to the right.

10

Python、66 60バイト

6バイトを削る@Dennisに感謝します!

f=lambda n:n>2and(f(n-1)-~f(n-2))*(f(n-1)-f(n-2))/2or(5-n)*n

これはこれまでで最もゴルフのようなコードではありませんが、私が作成した式を使用しています。

ここに画像の説明を入力してください

どこx右側にはあるf(n - 1)、とyありますf(n - 2)

説明:

a〜までのb(連続する)連続整数の合計は、次の式で記述できます。

amount * average

どこでamount(数)は次のように記述されます:

((a - b) - 1)

そしてaverage(すべての数値の平均)は次のように記述されます:

(a + b) / 2

したがって、完全な式は次のとおりです。

  ((a - b) - 1)(a + b) / 2
= (a - b - 1)(a + b) / 2

私たちは、最終的な式には、この式を実装する方法が置換することであるaためf(n - 1)bためf(n - 2)基本的には新しい用語の全ての合計を計算すると、別のものを追加f(n - 1)(今あるaすべての前の項の和である、上)。

それを組み合わせることで、以下が得られます。

  a + ((a - b - 1)(a + b) / 2)
= a + ((a^2 + ab - ab - b^2 - a - b) / 2)
= a + ((a^2 - b^2 - a - b) / 2)
= (a^2 - b^2 - a - b + 2a) / 2
= (a^2 - b^2 + a - b) / 2
= ((a + b)(a - b) + (a - b)) / 2
= (a + b + 1)(a - b) / 2

交換するaxby、そしてプレストねえ、あなたは上記の式に持っています。



9

Mathematica、49 48バイト

±2=4;±1=0;±n_:=Tr@Range@±(n-1)-Tr@Array[±#&,n-1]
(* or *)
±2=4;±1=0;±n_:=-Tr@Array[(k=±#)&,n-1]+Tr@Range@k

CP-1252エンコードを使用します。関数を定義しますPlusMinus (±)。1インデックス付き。

説明

±2=4;±1=0;±n_:=Tr@Range@±(n-1)-Tr@Array[±#&,n-1]

±2=4;±1=0;                                        (* Define ±1 and ±2 *)
          ±n_:=                                   (* ±n equals ... *)
               Tr@Range@±(n-1)                    (* Sum of (1, 2, ..., ±(n-1)) ... *)
                              -Tr@Array[±#&,n-1]  (* Minus the sum of previous terms *)

8

Oasis、11バイト

コード:

+>bc-*2/640


説明:

f nの関係を視覚化するために、例f 5を見てみましょう。f 5を計算するために、次の合計を見てみましょう。

1 + 2 + 3 + 5 + 7 + 8 + 9 + 10

太字の部分はf 4とまったく同じです。7 + 8 + 9 + 10部の範囲である[F N-2 + 1、F N-1 - 1]。これにより、式f n-1 +Σ[f n-2 + 1 ... f n- 1-1 ]Wolframリンク)が作成されます。

f n = 0.5×(f n-1 2 -f n-2 2 + f n-1 -f n-2

次のように書き換えることができます。

f n = 0.5×((f n-1 -f n-2)(f n-1 + f n-2)+(f n-1 -f n-2))

f n = 0.5×((f n-1 -f n-2)(f n-1 + f n-2 + 1))

コードで使用する式は次のとおりです。


コードの説明

この640部分は基本ケースを提供します:

a(0) = 0
a(1) = 4
a(2) = 6

実行されるコード(a(n)を定義します):

+>bc-*2/

+          # Add a(n + 1) and a(n + 2) implicitly
 >         # Add one to get a(n + 1) + a(n + 2) + 1
  b        # Push a(n + 1)
   c       # Push a(n + 2)
    -      # Subtract from each other
     *     # Multiply with the previous result
      2/   # Halve the result

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


3
説明?これにより、他の多くの答えよりも興味がわいてきました。

@ ais523説明を追加しました。
アドナン

5

ジュリア、39 33 32バイト

!n=n<3?5n-n^2:sum(!(n-2)+1:!~-n)

0ベース。

@Dennisのおかげで、6バイト節約できました。

@GlenOのおかげで、1バイト節約できました。

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

前の回答1-ベース:

!n=n<4?2(n>1)n:sum(!(n-2)+1:!~-n)

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

前の未回答1ベース:

f(n)=n<4?n<2?0:n*2:sum(f(n-2)+1:f(n-1))

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


1
余分なバイトを保存するには、ではn<3?5n-n^2:なくn<4?2(n>1)n:-を使用します。ただし、0ベースのインデックス作成の使用に切り替えることに注意してください。
グレンO

@GlenOありがとう、1バイト節約しました!
rahnema1

4

JavaScript(ES6)、47バイト

f=(n,b=4,a=6)=>n?--n?f(n,a,(a+b+1)*(a-b)/2):b:0

f(n) = sum(range(f(n-2) + 1, f(n-1) + 1))n> 2 の再帰関係を使用します。


4

PowerShell84 89 88 87バイト

$OFS='+'
for($a=0,4;$a.Count-le($n="$args")){$a+=("$(1..$a[-1])"|iex)-("$a"|iex)}$a[$n]

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

説明

0ベースのインデックス付け。のみ動作しますn = 6(私のWindowsマシンでは、のスタックオーバーフローでクラッシュしますn = 7)。

JungHwan Minの回答と同じ方法を使用します(範囲の合計から前の用語の合計を引いたもの)。

PowerShellで範囲/配列を合計するのは長いので、配列を結合+して長い式(など1+2+3+4...etc)を作成し、それを送信するiexInvoke-Expression)トリックを使用しています。

使用する代わりに2回行う必要があるため、出力フィールド区切り記号を表す-join特別な変数を設定しています$OFS。配列を文字列化するとき、これは要素の結合に使用される文字です。デフォルトはスペースです。だから、それを設定することにより、+(1回)、私のようなもの置き換えることができます$a-join'+'|iexとし"$a"|iex

単純なforループは、シーケンスカウントが入力整数以下になるまで続き、次に$nth要素を返します。


@AdmBorkBorkとても素敵です!これは明確な答えに値すると思います。この方法は十分に異なるため、使用しても自分の方法のようには感じません。
ブリアンティスト

1
@AdmBorkBork nice、+ 1、そして、私はそれから一つのことを学びました:ループの;後には必要ありませんfor。前に気づいたことはありません。
briantist

3

MATL17 16バイト

OKi:"tP:yX-sv]G)

1ベースのインデックスが使用されます。コードは非常に非効率的です。以下のためにn = 6それすでにオンラインコンパイラのメモリ制限を超えています。

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

使い方

O       % Push 0
K       % Push 4
i       % Input n
:"      % Do the following n times
  t     %   Push a copy of the top array (or number)
  P:    %   Range from 1 to the last element of array
  y     %   Push a copy of the second-top number/array
  X-    %   Set difference
  s     %   Sum
  v     %   Concatenate everything into a column vector
]       % End
G)      % Get n-th entry of the array. Implicity display

以下のために20のバイト、次のバージョンでは、メモリの制限を回避します。ただし、データ型にはまだ制限があります(double型は整数が正確に表現されることのみを保証できるため2^53n = 8。結果は最大で有効です。

OKi:"t0)tQ*2/ys-v]G)

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


2

Haskell、42バイト

f 0=0
f 1=4
f 2=6
f n=sum[1+f(n-2)..f$n-1]

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

これは直接のためのことが再発実装しn>2f(n)等しいf(n-1)プラスから開区間の合計f(n-2)f(n-1)再びから半開区間の和に等しいf(n-2)f(n-1)包括的に。

f(0) = 0
f(1) = 4
f(2) = 6 = 1+2+3
f(3) = 11 = 1+2+3+5 = 6 + 5 = 6 + sum]4,6[ = f(2)+ sum]f(1),f(2)[ = sum]f(1),f(2)]
...
f(n) = sum]f(n-2),f(n-1)] = sum[f(n-2)+1,f(n-1)]

2

Haskell、31バイト

m#s=m:s#sum[m+1..s]
((0:4#6)!!)

使用例:((0:4#6)!!) 6-> 468930オンラインでお試しください!

mこれまでの最大要素と次の値を追跡する単純な再帰s


私は新しい挑戦に来るたびに、誰かがいつも私が今までXD作ることができ、より良いどれよりもHaskellの答えを作られている
theonlygusti

私は常に数学的な挑戦にたどり着き、「やっとhaskellを試すことができるようになった!」CMD-F 'Haskell' –ああ待って、この答え...待って、何?Haskellのを断念
theonlygusti


2

Perl 6の 52の49 44  35バイト

{(|(0,4 X 0),{[+](^.[0])-.[1],.[0]+.[1]}...*)[$_;0]}

それを試してみてください

{(0,(4,0),{[+](^.[0])-.[1],.[0]+.[1]}...*)[$_;0]}

それを試してみてください

{(0,(4,0),{[+](^.[0])-.[1],.sum}...*)[$_;0]}

それを試してみてください

{(0,4,6,{[+] $^a^..$^b}...*)[$_]}

それを試してみてください

拡張:

{ # bare block lambda with implicit parameter 「$_」

  (
    # generate a sequence

    0, 4, 6,      # seed the sequence

    {             # lambda with placeholder parameters 「$a」 「$b」
      [+]         # reduce with 「&infix:<+>」
          $^a     # n-2
          ^..     # Range that excludes the first value
          $^b     # n-1
    }
    ...           # keep generating values until
    *             # never stop

  )[ $_ ]         # get the value that was asked for (0 based index)
}

2

PowerShell77 73バイト

param($n)$a=0,4;1..$n|%{$a+=(0..$a[-1]|?{$_-notin$a})-join'+'|iex};$a[$n]

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

定義されたアルゴリズムを実装し、0インデックスが付けられます。6TIOの入力が多すぎて処理できません。

$a配列に設定します[0,4]1入力から入力までループします$n。ループでは、番号の範囲から0最大の番号までを取り、句を$a[-1]使用して、まだ存在しない番号のみを引き出します。その数の配列はsと一緒にed され、その後に送られます(略してに似ています)。その値は、の最後に配列連結されます。最後に、ループを終了し、配列のth番目の番号を取得します。その数はパイプラインに残り、出力は暗黙的です。Where-Object|?{...}-join+iexInvoke-Expressioneval$a$n



1

バッチ、108バイト

@if %1==0 echo 0&exit/b
@set/ab=4,a=6
@for /l %%i in (2,1,%1)do @set/ac=(a+b+1)*(a-b)/2,b=a,a=c
@echo %b%

JavaScript回答のポート。


1

dc、47バイト

?d1-scd/4*dd[d1+*2/r-dsn+dlnlc1-dsc0<x]sxlc0<xp

コンピュータのメモリ容量まで、必要な大きさの整数で動作します。

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

0ベースのインデックス、stdinでの入力、stdoutでの出力。(stderrにも出力がありますが、これは無視されます。)

サンプルの実行:

$ for ((j=0;j<12;j++)){ echo -n "$j ";dc -f sumseq.dc <<<"$j";echo;} 2>/dev/null
0 0

1 4

2 6

3 11

4 45

5 969

6 468930

7 109947436950

8 6044219445882138462810

9 18266294354989892462984673364511343859409730

10 166828754731567805766174036610844675771635260155825966927845486666328\
837158267993261860

11 139159167026428037700805570917048711514125048327321592278500415852500\
422178720517080334552793040951056255170819719745908378102737875659900\
61575545777065220385544711322919415

これは、bashの次のソリューションと同じアルゴリズムを使用します。

純粋なbash、60バイト

for((n=s=$1?4:0,k=1;k<$1;k++,s+=(n=n++*n/2-s))){ :;}
echo $n

しかし、bashプログラムは、それを超える整数オーバーフローにヒットするため、7までの入力に対してのみ機能します。



0

C#-74バイト

int A(int f){int e=4,i=1,s=0;for(;i++<f;)e=e*-~e/2-(s+=e);return f>0?e:0;}

ゴルフをしていない:

int A(int f)
{
    int e = 4, 
        i = 1, 
        s = 0; // e is the last element, s is the sum of all previous elements
    for (; i++ < f; ) // calculate for indexes 1 through max (don't need the index, just a correct number of loop cycles)
        e = e * -~e / 2 - (s += e); // -~e => (e + 1), higher precedence to remove parentheses
    return f > 0 ? e : 0; //handle input 0 as a special case, which is 0
}

これをラムダに変換してさらに節約するか、または.Aggregate関数を使用して何かを保存する方法がおそらくあります。現在、私は輸入品を持っていませんが、多分それは平等ですか?


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