シルベスターの配列


32

シルベスターのシーケンスOEIS A000058は、次のように定義された整数シーケンスです。

各メンバーは、以前のすべてのメンバーに1を加えたものです。シーケンスの最初のメンバーは2です。

仕事

nを取り、Sylvesterのシーケンスのn番目の項を計算する可能な最小のプログラムを作成します。標準の入力、出力、抜け穴が適用されます。結果は非常に急速に成長するため、選択した言語で結果がオーバーフローを引き起こすような用語を取ることは期待されていません。

テストケース

ゼロまたは1つのインデックスを使用できます。(ここではゼロインデックスを使用しています)

>>0
2
>>1
3
>>2
7
>>3
43
>>4
1807

どの入力が処理されると予想されますか?出力は非常に急速に増加します。
ジオビット

1
@Geobitsは、あなたはあなたの言語缶限りハンドルに期待されている
小麦ウィザード

インデックス付けされたときにシーケンスnnth番号を返す配列は受け入れられますか?
user6245072

@ user6245072いいえ、独自のアレイにインデックスを付ける必要はありません
ウィートウィザード

回答:


26

Brain-Flak76 68 58 52 46バイト

<>(()())<>{({}[()])<>({({}[()])({})}{}())<>}<>

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

代わりにこの関係を使用します。

式

これは、シーケンスで提供される関係から変更されたこの関係から派生します。

a(n+1) = a(n) * (a(n) - 1) + 1

説明

各コマンドの機能のドキュメントについては、GitHubページをご覧ください

Brain-Flakには2つのスタックがあり、それぞれStack 1とStack 2と名付けます。

入力はスタック1に保存されます。

<>(()())<>             Store 2 in Stack 2.

