La otra pierna de Pitágoras

33

A Pitágoras le volaron la pierna en la guerra. Tuvo que ser amputado, y aunque estuvo a punto de morir, se recuperó y se recuperó por completo. Ahora, después de un año de caminar con muletas, ¡tiene el privilegio de obtener una prótesis en la pierna! Sin embargo, hay varios que encajan, pero ¿cuáles?

La tarea

Dado un entero positivo como entrada que es la longitud de un tramo de un triple pitagórico, genera todas las posibilidades para el otro tramo. Por ejemplo, el triple pitagórico más pequeño es (3,4,5), que forma un triángulo con dos patas de longitud 3 y 4, y una hipotenusa de longitud 5.

Ejemplos

Leg:5
12

Leg:28
21
45
96
195

Leg:101
5100

Leg:1001
168
468
660
2880
3432
4080
5460
6468
10200
38532
45540
71568
501000

Las normas

  • La entrada será un solo entero positivo n.
  • La salida puede estar en cualquier orden, con cualquier delimitador, en cualquier base (aunque esta base debe ser consistente), y con llaves de apertura y cierre opcionales, y espacios en blanco finales opcionales. Es decir, que 1 2 3, [1,2,3]y 1,11,111todos se ajustan a esta especificación de salida.
  • Puede suponer que nnunca será mayor que un cuarto de la cuarta raíz del límite de su idioma (sin usar bibliotecas). En la práctica, puede suponer que la entrada será menor que esto o 10,000, lo que sea menor.

Pitágoras te está esperando, ¡así que mejor escribe tu código rápido y corto!

El'endia Starman
fuente
18
Es un tipo realmente extraño. Está dispuesto a esperar un par de miles de años para que se inventen las computadoras, pero no un par de nanosegundos más para leer unos cientos de bytes adicionales. Un hombre muy preciso, por decir lo menos.
corsiKa

Respuestas:

4

Pyth - 13 bytes

Brute fuerza a todos los posibles hasta n^2+1.

f!%.a,TQ1S*QQ

Test Suite .

Maltysen
fuente
11

Jalea , 8 bytes

²R²+²Æ²O

Esta respuesta no es competitiva, ya que utiliza características que se han implementado después de que se publicó el desafío. Pruébalo en línea!

Este enfoque no utiliza matemática de coma flotante, por lo que dará la respuesta correcta siempre que las listas intermedias puedan caber en la memoria.

Idea

Si (a, b, c) es un triple pitagórico, hay enteros estrictamente positivos k, m, n de tal manera que la igualdad establecida {a, b} = {km 2 - kn 2 , 2kmn} se mantiene.

En particular, esto significa que a <b 2 y b <a 2 , por lo que para la entrada a simplemente podemos verificar si a 2 + b 2 es un cuadrado perfecto para cada b en {1, ... a 2 } .

Código

            Input: x

²           Compute x².
 R          Get get range 1 ... x².
  ²         Square each integer in that range.
   +²       Add x² to each resulting square.
     Ʋ     Check if the resulting sums are perfect squares.
       O    Get all indices of ones.
Dennis
fuente
10

Julia, 35 bytes

n->filter(i->hypot(i,n)%1==0,1:n^2)

Esta es una función anónima que acepta un número entero y devuelve una matriz.

Para cada uno idesde 1 hasta la entrada al cuadrado, calculamos la hipotenusa usando la función incorporada de Julia hypot, y determinamos si la porción fraccional es 0. Si es así, la mantenemos, de lo contrario está excluida.

Alex A.
fuente
6

CJam, 17 bytes

{:A2#{Amh1%!},1>}

Esta es una función anónima que saca un número entero de la pila y deja una matriz a cambio.

Pruébalo en línea!

Idea

Si (a, b, c) es un triple pitagórico, hay enteros estrictamente positivos k, m, n de modo que la igualdad establecida {a, b} = {km 2 - kn 2 , 2kmn} mantiene.

En particular, esto significa que a <b 2 y b <a 2 , por lo que para la entrada a simplemente podemos verificar si a 2 + b 2 es un cuadrado perfecto para cada b en {1, ... a 2 } .

Código

:A               Save the input in A.
  2#             Square it.
    {      },    Filter; for each B in {0, ..., A**2}:
     Amh           Calculate the hypotenuse of (A, B).
        1%!        Apply logical NOT to its fractional part.
                 Keep B if ! pushed 1.
             1>  Discard the first kept B (0).  
Dennis
fuente
4

JavaScript ES6, 60 62

Igual que las otras respuestas, comprobando de 1 a a * a-1

a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))

Gracias a @ Mwr247, la forma más corta de construir un rango en ES6

2 bytes guardados thx @ETHproductions

