Цілі трикутники з периметром менше 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), а не a (12).

Оцінка балів

Це - найкоротший виграш коду!


4
Вітаємо, що знайшли легко описану послідовність не в OEIS.
AdmBorkBork

1
У мене є проект відповідної послідовності, поданий до ОЕІС.
Петро Кагей

1
(0, 0), (0, 1), (1, 0) має периметр 2 + sqrt (2) ≈ 3.14
gggg

1
Так, вироджені трикутники на зразок (0,0), (1,1), (2,2) не враховуються.
Петро Кагей

1
Чи може вхід бути цілим значенням у типі з плаваючою комою, чи він також повинен бути інтегральним типом?
Οurous

Відповіді:


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 спасибі Еріку Позашляховику (інвертування SP¬+÷/E$за допомогою SẠ>÷/E$та використання, ÇÐfа не ÇÐḟ) -1 дякую містеру Xcoder (не потрібно розгладжувати перед сортуванням)
-2 завдяки містеру 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. Функція .
Ерік Аутгольфер

Також приємне зловживання nan.
Ерік Аутгольфер

Спасибі. На жаль, він все ще потребує SP¬і фактично не зловживає поділом на нульові результати (я думаю, це могло бути явним із фактичним або)
Джонатан Аллан

1
Насправді ви можете замінити ¬+на <. (EDIT: вам не потрібно замінити Pз , як ви використовуєте тільки невід'ємні координати.)
Ерік Outgolfer

Це не працює ( 7повертається, 21наприклад)
Джонатан Аллан

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

Джулія 0,6 , 135 байт

Повторіть можливі точки без походження, щоб скласти трикутник, представити їх як складні числа, відсортувати довжини квадратів та зберегти їх у наборі, щоб перевірити на збіжність. Уникайте колінних точок, перевіряючи, що кут між їх складними числами не є нульовим. Потім повертається довжина набору. Коротше використовувати довжини безпосередньо, але ви отримаєте неправильну відповідь 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для елементарного квадратного кореня.


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]

Спробуйте в Інтернеті!

Виявляє конгруентні трикутники за допомогою порівняння трьох значень, які підсумовують периметру, та колінних точок, перевіривши, що два найменших таких значення не відповідають третьому.

Ось версія, яка використовує швидший, більш важкий для пам’яті підхід: спробуйте в Інтернеті!


Якщо я перейду до цього, Start = @ 12.0я не отримую жодного результату, чи роблю щось не так?
gggg

1
@gggg тест на вміст вашого серця зараз
Οurous
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.