{                      while(Stack_1 != 0){
  ({}[()])                 Stack_1 <- Stack_1 - 1;
  <>                       Switch stack.
  ({({}[()])({})}{}())     Generate the next number in Stack 2.
  <>                       Switch back to Stack 1.
}

<>                     Switch to Stack 2, implicitly print.

生成アルゴリズムの場合:

({({}[()])({})}{}())      Top <- (Top + Top + (Top-1) + (Top-1) + ... + 0) + 1

(                  )      Push the sum of the numbers evaluated in the process:

 {            }               while(Top != 0){
  ({}[()])                        Pop Top, push Top-1    (added to sum)
          ({})                    Pop again, push again  (added to sum)
                              }

               {}             Top of stack is now zero, pop it.
                 ()           Evaluates to 1 (added to sum).

代替の46バイトバージョン

これは1つのスタックのみを使用します。

({}<(()())>){({}<({({}[()])({})}{}())>[()])}{}

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


1
わずか10もっと脳フラックに行くべきそのJava develeporsを表示するためにバイト
ロハンJhunjhunwala

1
@RohanJhunjhunwala私は...不可能だと怖い
漏れ修道女

@LeakyNunそれはまだ考えるのが面白いです。脳の高射砲は、いくつかのパワーを持ち、かつ簡潔な驚くべきである
ロハンJhunjhunwala

5
1スタックバージョンもスタッククリーンです。これは、brain-flakのコードモジュールの重要なポイントになる傾向があります。
小麦ウィザード

ワオ。これは非常に印象的な答えです。
DJMcMayhem

12

ゼリー、5 バイト

Ḷ߀P‘

これは、0ベースのインデックス付けとチャレンジ仕様の定義を使用します。

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

Ḷ߀P‘  Main link. Argument: n

Ḷ      Unlength; yield [0, ..., n - 1].
 ߀    Recursively apply the main link to each integer in that range.
   P   Take the product. This yields 1 for an empty range.
    ‘  Increment.

ああ、私は空の製品が1であることを忘れてしまった
漏れ修道女

12

六角形、27バイト

1{?)=}&~".>")!@(</=+={"/>}*

展開:

    1 { ? )
   = } & ~ "
  . > " ) ! @
 ( < / = + = {
  " / > } * .
   . . . . .
    . . . .

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

説明

シーケンスb(a) = a(n) - 1を検討して、少し並べ替えてみましょう。

b(a) = a(n) - 1
     = a(n-1)*(a(n-1)-1) + 1 - 1
     = (b(n-1) + 1)*(b(n-1) + 1 - 1)
     = (b(n-1) + 1)*b(n-1)
     = b(n-1)^2 + b(n-1)

このシーケンスは非常に似ていますが、増分を最後まで延期することができます。これにより、このプログラムでバイトが保存されます。

注釈付きのソースコードは次のとおりです。

ここに画像の説明を入力してください
TimwiのHexagonyColorerで作成されました。

そして、これはメモリダイアグラムです(赤い三角形はメモリポインタの初期位置と方向を示しています)。

ここに画像の説明を入力してください
TimwiのEsotericIDEで作成。

コードは、左隅を囲む灰色のパスから始まるため、最初の線形ビットは次のようになります。

1{?)(
1      Set edge b(1) to 1.
 {     Move MP to edge N.
  ?    Read input into edge N.
   )(  Increment, decrement (no-op).

次に、コード<はブランチにヒットし、メインループの開始(および終了)を示します。Nエッジに正の値がある限り、緑のパスが実行されます。そのパスはグリッドを数回ラップしますが、実際には完全に線形です:

""~&}=.*}=+={....(

.ノーオペレーションではないので、実際のコードです。

""~&}=*}=+={(
""             Move the MP to edge "copy".
  ~            Negate. This is to ensure that the value is negative so that &...
   &           ...copies the left-hand neighbour, i.e. b(i).
    }=         Move the MP to edge b(i)^2 and turn it around.
      *        Multiply the two copies of b(i) to compute b(i)^2.
       }=      Move the MP back to edge b(i) and turn it around.
         +     Add the values in edges "copy" and b(i)^2 to compute
               b(i) + b(i)^2 = b(i+1).
          ={   Turn the memory pointer around and move to edge N.
            (  Decrement.

このデクリメントがに減少Nする0と、赤いパスが実行されます。

")!@
"     Move MP back to edge b(i) (which now holds b(N)).
 )    Increment to get a(N).
  !   Print as integer.
   @  Terminate the program.

これでブルートフォーサーを実行できますか?
電卓

@CalculatorFelineブルートフォーサーは、妥当な時間内に最大で7バイトのプログラムを実行できます(多くの前提条件がある場合でも)。私はこれが7バイトでリモートで可能だとは思わない。
マーティンエンダー

そう?試行することの何が問題になっていますか?
電卓

@CalculatorFeline怠azine。ブルートフォーサーは、手動で微調整する必要がありますが、実際に何かが見つかる可能性はほとんどありません。一部のバージョンのスクリプトはGitHubにありますが、だれでも自由に試してみることができます。
マーティンエンダー

そして、どうすればそれができますか?
電卓

9

J、18 14 12バイト

randomraに感謝します。後で詳細な説明を書きます。

0&(]*:-<:)2:

J、14バイト

このバージョンはマイルのおかげです。^:以下のように、議題の代わりにパワー副詞を使用しました。今後の説明。

2(]*:-<:)^:[~]

J、18バイト

2:`(1+*/@$:@i.)@.*

0インデックス。

   e =: 2:`(1+*/@$:@i.)@.*
   e 1
3
   e 2
7
   e 3
43
   e 4
1807
   x: e i. 10
2 3 7 43 1807 3263443 10650056950807 113423713055421862298779648 12864938683278674737956996400574416174101565840293888 1655066473245199944217466828172807675196959605278049661438916426914992848    91480678309535880456026315554816
   |: ,: x: e i. 10
                                                                                                        2
                                                                                                        3
                                                                                                        7
                                                                                                       43
                                                                                                     1807
                                                                                                  3263443
                                                                                           10650056950807
                                                                              113423713055421862298779648
                                                    12864938683278674737956996400574416174101565840293888
165506647324519994421746682817280767519695960527804966143891642691499284891480678309535880456026315554816

説明

これは次のような議題です。

           ┌─ 2:
           │    ┌─ 1
       ┌───┤    ├─ +
       │   └────┤           ┌─ / ─── *
── @. ─┤        │     ┌─ @ ─┴─ $:
       │        └─ @ ─┴─ i.
       └─ *

(9!:7)'┌┬┐├┼┤└┴┘│─'then を使用して生成5!:4<'e'

分解:

       ┌─ ...
       │
── @. ─┤
       │
       └─ *

上のブランチを動名詞として使用し、下のブランチをGセレクターとして使用するとF、次のようになります。

e n     <=>     ((F n) { G) n

これは、の2:場合0 = * n、つまり符号がゼロ(つまりnゼロ)の場合に定数関数を使用します。それ以外の場合、このフォークを使用します。

  ┌─ 1
  ├─ +
──┤           ┌─ / ─── *
  │     ┌─ @ ─┴─ $:
  └─ @ ─┴─ i.

これは、シリーズに加えて次の1つです。

            ┌─ / ─── *
      ┌─ @ ─┴─ $:
── @ ─┴─ i.

さらに分解すると、これは範囲()*/にわたる自己参照($:)に対する積(i.)です。


2
また2(]*:-<:)^:[~]、式a(0) = 2とを使用して、パワー副詞を使用して14バイトを取得することもできますa(n+1) = a(n)^2 - (a(n) - 1)。より大きな値を計算するに2は、開始時に拡張整数としてマークする必要があります。
マイル

どちらのソリューションも非常に優れています。私はv`$:@.u再帰形式に気付いていなかったと思います。私はいつも^:vより複雑なフォーマットを常に使用していました。@miles私も(]v)トリックを使ったことはありません。理解するのに5分かかりました。
ランダラ

1
完全を期すために、3種類目のループ(マイルの方法を使用した14バイト):(2(]*:-<:)~&0~]または2:0&(]*:-<:)~])。そしてそれらを13バイト 組み合わせます]0&(]*:-<:)2:
ランダラ

12バイト:0&(]*:-<:)2:。(申し訳ありません、コメントでゴルフをするべきではありません。)
randomra

@randomraこれは、ボンドの本当にきちんとした使用法です。通常、中央の動詞は3つの引数を受け取っていると思うので、何が起こったのかを正確に知るためにページを読む必要がありました。
マイル

9

Perl 6、24バイト

{(2,{1+[*] @_}...*)[$_]}
{(2,{1+.²-$_}...*)[$_]}

説明

# bare block with implicit parameter 「$_」
{
  (
    # You can replace 2 with 1 here
    # so that it uses 1 based indexing
    # rather than 0 based
    2,

    # bare block with implicit parameter 「@_」
    {
      1 +

      # reduce the input of this inner block with 「&infix:<*>」
      # ( the input is all of them generated when using a slurpy @ var )
      [*] @_

      # that is the same as:
      # 「@_.reduce: &infix:<*>」
    }

    # keep calling that to generate more values until:
    ...

    # forever
    *

  # get the value as indexed by the input
  )[ $_ ]
}

使用法:

my &code = {(2,{1+[*] @_}...*)[$_]}

say code 0; # 2
say code 1; # 3
say code 2; # 7
say code 3; # 43
say code 4; # 1807

# you can even give it a range
say code 4..7;
# (1807 3263443 10650056950807 113423713055421844361000443)

say code 8;
# 12864938683278671740537145998360961546653259485195807
say code 9;
# 165506647324519964198468195444439180017513152706377497841851388766535868639572406808911988131737645185443
say code 10;
# 27392450308603031423410234291674686281194364367580914627947367941608692026226993634332118404582438634929548737283992369758487974306317730580753883429460344956410077034761330476016739454649828385541500213920807

my $start = now;
# how many digits are there in the 20th value
say chars code 20;
# 213441

my $finish = now;
# how long did it take to generate the values up to 20
say $finish - $start, ' seconds';
# 49.7069076 seconds

$_?を含む配列スライス これは何の魔法ですか?
ザイド

8

Haskell、26バイト

f n|n<1=2|m<-f$n-1=1+m*m-m

使用例:f 4-> 1807


7

Java 7、46 42バイト

int f(int n){return--n<0?2:f(n)*~-f(n)+1;}

通常の式で0インデックスを使用します。ただし、Javaには便利なパワーオペレータがなく、呼び出しが長くなっていたn*n-nためn*(n-1)、私は交換しましたf()


3
f(n)*~-f(n)動作するはずです。
デニス

1
毎回そのトリックを忘れるにはどうすればよいですか?これがヒントページにない場合は、そうなることは間違いありません。
ジオビット

2
return--n<0もう1バイト節約します。
デニス





5

Brain-Flak158 154バイト

リーキー修道女は私がここで打つ

({}<(()())>){({}[()]<<>(())<>([]){{}<>({}<<>(({}<>))><>)<>({<({}[()])><>({})<>}{})<>{}([])}{}<>({}())([]){{}({}<>)<>([])}{}<>>)}{}([][()]){{}{}([][()])}{} 

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

説明

入力a(0)の下に2を入れます

({}<(()())>) 

入力がゼロよりも大きい間、入力から1を減算して...

{
({}[()]

黙って...

<

1つを他のスタックに配置して、乗算の触媒として機能する<>(())<>

スタックが空でない間

 ([])
 {
  {}

リストの一番上に移動してコピーします

  <>({}<<>(({}<>))><>)

コピーに触媒を掛ける

  <>({<({}[()])><>({})<>}{})<>{}
  ([])
 }
 {}

ひとつ追加

 <>({}())

シーケンスを適切なスタックに戻す

 ([])
 {
 {}
 ({}<>)<>
 ([])
 }
 {}
 <>
>)
}{}

一番下の項目(つまり、最後に作成された番号)を除くすべてを削除します

([][()])
{
{}
{}
([][()])
}
{}

5

C、32バイト

f(n){return--n?f(n)*~-f(n)+1:2;}

1ベースのインデックスを使用します。Ideoneでテストします。



5

R、44 42 41バイト

JDLのおかげで2バイト節約

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

f=function(n)ifelse(n,(a=f(n-1))^2-a+1,2)

1
問題のステートメントからは明らかではありnませんが、負でないことが保証されている限り、条件をn>0からjustに減らすことができますn
JDL

@JDLいいね​​!ありがとう!
マミー

f(n-1)6バイトです。バイトを何かに割り当てることで保存すると思います。すなわちifelse(n,(a=f(n-1))^2-a+1,2)
-user5957401

5

Oasis、4バイト(非競合)

おそらく私のゴルフ家族からの最後の言語です!言語が課題をポストデートするため、競合しません。

コード:

²->2

Zweiのおかげで代替ソリューション:

<*>2

拡張バージョン:

a(n) = ²->
a(0) = 2

説明:

²    # Stack is empty, so calculate a(n - 1) ** 2.
 -   # Subtract, arity 2, so use a(n - 1).
  >  # Increment by 1.

CP-1252エンコードを使用します。オンラインでお試しください!


最後のゴルフ言語?もう作るつもりはない?D:
コナーオブライエン

@ ConorO'Brienおそらく、私は今アイデアを失っています:(
Adnan

この挑戦を見る前に、私が持ってb<*>2使用してa(n-1)*(a(n-1)+1)-1
ツヴァイ

@Zweiとてもすてき!b(入力ではなく)自動的に入力されるため、実際には省略できます:)。
アドナン

1
うん、投稿後に気付いた。シーケンス用に設計されているにもかかわらず、この言語がこのためにどのように機能するかに驚く。
ツヴァイ

3

Python、38 36バイト

Dennisのおかげで2バイト。

f=lambda n:0**n*2or~-f(n-1)*f(n-1)+1

できた!

代わりに、シーケンスで提供される関係から変更されたこの関係を使用します。

a(n+1) = a(n) * (a(n) - 1) + 1

説明

0**n*2戻っ2たときn=00そうでない場合は、理由が0**0あると定義される1Pythonで。







2

ゼリー、7バイト

²_’
2Ç¡

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

代わりに、シーケンスで提供されるこの関係を使用します。 a(n+1) = a(n)^2 - a(n) + 1

説明

2Ç¡   Main chain, argument in input

2     Start with 2
  ¡   Repeat as many times as the input:
 Ç        the helper link.


²_’   Helper link, argument: z
²     z²
  ’   z - 1
 _    subtraction, yielding z² - (z-1) = z² - z + 1

2

C、46バイト

s(n,p,r){for(p=r=2;n-->0;p*=r)r=p+1;return r;}

できた!

用途 p製品の一時保管場所としてします。

基本的に、2つのシーケンスp(n)とを定義しましたr(n)。ここでr(n)=p(n-1)+1p(n)=p(n-1)*r(n)。です。

r(n) 必須のシーケンスです。


1
ここでPythonの答えと同じ関係を使用していない理由は何ですか?それはもっと短いはずです
デニス

@Dennisこれはもっと面白いです。
リーキー修道女

@デニスそして、この答えは移植
リーキー修道女

2

R、50 46 44バイト

    n=scan();v=2;if(n)for(i in 1:n){v=v^2-v+1};v

シーケンス全体を追跡するのではなく、n> 1 n> 0である限り、指定された2次更新規則に従う積を追跡するだけです。(このシーケンスは、「1から開始」を使用します大会ゼロ」)

if(n> 1)ではなくif(n)を使用できるため、ゼロから開始する規則を使用すると、数バイト節約できます。


2

クラゲ、13バイト

p
\Ai
&(*
><2

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

説明

下から始めましょう:

(*
<

これは、関数を定義するフックf(x) = (x-1)*xです。

&(*
><

これは、前のフックをインクリメント関数で構成し、関数を提供しますg(x) = (x-1)*x+1

\Ai
&(*
><

最後に、これhg、整数入力で指定された回数だけ、前の関数の反復である関数を生成します。

\Ai
&(*
><2

そして最後に、この反復を初期値に適用します2p上部には、単に結果を出力します。

代替(同じく13バイト)

p
>
\Ai
(*
>1

これにより、増分が最後まで延期されます。


2

C、4334、33のバイト

1インデックス付き:

F(n){return--n?n=F(n),n*n-n+1:2;}

メインテスト:

int main() {
  printf("%d\n", F(1));
  printf("%d\n", F(2));
  printf("%d\n", F(3));
  printf("%d\n", F(4));
  printf("%d\n", F(5));
}




1

実際には14 12バイト

これは0インデックスを使用しました。ゴルフの提案を歓迎します。オンラインでお試しください!

2#,`;πu@o`nF

アンゴルフ:

2#              Start with [2]
  ,`     `n     Take 0-indexed input and run function (input) times
    ;           Duplicate list
     πu         Take product of list and increment
       @o       Swap and append result to the beginning of the list
           F    Return the first item of the resulting list

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