Czy mój trójkąt ma rację?


47

Biorąc pod uwagę a, b, cdługość trzech boków trójkąta, powiedzmy, czy trójkąt jest ustawiony pod kątem prostym (tj. Ma jeden kąt równy 90 stopni), czy nie.

Wejście

Trzy dodatnie wartości całkowite w dowolnej kolejności

Wynik

Albo specyficzny prawdziwe wyjścia ( true, 1, yes, ...) lub wyjście specyficzny false ( false, 0, no, ...)

Przykład

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

Zasady

  • Dane wejściowe i wyjściowe można podawać w dowolnym dogodnym formacie .
  • W swoim zgłoszeniu proszę podać prawdziwe i fałszywe wartości.
  • Nie trzeba obsługiwać wartości ujemnych ani potrójnych niepoprawnych krawędzi
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
  • Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inni mogli wypróbować Twój kod!
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).

1
Czy musimy obsługiwać wartości ujemne, czy trzykrotnie nieważne krawędzie?
user202729,

2
Bardzo podobne . Zostawię to reszcie społeczności, aby zdecydowała, czy to duplikat.
Cyfrowa trauma

2
Myślę, że użycie współrzędnych zamiast długości znacząco zmienia wyzwanie
Luis Mendo

8
Nie ma trójkąta o długości 21, 38, 5, ponieważ 21 + 5 <38 . Czy to zamierzony przypadek patologiczny, z którym musimy sobie poradzić?
Kevin

1
@ Kevin nie, nie musisz zajmować się tą sprawą. User202729 już zadał to pytanie :)
mdahmoune

Odpowiedzi:


37

Galaretka , 5 bajtów

²µSHe

Wypróbuj online!

Uwaga techniczna: bajty są liczone na stronie kodowej Jelly.

Wyjaśnienie:

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

Problem jest równoznaczny z a, b, cpodaniem trzech liczb i pytaniem, czy istnieje taka permutacja a² + b² = c². Jest to równoważne z tym, czy (a² + b² + c²) ÷ 2jest jednym z a², b² or c², więc program po prostu to sprawdza.


cóż ... galaretę.
Félix Gagnon-Grenier

1
Tylko uwaga techniczna: symbole ²i µkosztują dwa bajty w UTF-8, więc twój kod ma w rzeczywistości 7 bajtów, a nie 5
Charlie

2
@Charlie Odpowiedź zredagowana w celu wyjaśnienia.
user202729,

20

Python 2 , 37 bajtów

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

Wypróbuj online!

-2 dzięki FlipTack .
-1 dzięki Craig Gidney .

Dane wyjściowe za pośrednictwem kodu wyjścia ( 0= fałsz, 1= prawda).


Bah. Przyszedł z tą samą odpowiedzią. Możesz zmodyfikować pakiet testowy, aby zezwolił na dowolną liczbę przypadków testowych: patrz tutaj
mbomb007

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

Haha, w jaki sposób ta odpowiedź ma dwa razy więcej głosów niż krótsza xnor? Może ludziom podoba się słodka
prostota

1
@FlipTack ¯_ (ツ) _ / ¯ (również xnora nie ma w Pythonie 2)
Erik the Outgolfer

@EriktheOutgolfer Ponieważ płyta grzewcza nie jest częścią do gry w golfa. Zrobiłem to, aby działało w Pythonie 2 lub 3.
mbomb007,

17

Java 8, 44 bajty

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

Wyjaśnienie:

Wypróbuj tutaj.

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

Czy to działa bez nawiasów w sieci (c*=c)? *=Może mieć precidence nad ==i można zaoszczędzić dwa bajty.
corsiKa

@corsiKa Obawiam się, że jest na odwrót. ==ma pierwszeństwo przed *=. =, +=, *=Oraz inne podobne zadania faktycznie mają najniższy priorytet w operatorów Java .
Kevin Cruijssen

Nie mogę znaleźć niczego krótszego ... Próbowałem zamienić zmienne, aby przypisać maksymalną wartość a(na przykład), bez powodzenia. Cóż, mogłem to zrobić, ale około 65 znaków ...
Olivier Grégoire

12

JavaScript (ES6), 43 41 40 bajtów

Zapisałem 1 bajt i naprawiłem błąd dzięki @Neil

Pobiera dane wejściowe jako tablicę 3 liczb całkowitych. Zwraca truedla prostopadłych i falseinnych.

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


Wersja oryginalna, 44 bajty

Pobiera dane wejściowe jako 3 liczby całkowite. Zwraca 1dla prostopadłych i 0innych.

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

Przypadki testowe


