Kaki Lain Pythagoras


33

Pythagoras diledakkan kakinya dalam perang. Itu harus diamputasi, dan meskipun dia hampir mati, dia berhasil melewati dan membuat pemulihan penuh. Sekarang, setelah setahun berjalan dengan kruk, ia mendapat hak istimewa mendapatkan kaki palsu! Namun, ada beberapa yang cocok, tetapi yang mana?

Tugas

Diberikan bilangan bulat positif sebagai input yang merupakan panjang dari satu kaki triple Pythagoras, menampilkan semua kemungkinan untuk kaki lainnya. Sebagai contoh, triple Pythagoras terkecil adalah (3,4,5), yang membentuk segitiga dengan dua kaki panjang 3 dan 4, dan sisi miring panjang 5.

Contohnya

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

Aturan

  • Input akan menjadi bilangan bulat positif tunggal n.
  • Output dapat dalam urutan apa pun, dengan pembatas apa pun, di pangkalan apa pun (meskipun pangkalan ini harus konsisten), dan dengan kawat pembuka dan penutup opsional, dan spasi spasi tambahan opsional. Artinya, 1 2 3, [1,2,3], dan 1,11,111semua cocok spesifikasi output ini.
  • Anda mungkin berasumsi bahwa ntidak akan pernah lebih besar dari seperempat dari akar keempat batas bahasa Anda (tanpa menggunakan perpustakaan). Dalam praktiknya, Anda dapat berasumsi bahwa inputnya akan kurang dari ini atau 10.000, mana yang kurang.

Pythagoras sedang menunggu Anda, jadi lebih baik menulis kode Anda dengan cepat dan singkat!


18
Dia pria yang sangat aneh. Dia bersedia menunggu beberapa ribu tahun untuk komputer ditemukan, tetapi tidak beberapa nanodetik lagi untuk membaca beberapa ratus byte tambahan. Pria yang sangat tepat, untuk sedikitnya.
corsiKa

Jawaban:



11

Jelly , 8 byte

²R²+²Æ²O

Jawaban ini tidak bersaing, karena menggunakan fitur yang telah diterapkan setelah tantangan diposting. Cobalah online!

Pendekatan ini tidak menggunakan matematika floating point, sehingga akan memberikan jawaban yang benar selama daftar intervensi dapat masuk ke dalam memori.

Ide

Jika (a, b, c) adalah tripel Pythagoras, ada bilangan bulat positif k, m, n sehingga kesetaraan himpunan {a, b} = {km 2 - kn 2 , 2kmn} berlaku.

Secara khusus, ini berarti bahwa a <b 2 dan b <a 2 , jadi untuk input a kita cukup memeriksa apakah a 2 + b 2 adalah kuadrat sempurna untuk setiap b dalam {1, ... a 2 } .

Kode

            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 byte

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

Ini adalah fungsi anonim yang menerima integer dan mengembalikan array.

Untuk masing-masing idari 1 hingga input kuadrat, kami menghitung sisi miring menggunakan fungsi bawaan Julia hypot, dan menentukan apakah bagian pecahan adalah 0. Jika demikian, kami menyimpannya, jika tidak maka dikecualikan.


6

CJam, 17 byte

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

Ini adalah fungsi anonim yang mengeluarkan integer dari stack dan mengembalikan array sebagai balasannya.

Cobalah online!

Ide

Jika (a, b, c) adalah tripel Pythagoras, ada bilangan bulat positif k, m, n sehingga kesetaraan himpunan {a, b} = {km 2 - kn 2 , 2kmn} berlaku.

Secara khusus, ini berarti bahwa a <b 2 dan b <a 2 , jadi untuk input a kita cukup memeriksa apakah a 2 + b 2 adalah kuadrat sempurna untuk setiap b dalam {1, ... a 2 } .

Kode

: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

Sama seperti jawaban lainnya, memeriksa dari 1 ke a * a-1

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

Thx to @ Mwr247 cara terpendek untuk membangun rentang di ES6

2 byte disimpan thx @ETHproduksi


Luar biasa! Saya pikir Anda bisa menghemat beberapa byte dengan built-in:a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))
ETHproduksi

@ ETHproductions thx, saya perlu belajar lebih banyak tentang builtin matematika baru
edc65

Mudahnya mereka juga dibahas pada halaman yang sudah Anda tautkan. (Saya sendiri yang akan membuat saran hipot tetapi saya tidak login pada saat itu.)
Neil

3

C, 96 byte

Peningkatan bergantian y(kaki lainnya) dan z(sisi miring) sampai perbedaannya turun menjadi 1. Keluarkan setiap kecocokan tepat ( c==0) yang Anda temui di jalan.

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

Panggil program yang dikompilasi dengan n sebagai parameter; itu akan menampilkan daftar angka desimal yang dipisahkan ruang.

Jelas bukan yang terpendek; Saya mungkin menemukan kenyamanan dalam memiliki yang tercepat.

$ 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

Bahasa Wolfram (Mathematica) , 40 byte

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

Saya menggunakan bentuk tidak berdokumen Solve: ketika daftar variabel dihilangkan, maka Solvedefault untuk menyelesaikan semua simbol dalam ekspresi. Kami dengan demikian menghemat 6 byte lebih sering Solve[#^2+b^2==c^2,{b,c},PositiveIntegers].

PositiveIntegersbaru dalam versi 12 dari Mathematica dan karenanya tidak tersedia di TIO . Di desktop Mathematica, kita dapatkan

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 byte

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

Solusi mudah menggunakan kompleks absuntuk menghitung panjang sisi miring. Aman untuk digunakan n*nsebagai batas atas untuk kaki lainnya karena (n*n)^2 + n^2 < (n*n+1)^2. Saya mencoba menggunakan rekursi tetapi tidak mendapatkan yang lebih pendek.


2

Serius, 20 byte

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

Strategi yang sama dengan jawaban Python xnor: periksa i in range(1,n*n)nilai di mana abs(i+nj) % 1 == 0, dan output daftar. Cobalah online

Penjelasan:

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

APL (NARS), 373 karakter, 746 byte

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}

komentar:

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

Idenya akan menjadi faktor input untuk mengetahui kemungkinan m, n yang menghasilkan menggunakan t semua triple Pythagorian yang memiliki input sebagai leg. Uji:

  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 byte SBCS

Fungsi awalan diam-diam anonim.

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

Cobalah online!

×⍨ kuadrat (lit. selfie multiplikasi) argumen

(... ) terapkan fungsi diam-diam anonim berikut:

eg masukkan 1 melalui argumen

 kalikan dengan ɩ ntegers 1 melalui argumen (yaitu kuadrat)

⊢(... ) terapkan fungsi diam-diam anonim berikut dengan argumen sebagai argumen kiri:

  + adalah jumlahnya

   anggota dari

   saya t?

Temukan kebenaran


1

Perl 5, 43 byte

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

Jika Anda ingin skrip dihentikan, kami dapat memeriksa kaki lainnya hingga n² saja, seperti yang dijelaskan oleh xnor , jadi kami memiliki 48 byte:

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

1

Japt , 16 byte

1oU² f@!(MhXU %1

Cobalah online!

Bagaimana itu bekerja

        // 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 byte

nDLn+Ųƶ0K

Cobalah secara online atau verifikasi semua kasus uji .

nDLʒnIn+Ų

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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 byte

²╒gƲk²+°

Cobalah online!

Tidak dapat menemukan cara yang bagus untuk menghapus ²s, yang membutuhkan 3/9 byte. Kalau tidak, itu cukup lurus ke depan

Penjelasan

²           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 byte

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

Cobalah online.

Penjelasan:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.