まだ未使用のペア


21

正の整数のシーケンスを定義しましょう。偶数のシーケンスを前の用語の2倍に定義します。シーケンスの奇数インデックスは、シーケンスにまだ現れていない正の最小整数になります。

最初のカップルの用語は次のとおりです。

1,2,3,6,4,8,5,10,7,14,9,18,11,22,12,24,13,26,15,30

これは、連結ペア(n、2n)のリストと考えることもできます。ここで、nは、これまで使用されていない最小の正の整数です。

仕事

入力として数値nが与えられた場合、このシーケンスのn番目の項を計算します。

これはので、ソースコードのサイズをバイト単位で最小化することを目指してください。

OEIS A036552


シーケンスの奇数インデックスが、シーケンスにまだ現れていない最小の正の整数であるという事実無関係ですよね?
アダム

1
また、どのペアですか?
アダム

@Adámいいえ、そうではありません。どうしてそのような印象を与えているのかはわかりませんが、おそらく私はこれを不十分に言いました。
小麦ウィザード

1
@Adámのシーケンスを考えるもう1つの方法は、連結されたペアで構成され(n,2n)、各番号が1回だけ現れることです。各ペアは、後者の制約を順守しながら、可能な限り最小になるように選択されます。
マーティンエンダー

3
系列の奇数要素の2進評価は常に偶数です。誰かに役立つかもしれません。
電卓

回答:



7

JavaScript(ES6)、92 82 69 67 65バイト

n=>(F=i=>i^n?F(a[b=i&1?2*b:(g=k=>a[k]?g(k+1):k)(1)]=-~i):b)(a={})

どうやって?

以下を追跡します。

  • 最後に挿入された値を、B
  • ルックアップテーブルaで以前に検出されたすべての値。

内部的には、0ベースのインデックスiを使用しています。したがって、奇数と偶数の動作は逆になります。

  • 奇数の位置では、次の値は単に2 * bです。

  • 偶数の位置では、再帰関数g()とルックアップテーブルaを使用して、一致する最小値を特定します。

    (g = k => a[k] ? g(k + 1) : k)(1)

数バイトを節約するために、iはでは{}なくに初期化され0ます。これにより、次の使用が強制されます。

  • i^n比較する私はn個あるため({}) ^ n === n、一方、({}) - n評価さへNaN
  • -~i文字列を生成するため、iをインクリメント({}) + 1します。

デモ



5

Pythonの380の 72 69バイト

Mr. Xcoderのおかげで-7バイト!

f=lambda n:n and[f(n-1)*2,min({*range(n+1)}-{*map(f,range(n))})][n%2]

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


1
あなたはrepaceできるset(...)ため、 `{* ...}と78バイト
氏Xcoder

@Zacharýあなたは私のコメントに反論していましたか?その場合、Python 3のセットをの{*...}代わりに使用できますset(...)
ミスターXcoder

私は考えずにコメントしていましたが、しばらくしてから、{...for...in...}もう少し時間がかかることに気付きました。
ザカリー

あなたはそれを2回使用しているため、実際には、4つのバイトを救う
ミスターXcoder






3

05AB1E16 15 14バイト

1インデックス。
シーケンス内の奇数インデックスの要素のバイナリ表現が偶数のゼロで終わるという事実を使用します:A003159

Lʒb1¡`gÈ}€x¹<è

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

説明