edc65
fuente
¡Increíble! Creo que podría guardar algunos bytes con una función integrada:a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))
ETHproductions
@ETHproductions gracias, necesito aprender más sobre las nuevas matemáticas incorporadas
edc65
Convenientemente, también se analizan en la página que ya ha vinculado. (Hubiera hecho la sugerencia de hipot yo mismo pero no estaba conectado en ese momento.)
Neil
3

C, 96 bytes

Incremente alternativamente y(la otra pierna) y z(la hipotenusa) hasta que su diferencia baje a 1. Genere cada coincidencia exacta ( c==0) que encuentre en el camino.

int x,y,z;main(int c,char**a){for(x=z=atoi(a[1]);++y<z;c=x*x+y*y-z*z,c?z+=c>0:printf("%d ",y));}

Llame al programa compilado con n como parámetro; generará una lista de números decimales separados por espacios.

Obviamente no es el más corto; Puedo encontrar consuelo en tener el más rápido.

$ time ./pyth 9999
200 2020 13332 13668 16968 44440 45360 54540 55660 137532 164832 168168 413080 494900 504900 617120 1514832 1851468 4544540 5554440 16663332 49990000 
real    0m0.846s
user    0m0.800s
sys     0m0.000s
Ruud Helderman
fuente
88 bytes
techo el
3

Wolfram Language (Mathematica) , 40 bytes

