Meu triângulo está certo?

47

Dado a, b, co comprimento dos três lados de um triângulo, diga se o triângulo é angular (ou seja, tem um ângulo igual a 90 graus) ou não.

Entrada

Três valores inteiros positivos em qualquer ordem

Resultado

Ou uma verdadeira potência específica ( true, 1, yes, ...) ou uma saída específica falso ( false, 0, no, ...)

Exemplo

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

Regras

  • A entrada e saída podem ser fornecidas em qualquer formato conveniente .
  • Em seu envio, indique os valores verdadeiro e falso.
  • Não há necessidade de lidar com valores negativos ou com borda tripla inválida
  • Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
  • Se possível, inclua um link para um ambiente de teste on-line para que outras pessoas possam experimentar seu código!
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
mdahmoune
fonte
1
Devemos lidar com valores negativos ou com uma borda inválida tripla?
user202729
2
Muito relacionado . Vou deixar para o resto da comunidade decidir se é um idiota.
Digital Trauma
2
Eu acho que o uso de coordenadas em vez de comprimentos muda o desafio significativamente
Luis Mendo
8
Não há triângulo com comprimentos 21, 38, 5, porque 21 + 5 <38 . Esse é um caso patológico intencional com o qual devemos lidar?
22417 Kevin
1
@ Kevin não, você não tem que lidar com este caso. User202729 já fiz esta pergunta :)
mdahmoune

Respostas:

37

Gelatina , 5 bytes

²µSHe

Experimente online!

Nota técnica: Os bytes são contados na página de códigos Jelly.

Explicação:

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

O problema é equivalente a receber três números a, b, ce perguntar se existe uma permutação como essa a² + b² = c². Isso é equivalente a se (a² + b² + c²) ÷ 2é um dos a², b² or c²itens; portanto, o programa apenas verifica isso.

user202729
fonte
bem ... eu geleia.
Félix Gagnon-Grenier
1
Apenas uma nota técnica: símbolos ²e µcusto dois bytes cada um em UTF-8, assim que seu código tem, na verdade, 7 bytes, não 5
Charlie
2
@Charlie Resposta editada para esclarecimento.
user202729
20

Python 2 , 37 bytes

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

Experimente online!

-2 graças ao FlipTack .
-1 graças a Craig Gidney .

Saídas via código de saída ( 0= false, 1= true).

Erik, o Outgolfer
fonte
Bah. Veio com exatamente a mesma resposta. Você pode modificar o conjunto de testes para permitir qualquer número de casos de teste: veja aqui #
mbomb007
@ mbomb007 exec(code)hmmm, por que em exec (code)vez de exec code? : D ;-p
Erik the Outgolfer
Haha, como essa resposta tem o dobro dos votos positivos da resposta mais curta do xnor? Talvez as pessoas gostem da simplicidade doce disso?
FlipTack 25/10
1
@FlipTack _ (ツ) _ / ¯ (também xnor é não é em Python 2)
Erik o Outgolfer
@EriktheOutgolfer Porque o clichê não é a parte a ser jogada no golfe. Eu fiz isso para que ele iria trabalhar em qualquer Python 2 ou 3.
mbomb007
17

Java 8, 44 bytes

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

Explicação:

Experimente aqui.

(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)
Kevin Cruijssen
fonte
Funciona sem os parênteses no (c*=c)? O *=pode ter precedência sobre o ==e você pode salvar dois bytes.
corsiKa
@corsiKa Acho que é o contrário. ==tem precedência sobre *=. =, +=, *=, Atribuições e semelhantes realmente tem o menor precedência em operadores Java .
21717 Kevin Murrijssen
Não consigo encontrar nada mais curto ... Tentei trocar as variáveis ​​para ter o valor máximo atribuído a(por exemplo), sem sucesso. Bem, eu poderia fazê-lo, mas com cerca de 65 caracteres ...
Olivier Grégoire
12

JavaScript (ES6), 43 41 40 bytes

Salvo 1 byte e corrigido um erro graças a @Neil

Recebe a entrada como uma matriz de 3 números inteiros. Retorna truepara ângulos retos e falseoutros.

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


Versão original, 44 bytes

Aceita entrada como 3 números inteiros. Retorna 1para ângulos retos e 0outros.

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

Casos de teste

Arnauld
fonte
Parece que veio com a mesma resposta exata (exceto para o =>e ->diferença entre JavaScript e Java 8). ;) Tão óbvio +1 de mim.
Kevin Cruijssen 23/10
>>1é inseguro, isso retorna verdadeiro para [1, 1, 1].
Neil
2
Que tal Math.hypot(...a,...a)==n*2?
Neil
@Neil Very nice correção :)
Arnauld
2
@Neil Deve haver um ~=operador para "rougly igual";)
jollyjoker
12

