จำนวนเต็มรูปสามเหลี่ยมที่มีเส้นรอบวงน้อยกว่า n


13

คำนิยาม

"สามเหลี่ยมจำนวนเต็ม" คืออันที่มีพิกัดจำนวนเต็ม ตัวอย่างเช่นสามเหลี่ยมต่อไปนี้เป็นสามเหลี่ยมจำนวนเต็ม:

(0, 0), (0, 1), (1, 2) with perimeter 1 + sqrt(2) + sqrt(5) ≈ 4.650.

งาน

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

อินพุตและเอาต์พุต

อาร์กิวเมนต์จะได้รับเป็นจำนวนเต็มและผลลัพธ์ควรเป็นจำนวนของรูปสามเหลี่ยมที่มีเส้นรอบวงน้อยกว่าการโต้แย้ง

ตัวอย่าง

สามเหลี่ยมจำนวนเต็มที่เล็กที่สุดโดยขอบเขตจะสอดคล้องกับ

(0, 0), (0, 1), (1, 0) which has perimeter 2 + sqrt(2) ≈ 3.414

ที่เล็กที่สุดถัดไปคือ:

(0, 0), (0, 1), (1, 2) with perimeter 1 + sqrt(2) + sqrt(5) ≈ 4.650,
(0, 0), (0, 2), (1, 1) with perimeter 2 + 2sqrt(2)          ≈ 4.828,
(0, 0), (0, 2), (1, 0) with perimeter 3 + sqrt(5)           ≈ 5.236, and
(0, 0), (1, 2), (2, 1) with perimeter sqrt(2) + 2sqrt(5)    ≈ 5.886

กรณีทดสอบ:

a(1) = 0
a(2) = 0
a(3) = 0
a(4) = 1
a(5) = 3
a(6) = 5
a(7) = 11
a(8) = 18
a(9) = 29
a(10) = 44
a(12) = 94
a(20) = 738
a(30) = 3756
a(40) = 11875

ฉันมีพิกัดสำหรับสามเหลี่ยมแต่ละรูปในส่วนสำคัญนี้

คำเตือน

ขอให้สังเกตว่าสามเหลี่ยมที่ไม่สอดคล้องกันสองรูปแบบสามารถมีขอบเขตเดียวกัน

(0, 0), (0, 3), (3, 0) and (0, 0), (0, 1), (3, 4) both have perimeter 6 + 3sqrt(2).

นอกจากนี้ยังเก็บไว้ในใจว่าความไม่เท่าเทียมกันเป็นอย่างเข้มงวด ; สามเหลี่ยมพีทาโกรัส 3-4-5 ควรนับด้วย (13) ไม่ใช่ (12)

เกณฑ์การให้คะแนน

นี่คือ - รหัสที่สั้นที่สุดชนะ!


4
ขอแสดงความยินดีกับการค้นหาลำดับที่อธิบายได้ง่ายไม่ใช่ใน OEIS
AdmBorkBork

1
ฉันมีร่างสำหรับลำดับที่เกี่ยวข้องที่ส่งไปยัง OEIS
Peter Kagey

1
(0, 0), (0, 1), (1, 0) มีขอบเขต 2 + sqrt (2) ≈ 3.14
gggg

1
ใช่สามเหลี่ยมไม่ย่อยเช่น (0,0), (1,1), (2,2) จะไม่ถูกนับ
Peter Kagey

1
อินพุตสามารถเป็นค่าจำนวนเต็มในชนิดทศนิยมหรือไม่หรือต้องเป็นประเภทอินทิกรัลด้วยหรือไม่
Janurous

คำตอบ:


7

เยลลี่ , 28 27 25 23 ไบต์

pḶŒcÆḊÐfḅı;I$€AṢ€QS€<¹S

ลองออนไลน์!

มันทำงานอย่างไร

pḶŒcÆḊÐfḅı;I$€AṢ€QS€<¹S  Main link. Argument: n

 Ḷ                       Unlength; yield [0,...,n-1].
