ขาอื่น ๆ ของพีธากอรัส


33

พีธากอรัสทำขาของเขาปลิวไปในสงคราม มันจะต้องถูกตัดออกและแม้ว่าเขาเกือบจะเสียชีวิต แต่เขาก็ผ่านเข้ามาและทำการกู้คืนอย่างสมบูรณ์ ตอนนี้หลังจากปีที่เดินกับไม้ค้ำเขาได้รับสิทธิพิเศษในการรับขาเทียม! แม้ว่ามีหลายอย่างที่เหมาะสม แต่มีอะไรบ้าง

งาน

รับจำนวนเต็มบวกเป็นอินพุตที่ความยาวของขาข้างหนึ่งของพีทาโกรัสทริปเปิลเอาท์พุทเป็นไปได้ทั้งหมดสำหรับขาอีกข้าง ตัวอย่างเช่น Pythagorean triple ที่เล็กที่สุดคือ (3,4,5) ซึ่งเป็นรูปสามเหลี่ยมที่มีความยาวสองขา 3 และ 4 และสามเหลี่ยมด้านยาว 5

ตัวอย่าง

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

กฎระเบียบ

  • nการป้อนข้อมูลจะเป็นจำนวนเต็มบวกเดียว
  • เอาต์พุตอาจอยู่ในลำดับใด ๆ โดยมีตัวคั่นใด ๆ ในฐานใด ๆ (แม้ว่าฐานนี้จะต้องสอดคล้องกัน) และด้วยวงเล็บปีกกาเปิดและปิดที่เป็นตัวเลือกและตัวเลือกช่องว่างต่อท้าย นั่นคือ1 2 3, [1,2,3]และ1,11,111ทุกพอดีกับสเปคเอาท์พุทนี้
  • คุณอาจคิดว่าnจะไม่ใหญ่กว่าหนึ่งในสี่ของรูทที่สี่ของขีด จำกัด ภาษาของคุณ (โดยไม่ต้องใช้ห้องสมุด) ในทางปฏิบัติคุณอาจสมมติว่าอินพุตจะน้อยกว่านี้หรือ 10,000 แล้วแต่ว่าจะน้อยกว่าใด

พีธากอรัสกำลังรอคุณอยู่ดังนั้นควรเขียนโค้ดให้สั้นและเร็วกว่า!


18
เขาเป็นคนที่แปลกจริงๆ เขายินดีที่จะรอสองสามพันปีก่อนที่คอมพิวเตอร์จะถูกประดิษฐ์ขึ้นมา แต่ไม่กี่นาโนวินาทีเพื่ออ่านอีกสองสามร้อยไบต์ คนที่แม่นยำมากพูดน้อย
corsiKa

คำตอบ:



11

เยลลี่ขนาด 8 ไบต์

²R²+²Æ²O

คำตอบนี้ไม่ใช่การแข่งขันเนื่องจากใช้คุณลักษณะที่มีการนำมาใช้หลังจากการโพสต์ความท้าทาย ลองออนไลน์!

วิธีการนี้ไม่ได้ใช้เลขทศนิยมดังนั้นมันจะให้คำตอบที่ถูกต้องตราบใดที่รายการแทรกแซงสามารถใส่หน่วยความจำได้

ความคิด

ถ้า(a, b, c)เป็นพีทาโกรัสสามมีจำนวนเต็มบวกk, m, nอย่างนั้นตั้งค่าความเสมอภาค{a, b} = {km 2 - kn 2 , 2kmn}ถือ

โดยเฉพาะอย่างยิ่งที่นี้หมายถึงว่า<b 2และข <a 2ดังนั้นสำหรับการป้อนข้อมูลเราก็สามารถตรวจสอบว่า2 + B 2เป็นตารางที่สมบูรณ์สำหรับแต่ละใน{1, ... 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 ไบต์

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

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อที่รับจำนวนเต็มและส่งกลับอาร์เรย์

สำหรับแต่ละiจาก 1 ถึงอินพุตกำลังสองเราคำนวณด้านตรงข้ามมุมฉากโดยใช้hypotฟังก์ชันในตัวของ Julia และพิจารณาว่าส่วนที่เป็นเศษส่วนเป็น 0 หรือไม่ถ้าใช่เราเก็บไว้มิฉะนั้นจะถูกแยกออก


6

CJam, 17 ไบต์

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

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อที่ปรากฏเป็นจำนวนเต็มจากสแต็กและปล่อยให้อาร์เรย์กลับมา

ลองออนไลน์!

ความคิด

ถ้า(a, b, c)เป็นพีทาโกรัสสามมีจำนวนเต็มบวกk, m, nอย่างนั้นตั้งค่าความเสมอภาค{a, b} = {km 2 - kn 2 , 2kmn}ถือ

โดยเฉพาะอย่างยิ่งที่นี้หมายถึงว่า<b 2และข <a 2ดังนั้นสำหรับการป้อนข้อมูลเราก็สามารถตรวจสอบว่า2 + B 2เป็นตารางที่สมบูรณ์สำหรับแต่ละใน{1, ... 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

เช่นเดียวกับคำตอบอื่น ๆ ตรวจสอบจาก 1 ถึง * a-1

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

ขอบคุณ @ Mwr247 วิธีที่สั้นที่สุดในการสร้างช่วงใน ES6

2 ไบต์บันทึก thx @ETHproductions


! น่ากลัว ฉันคิดว่าคุณสามารถบันทึกสองสามไบต์ด้วยบิวท์อิน:a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))
ETHproductions

