Apakah segitiga saya benar?


47

Mengingat a, b, cpanjang tiga sisi segitiga, katakan apakah segitiga siku-siku (yaitu memiliki satu sudut sama dengan 90 derajat) atau tidak.

Memasukkan

Tiga nilai integer positif dalam urutan apa pun

Keluaran

Entah tertentu keluaran yang benar ( true, 1, yes, ...) atau output tertentu palsu ( false, 0, no, ...)

Contoh

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

Aturan

  • Input dan output dapat diberikan dalam format apa pun yang nyaman .
  • Dalam kiriman Anda, sebutkan nilai-nilai benar dan salah.
  • Tidak perlu menangani nilai negatif atau triple edge yang tidak valid
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online agar orang lain dapat mencoba kode Anda!
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

1
Haruskah kita menangani nilai negatif atau triple edge yang tidak valid?
user202729

2
Sangat terkait . Saya akan menyerahkannya kepada seluruh komunitas untuk memutuskan apakah ini dup.
Digital Trauma

2
Saya pikir menggunakan koordinat sebagai ganti panjang akan mengubah tantangan secara signifikan
Luis Mendo

8
Tidak ada segitiga dengan panjang 21, 38, 5, karena 21 + 5 <38 . Apakah ini kasus patologis yang disengaja yang harus kita tangani?
Kevin

1
@Kevin tidak, Anda tidak harus menangani kasus ini. User202729 telah menanyakan pertanyaan ini :)
mdahmoune

Jawaban:


37

Jelly , 5 byte

²µSHe

Cobalah online!

Catatan teknis: Bytes dihitung dalam codepage Jelly.

Penjelasan:

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

Masalahnya setara dengan diberi tiga angka a, b, c, dan menanyakan apakah ada permutasi sedemikian rupa a² + b² = c². Ini sama dengan apakah (a² + b² + c²) ÷ 2salah satu a², b² or c², jadi program hanya memeriksa itu.


yah ... aku jeli.
Félix Gagnon-Grenier

1
Hanya catatan teknis: simbol ²dan µbiaya masing-masing dua byte dalam UTF-8, jadi kode Anda sebenarnya 7 byte, bukan 5
Charlie

2
@Charlie Jawaban diedit untuk klarifikasi.
user202729

20

Python 2 , 37 byte

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

Cobalah online!

-2 Berkat FlipTack .
-1 Terima kasih kepada Craig Gidney .

Keluaran melalui kode keluar ( 0= false, 1= true).


Bah Datang dengan jawaban yang sama persis. Anda dapat memodifikasi suite tes untuk memungkinkan sejumlah kasus uji: lihat di sini
mbomb007

@ mbomb007 exec(code)hmmm, mengapa exec (code)bukan exec code? : D ;-p
Erik the Outgolfer

Haha, bagaimana jawaban ini memiliki dua kali lipat upvotes dari xnor yang lebih pendek? Mungkin orang hanya menyukai kesederhanaannya yang manis
FlipTack

1
@FlipTack ¯_ (ツ) _ / ¯ (juga xnor tidak ada di Python 2)
Erik the Outgolfer

@EriktheOutgolfer Karena pelat bukan bagian yang akan golf. Saya membuatnya jadi itu akan berhasil baik dalam Python 2 atau 3.
mbomb007

17

Java 8, 44 byte

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

Penjelasan:

Coba di sini.

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

Apakah ini berfungsi tanpa tanda kurung pada (c*=c)? Yang *=mungkin memiliki presensi atas ==dan Anda dapat menyimpan dua byte.
corsiKa

@corsiKa aku takut itu sebaliknya. ==lebih diutamakan *=. =, +=, *=, Tugas dan mirip benar-benar memiliki prioritas terendah di operator Jawa .
Kevin Cruijssen

Tidak dapat menemukan sesuatu yang lebih pendek ... Saya mencoba untuk menukar variabel agar nilai maks ditetapkan a(misalnya), tanpa hasil. Yah, saya bisa melakukannya, tetapi sekitar 65 karakter ...
Olivier Grégoire

12

JavaScript (ES6), 43 41 40 byte

Disimpan 1 byte dan memperbaiki bug berkat @Neil

Mengambil input sebagai array 3 bilangan bulat. Pengembalian trueuntuk sudut kanan dan falsesebaliknya.

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


Versi asli, 44 byte

Mengambil input sebagai 3 bilangan bulat. Pengembalian 1untuk sudut kanan dan 0sebaliknya.

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

Uji kasus


