จุดขัดแตะสามเหลี่ยมใกล้กับจุดกำเนิด


34

พื้นหลัง

ตารางสามเหลี่ยมเป็นตารางที่เกิดขึ้นจากการปูกระเบื้องเครื่องบินเป็นประจำกับรูปสามเหลี่ยมด้านเท่าของความยาวด้าน 1. ภาพด้านล่างเป็นตัวอย่างของตารางสามเหลี่ยม

จุดตาข่ายสามเหลี่ยมเป็นจุดสุดยอดของรูปสามเหลี่ยมรูปสามเหลี่ยมตาราง

กำเนิดเป็นจุดคงที่บนเครื่องบินซึ่งเป็นหนึ่งในจุดตาข่ายสามเหลี่ยม

ท้าทาย

ได้รับจำนวนเต็มไม่เป็นลบn, nค้นหาหมายเลขของจุดขัดแตะรูปสามเหลี่ยมที่มีระยะทางยุคลิดจากจุดกำเนิดคือน้อยกว่าหรือเท่ากับ

ตัวอย่าง

รูปต่อไปนี้เป็นตัวอย่างสำหรับn = 7(แสดงเฉพาะพื้นที่ 60 องศาเพื่อความสะดวกโดยมีจุด A เป็นจุดกำเนิด):

กรณีทดสอบ

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คือลำดับของจำนวนจุดที่มีอยู่ในวงกลมที่มีเส้นผ่านศูนย์กลางมากกว่ารัศมีnดังนั้นจึงมีคำสองเท่าตามที่คุณต้องการ
Neil

ที่เกี่ยวข้องวิกิพีเดียและMathworld มีสูตรของ xnor และไม่สามารถพิสูจน์ได้
user202729

4
มันคือผลรวมของแรกn^2+1แง่ของOEIS A004016
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 นาทีแล้ว ... มันดูเรียบง่าย แต่ฉันไม่สามารถหาความสัมพันธ์ระหว่างการเที่ยวซ้ำกับแวดวง ...
จองฮันมิน

7
@JungHwanMin หลักฐานของฉันคือการเดินทางครั้งยิ่งใหญ่ผ่านเรขาคณิตระนาบจำนวนเต็ม Eisenstein การแยกตัวประกอบผ่านเขตข้อมูลจำนวนการแลกเปลี่ยนกำลังสองกำลังสองการดำเนินการทางคณิตศาสตร์ การเขียนมันทั้งหมดจะเป็นภารกิจสำคัญที่ฉันไม่มีเวลาในตอนนี้ดังนั้นฉันหวังว่าจะมีคนอื่นที่จะให้การพิสูจน์น่าจะง่ายกว่าที่ฉันจะทำให้การเชื่อมต่อชัดเจนขึ้น
xnor

14
พิสูจน์ สิ่งนี้ยาวกว่าของ Lynn แต่มีอยู่ในตัวเองมากกว่า: มันไม่ได้ใช้การยืนยันที่ไม่ได้รับการพิสูจน์เกี่ยวกับการแยกตัวประกอบของจำนวนเต็ม Eisenstein
Peter Taylor

2
@PeterTaylor Cheddar Monk? เช่นเดียวกับ Darths & Droids?
Neil

3
@ Neil ขอแสดงความยินดีกับการเป็นคนแรกที่เคยถาม! ฉันลงทะเบียนโดเมนเพื่อใช้เป็นชิปต่อรองสำหรับการเจรจาระดับ 1 ในสถาบันการศึกษา
Peter Taylor

30

Haskell , 48 ไบต์

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

ลองออนไลน์!

ใช้สูตร "มนต์ดำ" ของ xnor:

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

พิสูจน์ความถูกต้องของตนและคำอธิบายวิธี XNOR การจัดการที่จะแสดงมันออกมาใน 43 ไบต์ของงูใหญ่สามารถพบได้ที่นี่

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

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

1n2


4
ฉันไม่ได้คาดหวังสิ่งนี้อย่างแน่นอนเมื่อ xnor พูดว่า "มีข้อมูลเชิงลึกทางคณิตศาสตร์บางประการเกี่ยวกับการตีกอล์ฟ"
Bubbler

29

ภาษา Wolfram (Mathematica) , 53 51 50 ไบต์

-1 ไบต์ขอบคุณ @miles

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

ลองออนไลน์!

อย่างไร?

