Là tam giác của tôi phải không?


47

Cho a, b, cchiều dài ba cạnh của một tam giác, giả sử nếu tam giác vuông góc (nghĩa là có một góc bằng 90 độ) hay không.

Đầu vào

Ba dương các giá trị số nguyên theo thứ tự

Đầu ra

Hoặc là một cụ thể sản lượng đúng ( true, 1, yes, ...) hoặc một đầu ra cụ thể sai ( false, 0, no, ...)

Thí dụ

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

Quy tắc

  • Đầu vào và đầu ra có thể được đưa ra trong bất kỳ định dạng thuận tiện .
  • Trong bài nộp của bạn, vui lòng nêu giá trị đúng và sai.
  • Không cần xử lý các giá trị âm hoặc bộ ba cạnh không hợp lệ
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Nếu có thể, vui lòng bao gồm một liên kết đến một môi trường thử nghiệm trực tuyến để người khác có thể thử mã của bạn!
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

1
Chúng ta phải xử lý các giá trị âm hoặc ba cạnh không hợp lệ?
dùng202729

2
Rất liên quan . Tôi sẽ để phần còn lại của cộng đồng quyết định xem đó có phải là bản sao không.
Chấn thương kỹ thuật số

2
Tôi nghĩ rằng việc sử dụng tọa độ thay vì độ dài sẽ thay đổi đáng kể thử thách
Luis Mendo

8
Không có tam giác có độ dài 21, 38, 5, vì 21 + 5 <38 . Đây có phải là một trường hợp bệnh lý có chủ ý mà chúng ta phải xử lý?
Kevin

1
@Kevin không bạn không phải xử lý trường hợp này. Người dùng202729 đã hỏi câu hỏi này :)
mdahmoune

Câu trả lời:


37

Thạch , 5 byte

²µSHe

Hãy thử trực tuyến!

Lưu ý kỹ thuật: Byte được tính trong Jelly codepage.

Giải trình:

²µ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)

Vấn đề tương đương với việc được đưa ra ba số a, b, c, và hỏi xem có hoán vị như vậy không a² + b² = c². Điều này tương đương với việc (a² + b² + c²) ÷ 2là một trong số đó a², b² or c², vì vậy chương trình chỉ kiểm tra điều đó.


tốt ... tôi thạch.
Félix Gagnon-Grenier

1
Chỉ cần một lưu ý kỹ thuật: các ký hiệu ²µchi phí hai byte mỗi UTF-8, vì vậy mã của bạn thực sự có 7 byte, không phải 5
Charlie

2
@Charlie Trả lời chỉnh sửa để làm rõ.
dùng202729

20

Python 2 , 37 byte

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

Hãy thử trực tuyến!

-2 nhờ FlipTack .
-1 cảm ơn Craig Gidney .

Đầu ra thông qua mã thoát ( 0= false, 1= true).


Bah Đến với câu trả lời chính xác. Bạn có thể sửa đổi bộ thử nghiệm để cho phép bất kỳ số lượng trường hợp thử nghiệm nào: xem tại đây
mbomb007

@ mbomb007 exec(code)hmmm, tại sao exec (code)thay vì exec code? : D ;-p
Erik the Outgolfer

Haha, làm thế nào để câu trả lời này có gấp đôi số lần nâng cấp của xnor ngắn hơn? Có lẽ mọi người chỉ thích sự đơn giản ngọt ngào của nó
FlipTack

1
@FlipTack _ (ツ) _ / (cũng là xnor không có trong Python 2)
Erik the Outgolfer

@EriktheOutgolfer Bởi vì nồi hơi không phải là phần được chơi gôn. Tôi đã làm cho nó hoạt động trong Python 2 hoặc 3.
mbomb007

17

Java 8, 44 byte

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

Giải trình:

Hãy thử nó ở đây.

(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)

Nó hoạt động mà không có dấu ngoặc đơn trên (c*=c)? Giá trị *=có thể có hơn ==và bạn có thể lưu hai byte.
corsiKa