Sepertinya kami datang dengan jawaban yang sama persis (kecuali untuk =>dan ->perbedaan antara JavaScript dan Java 8). ;) +1 sangat jelas dari saya.
Kevin Cruijssen

>>1tidak aman, ini mengembalikan true untuk [1, 1, 1].
Neil

2
Bagaimana dengan Math.hypot(...a,...a)==n*2?
Neil

@Neil Memperbaiki yang sangat bagus :)
Arnauld

2
@Neil Seharusnya ada ~=operator untuk "secara kasar sama";)
JollyJoker


7

Segitiga , 57 byte

Saya belum melihat satupun dalam bahasa ini dan sepertinya pantas untuk mencoba dan melakukannya. Butuh sedikit ... karena saya harus mendapatkan kepala saya dulu dan saya percaya ini bisa golf lagi.

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

Cobalah online!

Ini meluas ke segitiga berikut.

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

Jalannya berbelit-belit, tetapi saya akan mencoba dan menjelaskan apa yang telah saya lakukan. Saya akan melewatkan petunjuk arah. Sebagian besar kode adalah manipulasi tumpukan.

  • $:* Masukkan input pertama.
  • $:* Kotak input kedua.
  • S":Ug! Uji apakah nilai kedua lebih besar dari yang pertama.
    • benar p" Swap dengan yang pertama.
    • false, tidak p melakukan apa-apa.
  • $:* Kuadratkan input ketiga.
  • P":USg! Uji apakah nilai ketiga lebih besar dari yang terbesar dari sebelumnya.
    • true p+U- jumlah stack saat ini dan ambil nilai ketiga yang tersimpan
    • false p"U+- sum paling sedikit dan disimpan ketiga dan kurangi dari terbesar
  • 0=% uji kesetaraan ke nol dan hasil keluaran.

6

Haskell ( 33 32 31 byte)

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

Versi asli:

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

Fungsi anonim. Mengambil daftar dalam bentuk [a, b, c]. Output Benar atau Salah.

Versi pertama memeriksa apakah jumlah kuadrat dua kali kuadrat maksimum.

Kedua, versi yang sedikit lebih baik memeriksa apakah setengah jumlah kuadrat adalah elemen dalam daftar kuadrat.

Sunting: Secara tidak sengaja menghitung baris baru, terima kasih H.PWiz


1
Selamat datang di situs ini! Jawaban ini hanya 32 byte, mungkin Anda menghitung baris baru ekstra?
H.PWiz

3
Anda dapat menggunakan fungsi Monad untuk menyimpan lebih banyak byte di sini
H.PWiz

juga, tanda kurung di sekitar sumdapat dibuang. solusi bagus!
haskeller bangga

6

Perl 6 , 24 byte

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

Cobalah online!

*²+*²==*²adalah fungsi anonim yang mengembalikan true jika jumlah kuadrat dari dua argumen pertamanya sama dengan kuadrat dari argumen ketiga. Kami meneruskan daftar input yang diurutkan ke fungsi ini, meratakannya ke dalam daftar argumen dengan |.


6

R , 31 26 30 byte

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

Saya tidak suka yang ini, tapi lebih pendek. Jumlahkan kuadrat dan bagi dengan kuadrat terbesar. Benar kalau 2.

Versi Sebelumnya (dimodifikasi dengan kucing dan dengan tip @ Guiseppe)

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

Lakukan penjumlahan dari input yang disortir dengan item terakhir dinegasi dan kembalikan !tidak.

Cobalah online!


Untuk versi Anda sebelumnya, !sort(scan())^2%*%c(1,1,-1)adalah 27 byte. tapi saya pikir Anda masih perlu cat.
Giuseppe

Cheers @Guiseppe, lupakan kucing itu. Aturan-aturan di sekitar REPL membuatku jengkel, tetapi mereka memang seperti itu.
MickyT

@ Giuseppe Juga sentuhan yang bagus dengan perkalian matriks. Saya tidak akan pernah datang dengan itu.
MickyT

6

Brain-Flak , 68 byte

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

Cobalah online!

Menggunakan pengamatan dalam jawaban 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=

Cobalah online!

Penjelasan

Pertimbangkan input [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)

Cobalah online!

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

Cobalah online!


Tantangan itu diperbarui untuk membatasi input ke bilangan bulat.
Martin Ender


14
A*Alebih pendek ...
Socratic Phoenix


@mdahmoune 67 byte ; membalikkan makna nilai kebenaran dan menggunakan -alih-alih ==.
Jonathan Frech

