Kökene Yakın Üçgen Kafes Noktaları


34

Arka fon

Bir üçgen ızgara Aşağıdaki resim üçgen ızgara örneğidir kenar uzunluğu 1 eşkenar üçgen düzenli düzlemi döşeme oluşturduğu bir ızgaradır.

Bir üçgen kafes noktası , üçgen ızgarayı oluşturan bir üçgenin tepe noktasıdır .

Köken üçgen kafes noktalarından biri olan düzlem üzerinde sabit bir nokta.

Meydan okuma

Negatif olmayan bir tamsayı verildiğinde n, orijinden Öklid uzaklığına eşit veya daha az olan üçgen kafes noktalarının sayısını bulun n.

Örnek

Aşağıdaki şekil n = 7(A noktası menşeli iken kolaylık sağlamak için sadece 60 derecelik alanı gösteren) bir örnektir :

Test Kılıfları

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

İpucu : Bu dizi OEIS A003215 değil .

kurallar

için standart kurallar geçerlidir. En kısa gönderim kazanır.

Lütfen gönderiminizdeki zorluğu nasıl çözdüğünüzü de ekleyin.


7
OEIS A053416 , yarıçaptan ziyade bir çap dairesinde bulunan nokta sayısının dizisidir n, bu nedenle istediğiniz kadar iki terim vardır.
Neil

İlgili Wikipedia ve Mathworld . Xnor'ın formülünü içerir ve kanıt içermez.
user202729

4
OEIS A004016'nın ilk n^2+1şartlarının toplamıdır .
alephalpha

Yanıtlar:


49

Python 2 , 43 bayt

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

Çevrimiçi deneyin!

Bu kara büyü.

Yazılı bir ispat için 250 temsilci sunmak. Bir kanıt ve açıklama içinLynn'in cevabınabakınız.


7
Bu nasıl çalışıyor? 30 dakikadır merak ediyorum ... Çok basit görünüyor ama bu özyineleme ile çevreler arasında bir ilişki bulamıyorum ...
JungHwan Min

7
@JungHwanMin Kanıtım, uçak geometrisi, Eisenstein tamsayıları, sayı alanları üzerinde çarpanlara ayırma, ikinci dereceden karşılıklılık, aritmetik ilerlemeler ve birbiri ardına gelen toplamlar arasındaki destansı bir yolculuktur - hepsi böyle basit bir ifade için. Hepsini yazmak şu an için zamanım olmadığına dair büyük bir girişim olacak, bu yüzden başkasının bağlantıyı daha net kılan daha basit bir kanıt olduğunu kanıtlayacağını umuyorum.
xnor

14
Kanıt . Bu, Lynn'in kendisinden daha uzun fakat daha bağımsız olanı: Eisenstein tamsayıları üzerinde çarpanlaştırmaya dair kanıtlanmamış iddialardan faydalanmıyor.
Peter Taylor

2
@ PeterTaylor Cheddar Monk? Darths & Droids'de olduğu gibi?
Neil

3
@Neil, ilk soran kişi olduğun için tebrikler! Akademideki Müzakere, Seviye 1 için bir pazarlık çipi olarak kullanmak üzere etki alanını kaydettim.
Peter Taylor

30

Haskell , 48 bayt

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

Çevrimiçi deneyin!

Xnor'ın "kara büyü" formülünü kullanır:

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

Doğruluğunun bir kanıtı ve Xnor'ın 43 byte Python ile nasıl ifade etmeyi başardığının bir açıklaması burada bulunabilir .

1Nn2N=(x+yω)(x+yω)(x,y)

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

1n2


4
Xnor "problemin golf oynamanın ardında derin matematiksel görüşler var" derken kesinlikle bunu beklemiyordum.
Bubbler

29

Wolfram Dili (Mathematica) , 53 51 50 bayt

@Miles sayesinde -1 bayt

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

Çevrimiçi deneyin!

Nasıl?

Bunu düşünmek yerine:

enter image description here

Bunun gibi düşünün:

enter image description here

Bu yüzden [[sqrt(3)/2, 0], [1/2, 1]]ikinci rakamı birincisine dönüştürmek için tranformation matrisini uyguluyoruz .

Daha sonra, daireyi üçgen ızgarada Kartezyen koordinatlarına göre bulmalıyız.

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

