A outra perna de Pitágoras

33

Pitágoras teve sua perna estourada na guerra. Tinha que ser amputado e, embora ele quase morresse, ele se recuperou e se recuperou completamente. Agora, depois de um ano andando de muletas, ele tem o privilégio de ter uma perna protética! A coisa é, porém, existem vários que se encaixam, mas quais?

A tarefa

Dado um número inteiro positivo como entrada, que é o comprimento de uma perna de um triplo pitagórico, gera todas as possibilidades para a outra perna. Por exemplo, o menor triplo pitagórico é (3,4,5), que forma um triângulo com duas pernas de comprimento 3 e 4 e uma hipotenusa de comprimento 5.

Exemplos

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

As regras

  • A entrada será um único número inteiro positivo n.
  • A saída pode estar em qualquer ordem, com qualquer delimitador, em qualquer base (embora essa base deva ser consistente), com chaves de abertura e fechamento opcionais e espaço em branco à direita opcional. Ou seja, 1 2 3, [1,2,3], e 1,11,111todos se encaixam esta especificação de saída.
  • Você pode supor que nnunca será maior que um quarto da quarta raiz do limite do seu idioma (sem usar bibliotecas). Na prática, você pode assumir que a entrada será menor que isso ou 10.000, o que for menor.

Pitágoras está esperando por você, então é melhor escrever seu código rápido e rápido!

El'endia Starman
fonte
18
Ele é um cara muito estranho. Ele está disposto a esperar alguns milhares de anos para que os computadores sejam inventados, mas não mais alguns nanossegundos para ler algumas centenas extras de bytes. Um homem muito preciso, para dizer o mínimo.
CorsiKa 07/12/2015

Respostas:

4

Pitão - 13 bytes

O bruto força todos os possíveis até o momento n^2+1.

f!%.a,TQ1S*QQ

Conjunto de Teste .

Maltysen
fonte
11

Geléia , 8 bytes

²R²+²Æ²O

Essa resposta não é concorrente, pois usa recursos que foram implementados após o lançamento do desafio. Experimente online!

Essa abordagem não usa matemática de ponto flutuante; portanto, fornecerá a resposta correta desde que as listas intervenientes possam caber na memória.

Idéia

Se (a, b, c) é um triplo pitagórico, existem números inteiros estritamente positivos k, m, n de modo que a igualdade definida {a, b} = {km 2 - kn 2 , 2kmn} é válida.

Em particular, isto significa que a <b 2 e b <a 2 , então para a entrada de um podemos simplesmente verificar se um 2 + b 2 é um quadrado perfeito para cada b em {1, ... um 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
fonte
10

Julia, 35 bytes

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

Esta é uma função anônima que aceita um número inteiro e retorna uma matriz.

Para cada um ide 1 à entrada ao quadrado, calculamos a hipotenusa usando a hypotfunção incorporada de Julia e determinamos se a parte fracionária é 0. Nesse caso, mantemos-a, caso contrário, ela será excluída.

Alex A.
fonte
6

CJam, 17 bytes

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

Esta é uma função anônima que exibe um número inteiro da pilha e deixa uma matriz em troca.

Experimente online!

Idéia

Se (a, b, c) é um triplo pitagórico, existem números inteiros estritamente positivos k, m, n de modo que a igualdade definida {a, b} = {km 2 - kn 2 , 2kmn} é válida.

Em particular, isto significa que a <b 2 e b <a 2 , então para a entrada de um podemos simplesmente verificar se um 2 + b 2 é um quadrado perfeito para cada b em {1, ... um 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
fonte
4

JavaScript ES6, 60 62

O mesmo que as outras respostas, verificando de 1 a a * a-1

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

Thx to @ Mwr247 a maneira mais curta de criar um intervalo no ES6

2 bytes salvos thx @ETHproductions

edc65
fonte
Impressionante! Eu acho que você poderia salvar alguns bytes com um built-in:a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))
ETHproductions
@ETHproductions thx, preciso aprender mais sobre os novos
módulos de
Convenientemente, eles também são discutidos na página que você já vinculou. (Eu teria feito a sugestão hypot mim, mas eu não estava conectado no momento.)
Neil
3

C, 96 bytes

Aumente alternadamente y(a outra perna) e z(a hipotenusa) até que a diferença diminua para 1. Faça a saída de cada correspondência exata ( c==0) que encontrar no caminho.

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

Chame o programa compilado com n como parâmetro; ele produzirá uma lista separada por espaços de números decimais.

Obviamente não é o mais curto; Eu posso encontrar conforto em ter o mais 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
fonte
88 bytes
ceilingcat 15/11
3

Wolfram Language (Mathematica) , 40 bytes

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

Estou usando uma forma não documentada de Solve: quando a lista de variáveis ​​é omitida, o Solvepadrão é resolver para todos os símbolos na expressão. Assim, economizamos 6 bytes sobre os mais regulares Solve[#^2+b^2==c^2,{b,c},PositiveIntegers].

PositiveIntegersé novo na versão 12 do Mathematica e, portanto, não está disponível no TIO . No desktop Mathematica, obtemos

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
fonte
2

Python 2, 53 bytes

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

Uma solução simples usando complexo abspara calcular o comprimento da hipotenusa. É seguro usar n*ncomo limite superior para a outra perna, porque (n*n)^2 + n^2 < (n*n+1)^2. Tentei usar a recursão, mas não obtive nada mais curto.

xnor
fonte
2

Sério, 20 bytes

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

Mesma estratégia da resposta Python do xnor: verifique os i in range(1,n*n)valores where abs(i+nj) % 1 == 0e envie a lista. Experimente online

Explicação:

,;╗    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
fonte
2

PARI / GP, 36 bytes

x->[y|y<-[1..x^2],issquare(x^2+y^2)]
alefalpha
fonte
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}

Comente:

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

A idéia seria fatorar a entrada para conhecer os possíveis m, n que geram usando t todo o triplo pitagórico que tem a entrada como perna. Teste:

  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
fonte
2

APL (Dyalog Extended) , 15 14 bytes SBCS

Função de prefixo tácito anônimo.

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

Experimente online!

×⍨ quadrado (lit. selfie multiplicação de) o argumento

() Aplique a seguinte função tácita anônima:

ntegers 1 através do argumento

 multiplicar por ɩ ntegers 1 através do argumento (ie quadrado)

⊢() Aplique a seguinte função tácita anônima com o argumento à esquerda:

  + é a soma

   um membro de

   isto?

índices de verdades

Adão
fonte
1

Perl 5, 43 bytes

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

Se você deseja que o script seja finalizado, podemos inspecionar outras partes até n² apenas, conforme explicado pelo xnor , para termos 48 bytes:

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

Japonês , 16 bytes

1oU² f@!(MhXU %1

Experimente online!

Como 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
ETHproductions
fonte
1

05AB1E , 10 bytes

nDLn+Ųƶ0K

Experimente online ou verifique todos os casos de teste .

nDLʒnIn+Ų

Experimente online ou verifique todos os casos de teste .

Explicação:

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
fonte
1

MathGolf , 9 bytes

²╒gƲk²+°

Experimente online!

Não foi possível encontrar uma boa maneira de remover qualquer um dos ²s, que ocupam 3/9 bytes. Caso contrário, é bastante simples

Explicação

²           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
fonte
1

Java 8, 72 bytes

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

Experimente online.

Explicação:

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
fonte