ポインターシーケンスを作成する


12

ような任意の配列であることがポインタ配列を定義することができ(n)は=((N-1) - ((N-1))) FORALL Nいくつかの有限数よりも大きいです。たとえば、シーケンスが

3 2 1 

次の項は2a(n-1)= 1(n-1)-1 = 1a(1)= 2であるためです(この例はゼロインデックスですが、計算に使用するインデックスは関係ありません常に同じです。)。プロセスを繰り返すと、無限のシーケンスが得られます

3 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2

仕事

正の整数の初期配列を指定すると、その配列で始まるポインターシーケンスが出力されます。

出力タイプ

出力は、プログラムが返すことができる関数として、整数の無限リストまたはシーケンスにインデックスを付ける関数のいずれかを作成することを選択した場合、柔軟性を高めることを目的としています。完全なプログラムを作成する場合は、シーケンスの用語を無期限に出力できます。

開始配列とインデックスの2つの入力を選択することもできます。これを行うことを選択した場合、そのインデックスでシーケンスの項を出力するだけで済みます。


シーケンスの開始前にインデックス付けが必要なシーケンスが与えられることはありません。たとえば、次の用語を解決する3前に用語が必要になるため、有効な入力ではありません3

これはため、スコアはプログラムのバイト数になり、スコアが低いほど良くなります。

テストケース

テストケースは簡単にするために切り捨てられます

2 1   -> 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 ...
2 3 1 -> 2 3 1 3 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 ...
3 3 1 -> 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 ...
4 3 1 -> 4 3 1 3 4 4 3 3 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 ...

入力配列に加えて、n個の追加の用語を出力できますか?または、入力として提供されたものの後に始まるn番目の用語?
ルイスメンドー

@LuisMendoインデックス作成は問題ありません。
ポストロックガーフハンター

回答:


8

JavaScript(ES6)、25バイト

a=>f=n=>a[n]||f(--n-f(n))

呼び出されると、fシーケンス内の指定されたインデックスでアイテムを提供する関数を作成する匿名関数。

何か誤解されたら教えてください...


f(n)から呼び出しますf(n)。それが終わるとは思いませんが、JSを知りません。
ポストロックガーフハンター

@FunkyComputerMan n十分に低くa[n]なると、真理値が返されるので、||短絡し、無限に再帰することを防ぎます。
ETHproductions

ええ、私はそれを得ましたがn、各呼び出しで少しも下がっていません。naあなたの長さよりも大きい場合、停止することはないと確信しています。
ポストロックガーフハンター

2
それは、各呼び出しで低取得行く@FunkyComputerMan --n割り当てnn-1それを次の参照をデクリメントを参照するようにn
エリックアウトゴルファー

2
@FunkyComputerMan --ndecrements n、つまりf(--n-f(n))f((n-1)-f(n-1))
ETHproductions

5

7 6バイト

¡S!o_L

無限リストを返します。 オンラインでお試しください! TIOが結果を切り捨てて出力するまでに時間がかかることに注意してください。

説明

演算子に¡はいくつかの意味があります。ここでは、「既存の要素のリストから新しい要素を計算する関数を繰り返して無限リストを構築する」を使用しています。長さNのリストが与えられると、新しい要素は1ベースのインデックスN + 1を持ちます。必要なのは、リストの最後の要素(以前の値)を否定し、その結果を使用してリストにインデックスを付けることだけです。

¡S!o_L  Implicit input.
¡       Construct infinite list by iterating this function on input:
 S!      Element at index
    →    last element
  o_     negated.

4

Haskell、36バイト

リストを取得し、シーケンスにインデックスを付ける関数を返します

l!n|n<length l=l!!n|e<-n-1=l!(e-l!e)

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

説明

ここ!では、リストlとインデックスを受け取る関数を定義していますn。場合nの長さよりも短いl我々指標lによってn、そうでない場合は、我々は返しますl!((n-1)-l!(n-1))。これは、質問で指定した関数の再帰的な定義に従います。

以下は同じプログラムで、無料です。

a l n
 |n<length l = l!!n
 |otherwise = (a l) ((n-1) - (a l) (n-1))

私が使用e<-n-1割り当てる際バイトを保存するために、そうでなければ代わりのn-1eそれが後で使用できるように。


4

MATL13 9バイト

:"tt0)_)h

最初の用語に続いて、n個の追加の用語(チャレンジで許可)を出力します。nは入力として取得される正の整数です。

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

説明

