¿Mi triángulo es correcto?

47

Dada a, b, cla longitud de los tres lados de un triángulo, diga si el triángulo está en ángulo recto (es decir, tiene un ángulo igual a 90 grados) o no.

Entrada

Tres valores enteros positivos en cualquier orden

Salida

Ya sea una verdadera potencia específica ( true, 1, yes, ...) o una salida falsa específica ( false, 0, no, ...)

Ejemplo

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

Reglas

  • La entrada y la salida se pueden dar en cualquier formato conveniente .
  • En su envío, indique los valores verdadero y falso.
  • No es necesario manejar valores negativos o triples de borde inválidos
  • Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
  • Si es posible, incluya un enlace a un entorno de prueba en línea para que otras personas puedan probar su código.
  • Las lagunas estándar están prohibidas.
  • Este es el por lo que se aplican todas las reglas habituales de golf y gana el código más corto (en bytes).
mdahmoune
fuente
1
¿Debemos manejar valores negativos o triples de borde inválidos?
user202729
2
Muy relacionado . Dejaré que el resto de la comunidad decida si es un dup.
Trauma digital
2
Creo que el uso de coordenadas en lugar de longitudes cambia el desafío significativamente
Luis Mendo
8
No hay triángulo con longitudes 21, 38, 5, porque 21 + 5 <38 . ¿Es este un caso patológico intencional que tenemos que manejar?
Kevin
1
@ Kevin no, no tienes que manejar este caso. User202729 ya ha hecho esta pregunta :)
mdahmoune

Respuestas:

37

Jalea , 5 bytes

²µSHe

Pruébalo en línea!

Nota técnica: los bytes se cuentan en la página de códigos Jelly.

Explicación:

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

El problema es equivalente a recibir tres números a, b, cy preguntar si hay una permutación tal que a² + b² = c². Esto es equivalente a si (a² + b² + c²) ÷ 2es uno de ellos a², b² or c², por lo que el programa solo verifica eso.

usuario202729
fuente
bueno ... me pongo gelatina.
Félix Gagnon-Grenier
1
Solo una nota técnica: símbolos ²y µcuestan dos bytes cada uno en UTF-8, por lo que su código tiene en realidad 7 bytes, no 5
Charlie
2
@Charlie Answer editado para aclaración.
usuario202729
20

Python 2 , 37 bytes

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

Pruébalo en línea!

-2 gracias a FlipTack .
-1 gracias a Craig Gidney .

Salidas a través del código de salida ( 0= falso, 1= verdadero).

Erik el Outgolfer
fuente
Bah. Se le ocurrió exactamente la misma respuesta. Puede modificar el conjunto de pruebas para permitir cualquier número de casos de prueba: consulte aquí
mbomb007
@ mbomb007 exec(code)hmmm, ¿por qué en exec (code)lugar de exec code? : D ;-p
Erik the Outgolfer
Jaja, ¿cómo esta respuesta tiene el doble de votos al alza de Xnor? Tal vez a la gente le guste la dulce sencillez
FlipTack el
1
@FlipTack ¯_ (ツ) _ / ¯ (también xnor's no está en Python 2)
Erik the Outgolfer
@EriktheOutgolfer Porque el repetitivo no es la parte que se debe jugar al golf. Lo hice para que funcione en Python 2 o 3.
mbomb007
17

Java 8, 44 bytes

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

Explicación:

Pruébalo aquí

(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
fuente
¿Funciona sin el paréntesis en el (c*=c)? Es *=posible que tenga una preferencia sobre ==y puede guardar dos bytes.
corsiKa
@corsiKa Me temo que es al revés. ==tiene prioridad sobre *=. =, +=, *=, Asignaciones y similares en realidad tienen la prioridad más baja de los operadores de Java .
Kevin Cruijssen
No puedo encontrar nada más corto ... Traté de cambiar las variables para tener el valor máximo asignado a(por ejemplo), sin ningún éxito. Bueno, podría hacerlo, pero alrededor de 65 personajes ...
Olivier Grégoire
12

JavaScript (ES6), 43 41 40 bytes

Guardado 1 byte y reparado un error gracias a @Neil

Toma la entrada como una matriz de 3 enteros. Devoluciones truepara en ángulo recto y de falseotra manera.

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


Versión original, 44 bytes.

Toma la entrada como 3 enteros. Devoluciones 1para en ángulo recto y de 0otra manera.

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

Casos de prueba

Arnauld
fuente
Parece que ocurrió exactamente la misma respuesta (a excepción de la =>y ->diferencia entre JavaScript y Java 8). ;) Tan obvio +1 de mi parte.
Kevin Cruijssen
>>1es inseguro, esto devuelve cierto para [1, 1, 1].
Neil
2
¿Qué tal Math.hypot(...a,...a)==n*2?
Neil
@Neil Muy buena solución :)
Arnauld
2
@Neil Debería haber un ~=operador para "áspero igual";)
JollyJoker
12