Wygląda na to, że wpadł na dokładnie tej samej odpowiedzi (z wyjątkiem =>i ->różnicy między JavaScript i Java 8). ;) Tak oczywiste +1 ode mnie.
Kevin Cruijssen

>>1jest niebezpieczne, zwraca wartość true dla [1, 1, 1].
Neil

2
Jak o Math.hypot(...a,...a)==n*2?
Neil

@Neil Very nice fix :)
Arnauld

2
@Neil Powinien istnieć ~=operator dla „z grubsza równego”;)
JollyJoker


7

Trójkątny , 57 bajtów

Nie spotkałem się jeszcze z tym językiem i wydawało mi się, że warto spróbować. Trochę to zajęło ... ponieważ najpierw musiałem się tym zająć i wierzę, że można by jeszcze trochę zagrać w golfa.

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

Wypróbuj online!

To rozwija się do następującego trójkąta.

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

Ścieżka jest dość skomplikowana, ale postaram się wyjaśnić, co zrobiłem. Pominę wskaźniki kierunkowe. Większość kodu to manipulacja stosami.

  • $:* Kwadrat pierwszego wejścia.
  • $:* Kwadrat drugiego wejścia.
  • S":Ug! Sprawdź, czy druga wartość jest większa niż pierwsza.
    • true p" Zamień z pierwszym.
    • false p Nie rób nic.
  • $:* Kwadrat trzeciego wejścia.
  • P":USg! Sprawdź, czy trzecia wartość jest większa od największej z poprzedniej.
    • true p+U- sumuje bieżący stos i zabiera zapisaną trzecią wartość
    • fałszywa p"U+- suma najmniejsza i zapisana trzecia i odejmij od największej
  • 0=% test równości do zera i wynik wyjściowy.

6

Haskell ( 33 32 31 bajtów)

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

Orginalna wersja:

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

Funkcja anonimowa. Pobiera listę w postaci [a, b, c]. Wyprowadza wartość True lub False.

Pierwsza wersja sprawdzała, czy suma kwadratów była dwukrotnością kwadratu maksimum.

Po drugie, nieco lepsza wersja sprawdza, czy połowa sumy kwadratów jest elementem na liście kwadratów.

Edycja: przypadkowo policzyłem nowy wiersz, dzięki H.PWiz


1
Witamy na stronie! Ta odpowiedź ma tylko 32 bajty, może policzyłeś dodatkowy znak nowej linii?
H.PWiz

3
Możesz użyć funkcji Monada, aby zapisać więcej bajtów tutaj
H.PWiz

również nawiasy wokół summożna wyrzucić. fajne rozwiązanie!
dumny haskeller

6

Perl 6 , 24 bajtów

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

Wypróbuj online!

*²+*²==*²jest anonimową funkcją, która zwraca true, jeśli suma kwadratów pierwszych dwóch argumentów jest równa kwadratowi trzeciego argumentu. Do tej funkcji przekazujemy posortowaną listę danych wejściowych, spłaszczając ją do listy argumentów za pomocą |.


6

R , 31 26 30 bajtów

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

Nie podoba mi się ten, ale jest krótszy. Sumuje kwadraty i dzieli przez największy kwadrat. Prawda, jeśli 2.

Poprzednia wersja (zmodyfikowana za pomocą kota i końcówki @ Guiseppe)

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

Wykonaj sumę posortowanego wejścia z zanegowanym ostatnim elementem i zwróć !nie.

Wypróbuj online!


W poprzedniej wersji !sort(scan())^2%*%c(1,1,-1)jest 27 bajtów. ale myślę, że nadal potrzebujesz cat.
Giuseppe,

Pozdrawiam @Guiseppe, zapomniałem o kocie. Denerwują mnie zasady dotyczące REPL, ale takie są.
MickyT

@Giuseppe Również fajny zwrot z mnożenia macierzy. Nigdy bym tego nie wymyślił.
MickyT

6

Brain-Flak , 68 bajtów

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

Wypróbuj online!

Wykorzystuje obserwację w odpowiedzi 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 bajtów

SU&0)s=

Wypróbuj online!

Wyjaśnienie

