我的三角形对吗?


47

给定a, b, c一个三角形的三个边的长度,请说该三角形是否为直角(即,一个角度等于90度)。

输入项

任何顺序的三个整数值

输出量

无论是具体的真实输出(true1yes,...)或特定假输出(false0no,...)

5, 3, 4        --> yes
3, 5, 4        --> yes
12, 37, 35     --> yes
21, 38, 50     --> no
210, 308, 250  --> no

规则

  • 输入和输出可以任何方便的格式给出。
  • 在您提交的文件中,请注明正确和错误的值。
  • 无需处理负值无效的边缘三倍
  • 完整的程序或功能都是可以接受的。如果是函数,则可以返回输出而不是打印输出。
  • 如果可能,请提供一个在线测试环境的链接,以便其他人可以尝试您的代码!
  • 禁止出现标准漏洞
  • 这是因此所有常用的高尔夫规则都适用,并且最短的代码(以字节为单位)获胜。

1
我们必须处理负值还是无效的边缘三元组?
user202729

2
很有关系。我将它留给社区中的其他人来决定是否是重复的。
Digital Trauma

2
我认为使用坐标代替长度会显着改变挑战
Luis Mendo

8
没有长度的三角形21, 38, 5,因为21 + 5 <38。这是我们必须处理的故意病理案例吗?
凯文(Kevin)

1
@Kevin不,您不必处理这种情况。User202729已经问过这个问题:)
mdahmoune

Answers:


37

果冻,5 个字节

²µSHe

在线尝试!

技术说明:字节在Jelly代码页中计数。

说明:

²µSHe  Main link.
²      Square each number.
 µ     With the new list,
  S    calculate its sum,
   H   and halve it.
    e  Check if the result exists in the new list (squared input)

问题等同于被赋予三个数字a, b, c,并询问是否存在这样的排列a² + b² = c²。这等效于是否(a² + b² + c²) ÷ 2为之一a², b² or c²,因此程序仅对其进行检查。


好吧...果冻。
费利克斯·加侬-格尼尔

1
只是一个技术说明:符号²µ成本每两个字节在UTF-8,因此您的代码实际上已经7个字节,而不是5
查理·

2
@Charlie答案已编辑以澄清。
user202729

20

Python 2,37个字节

a,b,c=sorted(input())
1/(a*a+b*b-c*c)

在线尝试!

-2感谢FlipTack
-1感谢Craig Gidney

通过退出代码输出(0= false,1= true)。


呸。得出了完全相同的答案。您可以修改测试套件以允许使用任意数量的测试用例:请参见此处
mbomb007

@ mbomb007 hmmm exec(code),为什么exec (code)而不是exec code?:D
;-p

哈哈,这个答案如何将xnor的较短答案的投票率提高一倍?也许人们喜欢它的简单性
FlipTack

1
@FlipTack¯_(ツ)_ //(xnor也不在Python 2中)
Outgolfer的Erik

@EriktheOutgolfer因为样板不是要打高尔夫球的部分。我做了它,所以它会在任何Python 2里工作或3
mbomb007

17

Java 8,44字节

(a,b,c)->(a*=a)+(b*=b)==(c*=c)|a+c==b|b+c==a

说明:

在这里尝试。

(a,b,c)->                // Method with three integer parameters and boolean return-type
  (a*=a)+(b*=b)==(c*=c)  //  Return if `a*a + b*b == c*c`
  |a+c==b                //  or `a*a + c*c == b*b`
  |b+c==a                //  or `b*b + c*c == a*a`
                         // End of method (implicit / single-line return-statement)

没有括号就可以工作(c*=c)吗?将*=可能有超过precidence ==,你可以节省两个字节。
corsiKa

@corsiKa恐怕是另一回事了。==优先于*==+=*=,和类似的作业确实有在Java的运营商优先级最低
凯文·克鲁伊森

找不到更短的内容...我试图交换变量以将最大值分配给a(例如),但没有成功。好吧,我可以做到,但是大约65个字符...
OlivierGrégoire17年

12

JavaScript(ES6),43 41 40字节

保存了1个字节并通过@Neil修复了一个错误

将输入作为3个整数的数组。返回true直角,false否则返回。

a=>a.some(n=>Math.hypot(...a,...a)==n*2)


原始版本,44字节

输入为3个整数。返回1直角,0否则返回。

(a,b,c)=>(a*=a)+(b*=b)==(c*=c)|a+c==b|b+c==a

测试用例


看起来我们想出了完全相同的答案(JavaScript和Java 8之间的=>->区别除外)。;)对我来说很明显+1。
凯文·克鲁伊森

