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!


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:



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.

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.


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

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


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


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

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.


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

2

PARI / GP, 36 bytes

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

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 

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


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

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


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)

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.