둘레가 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

이 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)으로 계산되어야합니다.

채점

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


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
부동 소수점 유형의 입력 값이 정수 값일 수 있습니까? 아니면 정수 유형이어야합니까?
OUurous

답변:


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 덕분에 에릭 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

정정 사항 정정 : [(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. 기능 .
Outgolfer Erik

또한의 좋은 남용 nan.
Outgolfer Erik

감사. 불행히도 여전히 필요하고 SP¬0으로 나누기 결과를 남용하지는 않습니다 (실제로 명시 할 수 있다고 생각합니다)
Jonathan Allan

1
사실, 당신은 대체 할 수 ¬+와 함께 <. (편집 : 당신은 교체 할 필요가 없습니다 P으로 만 음이 아닌 좌표를 사용하는 등.)
Outgolfer 에릭

작동하지 않습니다 ( 예 : 7반품 21)
Jonathan Allan

3

자바 스크립트 (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) 에서도 작동 하지만 스 니펫에는 너무 많은 시간이 걸립니다.


2

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 제곱근을 위해.


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.