ジャンプアップシーケンス


19

次のシーケンスを検討してください。

0 1 3 2 5 4 8 6 7 12 9 10 11 17 13 14 15 16 23 ...

かなりパターンレスに見えますよね?仕組みは次のとおりです。で始まり、整数0でジャンプしn、でn始まり1ます。これがシーケンスの次の番号です。次に、「スキップされた」番号を追加します。この番号はまだ昇順で表示されていません。次に、n最後に追加された番号からインクリメントしてジャンプします。このパターンを繰り返します。

したがって、たとえば、到達する11とになりますn=5。増加nn=6、にジャンプしてから1713 14 15 16まだ追加されていないので追加します。次のジャンプはn=7なので、シーケンスの次の要素は23です。

チャレンジ

inputが与えられると、このシーケンスのth番目の項、シーケンスの最初の項をx出力するか、シーケンスの項の無限リストを作成します。0インデックスまたは1インデックスを選択できます。xx

I / Oとルール

  • 入力と出力は、任意の便利な方法で指定できます。
  • 入力と出力は、言語のネイティブの数値型に適合すると仮定できます。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。


@JayCe私は驚かない-それはかなりsequence意的なシーケンスだ。
AdmBorkBork

回答:


24

JavaScript(ES7)、41バイト

シーケンスのn番目の項を0インデックスで返します。

n=>(d=(n--*8-23)**.5)%1?n:'121'[n]^n-~d/2

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

どうやって?

メインケース:n>3

シーケンスの最初の4つの用語は特別なので、ここではそれらを脇に置いておきましょう。

以下のため、そのような順序になります。n>3

 n  | [4] 5 [6] 7 8 [ 9] 10 11 12 [13] 14 15 16 17 [18] 19 20 21 22 23 [24] 25 26 27 ...
----+------------------------------------------------------------------------------------
a(n)| [5] 4 [8] 6 7 [12]  9 10 11 [17] 13 14 15 16 [23] 18 19 20 21 22 [30] 24 25 26 ...
----+------------------------------------------------------------------------------------
 k  |  2  -  3  - -   4   -  -  -   5   -  -  -  -   6   -  -  -  -  -   7   -  -  - ...

実際には、2つのインターリーブされたサブシーケンスが存在することがわかります。

  • ほとんどの値は、単純に次のサブシーケンス属します。A

    A(n)=n1
  • いくつかの他の値は、サブシーケンスに属するその指標演算シーケンス従う(上記図中括弧で強調)3、3、4、6、9、13、18、24 ...そしてそのため我々が持っています:B

    B(n,k)=n+k1

    ここで、はメインシーケンスのインデックス、kはサブシーケンスBのインデックスです。nkB

メインシーケンスののインデックスは、次の式で与えられます。B

nk=k2k+62

与えられると、nが2次方程式の整数解である場合、メインシーケンスの対​​応する項がBに属することがわかります。nBn

x2x+62n=0

その判別式は次のとおりです。

Δ=14(62n)=8n23

そして、その正解は次のとおりです。

x=1+Δ2

期待するは整数です。したがって、テスト:Δ

(d = (n-- * 8 - 23) ** .5) % 1

特殊な例:0n3

以下のために、判別式は負とでその平方根の結果に取ってのNaN。以下のために、N = 3、判別式である1。したがって、シーケンスのこれらの最初の4つの用語は、サブシーケンスBに属すると見なされます。n<3n=31B

標準の式n-〜d / 2を適用するだけで、次のようになります:

12,12,32,3

の代わりに:

0,1,3,2

これはなぜ我々 XORと、これらの結果であるそれぞれ。0,1,2 and 1


10

、12バイト

Θṁṙ_1C+ḣ2tNN

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

無限リストとして出力します。以下は、最初のNを出力するバージョンです。

説明

Θṁṙ_1C+ḣ2tNN–完全なプログラム。入力を受け取らず、STDOUTに出力します。
         tN – 2から始まる自然数の無限リストを作成します。
      +ḣ2–そして[1、2]を追加します。収量[1,2,2,3,4,5,6,7,8,9,10,11、...]。
     CN –正の整数の無限リストをそれらの断片に切り取ります
               サイズ。収量[[1]、[2,3]、[4,5]、[6,7,8]、[9,10,11,12]、...]。
 ṁ–結果をマップし、その後フラット化します。
  ṙ_1–それぞれを1ユニットずつ右に回転させます。
               収量[1,3,2,5,4,8,6,7,12,9,10,11、...]