@ETHproductions ขอบคุณฉันต้องการที่จะเรียนรู้เพิ่มเติมเกี่ยวกับ builtins คณิตศาสตร์ใหม่
edc65

สะดวกพวกเขายังกล่าวถึงในหน้าที่คุณเชื่อมโยงแล้ว (ผมจะได้ทำข้อเสนอแนะ hypot ตัวเอง แต่ผมก็ไม่ได้เข้าสู่ระบบในเวลา.)
นีล

3

C, 96 ไบต์

เพิ่มอีกทางหนึ่งy(ขาอีกข้าง) และz(ด้านตรงข้ามมุมฉาก) จนกระทั่งความแตกต่างของพวกเขาลดลงเป็น 1 เอาท์พุททุกการแข่งขันที่แน่นอน ( 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));}

เรียกโปรแกรมที่คอมไพล์ด้วยnเป็นพารามิเตอร์ มันจะแสดงรายการตัวเลขทศนิยมที่คั่นด้วยช่องว่าง

เห็นได้ชัดว่าไม่ใช่ที่สั้นที่สุด; ฉันอาจพบความสะดวกสบายในการมีที่เร็วที่สุด

$ 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 (Mathematica)ขนาด 40 ไบต์

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

ฉันกำลังใช้รูปแบบที่ไม่มีเอกสารของSolve: เมื่อรายการตัวแปรถูกละไว้แล้วSolveเริ่มต้นที่การแก้สำหรับสัญลักษณ์ทั้งหมดในการแสดงออก เราทำให้ประหยัด 6 Solve[#^2+b^2==c^2,{b,c},PositiveIntegers]ไบต์กว่าปกติมากขึ้น

PositiveIntegersเป็นของใหม่ในรุ่น 12 ของ Mathematica และทำให้ไม่สามารถใช้ได้ในTIO ในเดสก์ท็อป Mathematica เราได้รับ

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 ไบต์

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

สารละลายที่ตรงไปตรงมาโดยใช้คอมเพล็กซ์absเพื่อคำนวณความยาวของด้านตรงข้ามมุมฉาก มันปลอดภัยที่จะใช้n*nเป็นที่ถูกผูกไว้บนขาอื่น ๆ (n*n)^2 + n^2 < (n*n+1)^2เพราะ ฉันพยายามใช้การสอบถามซ้ำ แต่ไม่สั้นลงเลย


2

อย่างจริงจัง 20 ไบต์

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

กลยุทธ์เดียวกับคำตอบ Python ของ xnor: ตรวจสอบi in range(1,n*n)ค่าที่abs(i+nj) % 1 == 0และส่งออกรายการ ลองออนไลน์

คำอธิบาย:

,;╗    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 ตัวอักษร, 746 ไบต์

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}

แสดงความคิดเห็น:

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

ความคิดนี้จะเป็นปัจจัยป้อนเข้าที่จะรู้ว่าเป็นไปได้ m, n ที่สร้างโดยใช้ Pythagorian ทั้งหมดสามตัวที่มีอินพุตเป็นขา ทดสอบ:

  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 ไบต์SBCS

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ

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

ลองออนไลน์!

×⍨ สแควร์ (เซลฟี่ทวีคูณของจุด) อาร์กิวเมนต์

() ใช้ฟังก์ชั่นเงียบโดยไม่ระบุชื่อต่อไปนี้:

ɩ ntegers 1 ผ่านการโต้แย้ง

 คูณด้วยɩ ntegers 1 ผ่านอาร์กิวเมนต์ (เช่นตาราง)

⊢() ใช้ฟังก์ชัน tacit แบบไม่ระบุชื่อต่อไปนี้กับอาร์กิวเมนต์เป็นอาร์กิวเมนต์ซ้าย:

  + คือผลรวม

   สมาชิกของ

   มัน?

ɩ ndices ของความจริง


1

Perl 5, 43 ไบต์

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

หากคุณต้องการให้สคริปต์ยุติเราสามารถตรวจสอบขาอื่น ๆ ได้สูงสุดn²เท่านั้นตามที่อธิบายโดยxnorดังนั้นเราจึงมี 48 ไบต์:

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

1

Japt , 16 ไบต์

1oU² f@!(MhXU %1

ลองออนไลน์!

มันทำงานอย่างไร

        // 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 ไบต์

nDLn+Ųƶ0K

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

nDLʒnIn+Ų

ลองออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมดตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

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 ไบต์

²╒gƲk²+°

ลองออนไลน์!

ไม่พบวิธีที่ดีในการลบรายการใด ๆ ²ซึ่งใช้เวลาถึง 3/9 ไบต์ ไม่อย่างนั้นมันจะค่อนข้างตรงไปตรงมา

คำอธิบาย

²           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 ไบต์

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

ลองออนไลน์

คำอธิบาย:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.