Số nguyên tam giác có chu vi nhỏ hơn n


13

Định nghĩa

Một "tam giác nguyên" là một có tọa độ nguyên. Ví dụ tam giác sau là tam giác nguyên:

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

Bài tập

Mục tiêu của thử thách này là đếm tất cả các tam giác nguyên (tối đa đồng dạng) với chu vi nhỏ hơn n.

Đầu vào và đầu ra

Đối số sẽ được đưa ra dưới dạng một số nguyên và đầu ra phải là số lượng tam giác có chu vi nhỏ hơn hoàn toàn so với đối số.

Ví dụ

Tam giác nguyên nhỏ nhất theo chu vi đồng dạng với

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

Nhỏ nhất tiếp theo là:

(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

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

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

Tôi có tọa độ cho mỗi hình tam giác trong Gist này .

Cảnh báo

Lưu ý rằng hai tam giác không đồng dạng có thể có cùng chu vi:

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

Cũng nên nhớ rằng sự bất bình đẳng là nghiêm ngặt ; tam giác 3-4-5 nên được tính bằng a (13), không phải a (12).

Chấm điểm

Đây là golfthe, chiến thắng mã ngắn nhất!


4
Chúc mừng bạn đã tìm thấy một chuỗi dễ dàng mô tả không có trong OEIS.
admBorkBork

1
Tôi có một bản nháp cho một chuỗi liên quan được đệ trình lên OEIS.
Peter Kagey

1
(0, 0), (0, 1), (1, 0) có chu vi 2 + sqrt (2) ≈ 3.14
gggg

1
Yep, tam giác suy biến như (0,0), (1,1), (2,2) không được tính.
Peter Kagey

1
Đầu vào có thể là một giá trị số nguyên trong một kiểu dấu phẩy động, hay nó cũng phải là một kiểu tích phân?
Οurous

Câu trả lời:


7

Thạch , 28 27 25 23 byte

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

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

Làm thế nào nó hoạt động

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

Thạch ,  38  33 byte

-1 nhờ Erik the Outgolfer (đảo ngược SP¬+÷/E$bằng cách sử dụng SẠ>÷/E$và sử dụng ÇÐfchứ không phải ÇÐḟ) -1 nhờ ông Xcoder (không cần phải làm phẳng trước khi sắp xếp)
-2 nhờ ông Xcoder ( S<¥Ðf³L-> S€<³S)
-1 ăn cắp một mẹo từ bản sửa đổi trước đó của câu trả lời của Dennis ( ṗ2’Œc-> p`⁺’- trường hợp dư thừa hơn nhưng người chơi gôn!)

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

Một chương trình đầy đủ lấy một số nguyên và in kết quả.

Hãy thử trực tuyến! (quá chậm để hoàn thành các trường hợp kiểm tra 20+ trong độ tuổi dưới 60)

Làm sao?

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

Giải thích sửa chữa: [(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. Chức năng .
Erik the Outgolfer

Ngoài ra, lạm dụng tốt đẹp của nan.
Erik the Outgolfer

Cảm ơn. Thật không may, nó vẫn cần SP¬và không thực sự lạm dụng sự phân chia bằng 0 (tôi đoán điều đó có thể rõ ràng với thực tế hoặc)
Jonathan Allan

1
Trên thực tế, bạn có thể thay thế ¬+bằng <. (EDIT: bạn không cần phải thay thế Pbằng , vì bạn chỉ sử dụng tọa độ không âm.)
Erik the Outgolfer

Điều đó không hiệu quả ( ví dụ 7trả về 21)
Jonathan Allan

3

JavaScript (ES7), 157 byte

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)

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

Chỉ các giá trị nhỏ có thể được tính toán với kích thước ngăn xếp mặc định của hầu hết các công cụ JS.


Phiên bản không đệ quy, 165 byte

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)

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

Phiên bản này cũng hoạt động cho (30)(40) , nhưng điều đó sẽ mất quá nhiều thời gian cho đoạn trích.


2

Julia 0,6 , 135 byte

Lặp lại các điểm không có nguồn gốc có thể để tạo thành hình tam giác, biểu diễn chúng dưới dạng số phức, sắp xếp các độ dài hình vuông và giữ chúng trong một tập hợp để kiểm tra sự đồng dạng. Tránh các điểm colinear bằng cách kiểm tra góc giữa các số phức của chúng là khác không. Sau đó, nó trả về độ dài của tập hợp. Nó ngắn hơn để sử dụng trực tiếp độ dài, nhưng bạn nhận được câu trả lời sai cho a(40). Giải pháp quá chậm để đạt được chạy a(40)vì cảnh báo không dùng nữa, vì vậy tôi cũng có một liên kết đến phiên bản nhanh hơn.

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

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

Nhanh hơn, phiên bản dài hơn với sự phản đối tránh. Hãy thử trực tuyến! Sử dụng sqrt.(g)ở vị trí không dùng √gcho căn bậc hai.


1

Sạch , 227 ... 143 byte

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]

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

Phát hiện các tam giác đồng dạng thông qua việc so sánh ba giá trị tổng hợp để tạo ra chu vi và các điểm colinear bằng cách xác minh rằng hai giá trị nhỏ nhất như vậy không bằng tổng thứ ba.

Đây là phiên bản sử dụng cách tiếp cận nhanh hơn, nặng bộ nhớ hơn: Hãy thử trực tuyến!


Nếu tôi đổi thành Start = @ 12.0tôi không nhận được bất kỳ đầu ra nào, tôi có làm gì sai không?
gggg

1
@gggg kiểm tra nội dung trái tim của bạn ngay bây giờ
urous
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.