らせん順列


17

自然数を長方形の渦巻きにまとめることができます:

 17--16--15--14--13
  |               |
 18   5---4---3  12
  |   |       |   |
 19   6   1---2  11
  |   |           |
 20   7---8---9--10
  |
 21--22--23--24--25

しかし、今では長方形のグリッド上にそれらを持っているので、別の順序でスパイラルを巻き戻すことができます。

 17  16--15--14--13
  |   |           |
 18   5   4---3  12
  |   |   |   |   |
 19   6   1   2  11
  |   |       |   |
 20   7---8---9  10
  |               |
 21--22--23--24--25

結果のシーケンスは明らかに自然数の順列です:

1, 4, 3, 2, 9, 8, 7, 6, 5, 16, 15, 14, 13, 12, 11, 10, 25, 24, 23, 22, 21, 20, 19, 18, 17, ...

あなたの仕事は、このシーケンスを計算することです。(OEIS A020703ですが、ネタバレ警告:別の興味深い定義と、自分で理解したいかもしれないいくつかの式が含まれています。)

おもしろい事実:巻き戻し可能な8つの注文にはすべて、独自のOEISエントリがあります。

チャレンジ

正の整数を指定すると、上記のシーケンスのth番目の要素をn返しnます。

プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、STDOUT(または最も近い代替)、関数の戻り値または関数(out)パラメーターを介して結果を出力できます。

標準の規則が適用されます。

テストケース

1       1
2       4
3       3
4       2
5       9
6       8
7       7
8       6
9       5
100     82
111     111
633     669
1000    986
5000    4942
9802    10000
10000   9802

n = 11131 OEISまでの完全なリストについては、OEISのbファイル参照してください

回答:


6

ゼリー、11 10バイト

’ƽð²+ḷ‘Ḥ_

電話で別のゼリーが答えます。

’ƽð²+ḷ‘Ḥ_   A monadic hook:
’ƽ          Helper link. Input: n
’             n-1
 ƽ            Atop integer square root. Call this m.
   ð         Start a new dyadic link. Inputs: m, n
    ²+ḷ‘Ḥ_    Main link:
    ²+ḷ       Square m, add it to itself,
       ‘      and add one.
        Ḥ     Double the result
         _    and subtract n.

ここで試してみてください


Jellyを使い始めるためのヒントはありますか?フォーク/フックがどのように解析されるのかまったくわかりません。
リン

最初にAPLまたはJを学びます。関数はすべて固定アリティを持っているため、チェーンは実際には列車よりも簡単です。
lirtosiast

そうですか。ええ、私はJの経験があります。jelly.pyどのチェーンがサポートされているかを読んで理解しようとするでしょう。
リン

2
どうやって携帯電話で入力したの!?コード自体よりも印象的です!
DJMcMayhem

8

Japt、20 19 16バイト

V=U¬c)²-V *2-U+2

オンラインでテストしてください!

その観察に基づいて

F(N)= ceil(N ^ .5)*(ceil(N ^ .5)-1)-N + 2

または、むしろ、

F(N)= N以上の最初の平方からその平方根を引いたものからNを引いたものに2を加えたもの。

この説明がOEISページにあるかどうかは、まだ見ていませんので、わかりません。


5

ジュリア、28バイト

n->2((m=isqrt(n-1))^2+m+1)-n

これは、整数を受け入れて整数を返すラムダ関数です。呼び出すには、変数に割り当てます。

我々は定義メートルような整数最大となるように、M 2N -1、すなわちの整数平方根N -1( isqrt)。その後、OEIS式2(m + 1)m - n + 2を単純に2(m 2 + m + 1)-nに簡略化できます。

オンラインで試す


4

CJam、14バイト

qi_(mQ7Ybb2*\-

アレックスのアプローチを使用:2*(m^2+m+1)-nどこm = isqrt(n-1)


2

ES7、31の 28 26バイト

n=>(m=--n**.5|0)*++m*2-~-n

私は独立してアレックスの式を発見しましたが、当時はコンピューターの近くにいなかったので証明できません。

編集:@ETHproductionsのおかげで、3バイト節約されました。さらに2バイトを保存しました。


n=>((m=--n**.5|0)+m*m)*2-n+1動作すると思います。
ETHproductions

@ETHproductionsおかげで、私はそれを取得する方法を自分自身に思っていた--n...そこに
ニール

@ETHproductionsへー、私はあなたの答えから2バイトを削ることに成功しました。
ニール


1

MATL16 13バイト

qX^Y[tQ*Q2*G-

LynnのCJam回答に基づきます

オンラインでお試しください!(言語の変更に応じY[て置き換えられましたk

q       % input n. Subtract 1
X^      % square root
Y[      % floor
tQ      % duplicate and add 1
*       % multiply
Q       % add 1
2*      % multiply by 2
G-      % subtract n

これは、他の回答(16バイト)とは異なるアプローチを使用します

6Y3iQG2\+YLt!G=)

2つのスパイラルマトリックスを明示的に生成します(実際には、垂直に反転したバージョンですが、出力には影響しません)。最初のものは

17    16    15    14    13
18     5     4     3    12
19     6     1     2    11
20     7     8     9    10
21    22    23    24    25

そして、2番目のものは変更されたパスをトレースします。

25    10    11    12    13
24     9     2     3    14
23     8     1     4    15
22     7     6     5    16
21    20    19    18    17

見つけるために、n配列の目数をそれが見つけるために十分であるn第2のマトリックス及び第一に対応する番号を選びます。マトリックスは、表示されるように十分に大きくする必要がありnます。また、原点(数値)が両方で同じ位置になるように、奇数サイズにする必要が1あります。

オンラインでもお試しください!(6Y3言語の変更に応じて移動されました)

6Y3      % 'spiral' string
i        % input n
QG2\+    % round up to an odd number large enough
YL       % generate spiral matrix of that size: first matrix
t!       % duplicate and transpose: second matrix
G=       % logical index that locates n in the second matrix
)        % use that index into first matrix

0

Brachylog、20バイト

-1$r$[I*I+I+1=*2-?=.

これは、他のほとんどすべての回答と同じ手法を使用します。

説明

-1                   § Build the expression Input - 1
  $r                 § Square root of Input - 1
    $[I              § Unify I with the floor of this square root
       *I+I+1        § Build the expression I * I + I + 1
             =*2-?   § Evaluate the previous expression (say, M) and build the expression
                     § M * 2 - Input
                  =. § Unify the output with the evaluation of M * 2 - Input

この答えに関する興味深い事実=は、括弧よりも使用が簡単で短いことです。

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