ホフスタッターQシーケンス


25

定義

  1. a(1)= 1
  2. a(2)= 1
  3. a(n)= a(na(n-1))+ a(na(n-2))n> 2の場合(nは整数)

仕事

正の整数を指定するとn、が生成されa(n)ます。

テストケース

n  a(n)
1  1
2  1
3  2
4  3
5  3
6  4
7  5
8  5
9  6
10 6
11 6
12 8
13 8
14 8
15 10
16 9
17 10
18 11
19 11
20 12

参照



1
1として使用できる言語でTrueを返すことはできますか?
デニス

1
@Dennisその言語でtrueが1に等しい場合、はい。
リーキー修道女

4
OEISリンクとは別に、シーケンスが最初に現れたGEBを参照することをお勧めします。
マーティンエンダー

回答:




8

ジュリア、29バイト

!n=n<3||!(n-!~-n)+!(n-!~-~-n)

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

使い方

単項演算子!を目的に合わせて再定義します。

n1または2の場合、truen<3返し、これが戻り値になります。

場合はNより大きい2n<3返し|| ブランチが実行されます。これは定義の単純な実装で~-n収率1 - N及び~-~-n収率N - 2


7

セソス、54バイト

0000000: eefb5b 04f83a a75dc2 36f8d7 cf6dd0 af7b3b 3ef8d7  ..[..:.].6...m..{;>..
0000015: cfed12 f661f0 ae9d83 ee63e6 065df7 ce6183 af7383  ....a.....c..]..a..s.
000002a: 76ef3c 3f6383 7eff9c b9e37f                       v.<?c.~.....

オンラインで試す

分解

set numin
set numout
add 1
fwd 1
add 1
fwd 6
get
sub 1
jmp
    jmp
        sub 1
        fwd 1
        add 1
        rwd 1
    jnz
    fwd 1
    sub 1
    rwd 2
    add 2
    jmp
        rwd 4
        jmp
            sub 1
            fwd 3
            add 1
            rwd 3
        jnz
        fwd 4
        jmp
            sub 1
            rwd 3
            add 1
            rwd 1
            add 1
            fwd 4
        jnz
        rwd 3
        jmp
            sub 1
            fwd 3
            add 1
            rwd 3
        jnz
        fwd 4
        add 2
        jmp
            rwd 5
            jmp
                rwd 1
                jmp
                    sub 1
                    fwd 2
                    add 1
                    rwd 2
                jnz
                fwd 1
                jmp
                    sub 1
                    rwd 1
                    add 1
                    fwd 1
                jnz
                rwd 1
                sub 1
            jnz
            fwd 2
            jmp
                sub 1
                rwd 1
                add 1
                rwd 1
                add 1
                fwd 2
            jnz
            fwd 1
            jmp
                rwd 2
                jmp
                    sub 1
                    fwd 1
                    add 1
                    rwd 1
                jnz
                fwd 2
                jmp
                    sub 1
                    rwd 2
                    add 1
                    fwd 2
                jnz
                fwd 1
            jnz
            fwd 3
            sub 1
        jnz
        rwd 2
        jmp
            sub 1
            rwd 3
            add 1
            fwd 3
        jnz
        fwd 1
        sub 1
    jnz
    fwd 2
jnz
rwd 7
put

またはBrainfuck表記で:

+>+>>>>>>,-[[->+<]>-<<++[<<<<[->>>+<<<]>>>>[-<<<+<+>>>>]<<<[->>>+<<<]>>>>++[<<<<<[<
[->>+<<]>[-<+>]<-]>>[-<+<+>>]>[<<[->+<]>>[-<<+>>]>]>>>-]<<[-<<<+>>>]>-]>>]<<<<<<<.

6

C、43 42バイト

@Dennisのおかげで1バイト節約

すべての答えは同じです、私は何か違うことをしなければなりません!

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

a(n){return n<3?:a(n-a(n-2))+a(n---a(n));}

