最初のスパイラル、次に斜め


8

正の入力番号を指定してn、左上を時計回りに内側にらせん状にして、1〜の数のらせんを作成します。対角線の合計を取り(奇数の場合、真ん中の数は2回カウントされます)、その数を出力します。n^21nn^2

の例n = 1

1

(1) + (1) = 2

の例n = 2

1 2
4 3

(1+3) + (4+2) = 4 + 6 = 10

の例n = 4

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

(1+13+15+7) + (10+16+14+4) = 36 + 44 = 80

の例n = 5

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

(1+17+25+21+9) + (13+23+25+19+5) = 73 + 85 = 158

さらなるルールと説明

  • これはOEIS A059924であり、そのページにはいくつかの閉じた形式のソリューションがあります。
  • 入力と出力は、言語のネイティブ整数型に適合すると想定できます。
  • 入力と出力は、任意の便利な形式で指定できます
  • 私の例ではここにあるように、提出には0インデックスまたは1インデックスのどちらかを選択できます。あなたがしていることを述べてください。
  • 完全なプログラムまたは関数のいずれかを使用できます。関数の場合、出力ではなく出力を返すことができます。
  • 可能であれば、他の人があなたのコードを試すことができるように、オンラインテスト環境へのリンクを含めてください。
  • 標準の抜け穴は禁止されています。
  • これはので、すべての通常のゴルフ規則が適用され、最短のコード(バイト単位)が優先されます。

回答:


21

R43 34バイト

function(n)(8*n^3-3*n^2+4*n+3)%/%6

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

OEISページのリストについては、以下の式a(n)

(16*n^3 - 6*n^2 + 8*n + 3 - 3*(-1)^n)/12

ただし、次のPARIコードが見つかるPROGセクションに移動するために、それをスキップしました。

floor((16*n^3 - 6*n^2 + 8*n + 3 - 3*(-1^n))/12))

当然、+3-3*(-1^n)と同じな+6ので、リンクされた数式を簡略化できます。

(16*n^3-6*n^2+8*n+6)/12 -> (8*n^3-3*n^2+4*n+3)/6

およびの必要性をなくすためでは%/%なく、整数除算を使用/floorます。


1
+3-3*(-1)^n6整数の除算では違いは失われますが、は実際にはとは異なります。
fergusq 2017

@fergusqあなたは正しいですが、PARI(私が私の解決策の基礎とする)で式として与えられた式+3-3*(-1^n)はと同じ+6です。私はそれをより明白にするために私の答えを更新します。
ジュゼッペ

@Giuseppeそれの+6場合はn奇妙ですが、でもある+0n
Bergi

3
@Bergi 3-3*(-1^n)は常に6です3-3*(-1)^nが、その交互の動作があります。元の式は、それが常に12で割り切れるように、整数除算の使用が不要になりれ、後者有する
Giuseppeの

1
ああ、そうです。原作者がこれを見落としたのは変だと思いませんか?
Bergi

5

Python 2、30バイト

ジュゼッペのアプローチを移植することにより、バイトを節約しました。

lambda n:((8*n-3)*n*n+4*n+3)/6

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

パイソン2 36の  34バイト

いくつかの保存されたより多くのおかげでバイト@LeakyNun

lambda n:((8*n-3)*n*n+4*n+n%2*3)/6

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




@LeakyNunありがとうございます。
Xcoder氏2017

2
アプローチのためのジュゼッペへの30バイトのクレジット
Leaky Nun

@LeakyNun私もそれで更新していました
Xcoder氏2017

3

Mathematica、19バイト

((8#-3)#*#+4#+3)/6&

次の構文で実行できます。

((8#-3)#*#+4#+3)/6&[5]

5入力と置き換えることができる場所。

Wolfram Sandbox(Copy-Paste + Evaluate Cells)で試すことができます


3

Mathematica、19バイト

((8#-3)#*#+4#+3)/6&

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

ジュゼッペのアプローチを移植することにより、バイトを節約しました。

Mathematica、58バイト

私は常にoeisへの回答よりも与えられた質問を楽しんでいます

LinearRecurrence[{3,-2,-2,3,-1},{0,2,10,34,80},2#][[#+1]]&

閉じた形を使うのはゴルファーになりませんか?
Leaky Nun

1
多くの答えは私の単純化を使用しているので、あなたも同じようにすることができます
Giuseppe






1

Excel、35 30バイト

ジュゼッペのアプローチを使用して5バイトを節約しました。

=INT((8*A1^3-3*A1^2+4*A1+3)/6)

最初の試み:

=(8*A1^3-3*A1^2+4*A1+3*MOD(A1,2))/6

OEISからの公式の直接実装から進化(37バイト):

=(16*A1^3-6*A1^2+8*A1+3-3*(-1)^A1)/12

+3-3*(-1)^A1ロジックをに変更できます6*MOD(A1,2)

=(16*A1^3-6*A1^2+8*A1+6*MOD(A1,2))/12

バイトを保存しませんが、2バイトの共通要素を削除できます。


1

05AB1E 13  12 バイト

Leaky NunのJelly提出と同じ基本変換手法を使用

たぶん、係数のリストを作成するより短い方法がありますか? 

Datboiのおかげで-1バイト(圧縮をビートするにはスペースとラップを使用(!))

8 3(4 3)¹β6÷

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

どうやって?

8 3(4 3)¹β6÷               stack: []
8            - literal            ['8']
  3          - literal            ['8','3']
   (         - negate             ['8',-3]
    4        - literal            ['8',-3,'4']
      3      - literal            ['8',-3,'4','3']
       )     - wrap               [['8',-3,'4','3']]
        ¹    - 1st input (e.g. 4) [['8',-3,'4','3'], 4]
         β   - base conversion    [483]
          6  - literal six        [483,6]
           ÷ - integer division   [80]
             - print TOS           80

私の13代...

•VŠ•S3(1ǝ¹β6÷

•2ùë•₂в3-¹β6÷

•мå•12в3-¹β6÷

係数のリストを見つけるためにすべて圧縮を使用しています。


8 3(4 3)¹β6÷安全な1バイト(ただし、空想的な圧縮はありません)
Datboi 2017





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