忍耐、若い「パドバン」


44

誰もがフィボナッチ数列を知っています:
あなたは正方形を取り、それに等しい正方形を付け、そして辺の長さが結果の長方形の最大の辺の長さに等しい正方形を繰り返し付けます。
結果は、数字のシーケンスがフィボナッチ数列である美しい正方形のらせんです:

しかし、正方形を使用したくない場合はどうなりますか?

正方形の代わりに正三角形を同様の方法で使用すると、等しく美しい三角形のらせんと新しいシーケンス:Padovanシーケンス、別名A000931が得られます。

仕事:

正の整数、出力、シーケンスの番目の項、または最初の項を指定します。NaNNN

シーケンスの最初の3つの項はすべてであると仮定します。したがって、シーケンスは次のように開始されます: 1

1,1,1,2,2,3,...

入力:

  • 正の整数N0

  • 無効な入力を考慮する必要はありません

出力:

  • Padovanシーケンスの番目の用語、または Padovanシーケンスの最初の用語。NNN

  • 最初の用語が出力される場合、出力は便利なものであれば何でもかまいません(リスト/配列、複数行の文字列など)N

  • いずれかになります -indexedまたは -indexed01

テストケース:
(0インデックス、番目の用語)N

Input | Output
--------------
0     | 1
1     | 1
2     | 1
4     | 2
6     | 4
14    | 37
20    | 200
33    | 7739

(1から始まる、最初の項)N

Input | Output
--------------
1     | 1
3     | 1,1,1
4     | 1,1,1,2
7     | 1,1,1,2,2,3,4
10    | 1,1,1,2,2,3,4,5,7,9
12    | 1,1,1,2,2,3,4,5,7,9,12,16

ルール:


2
14(0-indexed)は出力として表示され28ますが、結果が得られるはずです37
ジョナサンアラン

@JonathanAllanはい、あなたは正しいです。番目の用語の最後の2つのテストケースを修正しましたが、それは修正しませんでした。投稿が編集されました。N
タウ

@LuisMendo私はそう信じています。投稿を編集します。
タウ

1
@sharurフィボナッチ数列のこの定義は、視覚的な定義です。追加された連続する各正方形には、シーケンス内のその用語の長さがあります。あなたが記述するシーケンスは、その背後にある数値的推論です。両方のシーケンスは、他と同様に機能します。
タウ

1
リンクしたOEISシーケンスはを使用するため、わずかに異なることに注意してくださいa_0=1, a_1=0, a_2=0。その後ので、ビットシフトされてしまうa_5=a_6=a_7=1
Carmeister

回答:


59

ゼリー、10バイト

9s3’Ẓæ*³FṀ

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

1インデックス付き。次の最大要素を計算し: ここで、バイナリ行列は次のように便利に計算されます:

[001101010]n
[isprime(0)isprime(1)isprime(2)isprime(3)isprime(4)isprime(5)isprime(6)isprime(7)isprime(8)]

(これは完全な偶然です。)

9s3         [[1,2,3],[4,5,6],[7,8,9]]    9 split 3
   ’        [[0,1,2],[3,4,5],[6,7,8]]    decrease
    Ẓ       [[0,0,1],[1,0,1],[0,1,0]]    isprime
     æ*³    [[0,0,1],[1,0,1],[0,1,0]]^n  matrix power by input
        FṀ                               flatten, maximum

33
これは明らかに何らかのブードゥー教です
Pureferret

7
これは公開されるべきです。
YSC

6
@YSCそれはすでに公開されているA000931。プライムのトリックを推測することはありませんでした:)
flawr