Python 3 , 37 bytes

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

Pruébalo en línea!

Podría encontrarse con problemas de precisión de flotación con entradas grandes.

xnor
fuente
7

Triangular , 57 bytes

Todavía no he visto ninguno en este idioma y me pareció apropiado intentarlo. Tomó un poco ... ya que tenía que entenderlo primero y creo que esto podría jugar un poco más.

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

Pruébalo en línea!

Esto se expande al siguiente triángulo.

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

El camino es bastante complicado, pero intentaré explicar lo que he hecho. Me saltearé los punteros direccionales. La mayor parte del código es manipulación de pila.

  • $:* Cuadra la primera entrada.
  • $:* Cuadra la segunda entrada.
  • S":Ug! Pruebe si el segundo valor es mayor que el primero.
    • True p" intercambia con el primero.
    • falso no p hacer nada.
  • $:* Cuadra la tercera entrada.
  • P":USg! Pruebe si el tercer valor es mayor que el mayor del anterior.
    • p+U-suma verdadera la pila actual y quita el tercer valor almacenado
    • p"U+-suma falsa la menor y almacenada tercera y resta de la mayor
  • 0=% prueba la igualdad a cero y el resultado de salida.
MickyT
fuente
6

Haskell ( 33 32 31 bytes)

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

Versión original:

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

Función anónima. Toma una lista en la forma [a, b, c]. Salidas Verdadero o Falso.

La primera versión verificó si la suma de los cuadrados era el doble del cuadrado del máximo.

En segundo lugar, la versión ligeramente mejor verifica si la mitad de la suma de cuadrados es un elemento en la lista de cuadrados.

Editar: accidentalmente contó una nueva línea, gracias H.PWiz

perros de mantequilla
fuente
1
Bienvenido al sitio! Esta respuesta es de solo 32 bytes, ¿quizás contó una nueva línea adicional?
H.PWiz
3
Puede usar la función Monad para guardar algunos bytes más aquí
H.PWiz
Además, los paréntesis sumse pueden tirar. buena solución!
orgulloso Haskeller
6

Perl 6 , 24 bytes

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

Pruébalo en línea!

*²+*²==*²es una función anónima que devuelve verdadero si la suma de los cuadrados de sus dos primeros argumentos es igual al cuadrado de su tercer argumento. Pasamos la lista de entrada ordenada a esta función, aplanándola en la lista de argumentos con |.

Sean
fuente
6

R , 31 26 30 bytes

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

Este no me gusta tanto, pero es más corto. Suma los cuadrados y divide por el cuadrado más grande. Verdad si 2.

Versión anterior (modificada con cat y con la sugerencia de @ Guiseppe)

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

Haga una suma de la entrada ordenada con el último elemento negado y devuelva el !no.

Pruébalo en línea!

MickyT
fuente
Para su versión anterior, !sort(scan())^2%*%c(1,1,-1)es de 27 bytes. pero creo que aún necesitas un cat.
Giuseppe
Saludos @Guiseppe, se olvidó del gato. Las reglas sobre REPL me molestan, pero son lo que son.
MickyT
@Giuseppe También un buen giro con la multiplicación de matrices. Nunca se me hubiera ocurrido eso.
MickyT
6

Brain-Flak , 68 bytes

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

Pruébalo en línea!

Utiliza la observación en la respuesta del usuario 202729.

 {                      }      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
fuente
5

C (gcc) , 49 bytes

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

Pruébalo en línea!

Mejora la técnica de Kevin Cruijssens.

Devuelve 0 para un triángulo válido y, de lo contrario, un valor distinto de cero

Popeko
fuente
3
Bienvenido a PPCG!
caird coinheringaahing
¿Siempre funciona si estás usando operaciones bit a bit?
l4m2
4

MATL , 7 bytes

SU&0)s=

Pruébalo en línea!

Explicación

Considere la 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
fuente
4

Python 2 , 43 bytes

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

Pruébalo en línea!

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

Pruébalo en línea!

TFeld
fuente
El desafío se actualizó para limitar las entradas a enteros.
Martin Ender
14
A*Aes más corto ...
Socratic Phoenix
68 bytes tio.run/…
mdahmoune
@mdahmoune 67 bytes ; voltear los significados del valor de verdad y usar en -lugar de ==.
Jonathan Frech
4