@corsiKa Tôi sợ đó là cách khác. ==đã được ưu tiên hơn *=. =, +=, *=, Bài tập và tương tự như thực sự có những ưu tiên thấp nhất trong các nhà khai thác Java .
Kevin Cruijssen

Không thể tìm thấy bất cứ điều gì ngắn hơn ... Tôi đã cố gắng để các biến được hoán đổi để có giá trị tối đa được gán cho a(ví dụ), nhưng không thành công. Chà, tôi có thể làm điều đó, nhưng khoảng 65 ký tự ...
Olivier Grégoire

12

JavaScript (ES6), 43 41 40 byte

Đã lưu 1 byte và sửa lỗi nhờ @Neil

Lấy đầu vào là một mảng gồm 3 số nguyên. Trả về truecho góc phải và mặt falsekhác.

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


Phiên bản gốc, 44 byte

Lấy đầu vào là 3 số nguyên. Trả về 1cho góc phải và mặt 0khác.

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

Các trường hợp thử nghiệm


Có vẻ như chúng tôi đã đưa ra cùng một câu trả lời chính xác (ngoại trừ =>->sự khác biệt giữa JavaScript và Java 8). ;) Rõ ràng +1 từ tôi.
Kevin Cruijssen

>>1là không an toàn, điều này trả về đúng cho [1, 1, 1].
Neil

2
Thế còn Math.hypot(...a,...a)==n*2?
Neil

@Neil Khắc phục rất hay :)
Arnauld

2
@Neil Nên có một ~=nhà điều hành cho "bằng nhau một cách khó khăn";)
JollyJoker


7

Hình tam giác , 57 byte

Tôi chưa thấy ngôn ngữ này và có vẻ phù hợp để thử và làm một ngôn ngữ. Phải mất một chút ... vì tôi phải quay đầu lại và tôi tin rằng điều này có thể được đánh gôn thêm.

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

Hãy thử trực tuyến!

Điều này mở rộng đến tam giác sau.

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

Đường dẫn khá phức tạp, nhưng tôi sẽ thử và giải thích những gì tôi đã làm. Tôi sẽ bỏ qua các con trỏ định hướng. Hầu hết các mã là thao tác ngăn xếp.

  • $:* Bình phương đầu vào đầu tiên.
  • $:* Bình phương đầu vào thứ hai.
  • S":Ug! Kiểm tra nếu giá trị thứ hai lớn hơn giá trị thứ nhất.
    • p"Hoán đổi thực sự với người đầu tiên.
    • sai p Không làm gì cả.
  • $:* Bình phương đầu vào thứ ba.
  • P":USg! Kiểm tra nếu giá trị thứ ba lớn hơn giá trị lớn nhất trước đó.
    • đúng p+U- tổng ngăn xếp hiện tại và lấy đi giá trị thứ ba được lưu trữ
    • sai p"U+- tổng ít nhất và được lưu trữ thứ ba và trừ từ lớn nhất
  • 0=% kiểm tra đẳng thức bằng không và kết quả đầu ra.

6

Haskell ( 33 32 31 byte)

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

Phiên bản gốc:

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

Chức năng ẩn danh. Đưa ra một danh sách ở dạng [a, b, c]. Đầu ra Đúng hoặc Sai.

Phiên bản đầu tiên được kiểm tra nếu tổng bình phương gấp đôi bình phương tối đa.

Thứ hai, phiên bản tốt hơn một chút kiểm tra nếu một nửa tổng bình phương là một yếu tố trong danh sách các hình vuông.

Chỉnh sửa: Vô tình đếm một dòng mới, cảm ơn H.PWiz


1
Chào mừng đến với trang web! Câu trả lời này chỉ có 32 byte, có lẽ bạn đã tính thêm một dòng mới?
H.PWiz

3
Bạn có thể sử dụng hàm Monad để lưu thêm một số byte tại đây
H.PWiz

Ngoài ra, các dấu ngoặc đơn xung quanh sumcó thể được ném đi. giải pháp tốt đẹp!
tự hào