:"      % Implicitly input n. Do the following n times
  tt    %    Duplicate the sequence so far, twice. In the first iteration this
        %    implicitly inputs the array of initial terms
  0)    %    Get value of the last entry, say m
  _)    %    Get value of the entry which is m positions back from the last
  h     %    Append. This extends the array with the new entry
        % Implicit end. Implicitly display




2

ゼリー、6バイト

NṪịṭµ¡

シーケンスSと整数kを取り、k項をSに追加します。

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

使い方

NṪịṭµ¡  Main link. Left argument: S (sequence). Right argument: k (integer)

    µ¡  Combine the links to the left into a (variadic) chain and call it k times.
        The new chain started by µ is monadic, so the chain to the left will be
        called monadically.
N           Negate; multiply all elements in S by -1.
 Ṫ          Tail; retrieve the last element, i.e., -a(n-1).
  ị         At-index; retrieve the element of S at index -a(n-1).
            Since indexing is modular and the last element has indices n-1 and 0,
            this computes a( (n-1) - a(n-1) ).
   ṭ        Tack; append the result to S.


1

CJam、10バイト

{{(_j-j}j}

CJamの場合、これは非常にうまく機能します(05ab1eにも勝ります!)。

これは、i nスタック上のフォームへの入力を予期する匿名ブロックです。ここiで、シーケンス内のインデックスとn、開始番号の配列です。

これがうまく機能する理由は j、開始値のセットからメモされた再帰を提供演算子のです。

説明:

{    Function j(n) with [j(0), j(1), j(2)] = [4, 3, 1], return j(6):
 (    Decrement:    5
 _    Duplicate:    5 5
 j    j(5):
  (    Decrement:   5 4
  _    Duplicate:   5 4 4
  j    j(4):
   (    Decrement:  5 4 3
   _    Duplicate:  5 4 3 3
   j    j(3):
    (    Decrement: 5 4 3 2
    _    Duplicate: 5 4 3 2 2
    j    j(2) = 1:  5 4 3 2 1
    -    Subtract:  5 4 3 1
    j    j(1) = 3:  5 4 3 3
   -    Subtract:   5 4 0
   j    j(0) = 4:   5 4 4
  -    Subtract:    5 0
  j    j(0) = 4:    5 4
 -    Subtract:     1
 j    j(1) = 3:     3
}j   End:           3

1

Java(8)、60バイト

int a(int[]a,int n){return n<a.length?a[n]:a(a,--n-a(a,n));}

2つの入力(整数配列aと整数n)を受け取りn、シーケンスの 'th値を出力します。

説明:

ここで試してみてください。(数秒かかる場合があります。)

int a(int[]a,int n){        // Method with int[] and int parameters and int return-type
  return n<a.length?        //  If input `n` is smaller than the length of the array:
          a[n]              //   Output the `n`'th item of the array
         :                  //  Else:
          a(a,--n-a(a,n));  //   Recursive call with `n-1-a(n-1)`
}                           // End of method


0

05AB1E、20バイト

#`r[=ˆŽ¼}[¯¾¯¾è-è=ˆ¼

入力をスペース区切りの文字列として期待し、無期限に出力し続けます。かなり簡単な実装

実行例:

$ 05ab1e -e '#`r[=ˆŽ¼}[¯¾¯¾è-è=ˆ¼' <<< '3 2 1'
3
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2

0

Java(OpenJDK 8)95 93 91 90バイト

a->i->{int j=0,b[]=new int[++i];for(;j<i;j++)b[j]=j<a.length?a[j]:b[~-j-b[j-1]];return b;}

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


b[(j-1)-...]同等ではありませんb[~-j-...]か?
ジョナサンフレッチ

バイトを保存するために、からj>=a.lengthを三項を逆にすることができj<a.lengthます:j<a.length?a[j]:b[~-j-b[j-1]]。また、私は好奇心が強いです:チャレンジの説明自体でも説明されている再帰アプローチがわずか60バイトであるのに、なぜループアプローチを採用したのですか?
ケビンCruijssen

私は自己参照機能は、完全なプログラムの答えを必要とする方法と、私の知る限りで答えて好きではない
ロベルト・グラハムを

@RobertoGrahamいいえ、再帰的メソッドはラムダにできないため、Java 7スタイルのメソッドである必要があります。ただし、プログラム全体ではなく、(Java 7スタイルの)メソッドを投稿することは引き続き許可されています。
ケビンCruijssen

@KevinCruijssen私はあなたの答えをBiFunctionにしました、オンライン試してみてください!。それは可能だが、それは主に参照しているため、あなたは、プログラム全体をポストする必要があります
ロベルト・グラハム

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