Böylece kafes noktaları buluruz x, y öylex^2 + x y + y^2 <= r^2

Örneğin, şununla r = 3:

enter image description here


1
Bilginize, formül x^2+x y+y^2aynı zamanda 120 derece ile Kosinüs Kanunu'ndan elde edilebilir .
Bubbler

3
x^2+x y+y^2-> x(x+y)+y^2bayt kazandırır
mil

Formül x^2 + xy + y^2ayrıca bir Eistenstein tamsayısının normundan da türetilebilir a^2 - ab + b^2. İşareti aynıdır ve bu nedenle de aynı miktarda çözüme sahip olduğundan , bu terim dışında ave bönemsiz olduğuna dikkat edin ab.
orlp


7

CJam (24 bayt)

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

Bu, yığın üzerinde bir argüman alan ve sonucu yığın üzerinde bırakan isimsiz bir bloktur (fonksiyon). Çevrimiçi test paketi . En büyük iki vakanın çok yavaş olduğuna dikkat edin.

açıklama

alephalpha , bu soruya yaptığı bir yorumda kaydetti

OEIS A004016'nın ilk n ^ 2 + 1 terimlerinin toplamıdır.

f(n)=1+6Σbir=0n23bir+1-n23bir+2

Bu formülün doğruluğuna dair kanıtım, alephalpha'nın OEIS linkinden derlenen bazı bilgilere dayanıyor:

Gf: 1 + 6 * Toplam_ {n> = 1} x ^ (3 * n-2) / (1-x ^ (3 * n-2)) - x ^ (3 * n-1) / (1- x ^ (3 x n-1)). - Paul D. Hanna, 03 Temmuz 2011

xbir

Π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+6Σk0(q3k+11-q3k+1-q3k+21-q3k+2)

Kod diseksiyonu

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

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

Çevrimiçi deneyin!

JungHwan Min'in yöntemine dayanır .

açıklama

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

Jelly ,  15  13 bayt

-2 (Dennis sayesinde) sıfıra denk gelmemesi için kareyi arttırın; fark öncesi bir dilim yerine post-fark modulo dilimi kullanarak kafadan kaçının)

Python cevabında xnor tarafından açığa çıkan cevabın üzerinde durma "kara büyü" yöntemini kullanır, ancak özyineleme yerine yinelemeyi kullanır (ve biraz daha az hesaplama yapar)

²:Ѐ‘$Im3S×6C

Negatif olmayan bir tamsayıyı kabul eden ve pozitif bir tamsayı döndüren monadik bir bağlantı.

Çevrimiçi deneyin! Veya test odasına bakın .

Nasıl?

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

Bu @ JungHwanMin'in çözümünün limanı .

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

Çevrimiçi deneyin!


Orijinal cevap (ES7), 70 bayt

Basitçe ızgara boyunca yürür ve eşleşen noktaları sayar.

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

Çevrimiçi deneyin!


Portlandor xnor'ın cevabı daha kısa: 42 byte ( eğer tamsayı da bölersek 46 trueyerine 1). Ve tamsayı-bölmeleri golf ~~(a/b)
oynamak


1

Pari / GP , 42 bayt

Yerleşik kullanımı qfrep.

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

qfrep (q, B, {flag = 0}): integral ve kesin kuadratik form q için 1'den B'ye norm vektörlerinin sayısının (yarısı) vektörü. Bayrak 1 ise, 1 ila 2B arasındaki norm çiftlerini sayın.

Çevrimiçi deneyin!


0

C # (Visual C # Etkileşimli Derleyici) , 68 bayt

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

Çevrimiçi deneyin!

Maalesef diğer herkesle aynı. Muhtemelen bunu yazmanın daha iyi bir yolu olduğunu biliyorum, ama aynı anda c # ile aynı anda bir lambda ilan etmek ve çağırmak tam olarak yaptığım bir şey değil. Savunmam olsa da, bunu yapmak için iyi bir neden (dış kod golf, elbette) düşünemiyorum. Yine de, birileri bunu nasıl yapabileceğinizi biliyorsa, bana bildirin ve / veya krediyi çalın.



0

05AB1E , 15 bayt

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

Port @JonathanAllan s Jelly cevap sırayla bir türevidir, @ XNOR en 'kara büyü' formülü .

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.