Θ– 0を先頭に追加します。収量[0,1,3,2,5,4,8,6,7,12,9,10,11、...]

7

Haskell、43バイト

0:1:3:2:5!3
a!n=a:[a-n+2..a-1]++(a+n)!(n+1)

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

無限リストを定義します:

  0:1:3:2:(5!3)
 0:1:3:2:5:4:(8!4)
 0:1:3:2:5:4:8:6:7:(12!5)
 0:1:3:2:5:4:8:6:7:12:9:10:11:(17!6)
 0:1:3:2:5:4:8:6:7:12:9:10:11:17:13:14:15:16:(23!7) 

4

ゼリー、15バイト

+‘ɼṪRṙ-œ|@
0Ç¡ḣ

これは、与えられた完全なプログラムであるN、最初印刷N個の配列の項目を。

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

使い方

0Ç¡ḣ        Main link. Argument: n

0           Set the return value to 0.
 Ç¡         Call the helper link n times, first with argument 0, then n-1 times
            with the previous return value as argument.
   ḣ        Head; extract the first n items of the last return value.


+‘ɼṪRṙ-œ|@  Helper link. Argument: A (array)

 ‘ɼ         Increment the value in the register (initially 0) and yield it.
+           Add that value to all items in the sequence.
   Ṫ        Tail; extract the last item.
    R       Range; map k to [1, .., k].
     ṙ-     Rotate -1 units to the left, yielding [k, 1, ..., k-1].
       œ|@  Perform multiset union of A and the previous return value.

3

C(gcc)、73 67 64バイト

t,d;f(x){for(t=4,d=2;d<x;t+=d++)x-t||(d+=x+=d);t=x<4?x^x/2:x-1;}

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

f0のインデックスnを取得nし、シーケンスのth番目の数を生成する関数を定義します。

次のようにシーケンスを分析できます。

f(n)  = n   where n = 0, 1

f(2)  = 3   // 2 and 3 are swapped
f(3)  = 2

f(4)  = 5   // (+2,+3)
f(6)  = 8   // (+3,+4)
f(9)  = 12  // (+4,+5)
f(13) = 17  // (...)
...

f(n)  = n-1 // for all cases not yet covered

まず、中央のセクションを処理します。

for(t=4,d=2;d<x;t+=d++)x-t||(d+=x+=d);

左側の引数(4、6、9、13、...)はパターンに従っていることに注意してください。最初に2つ追加し、次に3つ追加し、4つ追加するなどです。ループの各反復から開始しt=4て追加しd(2から開始)d、プロセスで増分します。

ループの本体はより興味深いものです。4〜5、6〜8、9〜12などにマッピングすることを忘れないでください。d-1if xが追加されるだけですt。ただし、このロジックは最後のケースの前にあるため、最後にf(n) = n - 11を減算することがわかります。したがって、単純にdif x == tx-t||(x+=d))を追加できます。ただし、この直後にループから抜け出す必要もあります。そのため、それを追加d、不条理に見えるd+=x+=dようにしd<xます。これにより、常に条件が失敗します。

これは、最初の4つの値を除くすべてをカバーします。それらをバイナリで見ると、次のようになります:

00 -> 00
01 -> 01
10 -> 11
11 -> 10

したがって、次の場合、最後のビットを反転させます2 <= x < 4。これはで達成されx^x/2ます。x/22番目の最下位ビットを与えるので、これが元の数値とXORをとると、数値が2または3の場合、最後のビットが反転します。


3

ゼリー 13  10 バイト

-3デニスに感謝(0インデックスを使用して、累積合計設定と最終的な減少から2を節約します)

Ḷ»2Äi+_>2$

整数0( -indexed n)を受け入れる単項リンクは、整数a(n)を返します

オンラインでお試しください!またはテストスイートを見る


いいね!私は持っていましたḶÄ+3i+’が、エッジケースを処理する方法がわかりません。
デニス