แทนที่จะคิดในสิ่งนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ลองคิดดูสิ:

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นเราจึงใช้เมทริกซ์[[sqrt(3)/2, 0], [1/2, 1]]เปลี่ยนรูปเพื่อแปลงรูปที่สองเป็นอันแรก

จากนั้นเราจะต้องค้นหาวงกลมในตารางสามเหลี่ยมในแง่ของพิกัดคาร์ทีเซียน

(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
FYI สูตรx^2+x y+y^2นี้ยังสามารถได้มาจากกฎของ Cosinesด้วย 120 องศา
Bubbler

3
x^2+x y+y^2-> x(x+y)+y^2บันทึกไบต์
ไมล์

สูตรx^2 + xy + y^2นี้ยังสามารถนำมาจากบรรทัดฐานของจำนวนเต็ม Eistenstein a^2 - ab + b^2ซึ่งเป็น โปรดทราบว่าสัญญาณของaและbไม่เกี่ยวข้องยกเว้นในระยะabจึงมีวิธีการแก้ปัญหาจำนวนเดียวกัน
orlp


7

CJam (24 ไบต์)

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

นี่คือบล็อกที่ไม่ระบุชื่อ (ฟังก์ชัน) ซึ่งรับอาร์กิวเมนต์หนึ่งตัวบนสแต็กและปล่อยผลลัพธ์ไว้บนสแต็ก ชุดทดสอบออนไลน์ โปรดทราบว่าทั้งสองกรณีที่ใหญ่ที่สุดช้าเกินไป

คำอธิบาย

alephalphaตั้งข้อสังเกตในความเห็นเกี่ยวกับคำถามที่ว่า

มันคือผลรวมของเงื่อนไข n ^ 2 + 1 แรกของOEIS A004016

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

การพิสูจน์ความถูกต้องของสูตรนั้นขึ้นอยู่กับข้อมูลบางส่วนที่รวบรวมได้จากลิงก์ OEIS ของ alephalpha:

Gf: 1 + 6 * ผลรวม _ {n> = 1} x ^ (3 * n-2) / (1-x ^ (3 * n-2)) - x ^ (3 * n-1) / (1- x ^ (3 * n-1)) - Paul D. Hanna, Jul 03 2011

xa

k=0(1qk+1)(1+xqk+1)(1+x1qk)=kZqk(k+1)/2xk
m,nZωmnqm2+mn+n2=k=1(1qk)31q3k
ω
m,nZqm2+mn+n2=1+6k0(q3k+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 ต้องขอบคุณเดนนิส (เพียงเพิ่มตารางเพื่อหลีกเลี่ยงการรวมศูนย์เป็นศูนย์; หลีกเลี่ยงการใช้หัวโดยใช้โมดูโล - ชิ้นที่แตกต่างกันแทนที่จะเป็นชิ้นก่อนความแตกต่าง)

ใช้วิธี "มนต์ดำ" ในการสร้างคำตอบที่ถูกเปิดเผยโดย xnor ในคำตอบของPythonแต่ใช้การวนซ้ำมากกว่าการเรียกซ้ำ (และการคำนวณน้อยกว่าเล็กน้อย)

²:Ѐ‘$Im3S×6C

ลิงก์ monadic ยอมรับจำนวนเต็มที่ไม่เป็นลบและส่งคืนจำนวนเต็มบวก

ลองออนไลน์! หรือดูการทดสอบในตัว

อย่างไร?

²:Ѐ‘$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 ไบต์

นี่คือพอร์ตของ@ วิธีการแก้ปัญหาของ

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 ไบต์ (เอาท์พุทtrueแทน1; 46 ถ้าเรายังหารจำนวนเต็มด้วย) และฉันไม่รู้จัก JavaScript ดีพอที่จะเล่นกอล์ฟจำนวนเต็ม~~(a/b)แต่ฉันแน่ใจว่ามีวิธีที่สั้นกว่าสำหรับพวกนั้นเช่นกัน ..
Kevin Cruijssen


1

Pari / GP , 42 ไบต์

การใช้งานในqfrepตัว

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

qfrep (q, B, {flag = 0}): vector ของ (ครึ่ง) จำนวนเวกเตอร์ของ norms จาก 1 ถึง B สำหรับรูปแบบสมการกำลังสองหนึ่งรูป หากการตั้งค่าสถานะเป็น 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คำตอบวุ้นซึ่งเป็นอนุพันธ์จาก@ 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.