L                 # range [1 ... input]
 ʒ      }         # filter, keep only elements whose
  b               # ... binary representation
   1¡             # ... split at 1's
     `gÈ          # ... ends in an even length run
         €x       # push a doubled copy of each element in place
           ¹<è    # get the element at index (input-1)

3

パイソン259の 51 49バイト

f=lambda n,k=2:2/n%-3*(1-k)or f(n+~(k&-k)%-3,k+1)

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

バックグラウンド

すべての正のn整数は、n = 2 o(n) c(n)として一意に表現できます。ここで、c(n)。は奇数です。

してみましょう⟨a nはのn> 0チャレンジ仕様からシーケンスです。

すべての正の整数nについてo(a 2n-1は偶数であると主張します。以降O(2N)= O(2A 2N-1)= oは(2N-1)+ 1は、この主張と等価であるO(2Nの奇数常に。

クレームが偽であると仮定およびlet 2M-1は、そのようなことは配列の最初の奇数のインデックスであるO(2M-1 奇数です。これにより、o(a 2m-1が偶数になるように、2mがシーケンスの最初の偶数インデックスになることに注意してください。

o(a 2m-1は奇数で0は偶数であるため2m-12で割り切れます。定義により 2m-1シーケンスにまだ現れていない最小の正の整数であり2m-1 / 2が前に現れていなければならないことを意味します。ましょうkは(第1)のインデックスである2メートル-1 /2における。

以来、O(K)= O(2M-1 /2)= O(2M-1 )- 1のも、極小であるNことを意味kが奇数です。今度は、このことは、K + 1 = 2aはK = A 2M-1の定義に矛盾する、2M-1

使い方

まだこない


3

R70 69 65バイト

function(n){for(i in 2*1:n)F[i-1:0]=which(!1:n%in%F)[1]*1:2
F[n]}

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

1つの引数を取る匿名関数。FデフォルトはFALSEまたは0そのアルゴリズムが正しく何の正の整数がまだ順番にされていないことを評価すること。

アルゴリズムは、ペアに発生しfor(ここで次のようにループiから移行2する2nことによって2)。

           which(!1:n%in%l)[1]     # the missing value
                              *1:2 # keep one copy the same and double the next
l[i-1:0]=                         # store into l at the indices i-1 and i


2

Perl 6、50バイト

{(1,{@_%2??2*@_[*-1]!!first *∉@_,1..*}...*)[$_]}

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

  • 1, { ... } ... *遅延生成された無限シーケンスで、最初の用語の後の各用語は波括弧で区切られたコードブロックによって提供されます。ブロックは@_配列をその配列の現在のシーケンス全体を受け取ります。
  • 現在の要素数が奇数(@_ % 2)の場合、偶数インデックスの要素が生成されるため、次の要素はこれまでの最後の要素の2倍になります2 * @_[*-1]
  • それ以外の場合は、シーケンスにまだ現れていない最初の正の整数を取得しますfirst * ∉ @_, 1..*
  • $_外部関数への引数です。無限シーケンスにインデックスを付け、関数の戻り値を提供します。

1

Mathematica、82バイト

(s={};a=1;f=#;While[f>0,If[s~FreeQ~a,s~AppendTo~{a,2a}];a++;f--];Flatten[s][[#]])&

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


Mathematicaで58バイト(アイデアはかなり異なるため、おそらく別の回答を投稿する必要があります)。
-notjagan

OEISリンクからコピーしましたか?
-J42161217

タスクに合わせてゴルフをするように変更しましたが、多かれ少なかれOEISリンクと同じです。
-notjagan

1
あなたがしたい場合は、新しい答えを投稿し、作者クレジット@not
J42161217


1

C#(Visual C#Interactive Compiler)、82バイト

x=>{int y=1;for(var s="";x>2;x-=2)for(s+=2*y+":";s.Contains(++y+""););return x*y;}

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

@ASCIIOnlyのおかげで-6バイト!


C#8はあまりにも新しいため、オンラインインタープリターでは一般的ではないかもしれませんが、csiはMonoであるという事実に追加されるため、Monoがそれを実装して安定したビルドに追加するのを待つ必要がありますt既に)
ASCIIのみ

悲しいことに、C#でこれを確認するのは簡単ではありません
ASCIIのみ

これを使用して開始しますか?しかし、ええ、簡単なことのようには見えません。docs.microsoft.com/en-us/dotnet/api/...
ダナ

1
86?-とは思わない:、それは、リスト内の最大数になりますので、sは必要とされている
ASCIIのみの

また2.0=>2f
ダナ

0

Clojure、102バイト

#(nth(loop[l[0 1 2 3]i %](if(= i 0)l(recur(conj l(*(last l)2)(nth(remove(set l)(range))0))(dec i))))%)

反復しのn時間シーケンスと戻り構築するためn番目の項目を、1インデックス。


0

Ruby, 60 bytes

->n,*a{eval"v+=1while a[v];a[v]=a[2*v]=v+v*n%=2;"*(n/2+v=1)}

0インデックス。時間をループしn/2+1、毎回2つの値を生成し、インデックスに配列を設定してそれらを保存します。v+v*n%2出力を与える、vまたはv*2のパリティに応じてn



0

JavaScript(ES6)、60 65バイト

反復ソリューション。

n=>eval("for(s={},i=0;n;)s[++i]?0:(s[i+i]=--n)?--n?0:i+i:i")

少ないゴルフ

n=>{
  s = {}; //hashtable for used values
  for(i=0; n; )
  {
    if ( ! s[++i] )
    {
      s[i*2] = 1; // remember i*2 is already used
      if (--n)
        if (--n)
          0;
        else
          result = i*2;
      else
        result = i;
    }
  }
  return result;  
}

テスト

F=
n=>eval("for(s={},i=0;n;)s[++i]?0:(s[i+i]=--n)?--n?0:i+i:i")

for (a=1; a < 50; a++)
  console.log(a,F(a))


0

Jelly, 13 12 10 bytes

ḤRọ2ḂĠZFị@

This uses the observation from my Python answer.

Try it online!

How it works

ḤRọ2ḂĠZFị@  Main link. Argument: n

Ḥ           Unhalve; yield 2n.
 R          Range; yield [1, ... , 2n].
  ọ2        Compute the order of 2 in the factorization of each k in [1, ..., 2n].
    Ḃ       Bit; compute the parity of each order.
     G      Group the indices [1, ..., 2n] by the corresponding values.
      Z     Zip/transpose the resulting 2D array, interleaving the indices of 0
            with the indices of 1, as a list of pairs.
       F    Flatten. This yields a prefix of the sequence.
        ị@  Take the item at index n.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.