4

C,  68  54 byte

Menggunakan solusi user202729 .

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

Terima kasih kepada @Christoph untuk bermain golf 14 byte!

Cobalah online!

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

Cobalah online!


Output 1untuk parameter 1, 1, 1yang salah ...
Neil

@ Neil Sudah diperbaiki sekarang.
Steadybox

Pertanyaan telah diperbarui untuk menggunakan int, mungkin menghemat beberapa 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 berkat FrownyFrog

=`+/@\:~*:

jawaban asli

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

/:urutkan kotak *:, lalu periksa apakah jumlah dari dua yang pertama +/@}:sama dengan yang terakhir{:

Cobalah online!


itu sangat pintar
Jonah

4

Triangularity ,  49  31 byte

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

Cobalah online!

Penjelasan

Setiap program Triangularity harus memiliki bantalan segitiga (maafkan permainan kata-katanya). Artinya, saya th garis penghitungan dari bagian bawah program harus empuk dengan i - 1 titik ( .) di setiap sisi. Untuk menjaga agar dot-segitiga simetris dan menyenangkan secara estetika, setiap baris harus terdiri dari 2L - 1 karakter, di mana L adalah jumlah baris dalam program. Menghapus karakter yang menggantikan padding yang diperlukan, berikut adalah cara kerjanya:

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

Memeriksa apakah segitiga siku-siku dalam Triangularity ...


3

PowerShell , 39 byte

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

Cobalah online!

Mengurutkan input, menyimpannya ke dalam $a,$b,$cvariabel. Kemudian gunakan teorema Pythagoras untuk memeriksa apakah a*a + b*b = c*c. Outputnya adalah Boolean Trueatau False.


3

JavaScript 34 byte (tanpa 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)


Saya punya jawaban yang sama di 34: a=>a.sort()[0]**2+a[1]**2==a[2]**2di ES6. Jadi alat bantu untuk Anda @DanielIndie
WallyWest

1
Sayangnya, sort()menggunakan urutan leksikografis ketika tidak ada panggilan balik yang disediakan, membuat kode ini gagal misalnya [10,6,8].
Arnauld

3

RProgN 2 , 10 byte

§²2^r]‘\+e

Dijelaskan

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

Cobalah online!


Mengapa menduplikasi daftar?
mdahmoune

@mdahmoune RProgN2 tidak menyimpan daftar asli pada tumpukan ketika mengeluarkan elemen darinya, tetapi tumpukan adalah dengan referensi, jadi untuk menjaga tumpukan agar melakukan jumlah bagiannya, ia perlu diduplikasi terlebih dahulu.
ATaco

Thanx upvote;)
mdahmoune

3

Racket , 64 60 byte

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

Cobalah online!

Bagaimana itu bekerja

Tes jika a^2 + b^2 + c^2sama dengan dua kali terbesar a^2, b^2dan c^2.

Pengembalian #tuntuk segitiga siku-siku dan #funtuk semua input lainnya.


  • -4 byte berkat saran @ xnor untuk digunakan expt.

Luar biasa;) tetapi saya pikir (define funharus menjadi bagian dari kode ...
mdahmoune

Terima kasih! Saya pikir itu konvensional untuk mengatakan bahwa fungsi murni diizinkan sebagai jawaban. Pada (define fun ...)TIO hanya untuk kenyamanan: kita bisa menggunakan fungsi ini dengan sama baiknya dengan fungsi (... 3 4 5)mana .... (Jadi kita bisa memiliki tajuk (print (dan catatan kaki 3 4 5))jika Anda mau.)
Misha Lavrov

(Tapi ini adalah salah satu pengiriman Racket pertamaku, jadi aku tidak terlalu jelas tentang konvensi spesifik Racket, jika ada. Beberapa solusi masa lalu menggunakan Racket telah termasuk #lang racketdalam kode; beberapa belum.)
Misha Lavrov

1
Racket sangat bertele-tele sehingga lebih pendek untuk diulang (max a b c)daripada letmengikat, ya? Saya tidak mengira akan lebih pendek untuk mengikat sebagai argumen ke λ? Atau, bukankah ada eksponensial bawaan?
xnor

2
@MishaLavrov Lalu bagaimana (*(expt(max a b c)2)2)?
xnor

3

05AB1E , 6 byte

n{R`+Q

Cobalah online!


Contoh pertama gagal mendeteksi [1,1,1] bukan input yang valid (masalah umum pada beberapa upaya lain), tetapi yang kedua berfungsi dengan baik.
Nick Loughlin