6

Perl 6 , 24 byte

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

Hãy thử trực tuyến!

*²+*²==*²là một hàm ẩn danh trả về true nếu tổng bình phương của hai đối số đầu tiên của nó bằng bình phương của đối số thứ ba của nó. Chúng tôi chuyển danh sách đầu vào được sắp xếp vào hàm này, làm phẳng nó vào danh sách đối số với |.


6

R , 31 26 30 byte

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

Tôi không thích cái này nhiều, nhưng nó ngắn hơn. Tính tổng các hình vuông và chia cho hình vuông lớn nhất. Sự thật nếu 2.

Phiên bản trước (được sửa đổi với con mèo và với mẹo của @ Guiseppe)

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

Thực hiện tổng các đầu vào được sắp xếp với mục cuối cùng bị phủ định và trả về !không.

Hãy thử trực tuyến!


Đối với phiên bản trước của bạn, !sort(scan())^2%*%c(1,1,-1)là 27 byte. nhưng tôi nghĩ bạn vẫn cần a cat.
Giuseppe

Chúc mừng @Guiseppe, quên mất con mèo. Các quy tắc xung quanh REPL làm phiền tôi, nhưng chúng là những gì chúng là.
MickyT

@Giuseppe Cũng xoắn đẹp với phép nhân ma trận. Tôi sẽ không bao giờ nghĩ ra điều đó.
MickyT

6

Brain-Flak , 68 byte

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

Hãy thử trực tuyến!

Sử dụng quan sát trong câu trả lời của 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 byte

SU&0)s=

Hãy thử trực tuyến!

Giải trình

