Üçgem doğru mu?


47

a, b, cBir üçgenin üç kenarının uzunluğu göz önüne alındığında , üçgenin dik açılı olup olmadığını (yani 90 dereceye eşit bir açıya sahip olup olmadığını) söyleyin .

Giriş

Herhangi bir sırada üç pozitif tam sayı değeri

Çıktı

Ya belirli bir gerçek çıktı ( true, 1, yes, ...) veya belirli bir sahte çıktı ( false, 0, no, ...)

Örnek

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

kurallar

  • Giriş ve çıkış herhangi bir uygun formatta verilebilir .
  • Gönderiminizde lütfen doğru ve yanlış değerleri belirtin.
  • Negatif değerleri veya geçersiz kenar üçünü kullanmaya gerek yok
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlevse, çıktıyı yazdırmak yerine geri gönderebilirsiniz.
  • Mümkünse, lütfen başkalarının kodunuzu deneyebilmesi için çevrimiçi bir test ortamına bir bağlantı ekleyin!
  • Standart boşluklar yasaktır.
  • Bu olduğundan, tüm normal golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

1
Negatif değerleri mi yoksa geçersiz üçlü değeri mi kullanmalıyız?
user202729

2
Çok ilgili . Bunun bir karar olup olmadığına karar vermek için onu topluluğun geri kalanına bırakacağım.
Dijital Travma

2
Uzunluk yerine koordinat kullanmanın zorluğu önemli ölçüde değiştirdiğini düşünüyorum
Luis Mendo

8
Uzunlukları 21, 38, 5olan üçgen yok çünkü 21 + 5 <38 . Ele almamız gereken kasıtlı bir patolojik durum mu?
Kevin

1
@Kevin hayır, bu davayla ilgilenmek zorunda değilsin. Kullanıcı202729 zaten bu soruyu sordu :)
mdahmoune

Yanıtlar:


37

Jöle , 5 bayt

²µSHe

Çevrimiçi deneyin!

Teknik not: Jöle kod sayfasında Bayt sayılır.

Açıklama:

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

Sorun, üç sayı verilmesine eşdeğerdir a, b, cve böyle bir izin olup olmadığını sormaktır a² + b² = c². Bu, (a² + b² + c²) ÷ 2birinin olup olmadığına eşdeğerdir a², b² or c², bu nedenle program bunu kontrol eder.


iyi ... ben jöle.
Félix Gagnon-Grenier

1
Sadece teknik bir not: her biri UTF-8’de iki bayt sembol ²ve µmaliyeti, bu nedenle kodunuz aslında 7 bayt, 5 değil
Charlie

2
@ Charlie Cevap açıklama için düzenlendi.
user202729

20

Python 2 , 37 bayt

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

Çevrimiçi deneyin!

-2 FlipTack sayesinde .
-1 Craig Gidney'e teşekkürler .

Çıkış koduyla çıkışlar ( 0= false, 1= true).


Bah. Aynı cevabı buldum. Herhangi bir sayıda test
senaryosuna

@ mbomb007 exec(code)hmmm, neden exec (code)yerine exec code? : D
;-p

Haha, bu cevabın Xnor'ın kısa cevabının iki katı olması nasıldır? Belki de insanlar bunun
basitliğini severler

1
@FlipTack ¯_ (ツ) _ / ¯ (ayrıca xnor en Python 2'de değil)
Outgolfer Erik

@EriktheOutgolfer Çünkü bu kazan plakası golf edilecek kısım değil. Bunu Python 2 veya 3'te çalışacak şekilde yaptım.
mbomb007

17

Java 8, 44 bayt

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

Açıklama:

Burada dene.

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

Üzerinde parantez olmadan çalışıyor mu (c*=c)? *=Üzerinde precidence olabilir ==ve iki bayt kaydedebilirsiniz.
corsiKa

@ corsiKa Korkarım ki bunun tam tersi. ==önceliği vardır *=. =, +=, *=Ve benzeri atamalar aslında var Java operatörleri düşük önceliğe .
Kevin Cruijssen

Daha kısa bir şey bulamıyorum ... Değişkenleri a(örneğin) atanmış olan maksimum değere sahip olarak değiştirmeyi başardım . Şey yapabilirim, ama yaklaşık 65 karakter ...
Olivier Grégoire

12

JavaScript (ES6), 43 41 40 bayt

1 Bayt kaydedildi ve @Neil sayesinde bir hata düzeltildi

Girdiyi 3 tam sayı dizisi olarak alır. trueDik açılı ve falsebaşka türlü döndürür .

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


Orijinal sürüm, 44 bayt

Girdiyi 3 tamsayı olarak alır. 1Dik açılı ve 0başka türlü döndürür .

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

Test durumları


Biz aynı cevap geldi gibi görünüyor (için hariç =>ve ->JavaScript ve Java 8 arasındaki fark). ;) Yani benden açık +1.
Kevin Cruijssen