@NickLoughlin Ups, menghapus contoh pertama
Okx

Anda bisa melakukannya n{RÆ_untuk menghemat satu byte.
Emigna

3

Ruby, 31 byte

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

Mengambil input sebagai daftar 3 bilangan bulat. Gunakan beberapa ide dari solusi lain.


Saya baru menyadari jawaban yang baru saya posting hampir identik dengan jawaban Anda. Saya berjanji tidak menyalin milik Anda (saya sebenarnya menyimpannya untuk sementara waktu di kotak "Posting jawaban"), tetapi karena milik Anda dikirim terlebih dahulu, jika Anda pikir milik saya terlalu dekat, saya akan menghapusnya.
iamnotmaynard

@iamnotmaynard Ini hampir sama. ini kebetulan lucu lol. Terima kasih telah memberi tahu saya
dkudriavtsev

Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online sehingga orang lain dapat mencoba kode Anda!
mdahmoune

3

Julia 0,6 , 16 byte

!x=xx2x.*x

Cobalah online!

Bagaimana itu bekerja

Misalkan x = [a, b, c] .

x⋅xadalah produk titik dari x dan itu sendiri, sehingga menghasilkan a² + b² + c² .

2x.*xadalah produk elemen-bijaksana 2x dan x , sehingga menghasilkan [2a², 2b², 2c²] .

Akhirnya, tes apakah bilangan bulat a² + b² + c² milik vektor [2a², 2b², 2c²] , yang benar iff
a² + b² + c² = 2a² atau a² + b² + c² = 2b² atau a² + b² + c² = 2c² , yang dengan sendirinya benar jika
b² + c² = a² atau a² + c² = b² atau a² + b² = c² .



3

TI-Basic, 13 11 10 byte

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

Sekarang berfungsi untuk input dalam urutan apa pun dan juga lebih pendek. -1 Lain terima kasih kepada @MishaLavrov


Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online agar orang lain dapat mencoba kode Anda!
mdahmoune

Hanya mendeteksi ini diurutkan segitiga siku: masukan dari A=5, B=4, C=3akan tidak ditangani dengan benar.
Misha Lavrov

@MishaLavrov Terima kasih telah menunjukkan hal itu, penanganannya sebenarnya lebih pendek sebagai daftar. Sekarang berfungsi untuk input dalam urutan apa pun.
Timtech

Jika kita meninggalkan satu ), maka max(Ans=R►Pr(min(Ans),median(Ansitu juga valid (meskipun perhitungan yang kita lakukan di sini berbeda) dan satu byte lebih pendek.
Misha Lavrov

@MishaLavrov Itu menarik, saya mengerti maksud Anda. Saya pikir ungkapannya setara untuk semua input non-negatif.
Timtech

3

CJam, 9

q~$W%~mh=

Cobalah online

Penjelasan:

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

Beberapa penjelasan;)?
mdahmoune

@mdahmoune di sini Anda pergi
aditsu

Sial. Bukankah Anda menulis bahasa itu? Tampaknya tidak adil. (bercanda)
kaine

3

Pari / GP , 29 24 byte

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

Cobalah online!

Disimpan lima byte oleh perubahan yang jelas dari norml2(v)menjadi v*v~.

Terinspirasi oleh jawaban lain.

Di sini vharus ada vektor baris atau vektor kolom dengan tiga koordinat.

Contoh penggunaan: f([3,4,5])

Tentu saja, Anda mendapatkan panjang sisi rasional secara gratis, misalnya f([29/6, 10/3, 7/2]).

Jika saya tidak menghitung f(v)=bagian, itu adalah 19 byte. Bagian pertama juga dapat ditulis v->(total 22 byte).

Penjelasan: Jika tiga koordinat vyang x, ydan z, maka produk vdan transposnya v~memberikan skalar x^2+y^2+^z^2, dan kita perlu memeriksa apakah yang sama dengan dua kali kuadrat dari maksimum koordinat x, y, z.

Ekstra:f Tes yang sama untuk quadruple Pythagoras jika vektor input Anda memiliki empat koordinat, dan seterusnya.


Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online agar orang lain dapat mencoba kode Anda!
mdahmoune

@mdahmoune Anda dapat menggunakan tautan initio.run . Namun, jauh lebih baik untuk menginstal PARI / GP secara lokal.
Jeppe Stig Nielsen

3

MS Excel, 49 Bytes

Fungsi lembar kerja anonim yang mengambil input dari rentang [A1: C1] dan output ke sel panggilan.

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.