私も持っḶ»ạ¥3ていますḊ3,2;-このビットにはより簡潔にする必要があると感じています。
ジョナサンアラン

Ḷ»2Äi+_>2$0ベースのインデックス付けで3バイトを節約します。
デニス

素晴らしいゴルフ!1インデックスの土地で立ち往生しました。
ジョナサンアラン


2

MATL、22バイト

1y:"t0)@+h5M:yX-h]qw:)

最初の出力 nシーケンスの項をます。

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

説明

1         % Push 1
y         % Implicit input: n. Duplicate from below
":        % For each k in [1 2 ... n]
  t0)     %   Duplicate sequence so far. Get last entry, say m
  @+      %   Add k: gives m+k
  h       %   Concatenate horizontally
  5M      %   Push m+k again
  :       %   Range [1 2 ... m+k]
  y       %   Duplicate from below
  X-      %   Set difference
  h       %   Concatenate horizontally
]         % End
q         % Subtract 1, element-wise
w         % Swap. Brings original copy of n to the top
:)        % Keep the first n entries. Implicit display

私は最後にスマイリーが好きで、今ではすべてのMATLプログラムが笑顔で終わることを望んでいます。:)
スンダ-復活モニカ

はい@sundar、私はそれがMATL :-Dでは比較的一般的なイディオムだとうれしいです
ルイスMendo



1

QBasic、58バイト

DO
b=r+j
?b
r=b
FOR x=a+1TO b-1
?x
r=x
NEXT
a=b
j=j+1
LOOP

無期限に出力します。結果を確認するには、SLEEP 1ループ内にを追加するか、ループを作成するLOOP WHILE b<100か、そのようなものを作成します。

これは基本的に仕様を実装するだけです。戻る番号は常に最後にジャンプした番号とその前のジャンプした番号の間の番号になることに注意してください。したがって、これらの境界をaand として保存しbFORループを使用してそれらの間のすべての数値を出力します。



1

R、70バイト

function(e){for(i in 1:e)F=c(setdiff((F+i):1-1,F),F[1]+i,F);rev(F)[e]}

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

  • 1インデックス付き
  • F@JADの提案により、定数を使用して-4バイト
  • -5バイトは@Giuseppeの提案のおかげでリストを反転します
  • -JADの提案により、forループ内の不要な中括弧を削除する-2バイト
  • -のsetdiff代わりに使用して2バイトx[x %in% y]

以前のバージョン(79バイト)



@JAD:私はいつもF / Tを使うのを忘れていました...仕方がありません。「安全でないコード」を避け
たくあり

1
リストを逆に作成すると、保存され5 bytes、大量の警告が発生します!
ジュゼッペ

F/T関数定義で再定義されていなければ、安全でさえありません。(IIRC)のグローバル値を変更しませんF/T
JAD


1

Python 2、123バイト

def f(z):[s.extend([s[-1]+n]+[x for x in range(s[-1]+1,s[-1]+n)if not x in s]) for n in range(1,z)if len(s)<z];return s    

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

入力xが与えられると、シーケンスの最初のx項を出力し、

私はPythonを学んでいますが、この挑戦​​は物事をより興味深いものにします。

編集:いくつかの空白を剃る


PPCGへようこそ!以下のスペースを削除できますfor n in range(1,z) if len(s) < z]; return sfor n in range(1,z)if len(s)<z];return s
ライコニ



0

Perl 6、52バイト

(0,{((^max @_)∖@_).min.?key//(1+@_[*-1]+$++)}...*)

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

これは、...演算子を使用したジェネレータ式です。これは、以前の配列中のギャップを探し@_経由((^max @_)∖@_).min.?key

      @_  # prior sequence values         [0,1,3]
  max @_  # largest prior sequence value       3
 ^        # the Range 0..max @_            0,1,2
(       )∖@_  # set subtract prior seq     -0,1  -> (2=>True)
            .min  # smallest unseen value  2=>True
                .?key  # set yields pairs  2

?持っていない初期値が必要です.key。ギャップが見つからない場合$は、リストの最後の値にn(ここでは変数に)を追加し、さらに0のエラーで1を追加します。


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