Pisagor'un Diğer Ayağı


33

Pisagor savaşta bacağını havaya uçurdu. Kesilmesi gerekiyordu ve neredeyse ölmekle birlikte, o çekti ve tam bir iyileşme sağladı. Şimdi, koltuk değnekleriyle yürüdükten bir yıl sonra, protez bir bacak alma ayrıcalığını elde ediyor! Şey, yine de, uygun olan birkaç tane var, ama hangileri?

Görev

Pisagor üçlüsünün bir bacağının uzunluğu olan girdi olarak pozitif bir tamsayı verildiğinde, diğer bacağın tüm olanaklarını gösterir. Örneğin, en küçük Pisagorlu üçlü (3,4,5) olup, uzunluğu 3 ve 4 olan iki bacağı olan bir üçgen ve uzunluğu 5 olan bir hipotenüsüdür.

Örnekler

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

Kurallar

  • Giriş tek bir pozitif tamsayı olacaktır n.
  • Çıktı, herhangi bir sırada, herhangi bir sınırlayıcıda, herhangi bir bazda (bu tabanın tutarlı olması gerekir) ve isteğe bağlı açma ve kapama parantezleri ve isteğe bağlı izlemeli boşluk ile olabilir. Olduğunu 1 2 3, [1,2,3]ve 1,11,111tüm bu çıkış spesifikasyonu uygun.
  • Bunu kabul edebiliriz n(kütüphanelerini kullanmadan), dilinizin limit dördüncü kökünün daha büyük dörtte biri olmayacak. Uygulamada, girdinin bundan daha düşük veya hangisinin daha az olduğu 10.000'den düşük olacağını varsayabilirsiniz.

Pisagor sizi bekliyor, bu yüzden hızlı ve kısa kodunuzu yazın!


18
O gerçekten garip bir adam. Bilgisayarların icat edilmesi için birkaç bin yıl beklemeye razı, ancak birkaç ekstra yüz byte okuyacak birkaç nanosaniye değil. Çok kesin bir erkek, en azını söylemek için.
corsiKa

Yanıtlar:



11

Jöle , 8 bayt

²R²+²Æ²O

Bu cevap yarışmacı değildir çünkü meydan okuma yapıldıktan sonra uygulanan özellikleri kullanmaktadır. Çevrimiçi deneyin!

Bu yaklaşım kayan nokta matematiğini kullanmaz, bu nedenle araya giren listeler belleğe sığabildiği sürece doğru cevabı verecektir.

Fikir

Eğer (a, b, c) üçlü bir Pisagor olduğunu kesinlikle pozitif tamsayılar vardır k, m, n set eşitlik öyle ki {a, b} = {km 2 - kn 2 , 2kmn} tutar.

Özellikle, bu araçlar o <b 2 ve b <a 2 , böylece girişi için a eğer biz sadece kontrol edebilirsiniz bir 2 + b 2 her biri için mükemmel bir kare b içinde {1, ... bir 2 } .

kod

            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 bayt

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

Bu bir tamsayıyı kabul eden ve bir dizi döndüren adsız bir işlevdir.

i1'den giriş karesine kadar her biri için, Julia'nın yerleşik hypotişlevini kullanarak hipotenüsü hesaplıyoruz ve kesirli bölümün 0 olup olmadığını belirliyoruz.


6

CJam, 17 bayt

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

Bu, yığından bir tamsayı açan ve buna karşılık bir dizi bırakan anonim bir işlevdir.

Çevrimiçi deneyin!

Fikir

Eğer (a, b, c) üçlü bir Pisagor olduğunu kesinlikle pozitif tamsayılar vardır k, m, n set eşitlik öyle ki {a, b} = {km 2 - kn 2 , 2kmn} tutar.

Özellikle, bu araçlar o <b 2 ve b <a 2 , böylece girişi için a eğer biz sadece kontrol edebilirsiniz bir 2 + b 2 her biri için mükemmel bir kare b içinde {1, ... bir 2 } .

kod

: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

Diğer cevaplarla aynıdır, 1'den a'ya * a-1'i kontrol ediniz.

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

Thx to @ Mwr247 , ES6'da bir seri oluşturmanın en kısa yoludur

2 byte kaydedildi thx @ETHproductions


Müthiş! a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))
Yerleşik olarak

@ETHproductions thx, yeni matematik
yapıları

Ayrıca, daha önce bağladığınız sayfada da tartışılır. (Hipotek önerisini kendim yapardım ama o zaman giriş yapmamıştım.)
Neil

3

C, 96 bayt

Alternatif olarak , farkları 1 olana kadar ( ydiğer bacak) ve z(hipotenüs) artış (1) artar c==0.

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

Derlenmiş programı n ile parametre olarak çağırın ; boşlukla ayrılmış bir ondalık sayılar listesi çıkarır.

Açıkçası en kısa değil; En hızlı olanı rahatlatabilirim.

$ 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 Dili (Mathematica) , 40 bayt

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

Belgelenmemiş bir form kullanıyorum Solve: değişkenlerin listesi çıkarıldığında, Solveifadedeki tüm sembollerin çözümünde varsayılanlar. Böylece daha düzenli olarak 6 bayt tasarruf ediyoruz Solve[#^2+b^2==c^2,{b,c},PositiveIntegers].

PositiveIntegersMathematica'nın 12. sürümünde yeni ve bu nedenle TIO'da mevcut değil . Masaüstü Mathematica’da

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 bayt

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

absHipotenüsün uzunluğunu hesaplamak için kompleksi kullanan basit bir çözüm . n*nÇünkü diğer bacağınız için üst sınır olarak kullanmak güvenlidir (n*n)^2 + n^2 < (n*n+1)^2. Bunun yerine özyinelemeyi kullanmayı denedim ama daha kısa bir şey bulamadım.


2

Cidden, 20 bayt

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

Xnor'ın Python cevabıyla aynı strateji: i in range(1,n*n)nerede olduğunu kontrol et abs(i+nj) % 1 == 0ve listeyi çıkar. Çevrimiçi deneyin

Açıklama:

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

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}

yorum Yap:

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

Buradaki fikir, girdiyi bacağına sahip olan tüm Pisagor üçlüsünü kullanarak ortaya çıkaran olası m'yi (n) bilmek için girdiyi faktör olacaktır. Ölçek:

  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 Genişletilmiş) , 15 14 bayt SBCS

Anonim zımni önek işlevi.

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

Çevrimiçi deneyin!

×⍨ kare (lit. çarpma özçekimi) argümanı

() Aşağıdaki isimsiz tacit işlevini uygulayın:

nt egegers 1 argümanı ile

nt egegers 1 ile argüman (çarpı kare) ile  çarpma

⊢() Aşağıdaki anonim tacit işlevini sol argüman olarak argümanla uygulayın:

  + toplamı

   üyesi

   o?

ɩ Gerçeklerin farklılıkları


1

Perl 5, 43 bayt

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

Komut dosyasının sonlandırılmasını istiyorsanız, xnor tarafından açıklandığı gibi diğer bacakları yalnızca n²'ye kadar inceleyebiliriz , bu nedenle 48 bayt vardır:

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

1

Japt , 16 bayt

1oU² f@!(MhXU %1

Çevrimiçi deneyin!

Nasıl çalışır

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

nDLn+Ųƶ0K

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

nDLʒnIn+Ų

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

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 bayt

²╒gƲk²+°

Çevrimiçi deneyin!

Hiçbiri kaldırmak için güzel bir yol bulunamadı ²3/9 bayt s'nin . Aksi takdirde oldukça yalındır

açıklama

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

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

Çevrimiçi deneyin.

Açıklama:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.