>>1是不安全的,对于会返回true [1, 1, 1]
尼尔

2
怎么Math.hypot(...a,...a)==n*2
尼尔

@Neil非常好的修复方法:)
Arnauld

2
@Neil应该有一个~=“大致相等” 的运算符;)
JollyJoker


7

三角形,57个字节

我还没有看到任何一种这种语言,尝试尝试一种似乎很合适。花费了一点时间...因为我必须首先弄清楚它,我相信这可以打更多的球。

,$\:$:*/%*$"`=P:pp.0"*>/>-`:S!>/U+<U"g+..>p`S:U/U"p`!g<>/

在线尝试!

这将扩展到以下三角形。

          ,
         $ \
        : $ :
       * / % *
      $ " ` = P
     : p p . 0 "
    * > / > - ` :
   S ! > / U + < U
  " g + . . > p ` S
 : U / U " p ` ! g <
> /

路径非常复杂,但是我将尝试解释我所做的事情。我将跳过方向指针。大多数代码是堆栈操作。

  • $:* 平方第一个输入。
  • $:* 平方第二个输入。
  • S":Ug! 测试第二个值是否大于第一个。
    • 真正 p"与第一个交换。
    • p无能为力。
  • $:* 平方第三个输入。
  • P":USg! 测试第三个值是否大于前一个的最大值。
    • p+U-总和当前堆栈和带走所存储的第三值
    • p"U+-最少的总和,然后存储第三的总和,减去最大的总和
  • 0=% 将相等性测试为零并输出结果。

6

Haskell(33 32 31字节)

(\x->(sum x)/2`elem`x).map(^2)

原始版本:

(\x->2*maximum x==sum x).map(^2)

匿名函数。采取[a,b,c]形式的列表。输出True或False。

第一个版本检查平方和是否为最大平方的两倍。

其次,稍好的版本检查平方和的一半是否是平方列表中的元素。

编辑:不小心算了换行符,谢谢H.PWiz


1
欢迎光临本站!这个答案只有32个字节,也许您还算了一个额外的换行符?
H.PWiz

3
您可以在此处
H.PWiz

另外,圆括号sum也可以扔掉。不错的解决方案!
骄傲的haskeller

6

Perl 6,24个字节

{(*²+*²==*²)(|.sort)}

在线尝试!

*²+*²==*²是一个匿名函数,如果前两个参数的平方和等于第三个参数的平方,则返回true。我们将排序后的输入列表传递给此函数,并使用将其展平到参数列表中|


6

R,31 26 30字节

cat(sum(a<-scan()^2)/max(a)==2)

我不太喜欢这个,但是它比较短。对平方求和并除以最大平方。如果是2。

以前的版本(用cat和@Guiseppe的技巧进行了修改)

cat(!sort(scan())^2%*%c(1,1,-1))

对最后一项取反的已排序输入求和,然后返回!否。

在线尝试!


对于以前的版本,!sort(scan())^2%*%c(1,1,-1)为27个字节。但是我认为你还需要一个cat
朱塞佩

欢呼@吉塞佩,忘了那只猫。关于REPL的规则使我很烦,但是它们就是它们。
MickyT

@Giuseppe矩阵乘法也不错。我永远不会想出那个。
MickyT

6

Brain-Flak,68位元组

({({({})({}[()])}{}<>)<>})<>({<(({}){}<>[({})])>(){[()](<{}>)}{}<>})

在线尝试!

在user202729的答案中使用观察。

 {                      }      for each input number
   {({})({}[()])}{}            compute the square
  (                <>)<>       push onto second stack
(                        )     push sum of squares onto first stack
                          <>   move to second stack

 {                                    }    for each square
   (({}){}<>[({})])                        compute 2 * this square - sum of squares
  <                >(){[()](<{}>)}{}<>     evaluate loop iteration as 1 iff equal
(                                      )   push 1 if any squares matched, 0 otherwise


4

MATL,7个字节

SU&0)s=

在线尝试!

说明

考虑输入[12, 37, 35]

S     % Implicit input. Sort
      % [12, 35, 37]
U     % Square each entry
      % [144, 1225, 1369]
&0)   % Push last entry and remaining entries
      % STACK: 1369, [144, 1225]
s     % Sum of array
      % STACK: 1369, 1369
=     % Isequal? Implicit display
      % STACK: 1

4

Python 2,43个字节

lambda a,b,c:(a*a+b*b+c*c)/2in(a*a,b*b,c*c)

在线尝试!

Python 2中79个 70 68 62字节