p                        Take the Cartesian product of [1,...,n] and [0,...,n-1].
  Œc                     Take all combinations of the resulting pairs.
                         The result are of the form [[a, b], [c, d]].
    ÆḊÐf                 Filter by determinant; keep only pairs of pairs for which
                         the determinant (ad - bc) is non-zero, i.e., those such
                         that [0, 0], [a, b], and [c, d] are not collinear.
        ḅı               Convert each pair [a, b] from base i (imaginary unit) to
                         integer, mapping it to ai + b.
             €           For each pair of complex numbers [p, q]: 
          ;I$              append their forward differences, yielding [p, q, p-q].
              A          Take the absolute value of each resulting complex number.
               Ṣ€        Sort each resulting array of side lengths.
                 Q       Unique; remove duplicates.
                  S€     Take the sum of each array, computing the perimeters.
                    <¹   Compare them with n.
                      S  Take the sum of the resulting Booleans.

4

เยลลี่ ,  38  33 ไบต์

-1 ต้องขอบคุณErik the Outgolfer (กลับด้านSP¬+÷/E$โดยใช้SẠ>÷/E$และใช้ÇÐfแทนÇÐḟ) -1 ขอบคุณMr. Xcoder (ไม่จำเป็นต้องแบนก่อนจัดเรียง)
-2 ขอบคุณMr. Xcoder ( S<¥Ðf³L-> S€<³S)
-1 ขโมยเคล็ดลับจาก การแก้ไขคำตอบของเดนนิสก่อนหน้า( ṗ2’Œc-> p`⁺’- กรณีซ้ำซ้อนมากขึ้น แต่นักกอล์ฟ!)

SẠ>÷/E$
p`⁺’ÇÐfµ_/ṭ⁸²S€Ṣµ€Q½S€<³S

โปรแกรมเต็มรูปแบบรับจำนวนเต็มและพิมพ์ผลลัพธ์

ลองออนไลน์! (ช้าเกินไปที่จะทำกรณีทดสอบให้เสร็จสมบูรณ์ 20+ ในอายุต่ำกว่า 60 ปี)

อย่างไร?

SẠ>÷/E$ - Link 1, straightLineFromOrigin?: coordinates       i.e. [[a,b],[c,d]]
S       - sum                                                     [a+c,b+d]
 Ạ       - all? (0 if either of a+c or b+d are 0 otherwise 1)      all([a+c,b+d])
      $ - last two links as a monad:
   ÷/   -   reduce by division                                    [a÷c,b÷d]
     E  -   all equal?  (i.e. 1 if on a non-axial straight line)  a÷c==b÷d 
  >     - greater than? (i.e. 1 if not on any line, 0 otherwise)  all([a+c,b+d])>(a÷c==b÷d)

p`⁺’ÇÐḟµ_/ṭ⁸²S€Ṣµ€Q½S€<³S - Main link: integer, n
p`                        - Cartesian product of implicit range(n) with itself
  ⁺                       - repeat (Cartesian product of that result with itself)
   ’                      - decrement (vectorises)
                          -  - i.e. all non-negative lattice point pairs up to x,y=n-1
     Ðf                   - filter keep only if:
    Ç                     -   call last link (1) as a monad
       µ         µ€       - monadic chain for €ach:
        _/                -   reduce with subtraction i.e. [a-c,b-d]
           ⁸              -   chain's left argument, [[a,b],[c,d]]
          ṭ               -   tack                   [[a,b],[c,d],[c-a,d-b]]
            ²             -   square (vectorises)    [[a²,b²],[c²,d²],[(c-a)²,(d-b)²]]
             S€           -   sum €ach               [[a²+b²],[c²+d²],[(c-a)²+(d-b)²]]
                          -    - i.e. the squares of the triangle's edge lengths
               Ṣ          -   sort
                  Q       - de-duplicate (get one of each congruent set of triangles)
                   ½      - square root (vectorises)  - get sides from squares of sides
                    S€    - sum €ach
                       ³  - program's 3rd argument, n
                      <   - less than?
                        S -   sum (number of such triangles)
                          - implicit print

แก้ไขคำอธิบาย: [(a+c)×(b+d)]-> (a+c)×(b+d), [c÷a,d÷b]-> [a÷c,b÷d], c÷a==d÷b-> a÷c==b÷d, ->" c÷a==d÷b ฟังก์ชัน " a÷c==b÷d
Erik the Outgolfer

nanนอกจากนี้ยังมีการละเมิดที่ดีของ
Erik the Outgolfer

ขอบคุณ น่าเสียดายที่มันยังต้องการSP¬และไม่ได้ละเมิดการหารด้วยผลลัพธ์ที่เป็นศูนย์ (ฉันเดาว่ามันอาจจะชัดเจนกับของจริงหรือ)
Jonathan Allan

1
ที่จริงแล้วคุณสามารถแทนที่ด้วย¬+ <(แก้ไข: คุณไม่จำเป็นต้องแทนที่Pด้วยเนื่องจากคุณใช้เฉพาะพิกัดที่ไม่เป็นลบ)
Erik the Outgolfer

ไม่ทำงาน ( 7คืน21ตัวอย่าง)
Jonathan Allan

3

JavaScript (ES7), 157 ไบต์

f=(n,i=n**4,o={})=>i--&&([p,P,q,Q]=[0,1,2,3].map(k=>i/n**k%n|0),!o[k=[a=(H=Math.hypot)(p,P),b=H(p-q,P-Q),c=H(q,Q)].sort()]&a+b+c<n&&(o[k]=P*q!=p*Q))+f(n,i,o)

กรณีทดสอบ

สามารถคำนวณค่าขนาดเล็กได้ด้วยขนาดสแต็คเริ่มต้นของเอ็นจิน JS ส่วนใหญ่เท่านั้น


รุ่นที่ไม่ใช่แบบเรียกซ้ำได้ 165 ไบต์

n=>[...Array(n**4)].reduce((x,_,i,o)=>x+=!o[[p,P,q,Q]=[0,1,2,3].map(k=>i/n**k%n|0),k=[a=(H=Math.hypot)(p,P),b=H(p-q,P-Q),c=H(q,Q)].sort()]&(o[k]=P*q!=p*Q)&a+b+c<n,0)

กรณีทดสอบ

รุ่นนี้ยังใช้งานได้สำหรับ(30)และ(40)แต่นั่นอาจใช้เวลานานเกินไปสำหรับตัวอย่าง


2

Julia 0.6 , 135 bytes

วนซ้ำจุดที่ไม่ใช่จุดกำเนิดที่เป็นไปได้เพื่อสร้างสามเหลี่ยมแสดงถึงตัวเลขที่ซับซ้อนเรียงลำดับความยาวสแควร์และเก็บไว้ในชุดเพื่อตรวจสอบความสอดคล้องกัน หลีกเลี่ยงจุดโคลิเนียร์ด้วยการตรวจสอบว่ามุมระหว่างจำนวนเชิงซ้อนของพวกมันไม่ใช่ศูนย์ จากนั้นจะคืนค่าความยาวของชุด มันสั้นกว่าที่จะใช้ความยาวโดยตรง a(40)แต่คุณได้คำตอบที่ถูกต้องสำหรับ การแก้ปัญหาช้าเกินกว่าที่จะเรียกใช้a(40)เนื่องจากคำเตือนการคัดค้านดังนั้นฉันจึงมีลิงก์ไปยังเวอร์ชันที่เร็วกว่าเช่นกัน

n->(q=Set();for x=0:n,y=1:n,a=1:n,b=0:n
r=x+y*im
t=a+b*im
g=sort(abs2.([r,t,r-t]))
sum(√g)<n&&angle(r/t)>0&&push!(q,g)
end;length(q))

ลองออนไลน์!

เร็วขึ้นรุ่นที่ยาวขึ้นพร้อมกับหลีกเลี่ยงการเลิกใช้งาน ลองออนไลน์! ใช้sqrt.(g)แทน√gค่ารากที่สองของ elementwise


1

ทำความสะอาด , 227 ... 143 ไบต์

import StdEnv
@n#l=[0.0..n]
=sum[1\\p<-removeDup[sort(map(sqrt o\[u,v]=u*u+v*v)[[a-i,b-j],[a,b],[i,j]])\\a<-l,b<-l,i<-l,j<-l|a*j<>i*b]|sum p<n]

ลองออนไลน์!

ตรวจจับสามเหลี่ยมที่สมภาคกันผ่านการเปรียบเทียบค่าสามค่าที่รวมกันเพื่อทำเส้นรอบวงและจุด colinear โดยตรวจสอบว่าค่าที่น้อยที่สุดสองค่าดังกล่าวไม่ได้รวมกับค่าที่สาม

ต่อไปนี้เป็นรุ่นที่ใช้วิธีการที่เร็วกว่าและมีหน่วยความจำมากขึ้น: ลองออนไลน์!


หากฉันเปลี่ยนเป็นStart = @ 12.0ฉันไม่ได้รับผลใด ๆ ฉันจะทำอะไรผิดหรือเปล่า?
gggg

1
@gggg ทดสอบเนื้อหาของหัวใจของคุณตอนนี้
Janurous
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.