説明:それは基本的にですa(n-a(n-2))+a(n-a(n-1))が、動作が未定義である(私の電話(gcc)およびideoneで動作します)。


4
1.コンパイラーについても言及する必要があります。あなたの「盗品」は未定義の動作です。GCC 2.、あなたは必要としない1?とを:
デニス

@Dennis興味深いことに、私の同じPowerShell回答でも同じ定式化が機能します$b+=$b[$_-$b[$_-2]]+$b[$_---$b[$_]]
...-AdmBorkBork

@TimmyD一部のコンパイラーは、n--の前にa(n)をコンパイルする場合があり、そのための標準的な(または定義された)動作はありません。したがって、未定義の動作。
-betseg

@betsegうん、そう思う。必ずしもCに固有のものではないことを指摘してください。
AdmBorkBork

@TimmyDああ、私はそれを誤解しました。私は誰もが使用する機能を変更したかったので、私のものは異なっていて
頑丈

5

Mathematica、36バイト

バイトカウントは、ISO 8859-1エンコーディングとMathematicaの$CharacterEncoding設定WindowsANSI(Windowsのデフォルト。他の設定でも同様に機能する可能性がありますが、UTF-8そうでないものもあります)を前提としています。

±1=±2=1
±n_:=±(n-±(n-1))+±(n-±(n-2))

±単項演算子として定義します。

私は重複を取り除こうとしましたが、同じバイト数で終わりました:

