Chân khác của Pythagoras


33

Pythagoras đã bị nổ tung trong cuộc chiến. Nó đã phải cắt bỏ, và mặc dù anh ta gần như đã chết, anh ta đã vượt qua và hồi phục hoàn toàn. Bây giờ, sau một năm đi bộ bằng nạng, anh ta có được đặc quyền có được một chân giả! Điều đó là, mặc dù, có một số phù hợp, nhưng cái nào?

Nhiệm vụ

Cho một số nguyên dương là đầu vào có độ dài bằng một chân của bộ ba Pythagore, xuất tất cả các khả năng cho chân kia. Ví dụ, bộ ba Pythagore nhỏ nhất là (3,4,5), tạo thành một hình tam giác có hai chân dài 3 và 4, và cạnh huyền có chiều dài 5.

Ví dụ

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

Những quy định

  • Đầu vào sẽ là một số nguyên dương duy nhất n.
  • Đầu ra có thể theo bất kỳ thứ tự nào, với bất kỳ dấu phân cách nào, trong bất kỳ cơ sở nào (mặc dù cơ sở này phải nhất quán) và với các dấu ngoặc đóng mở tùy chọn và khoảng trắng theo sau tùy chọn. Đó là, 1 2 3, [1,2,3], và 1,11,111tất cả phù hợp với đặc điểm kỹ thuật đầu ra này.
  • Bạn có thể cho rằng nsẽ không bao giờ lớn hơn một phần tư gốc thứ tư trong giới hạn ngôn ngữ của bạn (không sử dụng thư viện). Trong thực tế, bạn có thể cho rằng đầu vào sẽ nhỏ hơn mức này hoặc 10.000, tùy theo mức nào ít hơn.

Pythagoras đang chờ đợi bạn, vì vậy tốt hơn nên viết mã của bạn nhanh và ngắn!


18
Anh ấy là một chàng trai thực sự kỳ lạ. Anh ta sẵn sàng chờ vài nghìn năm để máy tính được phát minh, nhưng không thêm vài nano giây để đọc thêm vài trăm byte. Một người đàn ông rất chính xác, để nói rằng ít nhất.
corsiKa

Câu trả lời:



11

Thạch , 8 byte

²R²+²Æ²O

Câu trả lời này không cạnh tranh, vì nó sử dụng các tính năng đã được triển khai sau khi thử thách được đăng. Hãy thử trực tuyến!

Cách tiếp cận này không sử dụng toán học dấu phẩy động, vì vậy nó sẽ đưa ra câu trả lời chính xác miễn là các danh sách can thiệp có thể phù hợp với bộ nhớ.

Ý kiến

Nếu (a, b, c) là bộ ba số Pythagore, có các số nguyên dương k, m, n sao cho đẳng thức {a, b} = {km 2 - kn 2 , 2kmn} giữ.

Đặc biệt, phương tiện này mà một <b 2b <a 2 , vì vậy cho đầu vào một chúng ta có thể chỉ đơn giản là kiểm tra xem một 2 + b 2 là một hình vuông hoàn hảo cho mỗi b trong {1, ... một 2 } .

            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)

Đây là một hàm ẩn danh chấp nhận một số nguyên và trả về một mảng.

Đối với mỗi ibình phương từ 1 đến bình phương đầu vào, chúng tôi tính toán cạnh huyền bằng hàm tích hợp của Julia hypotvà xác định xem phần phân số có bằng 0. Nếu vậy, chúng tôi giữ nguyên, nếu không thì loại trừ.


6

CJam, 17 byte

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

Đây là một hàm ẩn danh bật một số nguyên từ ngăn xếp và trả lại một mảng.

Hãy thử trực tuyến!

Ý kiến

Nếu (a, b, c) là bộ ba số Pythagore, có các số nguyên dương k, m, n sao cho đẳng thức {a, b} = {km 2 - kn 2 , 2kmn} giữ.

Đặc biệt, phương tiện này mà một <b 2b <a 2 , vì vậy cho đầu vào một chúng ta có thể chỉ đơn giản là kiểm tra xem một 2 + b 2 là một hình vuông hoàn hảo cho mỗi b trong {1, ... một 2 } .

