菱形シーケンス


11

成長する菱形の要素を列挙することを想像してください[1],[1,3,1],[1,3,5,3,1],…(うまく整列するような奇数のみ)。これは次のようになります。常に列挙を開始することに注意してください1

                   01
       1        02 03 04
 1   2 3 4   05 06 07 08 09          …
       5        10 11 12
                   13
(1) (1,3,1)    (1,3,5,3,1)    (1,3,5,7,5,3,1)   …

カラムの合計を開始すると[1],[2],[1,3,5],[4],[5],[2,6,10],…菱形のシーケンスが得られます。これらは、シーケンスの最初の100要素です。

1,2,9,4,5,18,35,24,9,10,33,60,91,70,45,16,17,54,95,140,189,154,115,72,25,26,81,140,203,270,341,288,231,170,105,36,37,114,195,280,369,462,559,484,405,322,235,144,49,50,153,260,371,486,605,728,855,754,649,540,427,310,189,64,65,198,335,476,621,770,923,1080,1241,1110,975,836,693,546,395,240,81,82,249,420,595,774,957,1144,1335,1530,1729,1564,1395,1222,1045,864,679,490,297,100

IO

次の3つの入出力メソッドのいずれかを自由に選択できます(無効な入力を処理する必要はありません)。

  • 整数nを指定すると、そのシーケンスのn番目の要素が出力されます(0インデックスまたは1インデックス、選択)
  • 整数nが与えられた場合、そのシーケンスの最初のn個の要素
  • シーケンスを無制限に印刷/返す

テストケース

上記の最初の100の用語を参照してください。ここにいくつかの大きな例を示します(1-indexed):

101 -> 101
443 -> 1329
1000 -> 49000    
1984 -> 164672
2017 -> 34289
2018 -> 30270
3000 -> 153000

回答:


3

雪だるま、72バイト

((}1vn2nD#`nPnCdU!*2nM1`nR:#nSNaB#`nS2nMNdE;aM|#NdE2nP+#`nSNdE`|aA#nM*))

これは、インデックスが1の入力を受け取り、permavarを介して対応する出力を返すサブルーチンです+

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

((        // begin subroutine
 }        // we'll only need 3 variables - b, e, g
 1vn2nD   // b = 0.5
 #`       // retrieve input and swap, now b = input and e = 0.5
 nP       // power, resulting in b=sqrt(input)
 nC       // ceiling - this gives the index i of the rhombus we want
 dU!*     // keep a copy of i in the permavar ! for later use
 2nM1`nR  // generate the range [1, 2i)
 :        // map the following block over the range...
  #nS     // subtract i, resulting in e.g. [-3 -2 -1 0 1 2 3] for i=4
  NaB     // absolute value - [3 2 1 0 1 2 3]
  #`nS    // subtract from i, giving [1 2 3 4 3 2 1]
  2nMNdE  // double and decrement, [1 3 5 7 5 3 1]
 ;aM      // map
 |        // shove the rhombus columns into g
 #NdE2nP  // b = (i-2)^2
 +#`      // move b into e and replace it with the original input
 nSNdE    // subtract the two and decrement, giving input-(i-2)^2-1
 `|aA     // this is the index into the rhombus columns that we want
 #nM*     // multiply by the original input and return
))

これは、Xcoder氏の答えと基本的に同じアルゴリズムを使用します。唯一の違いは、ここで必要な菱形の列(ceil(sqrt(n))番目の列)のみを生成することです。これが機能する理由を説明するために、各菱形に対応する入力を次に示します。

rhombus #   inputs
1           1
2           2 3 4
3           5 6 7 8 9
4           10 11 12 13 14 15 16
...

左の列は、右の列の各要素の平方根の天井に正確に対応していることに注意してください。ここから1から始まるインデックスを取得するには、前の菱形のインデックスの2乗を単純に減算します。


2

ゼリー、10 バイト

Ḥ€€’ŒBFị@×

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

N番目の用語(1から始まる)を返す完全なプログラム/モナドリンク。

各合計は、列の全体リスト(入力自体)のその列のインデックスに対応する菱形のその列のインデックスを掛けたものであるため、実際に行を生成する必要はありません。

どうやって?

Œ€€ 'ŒBFị@×〜フルプログラム。入力をNと呼びます。

  €〜範囲[1、N]の各整数Xに対して。
Ḥ€〜[1、X]の範囲の各整数を2倍にします。
   '〜デクリメント(減算1)。
    ŒB〜バウンス(要素ごと)。それぞれ回文化します。
      F〜フラット化。
       ị@〜リストのインデックスNにある要素を取得します。
         ×〜Nで乗算


2

JavaScript(ES7)、42 41バイト

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

0インデックス付き。A004737から派生した閉じた形式の式。

n=>((k=n**.5|0)-Math.abs(n+k*~k))*2*++n+n

テストケース


2

Befunge、62 60バイト

&:1>:00p:*`|
00:-\*:g00:<>2-\-0v!`\g
*.@v+1<g00:<^*2g00_2*1+

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

説明

実行パスが強調表示されたソースコード

*stdinから1から始まる要素番号nを読み取り、重複を保存することから始めます。
*次に、までの整数rをカウントアップして、どの菱形にいるかを判断しますr*r >= n
*菱形cの右側からの列オフセットはr*r - nです。
*そのオフセットを中心軸の周りに反映させるには、をチェックしますc >= r
*もしそうなら、反射されたcはになりr*2 - 2 - cます。
*反映されたcを取得すると、列の合計は単純になり(c*2 + 1) * nます。



1

ゼリー、8バイト

_.ạ²€ṂḤ×

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

使い方

_.ạ²€ṂḤ×  Main link. Argument: n

_.        Subtract 0.5; yield (n - 0.5).
   ²€     Square each; yield [1², 2², ..., n²].
  ạ       Take the absolute differences of (n - 0.5) and each of the squares.
     Ṃ    Take the minimum.
      Ḥ   Unhalve; double the minimum.
       ×  Multiply the result by n.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.