C,  68  54 bytes

Usando la solución user202729 .

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

¡Gracias a @Christoph por jugar al golf con 14 bytes!

Pruébalo en línea!

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

Pruébalo en línea!

Steadybox
fuente
Salidas 1para los parámetros de los 1, 1, 1cuales está mal ...
Neil
@Neil Ya está arreglado.
Steadybox
La pregunta se actualizó para usar ints, podría guardar algunos bytes.
corsiKa
f(a,b,c){a=!((a*=a)+(b*=b)-(c*=c)&&a-b+c&&a-b-c);}
Christoph
4

Japt , 8 bytes

Toma la entrada como una matriz.

m²
ø½*Ux

Intentalo

Lanudo
fuente
1
Me gustan los símbolos cuadrados en su solución;)
mdahmoune
4

J, 10 bytes

-6 bytes gracias a FrownyFrog

=`+/@\:~*:

respuesta original

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

/:ordenar los cuadrados *:, luego verificar si la suma de los dos primeros +/@}:es igual al último{:

Pruébalo en línea!

Jonás
fuente
eso es terriblemente inteligente
Jonás
4

Triangularidad ,  49  31 bytes

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

Pruébalo en línea!

Explicación

Cada programa de triangularidad debe tener un relleno triangular (disculpe el juego de palabras). Es decir, la i ésima línea contando desde la parte inferior del programa debe rellenarse con i - 1 puntos ( .) en cada lado. Para mantener los triángulos de puntos simétricos y estéticamente agradables, cada línea debe constar de 2L - 1 caracteres, donde L es el número de líneas en el programa. Eliminando los caracteres que componen el relleno necesario, así es como funciona el código:

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

Comprobando si un triángulo está en ángulo recto en Triangularidad ...

Sr. Xcoder
fuente
3

PowerShell , 39 bytes

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

Pruébalo en línea!

Ordena la entrada, la almacena en $a,$b,$cvariables. Luego usa el teorema de Pitágoras para verificar si a*a + b*b = c*c. La salida es booleana Trueo False.

AdmBorkBork
fuente
3

JavaScript 34 bytes (sin 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
fuente
Tuve una respuesta similar a los 34: a=>a.sort()[0]**2+a[1]**2==a[2]**2en ES6. Así que apoyos para ti @DanielIndie
WallyWest
1
Desafortunadamente, sort()usa el orden lexicográfico cuando no se proporciona devolución de llamada, por lo que este código falla, por ejemplo [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?

Pruébalo en línea!

Un taco
fuente
¿Por qué duplicar la lista?
mdahmoune
@mdahmoune RProgN2 no mantiene la lista original en la pila cuando saca un elemento de él, pero las pilas son por referencia, por lo que para que la pila haga la parte de la suma, primero debe duplicarse.
ATaco
Voto de agradecimiento
3

Raqueta , 64 60 bytes

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

Pruébalo en línea!

Cómo funciona

Comprueba si a^2 + b^2 + c^2es igual a dos veces el más grande de a^2, b^2y c^2.

Devuelve los #ttriángulos rectángulos y #ftodas las demás entradas.


  • -4 bytes gracias a la sugerencia de uso de @ xnor expt.
Misha Lavrov
fuente
Awesome;) pero creo que (define fundebe ser parte del código ...
mdahmoune
¡Gracias! Creo que es convencional decir que las funciones puras se permiten como respuestas. El (define fun ...)on TIO es solo por conveniencia: también podríamos usar esta función como (... 3 4 5)dónde ...está la función. (Entonces podríamos tener un encabezado (print (y un pie de página 3 4 5))si lo prefiere).
Misha Lavrov
(Pero esta es una de mis primeras presentaciones de Racket, por lo que no tengo muy claro qué convenciones específicas de Racket existen, si las hay. Algunas soluciones anteriores que usan Racket se han incluido #lang racketen el código; otras no.)
Misha Lavrov
1
Racket es tan prolijo que es más corto repetir (max a b c)que hacer un letenlace, ¿eh? Supongo que sería más corto enlazar como argumento a un λ? ¿O no hay una exponenciación incorporada?
xnor
2
@MishaLavrov Entonces, ¿qué tal (*(expt(max a b c)2)2)?
xnor
3

05AB1E , 6 bytes

n{R`+Q

Pruébalo en línea!