: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

Tương tự như các câu trả lời khác, kiểm tra từ 1 đến a * a-1

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

Thx đến @ Mwr247 cách ngắn nhất để xây dựng một phạm vi trong ES6

2 byte được lưu thx @ETHproductions


Tuyệt vời! Tôi nghĩ rằng bạn có thể lưu một vài byte với tích hợp:a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))
ETHproductions 8/12/2015

@ETHproductions thx, tôi cần tìm hiểu thêm về các nội dung toán học mới
edc65

Thuận tiện họ cũng thảo luận trên trang bạn đã liên kết. (Tôi có thể tự đưa ra gợi ý về hypot nhưng tôi đã không đăng nhập vào thời điểm đó.)
Neil

3

C, 96 byte

Lần lượt tăng dần y(chân kia) và z(cạnh huyền) cho đến khi chênh lệch của chúng giảm xuống 1. Xuất ra mọi kết quả khớp chính xác ( c==0) mà bạn gặp trên đường.

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

Gọi chương trình biên dịch với n là tham số; nó sẽ xuất ra một danh sách các số thập phân được phân tách bằng dấu cách.

Rõ ràng không phải là ngắn nhất; Tôi có thể tìm thấy sự thoải mái khi có nhanh nhất.

$ 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

Ngôn ngữ Wolfram (Mathicala) , 40 byte

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

Tôi đang sử dụng một hình thức không có giấy tờ Solve: khi danh sách các biến bị bỏ qua, sau đó Solvemặc định để giải cho tất cả các biểu tượng trong biểu thức. Do đó, chúng tôi lưu 6 byte thường xuyên hơn Solve[#^2+b^2==c^2,{b,c},PositiveIntegers].

PositiveIntegerslà phiên bản mới của Mathicala và do đó không có sẵn trong TIO . Trong Mathicala máy tính để bàn, chúng tôi nhận được

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]

Một giải pháp đơn giản sử dụng phức tạp absđể tính toán độ dài của cạnh huyền. Nó an toàn để sử dụng n*nnhư một giới hạn trên cho chân kia bởi vì (n*n)^2 + n^2 < (n*n+1)^2. Tôi đã thử sử dụng đệ quy thay thế nhưng không được gì ngắn hơn.


2

Nghiêm túc, 20 byte

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

Chiến lược tương tự như câu trả lời Python của xnor: kiểm tra i in range(1,n*n)các giá trị ở đâu abs(i+nj) % 1 == 0và xuất danh sách. Dùng thử trực tuyến

Giải trình:

,;╗    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 ký tự, 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}

bình luận:

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

Ý tưởng sẽ là yếu tố đầu vào để biết m, n có thể tạo ra bằng cách sử dụng tất cả bộ ba Pythagore có đầu vào là chân. Kiểm tra:

  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 kéo dài) , 15 14 byte SBCS

Chức năng tiền tố ẩn danh.

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

Hãy thử trực tuyến!

×⍨ vuông (lit. phép nhân selfie của) đối số

(... ) áp dụng các chức năng ngầm ẩn danh sau đây:

ntegers 1 thông qua đối số

 nhân với ntegers 1 thông qua đối số (tức là hình vuông)

⊢(... ) áp dụng các chức năng ngầm ẩn danh sau đây với lập luận như là đối số bên trái:

  + là tổng

   một thành viên của

   nó không

ɩ thông tin về sự thật


1

Perl 5, 43 byte

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

Nếu bạn muốn tập lệnh kết thúc, chúng tôi chỉ có thể kiểm tra các chân khác tối đa n², như được giải thích bởi xnor , vì vậy chúng tôi có 48 byte:

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

1

Japt , 16 byte

1oU² f@!(MhXU %1

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

nDLʒnIn+Ų

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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²+°

Hãy thử trực tuyến!

Không thể tìm thấy một cách hay để loại bỏ bất kỳ ²s nào, chiếm tới 3/9 byte. Nếu không thì nó khá đơn giản

Giải trình

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

Hãy thử trực tuyến.

Giải trình:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.