Python 3 , 37 bytes

lambda*l:sum(x*x/2for x in l)**.5in l

Experimente online!

Pode ocorrer problemas de precisão de flutuação com entradas grandes.

xnor
fonte
7

Triangular , 57 bytes

Ainda não vi nada nesse idioma e parecia apropriado tentar fazer um. Demorou um pouco ... já que eu tinha que pensar primeiro e acredito que isso poderia ser um pouco mais de golfe.

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

Experimente online!

Isso se expande para o seguinte triângulo.

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

O caminho é bastante complicado, mas vou tentar explicar o que fiz. Vou pular os ponteiros direcionais. A maior parte do código é manipulação de pilha.

  • $:* Esquadrar a primeira entrada.
  • $:* Esquadre a segunda entrada.
  • S":Ug! Teste se o segundo valor é maior que o primeiro.
    • p"Trocar verdadeiro com o primeiro.
    • false p Não faça nada.
  • $:* Esquadre a terceira entrada.
  • P":USg! Teste se o terceiro valor é maior que o maior do anterior.
    • p+U-soma verdadeira a pilha atual e tirar o terceiro valor armazenado
    • p"U+-soma falsa menor e armazenada terceira e subtrair da maior
  • 0=% teste a igualdade para zero e o resultado da saída.
MickyT
fonte
6

Haskell ( 33 32 31 bytes)

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

Versão original:

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

Função anônima. Pega uma lista no formato [a, b, c]. Saídas True ou False.

A primeira versão verificou se a soma dos quadrados era duas vezes o quadrado do máximo.

Segundo, uma versão um pouco melhor verifica se metade da soma dos quadrados é um elemento na lista de quadrados.

Edit: Contou acidentalmente uma nova linha, obrigado H.PWiz

butterdogs
fonte
1
Bem vindo ao site! Esta resposta é de apenas 32 bytes, talvez você tenha contado uma nova linha extra?
H.PWiz
3
Você pode usar a função Mônada para salvar mais alguns bytes aqui
H.PWiz
Além disso, os parênteses ao redor sumpodem ser jogados fora. boa solução!
haskeller orgulhoso
6

Perl 6 , 24 bytes

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

Experimente online!

*²+*²==*²é uma função anônima que retorna true se a soma dos quadrados dos dois primeiros argumentos for igual ao quadrado do terceiro argumento. Passamos a lista de entrada classificada para essa função, achatando-a na lista de argumentos com |.

Sean
fonte
6

R , 31 26 30 bytes

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

Eu não gosto muito deste, mas é mais curto. Soma os quadrados e divide pelo quadrado maior. Verdadeiramente se 2.

Versão anterior (modificada com gato e com a dica de @ Guiseppe)

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

Faça uma soma da entrada classificada com o último item negado e retorne o !não.

Experimente online!

MickyT
fonte
Para a sua versão anterior, !sort(scan())^2%*%c(1,1,-1)são 27 bytes. mas acho que você ainda precisa de um cat.
Giuseppe
Cheers @Guiseppe, esqueci o gato. As regras do REPL me incomodam, mas são o que são.
MickyT
@ Giuseppe Também torção agradável com a multiplicação de matrizes. Eu nunca teria pensado nisso.
MickyT
6

Flak cerebral , 68 bytes

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

Experimente online!

Usa a observação na resposta do usuário202729.

 {                      }      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
Nitrodon
fonte
5

C (gcc) , 49 bytes

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

Experimente online!

Melhora a técnica de Kevin Cruijssens

Retorna 0 para um triângulo válido e um valor diferente de zero, caso contrário

Popeko
fonte
3
Bem-vindo ao PPCG!
caird coinheringaahing
Isso sempre funciona se você estiver usando operações bit a bit?
l4m2
4

MATL , 7 bytes

SU&0)s=

Experimente online!

Explicação

Considere entrada [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
Luis Mendo
fonte
4

Python 2 , 43 bytes

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

Experimente online!

Python 2 , 79 70 68 62 bytes

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

Experimente online!

TFeld
fonte
O desafio foi atualizado para limitar as entradas para números inteiros.
Martin Ender
14
A*Aé mais curto ...
Socratic Phoenix
68 bytes tio.run/…
mdahmoune 23/10
@mdahmoune 67 bytes ; inverter os significados do valor da verdade e usar em -vez de ==.
Jonathan Frech
4

C,  68  54 bytes

Usando a solução de user202729 .

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

Graças a @Christoph por jogar 14 bytes!

Experimente online!

C, 85 bytes

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

Experimente online!

Steadybox
fonte
Saídas 1para os parâmetros de 1, 1, 1que é errado ...
Neil
@ Neil Está consertado agora.
Steadybox # 23/17
A pergunta foi atualizada para usar ints, pode salvar alguns bytes.
corsiKa
f(a,b,c){a=!((a*=a)+(b*=b)-(c*=c)&&a-b+c&&a-b-c);}
Christoph
4

Japonês , 8 bytes

Recebe entrada como uma matriz.

m²
ø½*Ux

Tente

Shaggy
fonte
1
Eu como os símbolos quadrados em sua solução;)
mdahmoune
4