Rozważ wejście [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 bajty

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

Wypróbuj online!

Python 2 , 79 70 68 62 bajtów

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

Wypróbuj online!


Wyzwanie zostało zaktualizowane, aby ograniczyć dane wejściowe do liczb całkowitych.
Martin Ender


14
A*Ajest krótszy ...
Socratic Phoenix

68 bajtów tio.run/…
mdahmoune

@mdahmoune 67 bajtów ; przerzucanie znaczeń wartości prawdy i używanie -zamiast ==.
Jonathan Frech

4

C,  68  54 bajtów

Korzystanie z rozwiązania user202729 .

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

Dzięki @Christoph za grę w golfa 14 bajtów!

Wypróbuj online!

C, 85 bajtów

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

Wypróbuj online!


Dane wyjściowe 1dla parametrów, 1, 1, 1które są niepoprawne ...
Neil

@ Neil Jest już naprawiony.
Steadybox

Pytanie zostało zaktualizowane, aby używać ints, może zaoszczędzić niektóre bajty.
corsiKa

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


4

J, 10 bajtów

-6 bajtów dzięki FrownyFrog

=`+/@\:~*:

oryginalna odpowiedź

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

/:posortuj kwadraty *:, a następnie sprawdź, czy suma pierwszych dwóch +/@}:równa się ostatniej{:

Wypróbuj online!


to cholernie sprytne
Jonah

4

Trójkątność ,  49  31 bajtów

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

Wypróbuj online!

Wyjaśnienie

Każdy program Trójkątności musi mieć trójkątne wypełnienie (przepraszam za kalambur). Oznacza to, że i- ta linia licząca od dołu programu musi być uzupełniona i-1 kropkami ( .) z każdej strony. Aby trójkąty kropkowe były symetryczne i estetyczne, każda linia musi składać się z 2L - 1 znaków, gdzie L jest liczbą linii w programie. Usuwając znaki, które składają się na niezbędne wypełnienie, oto jak działa kod:

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

Sprawdzanie, czy trójkąt jest ustawiony pod kątem prostym w trójkątności ...


3

PowerShell , 39 bajtów

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

Wypróbuj online!

Sortuje dane wejściowe i zapisuje je w $a,$b,$czmiennych. Następnie używa twierdzenia Pitagorasa, aby sprawdzić, czy a*a + b*b = c*c. Dane wyjściowe to Boolean Truelub False.


3

JavaScript 34 bajty (bez 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)


Miałem podobną odpowiedź w wieku 34 lat: a=>a.sort()[0]**2+a[1]**2==a[2]**2w ES6. Więc podoba Ci się @DanielIndie
WallyWest

1
Niestety sort()używa kolejności leksykograficznej, gdy nie jest dostępne wywołanie zwrotne, co powoduje na przykład, że ten kod zawodzi [10,6,8].
Arnauld,

3

RProgN 2 , 10 bajtów

§²2^r]‘\+e

Wyjaśniono

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

Wypróbuj online!


Po co powielać listę?
mdahmoune

@mdahmoune RProgN2 nie zachowuje oryginalnej listy na stosie, gdy usuwa się z niej element, ale stosy są przez odniesienie, więc aby zachować stos jako sumę, najpierw trzeba go zduplikować.
ATaco

Dziękuję za głos;)
mdahmoune

3

Rakieta , 64 60 bajtów

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

Wypróbuj online!

Jak to działa

Testy jeśli a^2 + b^2 + c^2jest równa dwukrotności największa a^2, b^2i c^2.

Zwraca #tdla prostokątnych trójkątów i #fdla wszystkich innych danych wejściowych.


  • -4 bajty dzięki sugestii @ xnor expt.

Niesamowite;) ale myślę, że (define funmusi być częścią kodu ...
mdahmoune

Dziękuję Ci! Myślę, że konwencjonalne jest twierdzenie, że czyste funkcje są dozwolone jako odpowiedzi. (define fun ...)Na TIO jest tylko dla wygody: moglibyśmy równie dobrze użyć tej funkcji jako (... 3 4 5)gdzie ...jest funkcja. (Więc możemy mieć nagłówek (print (i stopkę, 3 4 5))jeśli wolisz.)
Misza Ławrow

(Ale to jedno z moich pierwszych zgłoszeń dotyczących rakiet, więc nie jestem zbyt jasny, jakie są konwencje specyficzne dla rakiet, jeśli takie istnieją. Niektóre wcześniejsze rozwiązania wykorzystujące rakietę zostały włączone #lang racketdo kodu; niektóre nie.)
Misha Lavrov

1
Rakieta jest tak niewygodna, że ​​powtarzanie jest krótsze (max a b c)niż letwiązanie, co? Nie sądzę, że krótsze byłoby wiązanie jako argument do λ? A może nie ma wbudowanego potęgowania?
xnor

2
@MishaLavrov Więc co powiesz na (*(expt(max a b c)2)2)?
xnor

3

05AB1E , 6 bajtów

n{R`+Q

Wypróbuj online!


Pierwszy przykład nie wykrywa [1,1,1] nie jest prawidłowym wejściem (częsty problem przy niektórych innych próbach), ale drugi działa dobrze.
Nick Loughlin

@NickLoughlin Ups, usunięto pierwszy przykład
Okx

Możesz zrobić, n{RÆ_aby zapisać bajt.
Emigna

3

Ruby, 31 bajtów

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

Pobiera dane wejściowe jako listę 3 liczb całkowitych. Wykorzystuje pomysły z innych rozwiązań.


Właśnie zdałem sobie sprawę, że odpowiedź, którą właśnie opublikowałem, jest prawie identyczna z twoją. Obiecuję, że nie skopiowałem twojego (faktycznie miałem go przez pewien czas w polu „Opublikuj odpowiedź”), ale ponieważ twoje zostało przesłane jako pierwsze, jeśli uważasz, że moje jest zbyt blisko, usunę je.
iamnotmaynard

@iamnotmaynard To właściwie to samo. to był zabawny zbieg okoliczności lol. Dzięki za poinformowanie mnie
dkudriavtsev

Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inni mogli wypróbować Twój kod!
mdahmoune

3

Julia 0.6 , 16 bajtów

!x=xx2x.*x

Wypróbuj online!

Jak to działa

Niech x = [a, b, c] .

x⋅xjest iloczynem iloczynu x i samego, więc daje a² + b² + c² .

2x.*xjest iloczynem elementarnym 2x i x , więc daje [2a², 2b², 2c²] .

Na koniec sprawdza, czy liczba całkowita a² + b² + c² należy do wektora [2a², 2b², 2c²] , co jest prawdziwe iff
a² + b² + c² = 2a² lub a² + b² + c² = 2b² lub a² + b² + c² = 2c² , co samo w sobie jest prawdziwe iff
b² + c² = a² lub a² + c² = b² lub a² + b² = c² .



3

TI-Basic, 13 11 10 bajtów

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

Teraz działa na dane wejściowe w dowolnej kolejności i jest również krótszy. Kolejne -1 dzięki @MishaLavrov


Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inni mogli wypróbować Twój kod!
mdahmoune

To tylko wykrywa klasyfikowane odpowiednie trójkąty: wejście A=5, B=4, C=3by nie być prawidłowo obsługiwane.
Misha Lavrov

@MishaLavrov Dzięki za zwrócenie na to uwagi, tak naprawdę jest krótsza obsługa listy. Teraz działa dla danych wejściowych w dowolnej kolejności.
Timtech,

Jeśli pominiemy pojedynczy ), to max(Ans=R►Pr(min(Ans),median(Ansjest również poprawny (chociaż obliczenia, które tu wykonujemy, są inne) i są o jeden bajt krótsze.
Misha Lavrov

@MishaLavrov To ciekawe, rozumiem, co masz na myśli. Myślę, że wyrażenia są równoważne dla wszystkich nieujemnych danych wejściowych.
Timtech

3

CJam, 9

q~$W%~mh=

Wypróbuj online

Wyjaśnienie:

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

Jakieś wyjaśnienia;)?
mdahmoune

@mdahmoune here you go
aditsu

Cholera. Nie napisałeś tego języka? To nie wydaje się sprawiedliwe. (żart)
kaine

3

Pari / GP , 29 24 bajtów

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

Wypróbuj online!

Oszczędność pięciu bajtów dzięki oczywistej zmianie z norml2(v)na v*v~.

Inspirowany innymi odpowiedziami.

Tutaj vmoże być wektorem rząd lub wektora kolumny trzech współrzędnych.

Przykład zastosowania: f([3,4,5])

Oczywiście, na przykład, otrzymujesz racjonalne długości boków f([29/6, 10/3, 7/2]).

Jeśli nie liczę f(v)=części, to jest 19 bajtów. Pierwszą część można również napisać v->(łącznie 22 bajty).

Objaśnienie: Jeżeli trzy współrzędne vx, yi z, następnie produktem vi jego transpozycji v~daje skalarne x^2+y^2+^z^2i musimy sprawdzić, czy to jest równa dwukrotności kwadratu maksimum współrzędnych x, y, z.

Dodatkowo: Te same ftesty dla poczwórnej Pitagorasa, jeśli wektor wejściowy ma cztery współrzędne i tak dalej.


Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inni mogli wypróbować Twój kod!
mdahmoune

@mdahmoune Możesz użyć tego tio.runlinku . Jednak dużo przyjemniej jest po prostu zainstalować PARI / GP lokalnie.
Jeppe Stig Nielsen

3

MS Excel, 49 bajtów

Anonimowa funkcja arkusza roboczego, która pobiera dane z zakresu [A1: C1] i wysyła je do komórki wywołującej.

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.