Çevre n'den küçük tamsayı üçgenler


13

Tanım

Bir "tamsayı üçgeni" tamsayı koordinatlarına sahip bir üçgendir. Örneğin, aşağıdaki üçgen bir tamsayı üçgenidir:

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

Görev

Bu zorluğun amacı, çevre uzunluğu n'den küçük olan tüm tamsayı üçgenlerini (uyumluluğa kadar) saymaktır.

Giriş ve çıkış

Argüman bir tamsayı olarak verilecek ve çıktı, argümandan kesinlikle daha az çevre olan üçgenlerin sayısı olmalıdır.

Örnekler

Çevre tarafından en küçük tamsayı üçgeni,

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

Bir sonraki en küçükler:

(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

Test senaryoları:

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

Bu Gist'teki üçgenlerin her biri için koordinatlarım var .

Uyarılar

İki uyumlu olmayan üçgenin aynı çevreye sahip olabileceğine dikkat edin:

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

Ayrıca eşitsizliğin katı olduğunu unutmayın ; 3-4-5 pisagor üçgeni (12) ile değil, bir (13) ile sayılmalıdır.

puanlama

Bu golfü - en kısa kod kazanıyor!


4
OEIS'te olmayan, kolayca tanımlanabilen bir dizi bulduğunuz için tebrikler.
AdmBorkBork

1
OEIS'e gönderilen ilgili bir dizi için bir taslağım var.
Peter Kagey

1
(0, 0), (0, 1), (1, 0) çevre 2 + sqrt (2) ≈ 3,14
gggg

1
Evet, (0,0), (1,1), (2,2) gibi dejenere üçgenler sayılmaz.
Peter Kagey

1
Girdi kayan nokta tipinde bir tamsayı değeri olabilir mi, yoksa integral tipte de olmalı mı?
Οurous

Yanıtlar:


7

Jöle , 28 27 25 23 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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

Jöle ,  38  33 bayt

-1 Outgolfer Erik sayesinde ( kullanmak yerine SP¬+÷/E$kullanmak SẠ>÷/E$ve tersine çevirmek ) -1 Mr. Xcoder sayesinde (sıralamadan önce düzleştirmeye gerek yok) -2 Mr. Xcoder ( -> ) -1 sayesinde bir numara çalmak Dennis'in cevabının daha erken bir revizyonu ( -> - daha gereksiz vakalar ama golfçü!)ÇÐfÇÐḟ
S<¥Ðf³LS€<³S
ṗ2’Œcp`⁺’

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

Bir tamsayı alan ve sonucu basan tam bir program.

Çevrimiçi deneyin! (60 yaşın altında 20'den fazla test vakasını tamamlamak için çok yavaş)

Nasıl?

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çıklama düzeltmeleri: [(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. İşlev .
Outgolfer Erik

Ayrıca, güzel taciz nan.
Outgolfer Erik

Teşekkürler. Ne yazık ki hala ihtiyacı SP¬ve sıfır sonuçlarla bölünmeyi kötüye kullanmaz (sanırım gerçek bir ya da açık olabilir)
Jonathan Allan

1
Aslında, ¬+ile değiştirebilirsiniz <. (Düzeltme: Değiştirmek gerekmez Pile sadece negatif olmayan koordinatları kullanarak konum olarak.)
Outgolfer Erik

Bu işe yaramaz ( örneğin 7geri döner 21)
Jonathan Allan

3

JavaScript (ES7), 157 bayt

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)

Test senaryoları

Çoğu JS motorunun varsayılan yığın boyutu ile yalnızca küçük değerler hesaplanabilir.


Özyinelemesiz sürüm, 165 bayt

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)

Test senaryoları

Bu sürüm aynı zamanda (30) ve (40) için de çalışır , ancak snippet için çok fazla zaman alır.


2

Julia 0.6 , 135 bayt

Üçgeni oluşturmak, bunları karmaşık sayılar olarak göstermek, kare uzunluklarını sıralamak ve uyumu kontrol etmek için bir sette tutmak için olası menşe olmayan noktaların üzerinde yineleyin. Karmaşık sayıları arasındaki açının sıfır olmadığını kontrol ederek doğrusal çizgileri önler. Sonra setin uzunluğunu döndürür. Uzunlukları doğrudan kullanmak daha kısadır, ancak yanlış cevabı alırsınız a(40). Çözüm, a(40)kullanımdan kaldırma uyarısı nedeniyle çalışmaya ulaşmak için çok yavaş , bu yüzden daha hızlı bir sürüme de bağlantım var.

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

Çevrimiçi deneyin!

Kullanımdan kaldırma ile daha hızlı, daha uzun sürüm önlendi. Çevrimiçi deneyin! Kullanım Alanları sqrt.(g)yerinde kaldırılmış arasında √gelementwise kare kökü.


1

Temiz , 227 ... 143 bayt

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]

Çevrimiçi deneyin!

Çevresi yapmak için toplanan üç değeri karşılaştırarak uyumlu üçgenleri ve bu tür en küçük iki değerin üçüncüye ulaşmadığını doğrulayarak doğrusal çizgileri algılar.

İşte daha hızlı, daha fazla bellek ağırlıklı bir yaklaşım kullanan bir sürüm: Çevrimiçi deneyin!


Eğer Start = @ 12.0herhangi bir çıktı almıyorsam, yanlış bir şey mi yapıyorum?
gggg

1
@gggg şimdi kalbinizin içeriğine test edin
Οurous
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.