b/.Solve[#^2+b^2==c^2,PositiveIntegers]&

Estoy usando una forma no documentada de Solve: cuando se omite la lista de variables, por Solvedefecto se resuelve todos los símbolos en la expresión. De este modo, ahorramos 6 bytes sobre los más regulares Solve[#^2+b^2==c^2,{b,c},PositiveIntegers].

PositiveIntegerses nuevo en la versión 12 de Mathematica y, por lo tanto, no está disponible en TIO . En el escritorio de Mathematica, obtenemos

F = b/.Solve[#^2+b^2==c^2,PositiveIntegers]& ;

F[5]
(*    {12}    *)

F[28]
(*    {21, 45, 96, 195}    *)

F[101]
(*    {5100}    *)

F[1001]
(*    {168, 468, 660, 2880, 3432, 4080, 5460, 6468, 10200, 38532, 45540, 71568, 501000}    *)
romano
fuente
2

Python 2, 53 bytes

lambda n:[i for i in range(1,n*n)if abs(i+n*1j)%1==0]

Una solución sencilla que utiliza complejos abspara calcular la longitud de la hipotenusa. Es seguro usarlo n*ncomo límite superior para la otra pierna porque (n*n)^2 + n^2 < (n*n+1)^2. Intenté usar la recursión, pero no obtuve nada más corto.

xnor
fuente
2

En serio, 20 bytes

,;╗ªDR;`╜@ÇA1@%Y`M@░

La misma estrategia que la respuesta de Python de xnor: verifique los i in range(1,n*n)valores donde abs(i+nj) % 1 == 0y envíe la lista. Pruébalo en línea

Explicación:

,;╗    get input and save a copy in register 0
ªDR;   push two copies of range(1,n*n)
`╜@ÇA1@%Y`M    map the function across one of the ranges:
    ╜@ÇA         compute abs(i+nj)
    1@%Y         push 1 if result % 1 is 0, else 0
M@░    swap the two lists, take values in the original range where the corresponding values in the second range are truthy
Mego
fuente
2

PARI / GP, 36 bytes

x->[y|y<-[1..x^2],issquare(x^2+y^2)]
alephalpha
fuente
2

APL (NARS), 373 caracteres, 746 bytes

C←{h←{0=k←⍺-1:,¨⍵⋄(k<0)∨k≥i←≢w←⍵:⍬⋄↑,/{w[⍵],¨k h w[(⍳i)∼⍳⍵]}¨⍳i-k}⋄1≥≡⍵:⍺h⍵⋄⍺h⊂¨⍵}⋄P←{1≥k←≢w←,⍵:⊂w⋄↑,/{w[⍵],¨P w[a∼⍵]}¨a←⍳k}⋄d←{∪×/¨{k←≢b←1,π⍵⋄∪{b[⍵]}¨↑∪/101 1‼k k}⍵}⋄t←{(-/k),(×/2,⍵),+/k←⍵*2}⋄b←{⍬≡a←3 C d w←⍵:(⊂1,⍵,1)⋄(⊂1,⍵,1),a/⍨{⍵[2]>⍵[3]}¨a←↑∪/P¨,a/⍨{w=×/⍵}¨a}⋄u←{(↑⍵),2÷⍨(+/a),-/a←1↓⍵}⋄t1←{(↑¨⍵)×t¨1↓¨⍵}⋄f1←{0=2∣⍵:↑¨t1 b⍵÷2⋄{2⊃⍵}¨t1 u¨b⍵}⋄f←{m←⎕ct⋄⎕ct←0⋄r←f1⍵⋄⎕ct←m⋄r}

comentario:

C: ⍺ combination in ⍵ list
P: permutations  in ⍵ list
d: divisors of ⍵ unsigned
t: Pythagorian triple from ⍵ list 2 unsigned
b: if argument ⍵ is one unsigned it would return the list of (k,i,j) where 
   k,i,j are all divisors of ⍵, and ⍵=k×i×j and i>j
u: from one triple (k,i,j) return (k,(i+j)/2,(i-j)/2)
t1: apply (k,i,j) to t in the way  k×t i,j 
f: the function of this exercise

La idea sería factorizar la entrada para conocer la posible m, n que se genera usando t todo el triple pitagórico que tiene la entrada como pata. Prueba:

  f 18298292829831839x
167413760243137645229428509060960 15219432749376149566311682641900 99808869980900940 
  1383584795397831778755607512840 
  f 5
12
  f 28
195 96 21 45 
  f 101
5100
  f 1001
501000 6468 38532 2880 468 660 168 5460 45540 4080 71568 3432 10200 
  ≢f 1001
13
  f 1663481166348349x
1383584795397831778755607512900 
  f 198820182831x
19764732550476133587280 346749693868002343608 5664631173992 6083327962596530720 613900915408 115583231289334114460 
  18249983887789596492 1883559626820 1040249081604007030900 54749951663368790920 6588244183492044529092 
  265093577108 2196081394497348176360 
RosLuP
fuente
2

APL (Dyalog Extended) , 15 SBCS de 14 bytes

Función de prefijo tácito anónimo.

(⍸⊢(+∊⊢)⍳×⍳)×⍨

Pruébalo en línea!

×⍨ cuadrado (lit. selfie multiplicación de) el argumento

(... ) aplique la siguiente función tácita anónima:

tetegers 1 a través del argumento

 multiplicar por te ntegers 1 a través del argumento (es decir, cuadrado)

⊢(... ) aplique la siguiente función tácita anónima con el argumento como argumento izquierdo:

  + es la suma

   un miembro de

   ¿eso?

ɩ ndices de verdades

Adán
fuente
1

Perl 5, 43 bytes

$i=<>;{sqrt(++$_**2+$i**2)!~/\./&&say;redo}

Si desea que el script para finalizar, podemos inspeccionar otras patas hasta N² solamente, como se explica más por XNOR , por lo que tenemos 48 bytes:

map{sqrt(++$_**2+$i**2)!~/\./&&say}1..($i=<>)**2
msh210
fuente
1

Japt , 16 bytes

1oU² f@!(MhXU %1

Pruébalo en línea!

Cómo funciona

        // Implicit: U = input integer
1oU²    // Generate a range of integers from 1 to U squared.
f@!(    // Keep only items X that return falsily to:
MhXU %1 //  Math.hypot(X,U) % 1.
        // This keeps only the items where sqrt(X*X+U*U) = 0.
        // Implicit: output last expression
ETHproducciones
fuente
1

05AB1E , 10 bytes

nDLn+Ųƶ0K

Pruébelo en línea o verifique todos los casos de prueba .

nDLʒnIn+Ų

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

n           # Take the square of the (implicit) input-integer
 D          # Duplicate it
  L         # Create a list in the range [1, input^2]
   n        # Square each value in this list
    +       # Add the input^2 we duplicated to each
     Ų     # Check for each of these if it's a square (1 if truthy; 0 if falsey)
       ƶ    # Multiply each value by its 1-based index
        0K  # Remove all 0s from the list
            # (after which the result is output implicitly)

nDL         # Same as above
   ʒ        # Filter this list by:
    n       #  Get the square of the current number
     In+    #  Add the squared input to it
        Ų  #  And check if it's a square
            # (after the filter, implicitly output the result)
Kevin Cruijssen
fuente
1

MathGolf , 9 bytes

²╒gƲk²+°

Pruébalo en línea!

No se pudo encontrar una buena manera de eliminar ninguno de los ² s, que ocupan 3/9 bytes. De lo contrario, es bastante sencillo

Explicación

²           square input
 ╒          range(1,n+1)
  gÆ        filter list using next 5 operators
    ²       square list element
     k²     push input squared
       +    pop a, b : push(a+b)
        °   is perfect square
maxb
fuente
1

Java 8, 72 bytes

n->{for(int i=0;++i<n*n;)if(Math.hypot(i,n)%1==0)System.out.println(i);}

Pruébalo en línea.

Explicación:

n->{                           // Method with integer as parameter and no return-type
  for(int i=0;++i<n*n;)        //  Loop `i` in the range (0, n²)):
    if(Math.hypot(i,n)         //   If sqrt(i² + n²)
       %1==0)                  //   has no decimal digits after the comma (so is an integer)
      System.out.println(i);}  //    Output `i` with trailing newline
Kevin Cruijssen
fuente