原点に近い三角形の格子点


34

バックグラウンド

三角グリッドは写真の下三角格子の一例である辺の長さ1の正三角形と定期的に平面をタイリングすることにより形成されたグリッドです。

三角格子点三角格子を形成する三角形の頂点です。

原点は、三角格子点の一つである平面上の固定点です。

チャレンジ

非負の整数が与えられた場合n、原点からのユークリッド距離がより小さいか等しい三角形の格子点の数を見つけますn

次の図は、(例としてn = 7、ポイントAを原点として60度の領域のみを示しています)の例です。

テストケース

Input | Output
---------------
    0 |       1
    1 |       7
    2 |      19
    3 |      37
    4 |      61
    5 |      91
    6 |     127
    7 |     187
    8 |     241
    9 |     301
   10 |     367
   11 |     439
   12 |     517
   13 |     613
   14 |     721
   15 |     823
   16 |     931
   17 |    1045
   18 |    1165
   19 |    1303
   20 |    1459
   40 |    5815
   60 |   13057
   80 |   23233
  100 |   36295
  200 |  145051
  500 |  906901
 1000 | 3627559

ヒント:このシーケンスはOEIS A003215ではありません

ルール

標準ルールが適用されます。最短の提出が勝ちです。

課題をどのように解決したかを提出してください。


7
OEIS A053416は、radiusではなく直径の円に含まれるポイント数のシーケンスであるnため、必要な2倍の用語があります。
ニール

関連するウィキペディアMathworld。証明ではなくxnorの式が含まれています。
user202729

4
これは、OEIS A004016の最初のn^2+1用語の合計です。
alephalpha

回答:


49

Python 2、43バイト

f=lambda n,a=1:n*n<a/3or n*n/a*6-f(n,a+a%3)

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

これは黒魔術です。

文書化された証拠として250人の担当者提供します。証拠と説明については、リンの回答を参照してください。


7
これはどのように作動しますか?...私は...それはとてもシンプルに見える利益のために30分を思ってきたが、私はその再帰と円との間の関係を見つけることができません
JungHwan分

7
@JungHwanMin私の証明は、平面幾何学、アイゼンシュタイン整数、数体上の因数分解、二次相反性、算術的進行、および交換合計の壮大な旅です。それをすべて書くことは、今のところ時間がないという大きな仕事ですので、他の誰かが証明を与えてくれることを望んでいます。
xnor

14
証明。これは、Lynnのものよりも長くなりますが、より自己完結型です。アイゼンシュタイン整数の因数分解に関する実証されていない主張を使用しません。
ピーターテイラー

2
@PeterTaylorチェダーモンク?ダース&ドロイドのように?
ニール

3
@Neil、最初に聞いてくれてありがとう!アカデミーの交渉レベル1の交渉チップとして使用するドメインを登録しました。
ピーターテイラー

30

Haskell、48バイト

f n=1+6*sum[(mod(i+1)3-1)*div(n^2)i|i<-[1..n^2]]

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

xnorの「ブラックマジック」公式を使用します。

fn=1+6a=0n23a+1n23a+2

その正当性の証拠と、xnorが43バイトのPythonでそれを表現する方法の説明は、ここにあります

1Nn2N=バツ+yωバツ+yωバツy

6×の約数 N1 mod 3の約数 N2 mod 3

1n2


4
xnorが「問題のゴルフの背後にある数学的深い洞察がある」と言ったとき、私は確かにこれを期待していなかった。
バブラー

29

Wolfram言語(Mathematica)53 51 50バイト

@milesのおかげで-1バイト