±1=±2=1
±n_:=Tr[±(n-±(n-#))&/@{1,2}]

Retina
Leaky Nunで

@LeakyNun大丈夫?:)
マーティンエンダー

2日後。
リーキー修道女

@LeakyNunすぐに賞金をとても簡単に渡せば、担当者がいなくなるでしょう。
mbomb007


4

ゼリー15 14 バイト

2Rạ⁸߀$⁺Sµ1>?2

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

使い方

2Rạ⁸߀$⁺Sµ1>?2  Main link. Argument: n (integer)

2R              Yield [1, 2].
      $         Combine the previous three links into a monadic chain.
   ⁸                Yield n.
  ạ                 Take the absolute difference of the return value and n.
    ߀              Recursively call the main link on each result.
       ⁺            Duplicate the chain.
                    The first copy maps [1, 2] to [a(n - 1), a(n - 2)].
                    The second copy maps [a(n - 1), a(n - 2)] to
                    [a(n - a(n - 1)), a(n - a(n - 2))].
        S           Take the sum.
         µ          Combine all links to the left into a chain.
            ?       If...
           > 2          n is greater than 2, call the chain.
          1         Else, return 1.

あなたがセソスでそれをするならば、私はあなたに+400の報奨金を与えるかもしれません。
リーキー修道女

@LeakyNunセソスの答えがあるようです。コメントの1日後に出ました。
Yytsi

4

ゼリー14 12 11 バイト

ịḣ2S;
1Ç⁸¡2ị

これは反復的なアプローチです。

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

使い方

1Ç¡2ị   Main link. Argument: n

1       Set the return value to 1.
 Ç¡     Call the helper link n times, updating the return value after each call.
   2ị   Extract the second element of the resulting array.


ịḣ2S;   Helper link. Argument: A (array)

ị       At-index; retrieve the elements of A at the values of A.
 ḣ2     Head 2; extract the first two results.
    S   Take the sum of the result.
     ;  Prepend the sum to A.

3

Python、45 40バイト

a=lambda n:n<3or a(n-a(n-1))+a(n-a(n-2))

チャレンジの単純な単純な解釈。

@LeakyNunのおかげで5バイト節約できました!


3

Haskell、39 37バイト

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

チャレンジで説明したとおり、ガードを使用


申し訳ありませんが、私の(同一の)haskellソリューションを投稿する前に、あなたのソリューションを見ませんでした。ただし、改行を考慮する必要があるため、バイトカウントは38ではありませんか?
ライコニ

そして、ガードがなければならないn<3ためh 2 であることを1
ライコニ

@Laikoniそれの37複数行(「」 ")文字列を、とのニシキヘビlenの特徴に応じて次の2つのバイトとして改行をカウントしない限り、ええ、私は、それが今で固定だ他の事に気づいた。。
KarlKastor

TIL notepad ++は、改行を2文字としてカウントします。
ライコニ

@Laikoniは、間違いなく37バイトの改行を削除しました。
カールカストール

3

R、50バイト

a=function(n)ifelse(n<3,1,a(n-a(n-1))+a(n-a(n-2)))

使用法:

> a(1)
  1
> a(20)
  12


3

C#、51 44バイト

int a(int n)=>n<3?1:a(n-a(n-1))+a(n-a(n-2));

これを匿名にすることで短縮できるのではないかと思います pinkfloydx33!


1
C#6式の身体機能int a(int n)=>n<3?1:a(n-a(n-a))+a(n-a(n-2));
-pinkfloydx33

電話でタイプ中にタイポッドしているようです。-a最初の括弧のセットの最も内側は-1
pinkfloydx33

私も気づかなかった、それを修正rq
downrep_nation

3

JavaScript(ES6)、45バイト 34バイト

ES6の再帰的なソリューション。ゴルフのヒントは大歓迎です。

a=n=>n>2?a(n-a(n-1))+a(n-a(n-2)):1

さらに短縮してくれた/ u / ismilloに感謝します。




2

APL、20バイト

{⍵≤2:1⋄+/∇¨⍵-∇¨⍵-⍳2}

説明:

{⍵≤2:1⋄+/∇¨⍵-∇¨⍵-⍳2}
 ⍵≤2:1               If argument is 2 or less, return 1
      ⋄              Otherwise:
               ⍵-⍳2  Subtract [1, 2] from the argument
             ∇¨      Recursive call on both
           ⍵-        Subtract both results from the argument     
         ∇¨          Recursive call on both again
       +/            Sum          

2

VBA Excel 87バイト

非再帰的、これをn = 100000で動作させたいので、次のように言います:

Function A(N):ReDim B(N):For i=3 To N:B(i)=B(i-B(i-1)-1)+B(i-B(i-2)-1)+1:Next:A=B(N)+1

...そしてreturn、行末で(バイト#87)を押してEnd Function、「無料」のステートメントを取得します。B値は、n = 1および2の初期化を避けるために-1だけオフセットされることに注意してください。

スプレッドシートで通常どおりに呼び出し=A(100000)ます(取得するなど)48157

再帰バージョン、61バイト

Function Y(N):If N<3 Then Y=1 Else Y=Y(N-Y(N-1))+Y(N-Y(N-2))

n> 30では不当に遅くなり始め、n> 40ではまったく機能するとは言えません。


パフォーマンスは気にしません。コードの長さが重要です。短いソリューションを答えの先頭に移動する必要があります。
mbomb007

1
@ mbomb007私はゴルフに勝つには程遠いので、作業プログラムを構成するものを自分で選択します。簡単に解決できるソリューションがある場合、1バイトの整数でさえ処理できないということは、私が考える限りでは十分ではありません。
ジョファン

2

ルビー、36バイト

直接実装。ゴルフの提案は大歓迎です。

a=->n{n<3?1:a[n-a[n-1]]+a[n-a[n-2]]}

Afaik、a =を取り除くことができます。ここに投稿する場合、コードが->で始まるときに十分です。その場合、匿名関数としてカウントされます。
-Seims

@Seims残念ながら、関数はそれ自体を呼び出すため、関数に名前を付けるa[n-1]必要があります。
Sherlock9

2

Java 7、 68 61 51バイト

Leaky Nunのおかげで17人が助かりました。

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

PPCGへようこそ!
AdmBorkBork

PPCGへようこそ!Javaでのゴルフのヒントが好きかもしれません。代替形式は次のようになりますint a(int n){return n<3?1:a(n-a(n-2))+a(n---a(n));}が、残念ながら、既にある回答と同じバイト数を使用します。また、Java 8の回答は短いため、回答がJava 7であることを指定します。n->return n<3?1:a(n-a(n-1))+a(n-a(n-2))39 bytes) 。
ケビンCruijssen

歓迎してくれた皆さん、そしてJava8のヒントに感謝します-ラムダがそのように許可されていることを知りませんでした-Pythonでラムダが許可されているので、私はそれについて考えたことがないと思います。ラムダにはセミコロンが必要ですか?
ジャスティン

私は、Java 8を、私はによってコメントによると、セミコロンは、シングルライン式にカウントされません聞いたからたくさん使用していない@JustinTervay @DavidConradCAD97 @私自身のJavaの答えの1を
ケビンCruijssen

2

Oasis9 7 5バイト(非競合)

言語が課題をポストデートするため、非競合。4バイトを節約してくれたKenny Lauに感謝します。コード:

ece+V

拡張フォーム(のV11):

a(n) = ece+
a(0) = 1
a(1) = 1

コード:

e        # Stack is empty, so a(n - 1) is used, and it calculates a(n - a(n - 1))
 c       # Calculate a(n - 2)
  e      # Calculate a(n - a(n - 2))
   +     # Add up

オンラインでお試しください!。0.1秒でn = 1000を計算します。


1

PowerShell v2 +、85 79 69バイト

param($n)$b=1,1;2..$n|%{$b+=$b[$_-$b[$_-1]]+$b[$_-$b[$_-2]]};$b[$n-1]

入力を受け取り$n$bの配列に設定し、@(1, 1)からループに入ります2 .. $n。反復のたび$bに、シーケンスの単純な+=定義を使用して、シーケンスの最新の計算に取り組みます。次に、適切な数値を出力します$b-1PowerShellの配列にはゼロインデックスが付けられているため)。これが動作するかどうか$nである1か、2それらの値の両方がより低いインデックスにあらかじめ入力されているので$b、最初から、でもジャンク上のループタック場合ので、それはとにかく無視されます。


再帰的ソリューション78 76バイト

$a={param($k)if($k-lt3){1}else{(&$a($k-(&$a($k-1))))+(&$a($k-(&$a($k-2))))}}

通常、反復ソリューションの方が短いため(ネストされたすべてのかっこからわかるように)、ラムダに相当するものを回答として使用しました。ただし、この場合、ネストされた括弧は、ネストされた配列呼び出しを使用した反復ソリューションでほぼ複製されるため、再帰的ソリューションは短くなります。いや、反復解法は実際にはもっと短い(上記参照)。

のように、実行演算子を介して呼び出し&$a 20ます。まっすぐな再帰呼び出し。


1

JavaScript(ES6)、66バイト

n=>[...Array(n+1)].reduce((p,_,i,a)=>a[i]=i<3||a[i-p]+a[i-a[i-2]])

速度のための非再帰バージョン。再帰的なバージョンはおそらく短いかもしれませんが、他の誰かが書いておくために残しておきます。使うときはいつも好きreduceです。注:およびの(整数コンテキストで使用さtrueれる1場合にキャストする)を返すことで1バイト節約されます。a(1)a(2)



1

4番目、76バイト

ようやく機能しました!

: Q recursive dup dup 3 < if - 1+ else 2dup 2 - Q - Q -rot 1- Q - Q + then ;

オンラインで試す

説明:

: Q recursive                           \ Define a recursive function Q
    dup dup 3 <                         \ I moved a dup here to golf 2 bytes
    if                                  \ If n < 3, return 1
        - 1                             \ Golf: n-n is zero, add one. Same as 2drop 1+
    else
        2dup 2 - Q - Q                  \ Copy n until 4 on stack, find Q(n-Q(n-2))
        -rot                            \ Move the result below 2 copies of n
        1- Q - Q +                      \ Find Q(n-Q(n-2)), then add to previous ^
    then ;

オンラインで試してみてください(上から少しゴルフをしていません)

残念ながら、相互再帰は、ゴルフに使用するには少し冗長すぎます。


1

メープル、43 41バイト

a:=n->`if`(n>2,a(n-a(n-1))+a(n-a(n-2)),1)

使用法:

> a(1);
  1
> a(20);
  12

この問題は確かにメモ化の良い候補です。オプションキャッシュを使用すると、実行時間が大幅に短縮されます。

aC := proc(n) 
      option cache; 
      ifelse( n > 2, aC( n - aC(n-1) ) + aC( n - aC(n-2) ), 1 ); 
end proc:

これは次を使用して確認できます。

CodeTools:-Usage( aC(50) );

0

J、29 28バイト

1:`(+&$:/@:-$:@-&1 2)@.(2&<)

再帰的な定義を使用します。

使用法

追加のコマンドは、複数の入出力をフォーマットするために使用されます。

   f =: 1:`(+&$:/@:-$:@-&1 2)@.(2&<)
   (,:f"0) >: i. 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 1 2 3 3 4 5 5 6  6  6  8  8  8 10  9 10 11 11 12

説明

1:`(+&$:/@:-$:@-&1 2)@.(2&<)  Input: n
                        2&<   If n < 2
1:                              Return 1
                              Else
               -&1 2            Subtract [1, 2] from n to get [n-1, n-2]
            $:@                 Call recursively on n-1 and n-2
           -                    Subtract each of the results from n
        /@:                     Reduce using
      $:                          A recursive call on each
    +&                            Then summation
                                Return that value as the result

0

dc、62バイト

?si2sa1dd2:a:a[la1+dsadd1-;a-;alad2-;a-;a+r:ali;a0=A]dsAxli;af

このソリューションは、配列と再帰を利用します。

?si          # Take input from stdin and store it in register `i'
2sa          # Initialise register `a' with 2, since we'll be putting in the first
             #   two values in the sequence
1dd2         # Stack contents, top-down: 2 1 1 1
:a           # Pop index, then pop value: Store 1 in a[2]
:a           # Ditto:                     Store 1 in a[1]
[            # Open macro definition
 la 1+ dsa   # Simple counter mechanism: Increment a and keep a copy on stack

# The STACK-TRACKER(tm): Top of stack will be at top of each column, under the
#   dashed line. Read commands from left to right, wrapping around to next line.
#   This will be iteration number n.
  dd   1-    ;a       -          ;a            la            d          
#-----------------------------------------------------------------------
# n    n-1   a[n-1]   n-a[n-1]   a[n-a[n-1]]   n             n          
# n    n     n        n          n             a[n-a[n-1]]   n          
# n    n     n                                 n             a[n-a[n-1]]
#                                                            n          
#                                                                       

  2-            ;a            -             ;a            +      r    :a
#-----------------------------------------------------------------------
# n-2           a[n-2]        n-a[n-2]      a[n-a[n-2]]   a[n]   n      
# n             n             a[n-a[n-1]]   a[n-a[n-1]]   n      a[n]   
# a[n-a[n-1]]   a[n-a[n-1]]   n             n                           
# n             n                                                       

 li;a        # Load index of target element, and fetch that element's current value
             #    Uninitialised values are zero
 0=A         # If a[i]==0, execute A to compute next term
]dsAx        # Close macro definition, store on `A' and execute
li;a         # When we've got enough terms, load target index and push value
f            # Dump stack (a[i]) to stdout

結論として、誰かがのためdcにIDEを構築しているなら、私に知らせてください!
ジョー

0

アーラン、46バイト

f(N)when N<3->1;f(N)->f(N-f(N-1))+f(N-f(N-2)).

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