Điểm lưới tam giác gần với điểm gốc


34

Lý lịch

Một lưới tam giác là một mạng lưới hình thành bởi ốp lát các máy bay thường xuyên với tam giác đều có độ dài phía 1. Bức tranh dưới đây là một ví dụ về một mạng lưới tam giác.

Một điểm mạng tam giác là một đỉnh của một tam giác tạo thành lưới tam giác.

Các nguồn gốc là một điểm cố định trên mặt phẳng, đó là một trong những điểm lưới tam giác.

Thử thách

Cho một số nguyên không âm n, tìm số điểm mạng tam giác có khoảng cách Euclide từ gốc tọa độ nhỏ hơn hoặc bằng n.

Thí dụ

Hình dưới đây là một ví dụ cho n = 7(chỉ hiển thị khu vực 60 độ để thuận tiện, với điểm A là điểm gốc):

Các trường hợp thử nghiệm

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

Gợi ý : Trình tự này không phảiOEIS A003215 .

Quy tắc

Quy tắc tiêu chuẩn cho áp dụng. Bài nộp ngắn nhất sẽ thắng.

Vui lòng bao gồm cách bạn giải quyết các thách thức trong trình của bạn.


7
OEIS A053416 là chuỗi số điểm chứa trong một vòng tròn đường kính chứ không phải bán kính n, do đó, có gấp đôi số thuật ngữ bạn muốn.
Neil

WikipediaMathworld có liên quan . Chứa công thức của xnor và không chứng minh.
dùng202729

4
Nó là tổng của các n^2+1điều khoản đầu tiên của OEIS A004016 .
alephalpha

Câu trả lời:


49

Python 2 , 43 byte

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

Hãy thử trực tuyến!

Đây là ma thuật đen.

Cung cấp 250 đại diện cho một bằng chứng bằng văn bản. Xemcâu trả lời của Lynncho một bằng chứng và giải thích.


7
Cái này hoạt động ra sao? Tôi đã tự hỏi trong 30 phút tốt ... Trông thật đơn giản nhưng tôi không thể tìm thấy mối quan hệ giữa đệ quy và vòng tròn đó ...
JungHwan Min

7
@JungHwanMin Bằng chứng của tôi là một hành trình sử thi thông qua hình học phẳng, số nguyên Eisenstein, hệ số hóa trên các trường số, tính tương hỗ bậc hai, tiến trình số học và tổng kết xen kẽ - tất cả chỉ vì một biểu thức đơn giản như vậy. Viết tất cả sẽ là một công việc chính mà bây giờ tôi không có thời gian, vì vậy tôi hy vọng người khác sẽ đưa ra một bằng chứng, có thể là một điều đơn giản hơn mà tôi làm cho kết nối rõ ràng hơn.
xnor

14
Bằng chứng . Cái này dài hơn Lynn nhưng khép kín hơn: nó không sử dụng các xác nhận chưa được chứng minh về yếu tố đối với các số nguyên Eisenstein.
Peter Taylor

2
@PeterTaylor Cheddar Monk? Như trong Darths & Droids?
Neil

3
@Neil, xin chúc mừng bạn là người đầu tiên từng hỏi! Tôi đã đăng ký tên miền để sử dụng nó như một con chip thương lượng cho Đàm phán, Cấp 1 trong Học viện.
Peter Taylor

30

Haskell , 48 byte

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

Hãy thử trực tuyến!

Sử dụng công thức "ma thuật đen" của xnor:

f(n)=1+6a=0n23a+1n23a+2

Bằng chứng về tính chính xác của nó và giải thích về cách xnor quản lý để thể hiện nó trong 43 byte Python, có thể được tìm thấy ở đây .

Dài truyện ngắn: chúng tôi đếm Eisenstein số nguyên định mức , bằng cách thanh toán N = ( x + y ω ) ( x + y ω * ) vào số nguyên tố Eisenstein và đếm có bao nhiêu giải pháp cho ( x , y ) đi ra của các yếu tố. Chúng tôi nhận ra số lượng các giải pháp là bằng1Nn2N=(x+yω)(x+yω)(x,y)

