周长小于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勾股三角应以a(13)而非a(12)计数。

计分

这是 —最短的代码胜出!


4
祝贺您在OEIS中找不到容易描述的序列。
AdmBorkBork

1
我有一份相关顺序的草稿已提交给OEIS。
彼得·卡吉

1
(0,0),(0,1),(1,0)的周长2 + sqrt(2)
≈3.14

1
是的,不计算退化三角形,例如(0,0),(1,1),(2,2)。
Peter Kagey

1
输入可以是浮点类型的整数值,还是必须也必须是整数类型?
世纪

Answers:


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的ErikSP¬+÷/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

一个完整的程序,使用整数并打印结果。

在线尝试!(太慢,无法在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功能
暴民埃里克(Erik the Outgolfer)

此外,还滥用nan
暴民埃里克(Erik the Outgolfer)

谢谢。不幸的是,它仍然需要SP¬并且实际上并没有滥用除以零的结果(我想这可能与实际的结果或是明显的)
Jonathan Allan'1

1
实际上,您可以将替换¬+<。(编辑:您不需要替换P,因为您只使用非负坐标。)
Egg the 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)

测试用例

这个版本也适用于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

干净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现在就对您的心脏进行测试
很有可能
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.