1
...「誰かがこの1バイトを2バイトゴルフできない限り」を作ります:)(今は9バイトあります
ジョナサンアラン

1
私はここでとてつもなく小さな答えを見るのに慣れているので、「Jelly」の後のコンマが実際にこの問題のコードであると思いました
Tasos Papastylianou


26

ゼリー 10 9  8 バイト

ŻṚm2Jc$S

を生成する単項リンク受け入れn(0インデックス)P(n)

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

どうやって?

実装P(n)=i=0n2(i+1n2i)

ŻṚm2Jc$S - Link: integer, n       e.g. 20
Ż        - zero range                  [0, 1, 2, 3, 4, ..., 19, 20]
 Ṛ       - reverse                     [20, 19, ..., 4, 3, 2, 1, 0]
  m2     - modulo-slice with 2         [20, 18, 16, 14, 12, 10,  8,  6,  4,  2,  0]  <- n-2i
      $  - last two links as a monad:
    J    -   range of length           [ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]  <- i+1
     c   -   left-choose-right         [ 0,  0,  0,  0,  0,  0,  0, 28,126, 45,  1]
       S - sum                         200

そして、ここに「twofer」があり
ます。これも8バイトに対してまったく異なる方法です(これは1インデックスですが、はるかに遅いです)。

3ḊṗRẎ§ċ‘ - Link: n
3Ḋ       - 3 dequeued = [2,3]
   R     - range = [1,2,3,...,n]
  ṗ      -   Cartesian power         [[[2],[3]],[[2,2],[2,3],[3,2],[3,3]],[[2,2,2],...],...]
    Ẏ    - tighten                   [[2],[3],[2,2],[2,3],[3,2],[3,3],[2,2,2],...]
     §   - sums                      [ 2,  3,   4,    5,    5,    6,     6,...]
       ‘ - increment                 n+1
      ċ  - count occurrences         P(n)

18

Haskell、26バイト

(l!!)
l=1:1:1:2:scanl(+)2l

オンラインでお試しください!インデックスがゼロのn番目の用語を出力します。

以下の「明白な」再帰的解決策は無敵だと思っていましたが、それを見つけました。これl=1:scanl(+)1lは無限フィボナッチリストの古典的なゴルフ表現に似ていますが、ここでは隣接する要素の違いは4ポジション前の用語です。より直接書くことができますl=1:1:zipWith(+)l(0:l)が、それは長くなります。

このチャレンジで無限リスト出力が許可された場合、最初の行をカットして20バイトにすることができます。

27バイト

f n|n<3=1|1>0=f(n-2)+f(n-3)

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




6

オクターブ / MATLAB、35 33バイト

@(n)[1 filter(1,'cbaa'-98,2:n<5)]

最初のn項を出力します。

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

使い方

再帰的フィルターを実装する匿名関数。

'cbaa'-98は生成する短い形式[1 0 -1 -1]です。

2:n<5[1 1 1 0 0 ··· 0]n -1項)を生成する短い形式です。

filter(1,[1 0 -1 -1],[1 1 1 0 0 ··· 0])[1 1 1 0 0 ··· 0]分子係数1と分母係数をもつ伝達関数で定義された離散時間フィルターに入力を渡します[1 0 -1 -1]


6

J、22バイト

ngnとGalenのおかげで-2バイト

閉じた形式、26バイト

0.5<.@+1.04535%~1.32472^<:

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

反復、22バイト

(],1#._2 _3{ ::1])^:[#

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