>>1güvensiz, bu gerçek için döner [1, 1, 1].
Neil

2
Ne dersiniz Math.hypot(...a,...a)==n*2?
Neil

@Neil Çok hoş bir düzeltme :)
Arnauld

2
@Neil ~="
Kabaca


7

Üçgen , 57 bayt

Bu dilde henüz bir şey görmedim ve denemeyi denemek uygun görünüyordu. Biraz zaman aldı ... ilk başta kafamı sarmak zorunda kaldım ve bunun biraz daha golf oynayabileceğine inanıyorum.

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

Çevrimiçi deneyin!

Bu, aşağıdaki üçgene genişler.

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

Yol oldukça kıvrımlı, ancak ne yaptığımı açıklamaya çalışacağım. Yön işaretlerini atlayacağım. Kodun çoğu yığın manipülasyonudur.

  • $:* İlk girişi kareleyin.
  • $:* İkinci girişi kare.
  • S":Ug! İkinci değerin ilk değerden büyük olup olmadığını test edin.
    • p"ilk gerçek takas.
    • false p Hiçbir Şey Yapma.
  • $:* Üçüncü girişi kare.
  • P":USg! Üçüncü değerin öncekinin en büyük değerinden büyük olup olmadığını test edin.
    • true p+U- , geçerli yığını toplamla ve depolanan üçüncü değeri al
    • Yanlış p"U+- toplamı en az ve saklanan üçüncü ve en büyük çıkar
  • 0=% sıfıra eşitlik testi ve çıktı sonucu.

6

Haskell ( 33 32 31 bayt)

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

Orijinal versiyon:

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

Anonim işlev [A, b, c] biçiminde bir liste alır. Doğru veya Yanlış çıktılar.

İlk versiyon karelerin toplamının maksimumun karesinin iki katı olup olmadığını kontrol etti.

İkinci olarak, biraz daha iyi versiyon kareler toplamının yarısının kareler listesindeki bir eleman olup olmadığını kontrol eder.

Düzenleme: Yanlışlıkla newline sayılır, teşekkürler H.PWiz


1
Siteye Hoşgeldiniz! Bu cevap sadece 32 bayttır, belki fazladan bir yeni satır saydın?
H.PWiz


ayrıca, etrafındaki parantezler sumatılabilir. güzel çözüm!
Gurur haskeller 26:17

6

Perl 6 , 24 bayt

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

Çevrimiçi deneyin!

*²+*²==*²ilk iki argümanının karelerinin toplamı, üçüncü argümanın karesine eşitse doğru olan isimsiz bir fonksiyondur. Sıralanan giriş listesini bu işleve iletip argüman listesine düzleştiriyoruz |.


6

R , 31 26 30 bayt

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

Bundan pek hoşlanmıyorum, ama daha kısa. Kareleri toplar ve en büyük kareye böler. 2 ise hakikaten.

Önceki Sürüm (kediyle ve @ Guiseppe'nin bahşişiyle değiştirilmiş)

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

Sıralanan girişin toplamını son öğe negatiften yapın ve geri döndürmeyin !.

Çevrimiçi deneyin!


Önceki sürümünüz !sort(scan())^2%*%c(1,1,-1)için 27 bayttır. ama bence hala ihtiyacın var cat.
Giuseppe

@Guiseppe alkış, kediyi unuttu. REPL etrafındaki kurallar beni rahatsız ediyor, fakat onlar da onlar.
MickyT

@Giuseppe Ayrıca matris çarpımı ile güzel büküm. Ben asla böyle bir şey yapamazdım.
MickyT

6

Brain-Flak , 68 bayt

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

Çevrimiçi deneyin!

Kullanıcının202729 yanıtındaki gözlemi kullanır.

 {                      }      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 bayt

SU&0)s=

Çevrimiçi deneyin!

açıklama