Sum[Boole[x(x+y)+y^2<=#^2],{x,-2#,2#},{y,-2#,2#}]&

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

どうやって?

これを考える代わりに:

ここに画像の説明を入力してください

次のように考えてください:

ここに画像の説明を入力してください

したがって、変換行列を適用します [[sqrt(3)/2, 0], [1/2, 1]]、2番目の図を最初の図に変換します。

次に、デカルト座標で三角形グリッド内の円を見つける必要があります。

(sqrt(3)/2 x)^2 + (1/2 x + y)^2 = x^2 + x y + y^2

私たちは、格子点を見つけるのでx, y、このようなx^2 + x y + y^2 <= r^2

たとえば、とr = 3

ここに画像の説明を入力してください


1
参考x^2+x y+y^2までに、この式は120度の余弦法則から導出することもできます。
バブラー

3
x^2+x y+y^2-> x(x+y)+y^21バイトを節約
マイル

この式x^2 + xy + y^2は、Eistenstein整数のノルムから導出することもできa^2 - ab + b^2ます。符号ことに注意してくださいaとは、b用語を除いては無関係であるabことは、溶液の同量を有しているので。
orlp


7

CJam(24バイト)

{_*_,f{)_)3%(@@/*}1b6*)}

これは、スタック上の引数を1つ受け取り、結果をスタックに残す匿名ブロック(関数)です。オンラインテストスイート。最大の2つのケースは遅すぎることに注意してください。

説明

alephalphaは、質問に関するコメントで次のように述べています。

OEIS A004016の最初のn ^ 2 + 1項の合計です

fn=1+6a=0n23a+1n23a+2

その式の正当性の私の証明は、alephalphaのOEISリンクから収集したいくつかの情報に基づいています。

Gf:1 + 6 * Sum_ {n> = 1} x ^(3 * n-2)/(1-x ^(3 * n-2))-x ^(3 * n-1)/(1- x ^(3 * n-1))。-ポールD.ハンナ、2011年7月3日

バツa

k=01qk+11+バツqk+11+バツ1qk=kZqkk+1/2バツk
mnZωmnqm2+mn+n2=k=11qk31q3k
ω
mnZqm2+mn+n2=1+6k0q3k+11q3k+1q3k+21q3k+2

コード分​​析

{          e# Define a block. Stack: ... r
  _*       e#   Square it
  _,f{     e#   Map with parameter: invokes block for (r^2, 0), (r^2, 1), ... (r^2, r^2-1)
    )      e#     Increment second parameter. Stack: ... r^2 x with 1 <= x <= r^2
    _)3%(  e#     Duplicate x and map to whichever of 0, 1, -1 is equal to it (mod 3)
    @@/*   e#     Evaluate (r^2 / x) * (x mod 3)
  }
  1b6*     e#   Sum and multiply by 6
  )        e#   Increment to count the point at the origin
}

4

J、27バイト

[:+/@,*:>:(*++&*:)"{~@i:@+:

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

ジョンファンミンの方法に基づくます。

説明

[:+/@,*:>:(*++&*:)"{~@i:@+:  Input: n
                         +:  Double
                      i:     Range [-2n .. 2n]
                  "{~        For each pair (x, y)
                *:             Square both x and y
              +                Add x^2 and y^2
             +                 Plus
            *                  Product of x and y
        >:                   Less than or equal to
      *:                     Square of n
     ,                       Flatten
  +/                         Reduce by addition



3

ゼリー 15  13 バイト

-2 Dennisのおかげです(ゼロの連結を避けるために正方形をインクリメントするだけです;差分前スライスではなく差分後モジュロスライスを使用して頭を回避します)

Pythonのanswerでxnorによって公開された答えに「ブラックマジック」法を使用しますが、再帰ではなく反復を使用します(計算は少し少なくなります)。

²:Ѐ‘$Im3S×6C

負でない整数を受け入れ、正の整数を返す単項リンク。

オンラインでお試しください!または、テストスイートを参照してください。

どうやって?

²:Ѐ‘$Im3S×6C - Main Link: non-negative integer, n     e.g. 7
²             - square                                     49
     $        - last two links as a monad:
    ‘         -   increment                                50
  Ѐ          -   map across (implicit range of) right with:
 :            -     integer division                       [49,24,16,12,9,8,7,6,5,4,4,4,3,3,3,3,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0]
      I       - incremental differences                    [-25,-8,-4,-3,-1,-1,-1,-1,-1,0,0,-1,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1]
       m3     - every third element                        [-25,-3,-1,0,0,-1,0,0,0,0,0,0,0,0,0,0,-1]
         S    - sum (vectorises)                           -31
          ×6  - multiply by six                           -186
            C - complement (1-X)                           187

2

JavaScript(ES6)、65バイト

これは@JungHwanMinのソリューションの移植版です。

f=(n,y=x=w=n*2)=>y-~w&&(x*x+x*y+y*y<=n*n)+f(n,y-=--x<-w&&(x=w,1))

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


元の回答(ES7)、70バイト

単にグリッドを歩いて、一致するポイントをカウントします。

f=(n,y=x=n*=2)=>y+n+2&&(x*x*3+(y-x%2)**2<=n*n)+f(n,y-=--x<-n&&(x=n,2))

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


xnorのポーティングの答えは短くなります:42バイト(整数除算の場合は46のtrue代わりに出力1)。そして、私はゴルフに十分整数部門JavaScriptを知らない~~(a/b)..しかし、私は確かにそれらのための短い道はそこにもあるよ
ケビンCruijssen


1

パリ/ GP、42バイト

組み込みのを使用しqfrepます。

n->1+2*vecsum(Vec(qfrep([2,1;1,2],n^2,1)))

qfrep(q、B、{flag = 0}):積分および2次形式qに対する1からBまでのノルムのベクトルの数(半分)のベクトル。flagが1の場合、1〜2Bの偶数ノルムのベクトルをカウントします。

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


0

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

n=>{int g(int x,int y)=>x*x<y/3?1:x*x/y*6-g(x,y+y%3);return g(n,1);}

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

残念ながら、他のみんなと同じです。これを書くもっと良い方法があると思いますが、c#で同時にラムダを宣言して呼び出すことは、私がやっていることではありません。私の防御では、そうする正当な理由(もちろんゴルフ以外)を考えることはできません。それでも、あなたがこれを行う方法を誰かが知っているなら、私に知らせて、そして/またはクレジットを盗むと思います。



0

05AB1E、15 バイト

nD>L÷¥ā3%ÏO6*±Ì

@JonathanAllanのJelly回答のポート。これは、@ xnorの「ブラックマジック」の公式から派生したものです。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

n                # Square the (implicit) input-integer
 D>              # Duplicate it, and increase the copy by 1
   L             # Create a list in the range [1, input^2+1]
    ÷            # Integer divide input^2 by each of these integers
     ¥           # Take the deltas
      ā          # Push a list in the range [1, length] without popping the deltas itself
       3%        # Modulo each by 3
         Ï       # Only leave the values at the truthy (==1) indices
          O      # Take the sum of this list
           6*    # Multiply it by 6
             ±   # Take the bitwise NOT (-n-1)
              Ì  # And increase it by 2
                 # (after which the result is output implicitly)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.