J, 10 bytes

-6 bytes graças ao FrownyFrog

=`+/@\:~*:

resposta original

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

/:classifique os quadrados *:e verifique se a soma dos dois primeiros +/@}:é igual ao último{:

Experimente online!

Jonah
fonte
isso é terrivelmente inteligente
Jonah
4

Triangularidade ,  49  31 bytes

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

Experimente online!

Explicação

Todo programa de triangularidade deve ter um preenchimento triangular (desculpe o trocadilho). Ou seja, a i- ésima linha da parte inferior do programa deve ser preenchida com i-1 pontos ( .) em cada lado. Para manter os triângulos de pontos simétricos e esteticamente agradáveis, cada linha deve consistir em 2L - 1 caracteres, onde L é o número de linhas no programa. Removendo os caracteres que compõem o preenchimento necessário, eis como o código funciona:

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

Verificando se um triângulo está em ângulo reto na Triangularidade ...

Mr. Xcoder
fonte
3

PowerShell , 39 bytes

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

Experimente online!

Classifica a entrada, armazena isso em $a,$b,$cvariáveis. Em seguida, usa o teorema de Pitágoras para verificar se a*a + b*b = c*c. A saída é booleana Trueou False.

AdmBorkBork
fonte
3

JavaScript 34 bytes (sem 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)

DanielIndie
fonte
Eu tive uma resposta semelhante em 34: a=>a.sort()[0]**2+a[1]**2==a[2]**2no ES6. Então adereços para você @DanielIndie
WallyWest
1
Infelizmente, sort()usa a ordem lexicográfica quando nenhum retorno de chamada é fornecido, fazendo com que esse código falhe, por exemplo [10,6,8].
Arnauld
3

RProgN 2 , 10 bytes

§²2^r]‘\+e

Explicado

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

Experimente online!

ATaco
fonte
Por que duplicar a lista?
Mdahmoune
@mdahmoune O RProgN2 não mantém a lista original na pilha ao remover um elemento, mas as pilhas são por referência; portanto, para manter a pilha com a parte da soma, ela precisa ser duplicada primeiro.
ATaco 24/10
Thanx upvote;)
mdahmoune
3

Raquete , 64 60 bytes

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

Experimente online!

Como funciona

Testa se a^2 + b^2 + c^2é igual a duas vezes o maior de a^2, b^2e c^2.

Retorna #tpara triângulos retos e #fpara todas as outras entradas.


  • -4 bytes, graças à sugestão de @ xnor de usar expt.
Misha Lavrov
fonte
Incrível;), mas eu acho que (define fundeve ser uma parte do código ...
mdahmoune
Obrigado! Eu acho que é convencional dizer que funções puras são permitidas como respostas. O (define fun ...)on TIO é apenas por conveniência: poderíamos igualmente usar essa função como (... 3 4 5)onde ...está a função. (Para que pudéssemos ter um cabeçalho de (print (e um rodapé de 3 4 5))se preferir.)
Misha Lavrov
(Mas essa é uma das minhas primeiras submissões ao Racket, por isso não sou muito claro sobre quais convenções específicas do Racket existem, se houver. Algumas soluções anteriores usando o Racket foram incluídas #lang racketno código; outras não.)
Misha Lavrov
1
Raquete é tão prolixo que é mais curto repetir (max a b c)do que fazer uma letencadernação, não é? Suponho que não seria mais curto vincular como argumento a um λ? Ou não há uma exponenciação embutida?
Xnor
2
@MishaLavrov Então, que tal (*(expt(max a b c)2)2)?
Xnor
3

05AB1E , 6 bytes

n{R`+Q

Experimente online!