1
別の24バイトソリューション(退屈):(1#.2 3 $:@-〜]) `1:@。(3&>)オンラインで試してみてください!
ガレンイワノフ


@GalenIvanov tyvm、それは素晴らしいトリックです。
ヨナ

2
1:-> 1。どうやら、右、上の名詞で「有害」な作品
NGN

@ngn TIL ... ty再び!
ジョナ

5

網膜47 42バイト

K`0¶1¶0
"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*
6,G`

オンラインでお試しください!最初のn用語を別々の行に出力します。説明:

K`0¶1¶0

入力を-2-1およびの用語に置き換えます0

"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*

n再帰関係を使用して次の用語を生成します。*_ここに短いため$&*_ながら、単項に一致(第1)番号を変換する$1*短いため$1*_れる単項に中間数を変換します。$.(戻ってその単項引数の小数の合計は、最初と中間の数の和、すなわち。

6,G`

最初の6文字、つまり最初の3行を破棄します。


5

Cubix、20バイト

これは0のインデックスが付けられ、N番目の項を出力します

;@UOI010+p?/sqq;W.\(

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

辺の長さが2の立方体にラップします

    ; @
    U O
I 0 1 0 + p ? /
s q q ; W . \ (
    . .
    . .

実行を見る

  • I010 -スタックを開始します
  • +p? -スタックの上部を追加し、スタックの下部からカウンターを引き出してテストします
  • /;UO@ -カウンターが0の場合、上面に反映し、TOS、uターン、出力、停止を削除します
  • \(sqq;W -カウンターが正の場合、反映、カウンターのデクリメント、TOSの交換、上から下への2回のプッシュ、TOSの削除、レーンのメインループへのシフト。


4

Perl 6、24バイト

{(1,1,1,*+*+!*...*)[$_]}

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

式によって生成される新しい各要素を含む、かなり標準的な生成されたシーケンス* + * + !*。これにより、3番目の前の要素、2番目の前の要素、および常にFalseゼロである前の要素の論理否定が追加されます。


このコミュニティWikiはなぜですか?
ジョーキング

@JoKingは私を打ちます。どうにかしてやったら、それは意図的ではなかった。
ショーン

4

05AB1E、8バイト

1Ð)λ£₂₃+

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

私と一緒に耐えて、私はしばらくゴルフをしていません。1Ð)この場合に機能するより短い代替品があるのだろうか(試しましたが1D)3Å1などですが、バイトを節約するものはありません)。シーケンスの最初の項を出力します。または、がなければ、シーケンスの項の無限ストリームを出力します。n£

どうやって?

1Ð)λ£₂₃+ | Full program.
1Ð)      | Initialize the stack with [1, 1, 1].
   λ     | Begin the recursive generation of a list: Starting from some base case,
         | this command generates an infinite list with the pattern function given.
    £    | Flag for λ. Instead of outputting an infinite stream, only print the first n.
     ₂₃+ | Add a(n-2) and a(n-3).

1Ð)2バイトになることはないと思います。6バイトの異なる3バイトの選択肢を考えることができますが、2 バイトはありません。
ケビンクルーッセン

4

APL(Dyalog Unicode)20 18 17 バイトSBCS

このコードは1インデックスです。n最後のいくつかの余分なメンバーを削除する必要があるため、Padovanシーケンスのアイテムを取得するのと同じバイト数です。また、0インデックスを取得するのと同じバイト数です。

編集: ngnのおかげで-2バイト。ngnのおかげで-1バイト

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

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

説明

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

  ⍺(. . . .)⍣⎕⍵   This format simply takes the input ⎕ and applies the function
                   inside the brackets (...) to its operands (here marked ⍵ and ⍺).
  2(. . .+/)⍣⎕×⍳3  In this case, our ⍵, the left argument, is the array 1 1 1,
                   where we save our results as the function is repeatedly applied
                   and our ⍺, 2, is our right argument and is immediately applied to +/,
                   so that we have 2+/ which will return the pairwise sums of our array.
       2⌷          We take the second pairwise sum, f(n-2) + f(n-3)
    ⊢,⍨            And add it to the head of our array.
4⌷                 When we've finished adding Padovan numbers to the end of our list,
                   the n-th Padovan number (1-indexed) is the 4th member of that list,
                   and so, we implicitly return that.

4

K(ngn / k)24 20バイト

ngnのおかげで-4バイト!

