둘레가 n보다 작은 정수 삼각형 (0, 1), (1, 2) with perimeter 1

정의

“정수 삼각형”은 정수 좌표를 가진 것입니다. 예를 들어 다음 삼각형은 정수 삼각형입니다.

(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

이 Gist의 각 삼각형에 대한 좌표가 있습니다.

경고

일치하지 않는 두 삼각형의 둘레는 동일 할 수 있습니다.

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

또한 불평등은 엄격 하다는 것을 명심하십시오 . 3-4-5 피타고라스 삼각형은 a (12)가 아닌 a (13)으로 계산되어야합니다.

채점

입니다 년 – 짧은 코드 승리!



답변

젤리 , 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.


답변

젤리 ,  38  33 바이트

-1 덕분에 에릭 Outgolfer (반전 SP¬+÷/E$사용하지하여 SẠ>÷/E$사용할 ÇÐf보다는 ÇÐḟ-1 덕분에) 씨 Xcoder (필요를 정렬하기 전에 평평하게)
-2 덕분에 씨 Xcoder ( S<¥Ðf³L-> S€<³S)
-1에서 트릭을 훔치는 Dennis의 답변 의 이전 개정 ( ṗ2’Œc-> p`⁺’-중복 사례가 많지만 골퍼입니다!)

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

정수를 취하고 결과를 인쇄하는 전체 프로그램.

온라인으로 사용해보십시오! (60 초 미만의 테스트 케이스 20+를 완료하기에는 너무 느림)

어떻게?

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


답변

자바 스크립트 (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)

테스트 사례

이 버전은 a (30)a (40) 에서도 작동 하지만 스 니펫에는 너무 많은 시간이 걸립니다.


답변

Julia 0.6 , 135 바이트

가능한 비 원점을 반복하여 삼각형을 구성하고,이를 복잡한 숫자로 표현하고, 정사각형 길이를 정렬하고 일치 성을 확인하기 위해 세트로 유지하십시오. 복소수 사이의 각도가 0이 아닌지 확인하여 동일 선상의 점을 피합니다. 그런 다음 집합의 길이를 반환합니다. 길이를 직접 사용하는 것이 더 짧지 만에 대한 답변이 잘못되었습니다 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)장소는 추천의 √gelementwise 제곱근을 위해.


답변

클린 , 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]

온라인으로 사용해보십시오!

둘레를 만드는 데 합산되는 세 가지 값과 이러한 두 개의 가장 작은 값이 셋째와 합치 지 않는지를 확인하여 공선 점을 비교하여 합동 삼각형을 감지합니다.

더 빠르고 더 많은 메모리를 사용하는 접근 방식을 사용하는 버전은 다음과 같습니다. 온라인으로 사용해보십시오!


답변