首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数一下三角形的数目

数一下三角形的数目
EN

Code Golf用户
提问于 2019-08-27 18:46:07
回答 14查看 4.7K关注 0票数 26

给定一个正整数的列表,找出我们可以形成的三角形的数目,这样它们的边长由输入列表的三个不同的条目表示。

(灵感来自CR。)

详细信息

  • 如果三边长度a,b,c的所有排列满足严格的三角形不等式a + b > c. (这意味着a+b > ca+c>bb+c>a必须都成立),则可以形成三角形。
  • 三边长度a,b,c必须出现在列表中不同的位置,但不一定要成对的不同。
  • 输入列表中三个数字的顺序并不重要。如果我们考虑一个列表a和三个数字a[i], a[j], a[k] (其中i,j,k成对不同),那么(a[i],a[j],a[k]), (a[i],a[k],a[j]), (a[j], a[i], a[k])等都被认为是相同的三角形。
  • 输入列表可以假定包含至少3个条目。
  • 您可以假设输入列表按升序排序。

示例

在网上试试!上可以找到一个小的测试程序

代码语言:javascript
运行
复制
Input, Output:
[1,2,3]  0
[1,1,1]  1
[1,1,1,1] 4
[1,2,3,4] 1
[3,4,5,7] 3
[1,42,69,666,1000000] 0
[12,23,34,45,56,67,78,89] 34
[1,2,3,4,5,6,7,8,9,10] 50

对于[1,2,3,...,n-1,n]的输入,这是A002623

对于[1,1,...,1] (length n)的输入,这是A000292

对于第一个n斐波那契数(A000045)的输入,这是A000004

EN

回答 14

Code Golf用户

发布于 2019-08-27 19:45:27

哈斯克尔,49字节

代码语言:javascript
运行
复制
([]%)
[c,b,a]%l|a+b>c=1
p%(h:l)=(h:p)%l+p%l
_%_=0

在网上试试!

递归生成l的所有子序列(反向),并检查哪个长度-3 1构成三角形.

50字节

代码语言:javascript
运行
复制
f l=sum[1|[a,b,c]<-filter(>0)<A8gt;mapM(:[0])l,a+b>c]

在网上试试!

同样的想法,使用mapM生成子序列,方法是将l中的每个值映射到自身(包括)或0 (排除)。

50字节

代码语言:javascript
运行
复制
([]%)
p%(b:t)=sum[1|c<-t,a<-p,a+b>c]+(b:p)%t
_%_=0

在网上试试!

尝试每个分区点以接受中间元素b

51字节

代码语言:javascript
运行
复制
f(a:t)=f t+sum[1|b:r<-scanr(:)[]t,c<-r,a+b>c]
f _=0

在网上试试!

函数q=scanr(:)[]生成后缀列表。很多麻烦来自于需要考虑是否包含相同的元素,正确的次数。

52字节

代码语言:javascript
运行
复制
q=scanr(:)[]
f l=sum[1|a:r<-q l,b:s<-q r,c<-s,a+b>c]

在网上试试!

助手函数q=scanr(:)[]生成后缀列表。

57字节

代码语言:javascript
运行
复制
import Data.List
f l=sum[1|[a,b,c]<-subsequences l,a+b>c]

在网上试试!

票数 6
EN

Code Golf用户

发布于 2019-08-27 20:38:59

Perl 6,35字节

代码语言:javascript
运行
复制
+*.combinations(3).flat.grep(*+*>*)

在网上试试!

解释

这是一个任何代码,也就是lambda函数的简明表示法(只在非常简单的情况下起作用)。每个*都是一个参数的占位符。因此,我们取长度列表(出现在第一个*中),使所有三个元素的组合(它们总是以与原始列表相同的顺序出现,这意味着组合也是排序的),平平列表,然后取列表3乘3,然后筛选(grep)只满足*+*>*的三重奏,即前两个参数之和大于第三个参数。这就给出了所有的三胞胎,最后我们用一个+强制数字上下文来计算它们。

(当然,我们只需要对“两个较小的和>最大和”的情况进行测试。如果这是成立的,另一个小保持,如果这不是,三重奏不表示正确的三角形长度,我们不需要进一步研究。)

票数 5
EN

Code Golf用户

发布于 2019-08-27 19:16:24

Python 3,73字节

代码语言:javascript
运行
复制
lambda l:sum(a+b>c for a,b,c in combinations(l,3))
from itertools import*

在网上试试!

这是我脑海中第一种天真的,蛮力的方法。如果我找到了一个使用不同方法的较短的解决方案,我将更新文章。注意,由于输入是排序的,元组(a,b,c)也是按升序排列的,所以只检查a+b>c是否保持就足够了。

票数 4
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/190949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档