Girişi düşünün [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 bayt

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

Çevrimiçi deneyin!

Python 2 , 79 70 68 62 bayt

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

Çevrimiçi deneyin!


Zorluk, girdileri tam sayılarla sınırlandırmak için güncellendi.
Martin Ender


14
A*Adaha kısa ...
Socratic Phoenix,


@mdahmoune 67 bytes ; hakikat değerinin anlamlarını çevirmek -yerine kullanmak ==.
Jonathan Frech

4

C,  68  54 bayt

User202729'un çözümünü kullanarak .

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

14 byte golf oynadığı için @ Christoph'a teşekkürler!

Çevrimiçi deneyin!

C, 85 bayt

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

Çevrimiçi deneyin!


1Parametreleri 1, 1, 1yanlış olan çıktılar ...
Neil

@Neil Şimdi düzeltildi.
Steadybox

Soru, ints kullanmak için güncellendi, bazı baytları kaydedebilir.
corsiKa

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


4

J, 10 bayt

FrownyFrog sayesinde -6 bayt

=`+/@\:~*:

orijinal cevap

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

/:kareleri sıralayın *:, ardından ilk ikisinin toplamının +/@}:sonuncusuna eşit olup olmadığını{:

Çevrimiçi deneyin!


Bu çok zekice lanet
Jonah

4

Üçgensellik ,  49  31 bayt

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

Çevrimiçi deneyin!

açıklama

Her Üçgensellik programında üçgen bir dolgu maddesi olmalıdır (punto hariç). Kendisine, i programın altından inci satır sayma dolgulu olmalıdır i - 1 noktalar ( .her iki tarafta). Nokta üçgenleri simetrik ve estetik olarak hoş tutmak için, her satır 2L - 1 karakterden oluşmalıdır , burada L programdaki satır sayısıdır. Gerekli dolguyu oluşturan karakterleri kaldırmak, işte kodun çalışması:

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

Üçgenlikte üçgenin dik açılı olup olmadığını kontrol etmek ...


3

PowerShell , 39 bayt

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

Çevrimiçi deneyin!

Girişi sıralar, $a,$b,$cdeğişkenlere kaydeder. Sonra Pisagor teoremi kullanarak olup olmadığını kontrol etmek a*a + b*b = c*c. Çıktı Boolean Trueveya False.


3

JavaScript 34 bayt (D = olmadan)

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)


Benzer bir cevabı 34: a=>a.sort()[0]**2+a[1]**2==a[2]**2ES6'da da verdim. Öyleyse sana sahne @DanielIndie
WallyWest 23:17

1
Ne yazık ki, sort()herhangi bir geri arama sağlanmadığında sözdizimsel sırayı kullanır ve bu kodu örneğin başarısız kılar [10,6,8].
Arnauld

3

RProgN2 , 10 bayt

§²2^r]‘\+e

Açıklaması

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

Çevrimiçi deneyin!


Listeyi neden çoğaltıyorsunuz?
mdahmoune

@mdahmoune RProgN2, bir öğeyi çıkarırken yığındaki orijinal listeyi tutmaz, ancak yığınlar referans olarak verilmiştir, bu nedenle yığının toplam kısmını yapmasını sağlamak için önce çoğaltılması gerekir.
ATaco

Thanx upvote;)
mdahmoune

3

Raket , 64 60 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

Testler eğer a^2 + b^2 + c^2isimli iki katı büyük için eşit a^2, b^2ve c^2.

İade #thakkı üçgenler ve #fdiğer tüm girişler için.


  • @ Xnor’ın kullanması önerisi sayesinde -4 bayt expt.

Awesome;) ama bence (define funkodun bir parçası olmalı ...
mdahmoune

Teşekkür ederim! Bence saf fonksiyonlara cevap olarak izin verildiğini söylemek geleneksel. (define fun ...)TIO sadece kolaylık içindir: Biz eşit sıra bu fonksiyonu kullanabilirsiniz (... 3 4 5)nerede ...fonksiyonudur. (Yani eğer istersen bir başlık (print (ve altbilgiye sahip 3 4 5))olabiliriz.)
Misha Lavrov

(Ama bu, eğer varsa, orada ne Raket özgü kuralları üzerinde çok net değilim bu yüzden, benim ilk Raket gönderimler biridir Raket kullanan bazı geçmiş çözümler dahil ettik. #lang racketKodda, bazıları değil.)
Misha Lavrov

1
Raket o kadar endişe verici ki, tekrarlamak ciltleme (max a b c)yapmaktan daha kısa. letBir argüman olarak bağlamanın daha kısa olacağını sanmıyorum λ? Veya, yerleşik bir üstel yapı yok mu?
xnor

2
@MishaLavrov O zaman nasıl (*(expt(max a b c)2)2)?
xnor


3

Ruby, 31 bayt

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

3 tam sayı listesi olarak girdi alır. Diğer çözümlerden bazı fikirler kullanır.


Yeni gönderdiğim cevabın sizinkiyle neredeyse aynı olduğunu farkettim. Söz veriyorum ben seninkileri kopyalamam (Aslında "Bir cevap yaz" kutucuğunda bir süre oturuyordum), ama seninki ilk gönderildiğinden beri, benimki çok yakın olduğunu düşünüyorsanız, onu sileceğim.
iamnotmaynard

@iamnotmaynard Hemen hemen aynı şey. Bu komik bir tesadüf lol oldu.
Haber

Mümkünse, lütfen başkalarının kodunuzu deneyebilmesi için çevrimiçi bir test ortamına bir bağlantı ekleyin!
mdahmoune

3

Julia 0.6 , 16 bayt

!x=xx2x.*x

Çevrimiçi deneyin!

Nasıl çalışır

Let , x = [a, b, c] .

x⋅xx'in kendisinin nokta ürünü olduğundan, a² + b² + c² verir .

2x.*x2x ve x'in eleman şeklinde ürünüdür , bu yüzden [2a², 2b², 2c²] ürün verir .

Son olarak, test ise tam sayı a² + b² + c² vektöre ait [2a², 2b², 2c²] olduğu, doğru iff
a² + b² + c² = 2a² veya a² + b² + c² = 2b² veya a² + b² + c² = 2c² , olan kendisi doğru iff
b² + c² = a² veya a² + c² = b² veya a² + b² = c² .



3

TI-Basic, 13 11 10 bayt

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

Şimdi herhangi bir sırayla girişler için çalışıyor ve aynı zamanda daha kısa. @MishaLavrov sayesinde bir -1 daha


Mümkünse, lütfen başkalarının kodunuzu deneyebilmesi için çevrimiçi bir test ortamına bir bağlantı ekleyin!
mdahmoune

Bu yalnızca algılar doğru üçgen sıralanmış: girdi ait A=5, B=4, C=3doğru şekilde ele olmazdı.
Misha Lavrov

@MishaLavrov Buna dikkat çektiğiniz için teşekkür ederiz, aslında liste olarak kullanım daha kısadır. Şimdi herhangi bir sırayla girişler için çalışıyor.
Timtech

Eğer bir bekar bırakırsak ), o max(Ans=R►Pr(min(Ans),median(Anszaman da geçerlidir (burada yaptığımız hesap farklı olsa da) ve bir bayt daha kısadır.
Misha Lavrov

@MishaLavrov Bu ilginç, ne demek istediğini anlıyorum. Tüm negatif olmayan girdiler için ifadelerin eşdeğer olduğunu düşünüyorum.
Timtech

3

CJam, 9

q~$W%~mh=

Çevrimiçi deneyin

Açıklama:

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

Bazı açıklamalar;)?
mdahmoune

@mdahmoune here go
aditsu

Onu tehlikeye sok. Bu dili yazmadın mı? Adil gözükmüyor. (şaka)
kaine

3

Pari / GP , 29 24 bayt

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

Çevrimiçi deneyin!

Dan bariz bir değişiklikten beş bayt Kaydedilen norml2(v)için v*v~.

Diğer cevaplardan ilham alındı.

Burada vbir satır vektörü veya üç koordinatlı bir sütun vektörü olmalıdır .

Kullanım örneği: f([3,4,5])

Tabii ki, örneğin ücretsiz rasyonel yan uzunlukları olsun f([29/6, 10/3, 7/2]).

Parçayı saymazsam f(v)=, bu 19 bayttır. İlk kısım da yazılabilir v->(toplam 22 bayt).

Açıklama: Üç koordinatları ise vşunlardır x, yve z, daha sonra ürün vve devrik v~bir skalar verir x^2+y^2+^z^2ve biz bu koordinatların maksimum iki kez kareye eşit olup olmadığını kontrol etmek gerek x, y, z.

Ekstra: Girdi vektörünüzde dört koordinat varsa, fbir Pisagor dörtlü için de aynı testler .


Mümkünse, lütfen başkalarının kodunuzu deneyebilmesi için çevrimiçi bir test ortamına bir bağlantı ekleyin!
mdahmoune

@mdahmoune Bu tio.runlinki kullanabilirsiniz . Ancak, yerel olarak sadece PARI / GP'yi kurmak daha güzel .
Jeppe Stig Nielsen

3

MS Excel, 49 Bayt

[A1: C1] aralığından girdi alan ve çağıran hücreye çıkış yapan adsız çalışma işlevi.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.