Okx
fonte
O primeiro exemplo falha ao detectar [1,1,1] não é uma entrada válida (problema comum em outras tentativas), mas o segundo funciona bem.
precisa
@NickLoughlin Ops, removido primeiro exemplo
Okx 24/10
Você poderia fazer n{RÆ_para salvar um byte.
Emigna
3

Ruby, 31 bytes

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

Leva a entrada como uma lista de 3 números inteiros. Usa algumas idéias de outras soluções.

dkudriavtsev
fonte
Acabei de perceber que a resposta que acabei de publicar é quase idêntica à sua. Prometo que não copiei a sua (na verdade, fiquei sentada por um tempo na caixa "Postar uma resposta"), mas desde que a sua foi enviada primeiro, se você acha que a minha está muito perto, eu a excluirei.
Iamnotmaynard #
@iamnotmaynard É praticamente a mesma coisa. isso foi uma coincidência engraçada lol. Obrigado por me informar
dkudriavtsev
Se possível, inclua um link para um ambiente de teste on-line para que outras pessoas possam experimentar seu código!
mdahmoune
3

Julia 0.6 , 16 bytes

!x=xx2x.*x

Experimente online!

Como funciona

Seja x = [a, b, c] .

x⋅xé o produto escalar de x e de si mesmo, portanto produz a² + b² + c² .

2x.*xé o produto dos elementos 2x e x , portanto, produz [2a², 2b², 2c²] .

Finalmente, testa se o número inteiro a² + b² + c² pertence ao vetor [2a², 2b², 2c²] , o que é verdadeiro se
a² + b² + c² = 2a² ou a² + b² + c² = 2b² ou a² + b² + c² = 2c² , o que em si é verdadeiro se
b² + c² = a² ou a² + c² = b² ou a² + b² = c² .

Dennis
fonte
3

Java (OpenJDK 8) , 68 bytes

a->{java.util.Arrays.sort(a);return a[0]*a[0]+a[1]*a[1]==a[2]*a[2];}

Experimente online!

Roberto Graham
fonte
Você pode salvar alguns bytes usando curry em vez de uma matriz?
AdmBorkBork
1
@AdmBorkBork Não, porque sortusa uma matriz.
Olivier Grégoire
3

TI-Basic, 13 11 10 bytes

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

Agora funciona para entradas em qualquer ordem e também é mais curto. Mais -1 graças a @MishaLavrov

Timtech
fonte
Se possível, inclua um link para um ambiente de teste on-line para que outras pessoas possam experimentar seu código!
mdahmoune
Isso só detecta classificadas triângulos retângulos: entrada de A=5, B=4, C=3não seria tratado corretamente.
Misha Lavrov #
@MishaLavrov Obrigado por apontar isso, é realmente um tratamento mais curto como uma lista. Agora ele funciona para entradas em qualquer ordem.
Timtech 25/10
Se deixarmos um único ), max(Ans=R►Pr(min(Ans),median(Anstambém será válido (embora o cálculo que estamos fazendo aqui seja diferente) e seja um byte mais curto.
Misha Lavrov
@MishaLavrov Isso é interessante, entendo o que você quer dizer. Eu acho que as expressões são equivalentes para todas as entradas não negativas.
Timtech 26/10
3

CJam, 9

q~$W%~mh=

Experimente online

Explicação:

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
aditsu
fonte
Algumas explicações;)?
mdahmoune
@mdahmoune aqui vai você
aditsu 26/17
Dang it. Você não escreveu esse idioma? Não parece justo. (piada)
kaine
3

Pari / GP , 29 24 bytes

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

Experimente online!

Salvo cinco bytes por uma mudança óbvia de norml2(v)para v*v~.

Inspirado por outras respostas.

Aqui vdeve haver um vetor de linha ou um vetor de coluna com três coordenadas.

Exemplo de uso: f([3,4,5])

Obviamente, você obtém comprimentos laterais racionais de graça, por exemplo f([29/6, 10/3, 7/2]).

Se eu não contar a f(v)=parte, isso significa 19 bytes. A primeira parte também pode ser gravada v->(total de 22 bytes).

Explicação: Se as três coordenadas do vsão x, ye z, em seguida, o produto de ve sua transposição v~dá um escalar x^2+y^2+^z^2, e é preciso verificar se isso é igual a duas vezes o quadrado da máxima das coordenadas x, y, z.

Extra: Os mesmos ftestes para um quadruplo pitagórico, se o seu vetor de entrada tiver quatro coordenadas, e assim por diante.

Jeppe Stig Nielsen
fonte
Se possível, inclua um link para um ambiente de teste on-line para que outras pessoas possam experimentar seu código!
mdahmoune
@mdahmoune Você pode usar este tio.runlink . No entanto, é muito melhor instalar o PARI / GP localmente.
Jeppe Stig Nielsen
3

MS Excel, 49 bytes

Função de planilha anônima que recebe entrada do intervalo [A1: C1] e sai para a célula chamadora.

=OR(A1^2+B1^2=C1^2,B1^2+C1^2=A1^2,A1^2+C1^2=B1^2)
Taylor Scott
fonte