{$[x<3;1;+/o'x-2 3]}

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

0から始まる、最初のN項


1
f[x-2]+f[x-3]-> +/o'x-2 3oは「
繰り返し

@ngnありがとう!私はJで(成功せずに)試しました。ここはエレガントです。
ガレンイワノフ

@ngn実際、これはJでどのように見えるかを示しています:(1#.2 3 $:@-〜]) `1:@。(3&>)
Galen Ivanov

ああ、正しい、base-1デコードは列車に優しい合計方法です:)
ngn

2
1:- > #J溶液中
NGN

4

x86 32ビットマシンコード、17バイト

53 33 db f7 e3 43 83 c1 04 03 d8 93 92 e2 fa 5b c3

分解:

00CE1250 53                   push        ebx  
00CE1251 33 DB                xor         ebx,ebx  
00CE1253 F7 E3                mul         eax,ebx  
00CE1255 43                   inc         ebx  
00CE1256 83 C1 04             add         ecx,4  
00CE1259 03 D8                add         ebx,eax  
00CE125B 93                   xchg        eax,ebx  
00CE125C 92                   xchg        eax,edx  
00CE125D E2 FA                loop        myloop (0CE1259h)  
00CE125F 5B                   pop         ebx  
00CE1260 C3                   ret

インデックスは0です。初期化は、eax * 0を計算することで簡単に実現できます。128ビットの結果は0であり、edx:eaxに入ります。

各反復の開始時、レジスタの順序はebx、eax、edxです。xchg eax命令のエンコードを利用するには、正しい順序を選択する必要がありました-1バイト。

コンベンションにeax関数の戻り値を保持する出力を到達させるために、ループカウンターに4を追加する必要がありましたfastcall

保存と復元を必要としない他の呼び出し規約を使用できますebxが、fastcallとにかく楽しいです:)


2
PP&CGでマシンコードの回答を見るのが大好きです!+1
タウ


3

Lua 5.3、49 48バイト

function f(n)return n<4 and 1or f(n-2)+f(n-3)end

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

Vanilla Luaには、文字列へのブール値の強制がないため(tonumber(true)戻り値であってもnil)、疑似三項演算子を使用する必要があります。このバージョンは、すべてのLuaのように1からインデックス付けされています。Lua 5.1では、この1or部分を変更する必要があり1 orます。これは、数値の字句解析の方法が異なります。



3

JavaScript(ES6)、23バイト

a(0)=a(1)=a(2)=1

N

f=n=>n<3||f(n-2)+f(n-3)

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


出力の残りが数値である場合、true返すことは返すことと同じであると言うのは合理的ではないと思い1ます。
Nit


あなたにはいくつかの要件が欠けていると思います:私の修正(Javaのバージョン)を見てください
シャック

@Shaqチャレンジは、シーケンスの最初の3つの用語がすべて1であることを明確に指定します。したがって、A000931で定義されているシーケンスではありません(ただし、式は同じです)。
アーナルド

@Arnauldうん、今それを見ることができます。ごめんなさい!
シャック


2

TI-BASIC(TI-84)、34バイト

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1

N

入力はですAns
出力は入力されAns、自動的に印刷されます。

十分な時間が経過したことに加えて、複数の回答が投稿されたため、この回答よりも多くの回答が出されたと考えました。

例:

0
               0
prgmCDGFD
               1
9
               9
prgmCDGFD
               9
16
              16
prgmCDGFD
              65

説明:

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1      ;full program (example input: 6)

[[0,1,0][0,0,1][1,1,0]]                     ;generate the following matrix:
                                            ; [0 1 0]
                                            ; [0 0 1]
                                            ; [1 1 0]
                       ^(Ans+5              ;then raise it to the power of: input + 5
                                            ; [4  7 5]
                                            ; [5  9 7]
                                            ; [7 12 9]
                               Ans(1,1      ;get the top-left index and leave it in "Ans"
                                            ;implicitly print Ans

2

Pyth、16バイト

L?<b3!b+y-b2y-b3

これは関数を定義しますyここで試してみてください!

より楽しいソリューションを次に示しますが、9バイト長くなります。ただし、バイトを削ることができます。

+l{sa.pMf.Am&>d2%d2T./QY!

これは、OEISページでDavid Callanによって与えられた定義を使用します:「a(n)=奇数で3以上の部分へのnの合成の数」ここで試してみてください!関数を定義する代わりに、入力を直接受け取ります。


y-b2y-b3多分分岐またはL?でリファクタリングできますか?2つの要素の配列を宣言するのはコストがかかりますが。yL-Lb2,3より長い:(
ヴェン

@Ven私は置き換えることができた+y-b2y-b3smy-bdhB2バイトと同じ量です。hB2結果は配列になります[2, 3]
RK。

よくやったhB2。残念ながら、同じバイトカウントです。
ヴェン

ええ、しかし、私dはマップ内でそれを取り除くための何らかの方法があるのだろうかと思います。
RK。

2

Java、41バイト

ラムダ(実行時エラー)を使用できません。このJavaScript回答のポート

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

TIO


あなたにはいくつかの要件が欠けていると思います:私の修正をここで見てください
シャック

Shaqのコメントを無視してください。あなたの答えは正解であり、可能な限り最短のJava回答です(Java 12以降)。
オリビエグレゴワール

じゃあ 何が「見逃された」のかわかりませんが、大丈夫です。編集:nvm JSの回答を読みました。
ベンジャミンアーカート






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