Xem xét đầu vào [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 byte

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

Hãy thử trực tuyến!

Python 2 , 79 70 68 62 byte

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

Hãy thử trực tuyến!


Thách thức đã được cập nhật để giới hạn đầu vào cho số nguyên.
Martin Ender


14
A*Angắn hơn ...
Socratic Phoenix


@mdahmoune 67 byte ; lật ý nghĩa của giá trị thật và sử dụng -thay vì ==.
Jonathan Frech

4

C,  68  54 byte

Sử dụng giải pháp của người dùng202729 .

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

Cảm ơn @Christoph đã chơi golf 14 byte!

Hãy thử trực tuyến!

C, 85 byte

#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;}

Hãy thử trực tuyến!


Đầu ra 1cho các tham số 1, 1, 1sai ...
Neil

@Neil Nó đã được sửa.
Steadybox

Câu hỏi đã được cập nhật để sử dụng ints, có thể lưu một số byte.
corsiKa

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


4

J, 10 byte

-6 byte nhờ FrownyFrog

=`+/@\:~*:

câu trả lời gốc

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

/:sắp xếp các hình vuông *:, sau đó kiểm tra xem tổng của hai số đầu tiên có +/@}:bằng số cuối cùng không{:

Hãy thử trực tuyến!


thật là thông minh chết tiệt
Jonah

4

Hình tam giác ,  49  31 byte

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

Hãy thử trực tuyến!

Giải trình

Mỗi chương trình Tam giác phải có phần đệm hình tam giác (xin lỗi chơi chữ). Đó là, dòng thứ i tính từ dưới cùng của chương trình phải được đệm bằng i - 1 chấm ( .) ở mỗi bên. Để giữ cho các hình tam giác chấm đối xứng và thẩm mỹ dễ chịu, mỗi dòng phải bao gồm 2L - 1 ký tự, trong đó L là số dòng trong chương trình. Loại bỏ các ký tự tạo nên phần đệm cần thiết, đây là cách mã hoạt động:

)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).

Kiểm tra xem một hình tam giác có vuông góc với hình tam giác không ...


3

PowerShell , 39 byte

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

Hãy thử trực tuyến!

Sắp xếp đầu vào, lưu trữ thành $a,$b,$ccác biến. Sau đó sử dụng định lý Pythagore để kiểm tra xem a*a + b*b = c*c. Đầu ra là Boolean Truehoặc False.


3

JavaScript 34 byte (không có 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)


Tôi đã có một câu trả lời tương tự ở 34: a=>a.sort()[0]**2+a[1]**2==a[2]**2trong ES6. Vì vậy, đạo cụ cho bạn @DanielIndie
WallyWest

1
Thật không may, sort()sử dụng thứ tự từ điển khi không có cuộc gọi lại được cung cấp, làm cho mã này không thành công [10,6,8].
Arnauld

3

RProgN 2 , 10 byte

§²2^r]‘\+e

Giải thích

§²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?

Hãy thử trực tuyến!


Tại sao lại trùng lặp danh sách?
mdahmoune

@mdahmoune RProgN2 không giữ danh sách ban đầu trên ngăn xếp khi bật một phần tử khỏi nó, nhưng ngăn xếp là do tham chiếu, vì vậy, để giữ ngăn xếp thực hiện phần tổng của nó, trước tiên, nó cần được sao chép.
ATaco

Thanx upvote;)
mdahmoune

3

Vợt , 64 60 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Kiểm tra nếu a^2 + b^2 + c^2tương đương với hai lần lớn nhất a^2, b^2c^2.

Trả về #tcho các tam giác bên phải và #fcho tất cả các đầu vào khác.


  • -4 byte nhờ đề xuất của @ xnor để sử dụng expt.

Tuyệt vời;) nhưng tôi nghĩ (define funphải là một phần của mã ...
mdahmoune

Cảm ơn bạn! Tôi nghĩ rằng thông thường để nói rằng các chức năng thuần túy được cho phép như là câu trả lời. Các (define fun ...)trên TIO chỉ là để thuận tiện: chúng tôi tốt như nhau có thể sử dụng chức năng này như (... 3 4 5)nơi ...là chức năng. (Vì vậy, chúng tôi có thể có một tiêu đề (print (và chân trang 3 4 5))nếu bạn thích.)
Misha Lavrov

(Nhưng đây là một trong những lần gửi vợt đầu tiên của tôi, vì vậy tôi không quá rõ về những quy ước dành riêng cho vợt, nếu có. Một số giải pháp trước đây sử dụng vợt đã bao gồm #lang rackettrong mã; một số chưa có.)
Misha Lavrov

1
Vợt quá dài đến nỗi lặp lại ngắn (max a b c)hơn so với thực hiện letràng buộc, phải không? Tôi không cho rằng nó sẽ ngắn hơn để ràng buộc như là một đối số cho một λ? Hoặc, không có tích lũy lũy thừa?
xnor

2
@MishaLavrov thì sao (*(expt(max a b c)2)2)?
xnor

3

Ví dụ đầu tiên không phát hiện [1,1,1] không phải là đầu vào hợp lệ (vấn đề phổ biến đối với một số lần thử khác), nhưng lần thứ hai hoạt động tốt.
Nick Loughlin

@NickLoughlin Rất tiếc, đã xóa ví dụ đầu tiên
Okx

Bạn có thể làm n{RÆ_để tiết kiệm một byte.
Emigna

3

Ruby, 31 byte

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

Lấy đầu vào là một danh sách gồm 3 số nguyên. Sử dụng một số ý tưởng từ các giải pháp khác.


Tôi mới nhận ra câu trả lời tôi vừa đăng gần giống với câu trả lời của bạn. Tôi hứa rằng tôi đã không sao chép của bạn (tôi thực sự đã để nó ngồi một lúc trong hộp "Đăng câu trả lời"), nhưng vì bạn đã gửi trước, nếu bạn nghĩ rằng tôi quá gần, tôi sẽ xóa nó.
iamnotmaynard

@iamnotmaynard Nó khá giống nhau. đây là một sự trùng hợp hài hước lol Cảm ơn đã cho tôi biết
dkudriavtsev

Nếu có thể, vui lòng bao gồm một liên kết đến một môi trường thử nghiệm trực tuyến để người khác có thể thử mã của bạn!
mdahmoune

3

Julia 0,6 , 16 byte

!x=xx2x.*x

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Đặt x = [a, b, c] .

x⋅xlà sản phẩm chấm của x và chính nó, vì vậy nó mang lại a² + b² + c² .

2x.*xlà sản phẩm nguyên tố của 2xx , do đó, nó mang lại [2a², 2b², 2c²] .

Cuối cùng, kiểm tra xem số nguyên a² + b² + c² có thuộc về vectơ [2a², 2b², 2c²] , có đúng không iff
a² + b² + c² = 2a² hoặc a² + b² + c² = 2b² hoặc a² + b² + c² = 2² , bản thân nó đúng là iff
b² + c² = a² hoặc a² + c² = b² hoặc a² + b² = c² .



3

TI-Basic, 13 11 10 byte

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

Bây giờ làm việc cho đầu vào theo thứ tự bất kỳ và cũng ngắn hơn. -1 khác nhờ @MishaLavrov


Nếu có thể, vui lòng bao gồm một liên kết đến một môi trường thử nghiệm trực tuyến để người khác có thể thử mã của bạn!
mdahmoune

Đây chỉ phát hiện được sắp xếp tam giác vuông: đầu vào của A=5, B=4, C=3sẽ không được xử lý một cách chính xác.
Misha Lavrov

@MishaLavrov Cảm ơn bạn đã chỉ ra rằng, đây thực sự là một danh sách ngắn hơn. Bây giờ nó hoạt động cho đầu vào theo thứ tự bất kỳ.
TimTech

Nếu chúng ta bỏ đi một )thì max(Ans=R►Pr(min(Ans),median(Anscũng hợp lệ (mặc dù tính toán chúng ta đang làm ở đây là khác nhau) và ngắn hơn một byte.
Misha Lavrov

@MishaLavrov Thật thú vị, tôi hiểu ý của bạn. Tôi nghĩ rằng các biểu thức là tương đương cho tất cả các đầu vào không âm.
Timtech

3

CJam, 9

q~$W%~mh=

Dùng thử trực tuyến

Giải trình:

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

Một số giải thích;)?
mdahmoune

@mdahmoune bạn đến đây
aditsu

Đằng đó. Bạn không viết ngôn ngữ đó à? Có vẻ không công bằng. (đùa)
kaine

3

Pari / GP , 29 24 byte

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

Hãy thử trực tuyến!

Đã lưu năm byte bởi một thay đổi rõ ràng từ norml2(v)đến v*v~.

Lấy cảm hứng từ các câu trả lời khác.

Ở đây vphải là một vectơ hàng hoặc một vectơ cột có ba tọa độ.

Ví dụ sử dụng: f([3,4,5])

Tất nhiên, bạn có được độ dài bên hợp lý miễn phí, ví dụ f([29/6, 10/3, 7/2]).

Nếu tôi không đếm f(v)=phần, đó là 19 byte. Phần đầu tiên cũng có thể được viết v->(tổng cộng 22 byte).

Giải thích: Nếu ba tọa độ vx, yz, sau đó sản phẩm của vvà chuyển vị của nó v~mang lại cho một đại lượng vô hướng x^2+y^2+^z^2, và chúng ta cần phải kiểm tra xem đó là tương đương với hai lần bình phương của tối đa của các tọa độ x, y, z.

Bổ sung: Các fthử nghiệm tương tự cho bộ tứ số Pythagore nếu vectơ đầu vào của bạn có bốn tọa độ, v.v.


Nếu có thể, vui lòng bao gồm một liên kết đến một môi trường thử nghiệm trực tuyến để người khác có thể thử mã của bạn!
mdahmoune

@mdahmoune Bạn có thể sử dụng liên kết nàytio.run . Tuy nhiên, sẽ tốt hơn nhiều nếu chỉ cài đặt PARI / GP cục bộ.
Jeppe Stig Nielsen

3

MS Excel, 49 byte

Hàm bảng tính ẩn danh nhận đầu vào từ phạm vi [A1: C1] và xuất ra ô gọi.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.