6×((# of divisors of N1 (mod 3))(# of divisors of N2 (mod 3)))

và áp dụng một mẹo thông minh để làm cho việc tính toán thực sự dễ dàng cho tất cả các số nguyên từ đến n 2 cùng một lúc. Điều này mang lại công thức trên. Cuối cùng, chúng tôi áp dụng một số phép thuật chơi gôn Python để kết thúc với giải pháp xnor thực sự nhỏ bé được tìm thấy.1n2


4
Tôi chắc chắn không mong đợi điều này khi xnor nói "có một số hiểu biết sâu sắc về toán học đằng sau vấn đề đánh gôn".
Bong bóng

29

Ngôn ngữ Wolfram (Mathicala) , 53 51 50 byte

-1 byte nhờ @miles

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

Hãy thử trực tuyến!

Làm sao?

Thay vì suy nghĩ trong này:

nhập mô tả hình ảnh ở đây

Hãy nghĩ về nó như thế này:

nhập mô tả hình ảnh ở đây

Vì vậy, chúng tôi áp dụng ma trận thông tin [[sqrt(3)/2, 0], [1/2, 1]] biến đổi để biến đổi hình thứ hai thành hình thứ nhất.

Sau đó, chúng ta phải tìm vòng tròn trong lưới tam giác theo tọa độ Descartes.

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

Vì vậy, chúng tôi tìm thấy các điểm lưới x, ysao chox^2 + x y + y^2 <= r^2

Ví dụ r = 3: với :

nhập mô tả hình ảnh ở đây


1
FYI, công thức x^2+x y+y^2cũng có thể được bắt nguồn từ Luật Cosines với 120 độ.
Bong bóng

3
x^2+x y+y^2-> x(x+y)+y^2tiết kiệm một byte
dặm

Công thức x^2 + xy + y^2cũng có thể được bắt nguồn từ định mức của một số nguyên Eistenstein, đó là a^2 - ab + b^2. Lưu ý rằng dấu hiệu của abkhông liên quan ngoại trừ trong thuật ngữ abđể nó có cùng số lượng giải pháp.
orlp


7

CJam (24 byte)

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

Đây là một khối ẩn danh (hàm) nhận một đối số trên ngăn xếp và để lại kết quả trên ngăn xếp. Bộ kiểm tra trực tuyến . Lưu ý rằng hai trường hợp lớn nhất là quá chậm.

Giải trình

alephalpha lưu ý trong một bình luận về câu hỏi đó

Nó là tổng của các điều khoản n ^ 2 + 1 đầu tiên của OEIS A004016

f(n)=1+6a=0n23a+1n23a+2

Bằng chứng chính xác của tôi về công thức đó dựa trên một số thông tin lượm lặt được từ liên kết OEIS của alephalpha:

Gf: 1 + 6 * Sum_ {n> = 1} x ^ (3 * n-2) / (1-x ^ (3 * n-2)) - x ^ (3 * n-1) / (1- x ^ (3 * n-1)). - Paul D. Hanna, ngày 03 tháng 7 năm 2011

xmột

Πk= =0(1-qk+1)(1+xqk+1)(1+x-1qk)= =ΣkZqk(k+1)/2xk
Σm,nZωm-nqm2+mn+n2= =Πk= =1(1-qk)31-q3k
ω
m,nZqm2+mn+n2=1+6k0(q3k+11q3k+1q3k+21q3k+2)

Bóc tách mã

{          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 byte

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

Hãy thử trực tuyến!

Dựa trên phương pháp của JungHwan Min .

Giải trình

[:+/@,*:>:(*++&*:)"{~@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

Thạch ,  15  13 byte

-2 nhờ Dennis (chỉ cần tăng bình phương để tránh ghép số 0; tránh đầu bằng cách sử dụng lát cắt modulo sau chênh lệch thay vì lát cắt chênh lệch trước)

Sử dụng phương pháp "ma thuật đen" để mài giũa câu trả lời đã được xnor đưa ra trong câu trả lời Python của họ , nhưng sử dụng phép lặp chứ không phải đệ quy (và tính toán ít hơn một chút)

²:Ѐ‘$Im3S×6C

Một liên kết đơn âm chấp nhận một số nguyên không âm và trả về một số nguyên dương.

Hãy thử trực tuyến! Hoặc xem bộ thử nghiệm .

Làm sao?

²:Ѐ‘$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 byte

Đây là một cổng của giải pháp @ 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))

Hãy thử trực tuyến!


Câu trả lời gốc (ES7), 70 byte

Đơn giản chỉ cần đi qua lưới và đếm các điểm phù hợp.

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))

Hãy thử trực tuyến!


Câu trả lời của xnor ngắn hơn: 42 byte (đầu ra truethay vì 1; 46 nếu chúng ta cũng chia số nguyên). Và tôi không biết đủ về JavaScript để phân chia số nguyên ~~(a/b), nhưng tôi chắc chắn có một cách ngắn hơn cho những người đó ..
Kevin Cruijssen


1

Pari / GP , 42 byte

Sử dụng tích hợp qfrep.

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

qfrep (q, B, {flag = 0}): vectơ của (một nửa) số lượng vectơ của định mức từ 1 đến B cho dạng bậc hai tích phân và xác định q. Nếu cờ là 1, đếm các vectơ của định mức chẵn từ 1 đến 2B.

Hãy thử trực tuyến!


0

C # (Trình biên dịch tương tác Visual C #) , 68 byte

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);}

Hãy thử trực tuyến!

Giống như mọi người khác, thật không may. Tôi biết có lẽ có một cách tốt hơn để viết điều này, nhưng tuyên bố và gọi lambda cùng một lúc trong c # không chính xác là điều tôi làm, tốt, bao giờ hết. Mặc dù trong phòng thủ của tôi, tôi không thể nghĩ ra một lý do chính đáng (tất nhiên là ngoài môn đánh gôn) để làm điều đó. Tuy nhiên, nếu ai đó biết làm thế nào bạn có thể làm điều này, hãy cho tôi biết và / hoặc đánh cắp tín dụng, tôi đoán vậy.



0

05AB1E , 15 byte

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

Cảng @JonathanAllan s câu trả lời Jelly , do đó là một dẫn xuất từ @ XNOR của 'ma thuật đen' công thức .

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.