境界線が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の各三角形の座標があります。

警告

一致しない2つの三角形が同じ境界を持つことができることに注意してください。

(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に提出された関連シーケンスのドラフトがあります。
ピーターケイジー

1
(0、0)、(0、1)、(1、0)に境界線2 + sqrt(2)
≈3.14

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 Erik the Outgolferに感謝(使用ではなく使用SP¬+÷/E$して反転)-1 Mr. Xcoderに感謝(並べ替え前に平坦化する必要はありません) -2 Mr. Xcoderに感謝(-> ) -1からトリックを盗みますデニスの回答の以前の改訂(-> -より冗長なケースですが、ゴルファー!)SẠ>÷/E$ÇÐfÇÐḟ
S<¥Ðf³LS€<³S
ṗ2’Œcp`⁺’

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機能
エリックアウトゴルファー


ありがとう。残念ながら、それはまだSP¬ゼロ除算の結果を必要としており、実際には使用していません(実際の
ジョナサンアラン

1
実際に、あなたは置き換えることができ¬+<。(編集:負でない座標のみを使用しているためP、に置き換える必要はありません。)
エリックアウトゴルファー

それは機能しません(たとえば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)

テストケース

このバージョンはa(30)およびa(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

Clean227 ... 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]

オンラインでお試しください!

合計する3つの値を比較して一致する三角形を検出し、その2つの最小値が合計して3番目にならないことを確認することにより共線点を検出します。

これは、より高速で、より多くのメモリを使用するアプローチを使用するバージョンです。オンラインで試してください!


Start = @ 12.0出力を取得しないように変更した場合、何か間違ったことをしていますか?
gggg

1
@ggggがあなたの心のコンテンツをテストします
18年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.