lambda*l:any(A*A+B*B==C*C for A,B,C in zip(l,l[1:]+l,l[2:]+l))

在线尝试!


挑战已更新为将输入限制为整数。
Martin Ender


14
A*A较短...
苏格拉底凤凰城


@mdahmoune 67字节 ; 翻转真值的含义并使用-代替==
乔纳森·弗雷奇

4

C, 68  54字节

使用user202729的解决方案

f(a,b,c){return!((a*=a)+(b*=b)-(c*=c)&&a-b+c&&a-b-c);}

感谢@Christoph打高尔夫球14个字节!

在线尝试!

C,85个字节

#define C(a,b,c)if(a*a+b*b==c*c)return 1;
f(a,b,c){C(a,b,c)C(b,c,a)C(c,a,b)return 0;}

在线尝试!


1参数1, 1, 1错误的输出...
Neil

@Neil现在已修复。
Steadybox '17

问题已更新为使用int,可能会节省一些字节。
corsiKa

f(a,b,c){a=!((a*=a)+(b*=b)-(c*=c)&&a-b+c&&a-b-c);}
克里斯多夫(Christoph),


4

J,10个字节

-6字节归功于FrownyFrog

=`+/@\:~*:

原始答案

(+/@}:={:)@/:~*:

/:对正方形进行排序*:,然后检查前两个和是否+/@}:等于最后一个{:

在线尝试!


那真是该死的聪明
约拿(Jonah)

4

三角性 49  31字节

...)...
..IEO..
.M)2s^.
}Re+=..

在线尝试!

说明

每个Triangularity程序都必须有一个三角形填充(例如双关语)。也就是说,从程序底部开始的第i行必须在每侧填充i-1点(.)。为了使点三角形对称且美观,每行必须由2L-1个字符组成,其中L是程序中的行数。删除构成必要填充的字符,这是代码的工作方式:

)IEOM)2s^}Re+=     Full program. Input: STDIN, Output: STDOUT, either 1 or 0.
)                  Pushes a zero onto the stack.
 IE                Evaluates the input at that index.
   O               Sorts the ToS (Top of the Stack).
    M)2s^}         Runs the block )2s^ on a separate stack, thus squaring each.
          R        Reverse.
           e       Dump the contents separately onto the stack.
            +      Add the top two items.
             =     Check if their sum is equal to the other entry on the stack (c^2).

正在检查三角形中的三角形是否为直角...


3

PowerShell,39个字节

$a,$b,$c=$args|sort;$a*$a+$b*$b-eq$c*$c

在线尝试!

对输入进行排序,然后将其存储到$a,$b,$c变量中。然后使用勾股定理检查是否a*a + b*b = c*c。输出为Boolean TrueFalse


3

JavaScript 34字节(无D =)

D=(d,[a,b,c]=d.sort())=>a*a+b*b==c*c

console.log(D([5, 3, 4       ])== true)
console.log(D([3, 5, 4       ])== true)
console.log(D([12, 37, 35    ])== true)
console.log(D([21, 38, 5     ])== false)
console.log(D([210, 308, 15  ])== false)


a=>a.sort()[0]**2+a[1]**2==a[2]**2在ES6中,我在34处有类似的答案。所以给你的道具@DanielIndie
WallyWest '17

1
不幸的是,sort()在没有提供回调的情况下使用字典顺序,从而使该代码例如失败[10,6,8]
Arnauld

3

RProgN 2,10字节

§²2^r]‘\+e

讲解

§²2^r]‘\+e
§           # Sort the input list
 ²2^r       # Square each element in the list.
     ]      # Duplicate it on the reg stack.
      ‘     # Pop the top (largest) element off it
       \+   # Swap it, sum the rest of the list.
         e  # Are they equal?

在线尝试!


为什么要复制列表?
mdahmoune

@mdahmoune RProgN2在从中弹出元素时不会将原始列表保留在堆栈中,但是堆栈是通过引用进行的,因此要使堆栈执行其总和部分,需要首先对其进行复制。
ATaco

Thanx upvote;)
mdahmoune

3

球拍64 60字节

(λ(a b c)(=(+(* a a)(* b b)(* c c))(*(expt(max a b c)2)2)))

在线尝试!

这个怎么运作

如果测试a^2 + b^2 + c^2是等于最大的两倍a^2b^2c^2

返回#t直角三角形和#f所有其他输入。


  • 感谢@xnor的使用-4个字节expt

太棒了;),但我认为(define fun必须是代码的一部分...
mdahmoune17年

谢谢!我认为惯例是允许使用纯函数作为答案。该(define fun ...)只是为了方便对TIO是:我们同样可以使用此功能(... 3 4 5),其中...的功能。(因此(print (3 4 5))如果您愿意,我们可以有的页眉和页脚。)
Misha Lavrov

(但这是我第一次提交有关Racket的约定,所以我不太清楚特定于Racket的约定,如果有的话。#lang racket代码中包含一些过去使用Racket的解决方案;有些则没有。)
Misha Lavrov

1
球拍太罗word了,以至于重复(max a b c)let装订要短,是吗?我不认为将绑定作为一个参数会更短λ吗?还是没有内置的幂运算?
xnor

2
@MishaLavrov然后(*(expt(max a b c)2)2)呢?
xnor


3

Ruby,31个字节

->a{a,b,c=*a.sort;a*a+b*b==c*c}

将输入作为3个整数的列表。使用其他解决方案中的一些想法。


我刚刚意识到我刚刚发布的答案与您的答案几乎相同。我保证不会复制您的文件(我实际上在“发布答案”框中放了一段时间),但是由于您的文件是第一次提交的,如果您认为我的文件太近了,我将其删除。
iamnotmaynard

@iamnotmaynard这几乎是同一件事。这是一个有趣的巧合。感谢您让我知道
dkudriavtsev

如果可能,请提供一个在线测试环境的链接,以便其他人可以尝试您的代码!
mdahmoune

3

朱莉娅0.6,16字节

!x=xx2x.*x

在线尝试!

这个怎么运作

x = [a,b,c]

x⋅xx及其本身的点积,因此得出a²+b²+c²

2x.*x2xx的按元素乘积,因此得出[2a²,2b²,2c²]

最后,测试整数a²+b²+c²是否属于矢量[2a²,2b²,2c²],如果
a²+b²+c²=2a²a²+b²+c²=2b²a²+b²+c²=2c²,则为真,当
b²+c²=a²a²+c²=b²a²+b²=c²时,它本身就是正确的。



3

TI基本(13 11 10字节)

max(Ans=R►Pr(min(Ans),median(Ans

现在可以按任何顺序输入,并且更短。@ -1感谢@MishaLavrov


如果可能,请提供一个在线测试环境的链接,以便其他人可以尝试您的代码!
mdahmoune

这仅检测分拣直角三角形:输入A=5B=4C=3就不能正确地处理。
Misha Lavrov

@MishaLavrov感谢您指出这一点,实际上,它作为列表的处理时间较短。现在,它适用于任何顺序的输入。
Timtech '17

如果我们不使用single ),那么max(Ans=R►Pr(min(Ans),median(Ans它也是有效的(尽管我们在这里进行的计算是不同的),并且要短一个字节。
米莎·拉夫罗夫

@MishaLavrov有趣,我明白你的意思了。我认为所有非负输入的表达式都是等效的。
Timtech '17

3

CJam,9岁

q~$W%~mh=

在线尝试

说明:

q~      read and evaluate the input (given as an array)
$W%     sort and reverse the array
~       dump the array on the stack
mh      get the hypotenuse of a right triangle with the given 2 short sides
=       compare with the longer side

一些解释;)?
mdahmoune

@mdahmoune,您可以在这里
aditsu

该死的。你不是写那种语言吗 看起来不公平。(笑话)
kaine

3

Pari / GP29 24字节

f(v)=v~==2*vecmax(v)^2

在线尝试!

norml2(v)到的明显更改节省了五个字节v*v~

受到其他答案的启发。

这里v必须是具有三个坐标的行向量或列向量

使用示例: f([3,4,5])

当然,例如,您可以免费获得合理的边长f([29/6, 10/3, 7/2])

如果我不计算f(v)=部分,那是19个字节。第一部分也可以被写入v->(总共22个字节)。

说明:如果三个坐标vxyz,然后对产品v和它的转置v~给了一个标量x^2+y^2+^z^2,我们需要检查是否等于最大坐标的平方两次xyz

附加:如果输入向量具有四个坐标,则f勾股四倍体进行相同的测试,依此类推。


如果可能,请提供一个在线测试环境的链接,以便其他人可以尝试您的代码!
mdahmoune

@mdahmoune您可以使用tio.run链接。但是,仅在本地安装PARI / GP会更好。
Jeppe Stig Nielsen,

3

MS Excel,49字节

匿名工作表函数,它从[A1:C1]范围内获取输入并输出到调用单元格。

=OR(A1^2+B1^2=C1^2,B1^2+C1^2=A1^2,A1^2+C1^2=B1^2)

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.