Okx
fuente
El primer ejemplo no puede detectar [1,1,1] no es una entrada válida (problema común en algunos otros intentos), pero el segundo funciona bien.
Nick Loughlin
@NickLoughlin Vaya, primer ejemplo eliminado
Okx
Podrías hacer n{RÆ_para guardar un byte.
Emigna
3

Ruby, 31 bytes

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

Toma la entrada como una lista de 3 enteros. Utiliza algunas ideas de otras soluciones.

dkudriavtsev
fuente
Me acabo de dar cuenta de que la respuesta que acabo de publicar es casi idéntica a la tuya. Prometo que no copié el tuyo (en realidad lo tuve sentado un rato en el cuadro "Publicar una respuesta"), pero como el tuyo se envió primero, si crees que el mío está demasiado cerca, lo eliminaré.
Restablece a Monica iamnotmaynard el
@iamnotmaynard Es casi lo mismo. Esta fue una coincidencia divertida jajaja. Gracias por
hacérmelo
Si es posible, incluya un enlace a un entorno de prueba en línea para que otras personas puedan probar su código.
mdahmoune
3

Julia 0.6 , 16 bytes

!x=xx2x.*x

Pruébalo en línea!

Cómo funciona

Sea x = [a, b, c] .

x⋅xes el producto escalar de x y de sí mismo, por lo que produce a² + b² + c² .

2x.*xes el producto de 2x y x , por lo que produce [2a², 2b², 2c²] .

Finalmente, comprueba si el entero a² + b² + c² pertenece al vector [2a², 2b², 2c²] , lo cual es cierto si
a2 + b² + c² = 2a² o a² + b² + c² = 2b² o a² + b² + c² = 2c² , que en sí mismo es cierto si f
b² + c² = a² o a² + c² = b² o a² + b² = c² .

Dennis
fuente
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];}

Pruébalo en línea!

Roberto Graham
fuente
¿Puedes guardar algunos bytes usando curry en lugar de una matriz?
AdmBorkBork
1
@AdmBorkBork Nope, porque sorttoma una matriz.
Olivier Grégoire
3

TI-Basic, 13 11 10 bytes

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

Ahora funciona para entradas en cualquier orden y también es más corto. Otro -1 gracias a @MishaLavrov

Timtech
fuente
Si es posible, incluya un enlace a un entorno de prueba en línea para que otras personas puedan probar su código.
mdahmoune
Esto sólo detecta ordenados triángulos rectángulos: entrada A=5, B=4, C=3no se maneja correctamente.
Misha Lavrov
@MishaLavrov Gracias por señalarlo, en realidad es un manejo más corto como una lista. Ahora funciona para entradas en cualquier orden.
Timtech
Si dejamos un solo ), entonces max(Ans=R►Pr(min(Ans),median(Anstambién es válido (aunque el cálculo que estamos haciendo aquí es diferente) y es un byte más corto.
Misha Lavrov
@MishaLavrov Eso es interesante, entiendo lo que quieres decir. Creo que las expresiones son equivalentes para todas las entradas no negativas.
Timtech
3

CJam, 9

q~$W%~mh=

Pruébalo en línea

Explicación:

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
fuente
Algunas explicaciones;)?
mdahmoune
@mdahmoune aquí tienes
aditsu
Dang it. ¿No escribiste ese idioma? No parece justo (broma)
kaine
3

Pari / GP , 29 24 bytes

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

Pruébalo en línea!

Guardado cinco bytes por un cambio obvio de norml2(v)a v*v~.

Inspirado por otras respuestas.

Aquí vdebe haber un vector de fila o un vector de columna con tres coordenadas.

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

Por supuesto, obtienes longitudes laterales racionales gratis, por ejemplo f([29/6, 10/3, 7/2]).

Si no cuento la f(v)=parte, son 19 bytes. La primera parte también se puede escribir v->(total 22 bytes).

Explicación: Si las tres coordenadas del vson x, yy z, a continuación, el producto de vy su transpuesta v~da un escalar x^2+y^2+^z^2, y tenemos que comprobar si es igual al doble del cuadrado de la máxima de las coordenadas x, y, z.

Extra: las mismas fpruebas para un cuádruple pitagórico si su vector de entrada tiene cuatro coordenadas, y así sucesivamente.

Jeppe Stig Nielsen
fuente
Si es posible, incluya un enlace a un entorno de prueba en línea para que otras personas puedan probar su código.
mdahmoune
@mdahmoune Puedes usar este tio.runenlace . Sin embargo, es mucho mejor instalar PARI / GP localmente.
Jeppe Stig Nielsen
3

MS Excel, 49 bytes

Función de hoja de trabajo anónima que toma la entrada del rango [A1: C1] y la envía a la celda que llama.

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