ดั้งเดิมพีทาโกรัสอเนกประสงค์


29

( ที่เกี่ยวข้อง )

พีทาโกรัส Tripleเป็นรายการ(a, b, c)ที่น่าพอใจสม2 + B 2 c = 2

ดั้งเดิมพีทาโกรัส Triple (PPT) เป็นหนึ่งในสถานที่ที่a, bและcมีทั้งหมดcoprime (เช่นหารเพียงร่วมกันระหว่างสามองค์ประกอบคือ1) ตัวอย่างเช่น(3, 4, 5)สามเหลี่ยมมุมฉากคือ Primitive Pythagorean Triple ที่มีชื่อเสียง

ความท้าทาย

  • รับอินพุตn, ส่งออกnPPT th หรือ,
  • รับอินพุตnส่งออกnPPT แรก

มีหลายวิธีในการสั่งซื้อ PPTs เหล่านี้เพื่อสร้างรายการที่ได้รับคำสั่งซื้ออย่างดีเพื่อพิจารณาว่าอันไหนคือnth คุณสามารถเลือกการสั่งซื้อใด ๆ ที่คุณต้องการตราบใดที่คุณสามารถพิสูจน์ได้ (อย่างไม่เป็นทางการ) ว่าอัลกอริทึมของคุณสามารถสร้าง PPT ที่เป็นเอกลักษณ์ทุกอย่างที่เป็นไปได้ ตัวอย่างเช่นรหัสของคุณไม่ควรส่งออกทั้งสอง(3,4,5)และ(4,3,5)เนื่องจากเป็นรหัสที่ซ้ำกันของทริปเปิลเดียวกัน - อันใดอันหนึ่งโปรด

ในทำนองเดียวกันไม่ว่ารหัสของคุณจะเป็นศูนย์หรือหนึ่งดัชนีก็ดีถ้าคุณระบุว่าคุณกำลังใช้อะไรอยู่

ตัวอย่าง

สำหรับตัวอย่างดังต่อไปนี้ฉันใช้หนึ่งในการจัดทำดัชนีเอาท์พุทnPPT, th และการสั่งซื้อโดยมีขนาดเล็กที่สุดcแล้วที่เล็กที่สุดแล้วมีขนาดเล็กที่สุดab

n | output
1 | (3, 4, 5)
2 | (5, 12, 13)
5 | (20, 21, 29)
12| (48, 55, 73)

กฎระเบียบ

  • อินพุตและเอาต์พุตจะได้รับในรูปแบบที่สะดวกใด
  • ในการส่งของคุณโปรดระบุวิธีการจัดเรียงรายการของคุณและระบุว่ารายการของคุณเป็นดัชนี 0 หรือดัชนี 1 ดัชนี
  • การสั่งซื้อที่คุณเลือกไม่สามารถสร้างรายการซ้ำ
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • หากเป็นไปได้โปรดใส่ลิงค์ไปยังสภาพแวดล้อมการทดสอบออนไลน์เพื่อให้ผู้อื่นสามารถลองใช้รหัสของคุณได้!
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการตีกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ


2
A103606
ไมล์

อะไรคืออินพุตสูงสุดที่เราต้องให้การสนับสนุน? เราสามารถสันนิษฐานได้ว่ามันเหมาะกับความสามารถของภาษาที่เราเลือก?
Mr. Xcoder

1
@ Mr.Xcoder ใช่; นั่นคือสมมติฐานที่ปลอดภัยมาตรฐานเว้นแต่คุณจะใช้สิ่งนั้นเพื่อหาช่องโหว่ (เช่นภาษารองรับเฉพาะตัวเลข 1 บิต) เพื่อทำให้เกิดปัญหาเล็กน้อย
AdmBorkBork

2
ฉันพบคำตอบสำหรับคำถามของฉัน: a และ b ต้องเป็น coprime และนี่เป็นหลักฐานที่
edc65

คำตอบ:


12

เยลลี่ , 27 25 ไบต์

2 ไบต์ขอบคุณ Jonathan Allan

²IH;Pµ;ÆḊ
+2ḶḤ‘Œcg/ÐṂÇ€Ṣḣ

ลองออนไลน์!

ขาออกแรกnอเนกประสงค์ 1 การจัดทำดัชนี[b, a, c]โดยจัดเรียงตามการเพิ่มขึ้นแล้วba

ใช้อัลกอริทึมจากWikipedia :

a = mn, b = (m² - n²) / 2, c = (m² + n²) / 2

นี้จะสร้างอเนกประสงค์ดั้งเดิมทั้งหมดสำหรับทุกคู่ coprime m > n > 0ที่ไม่ซ้ำกันของจำนวนเต็มคี่

คำอธิบาย

+2ḶḤ‘Œcg/ÐṂÇ€Ṣḣ    Main link. Argument: n
+2                   Add 2 to n, to get enough results.
  Ḷ                  Get integers [0, 1, ..., n+1].
   Ḥ                 Double to get [0, 2, ..., 2n+2].
    ‘                Increment to get [1, 3, ..., 2n+3].
     Œc              Get all ordered pairs [[1, 3], [1, 5], ..., [2n+1, 2n+3]].
       g/            GCD of each pair.
         ÐṂ          Grab the pairs with minimal GCD (which is 1).
           ǀ        Call the helper link on each pair to get the triples.
             Ṣ       Sort the triples first by a, then by b, then by c.
              ḣ      Get the last n.

²IH;Pµ;ÆḊ    Helper link. Argument: pair [m, n]
²              Square to get [m², n²].
 I             Increments: get [m²-n²].
  H            Halve: get [(m²-n²)/2], i.e. [b].
    P          Product: get mn, i.e. a.
   ;           Append to get [b, a].
     µ         Begin a new monadic chain with argument [b, a].
       ÆḊ      Get the length of the vector, i.e. c.
      ;        Append to get [b, a, c].

นั่นเป็นคำอธิบายที่ดีจริงๆ ขอบคุณ!
AdmBorkBork

g/Ị$Ðf-> g/ÐṂเพื่อบันทึกสองไบต์ (เนื่องจาก gcd ที่น้อยที่สุดคือ 1 และจะมีรายการดังกล่าวอย่างน้อยหนึ่งรายการเสมอ)
Jonathan Allan

ไบต์อื่นอาจถูกบันทึกไว้ (แม้ว่าจะทำให้มีประสิทธิภาพน้อยลง) โดยการแทนที่+2ḶḤ‘Œcด้วย²Rm2Œc- เศษที่มันจะไม่ทำงานสำหรับการป้อนข้อมูลของ1:(
Jonathan Allan

@JanathanAllan ขอบคุณสำหรับขั้นต่ำ ฉันลองช่วง 2 ไบต์เยอะ แต่น่าเสียดายที่ไม่มีใครใหญ่พอ ( ²ḶḤ‘Œcเป็นหนึ่งในคนแรกที่ฉันนึกถึง)
PurkkaKoodari

8

MATL , 36 ไบต์

`@:Ut&+wmR&fZd1Mhw/vXutnGE<]GY)t&2|h

อินพุตเป็นแบบอิง 1 ลำดับผลลัพธ์รับประกันว่าแต่ละทริปเปิลจะปรากฏขึ้นหนึ่งครั้ง คำอธิบายการสั่งซื้อมีดังต่อไปนี้ คำอธิบายนั้นจำเป็นต้องทำการวิเคราะห์เล็กน้อยว่าโปรแกรมทำงานอย่างไร

รหัสที่ช่วยให้การเพิ่มเคาน์เตอร์ในวงเริ่มต้นที่k 1สำหรับแต่ละkสร้างคู่กับa = 1,...,k, b = 1,...,k, และเพื่อนผู้ที่ให้พีทาโกรัสสามด้วยa < b c <= kคู่จะได้รับในคำสั่งของเพิ่มขึ้นแล้วba

แต่ละคู่จะถูกหารด้วย gcd คู่ผลลัพธ์ (อาจซ้ำกัน) จัดเป็นเมทริกซ์สองคอลัมน์ kเมทริกซ์นี้จะตัดแบ่งในแนวตั้งกับเมทริกซ์ที่คล้ายกันที่มีผลสะสมที่ได้รับค่าขนาดเล็ก แถวของเมทริกซ์จะซ้ำซ้อนซ้ำซ้อนอย่างเสถียร สิ่งนี้จะลบการทำซ้ำสองประเภท:

  1. คู่ที่ถูกพบมากกว่าหนึ่งครั้งสำหรับปัจจุบันk(เช่น3,4ซึ่งเป็นผลมาจาก6,8เมื่อหารด้วย gcd ของมัน);

  2. kคู่ที่พบแล้วกับที่มีขนาดเล็ก

ในความเป็นจริงแล้วการวนซ้ำแต่ละครั้งkจะค้นหาคู่ทั้งหมดที่พบแล้วสำหรับการทำซ้ำก่อนหน้านี้ แต่มันอาจจะพบพวกเขาในลำดับที่แตกต่างกัน ตัวอย่างเช่นk=25จะค้นหาสาม7,24,25และไม่20,21,29(เพราะcไม่เกินk) ในภายหลังการทำซ้ำk=29จะค้นหาทั้งคู่ แต่20,21,29 ก่อนหน้านี้ 7,24,25 (คำสั่งซื้อเพิ่มขึ้นbแล้วa) นี่คือเหตุผลที่แทนที่จะเก็บคู่ทั้งหมดที่พบล่าสุดkเราผนวกเข้ากับคู่ก่อนหน้าและซ้ำซ้อนเสถียร nการทำเช่นนี้มั่นใจว่าคำสั่งจะเหมือนกันสำหรับป้อนข้อมูลใด ๆ

การรับประกันดังกล่าวข้างต้นรับประกันว่าพีทาโกรัสสามคนจะปรากฎตัวในที่สุดและจะปรากฏเพียงครั้งเดียว สำหรับอินพุตnการวนซ้ำจะkเสร็จสิ้นเมื่อnได้รับอย่างน้อยสามเท่าที่ใช้ได้ แล้วnทริปที่สามคือ ouput

ลองออนไลน์!

หรือใช้รหัสที่แก้ไขนี้เพื่อดูnอเนกประสงค์สามอัน:

`@:Ut&+wmR&fZd1Mhw/vXutnGE<]G:Y)tU&2sX^h

ลองออนไลน์!


1
คำอธิบายที่ดี
AdmBorkBork

8

Haskell , 98 ไบต์

f 0=(3,4,5)
f n|let(a,b,c)=f$div(n-1)3;r=mod n 3;d=a*(-1)^2^r;e=b*(-1)^r;s=2*(d+e+c)=(s-d,s-e,s+c)

ลองออนไลน์!

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

ตีความนี้bijective ฐาน 3หลักnเป็นเส้นทางลงที่ต้นไม้แห่งอเนกประสงค์พีทาโกรัสดั้งเดิม มันทำงานโดยไม่มีการค้นหาในการดำเนินการ O (log n )

Tree of primitive Pythagorean triples


5

เยลลี่ , 19 18 ไบต์

*g/²_/
4*œc3UṢÇÐḟḣ

โปรแกรมใช้ดัชนีที่อิงn 1และพิมพ์n PPTs แรก[c, b, a]ตามลำดับพจนานุกรม

นี่เป็นโซลูชันO (64 n )ดังนั้น TIO จะทำให้หายใจไม่ออกในอินพุต4และสูงกว่า ฉันจะพยายามทำให้เร็วขึ้น

ลองออนไลน์!

รุ่นอื่น O (n 3 ) อาจใช้ได้

เพื่อหาสิ่งที่n THแฝด - [C n , ขnเป็นn ] - การแก้ปัญหาดังกล่าวข้างต้นสันนิษฐานว่าn ≤ 4 nซึ่งเป็นเรื่องง่ายในการตรวจสอบ อย่างไรก็ตามA020882พิสูจน์ให้เห็นว่าn ~ 2πnจึงมีเป็นkดังกล่าวว่าn ≤ knสำหรับทุกn

หากเราสามารถใช้k = 7ได้การแก้ปัญหาด้านล่างก็ใช้ได้เช่นกัน (และเร็วกว่ามาก)

*g/²_/
×7œc3UṢÇÐḟḣ

ลองออนไลน์!

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

4*œc3UṢÇÐḟḣ  Main link. Argument: n

4*           Compute 4**n, the n-th power of 4.
  œc3        Take all 3-combinations of the set {1, ..., 4**n}, each sorted in
             ascending order. The triples themselves are sorted lexicographically.
     U       Upend; reverse each triple [a, b, c], yielding [c, b, a].
      Ṣ      Sort the descending triples lexicographically. This ensures that their
             order is independent of n.
       ÇÐḟ   Keep only triples for which the helper link returns a falsy value.
          ḣ  Dyadic head; take the first n triples.


*g/²_/       Helper link. Argument: [c, b, a]

 g/          Reduce [c, b, a] by greatest common divisor, yielding g.
*            Elevate the integers to that power, computing [c**g, b**g, a**g].
   ²         Square, yielding [c**2g, b**2g, a**2g].
    _/       Reduce by subtraction, yielding c**2g - b**2g - a**2g.
             Fermat's Last Theorem assures that this difference will be non-zero
             whenever g > 1, so this yields 0 iff g = 1 and c² = a² = b².

4

JavaScript (ES7), 106 105 103 ไบต์

เอาต์พุต Nth PPT ผลการค้นหาจะ 1 จัดทำดัชนีและได้รับคำสั่งจากค่าของข

n=>(g=(a,b)=>b?g(b,a%b):a,F=a=>(x=a*a+b*b,c=x**.5|0)*c-x*g(a,g(b,c))||--n?F(a-b?a+1:!++b):[a,b,c])(b=1)

การสาธิต


4

MATL , 63 ไบต์

3lvi:"t"[HlHllO;aOlOHl]!@Y*2eh]]!XuGY)&*tt[lO;Oa]*ssD2)ED2Xy*ss

ลองออนไลน์!

บทเรียนในการตีกอล์ฟผิดไปอย่างมาก ฉันโพสต์มันต่อไปเพราะฉันสงสัยว่ามีวิธีการเล่นกอล์ฟที่ดีกว่านี้หรือไม่

ฉันใช้สิ่งนี้หน้าวิกิพีเดียในการรวมกันกับสูตรของ Euclid เพื่อสร้างสรรค์สร้าง triples ทั้งหมดมากกว่าวิธีการทดลองและข้อผิดพลาด

ครั้งแรกคู่ coprime คี่ถูกสร้างขึ้นเป็นต้นไม้ประกอบไปด้วย นี่คือการคูณเมทริกซ์ขนาดใหญ่ซึ่งคิดเป็นจำนวนไบต์มากที่สุด จากนั้นจะใช้สูตรของ Euclid ซึ่งอาจจะเป็นการสิ้นเปลืองแบบไบท์เช่นกัน หากใครมีเคล็ดลับสำหรับสองส่วนนี้ฉันชอบที่จะได้ยินพวกเขา

log3(n)โปรดทราบว่าเพื่อประหยัดไบต์โปรแกรมนี้สร้างต้นไม้ลึกเช่นเดียวกับการป้อนข้อมูลที่มากกว่า นอกจากนี้เด็ก ๆ จะได้สร้างขึ้นสำหรับแต่ละแถวมากกว่าเพียง Xuแต่สำหรับแถวสุดท้ายของต้นไม้แล้วกรองอีกครั้งกับ มากสำหรับวิธีการสร้างสรรค์ที่มีประสิทธิภาพ

3lv % Push root node of ternary tree
i:" % Generate a tree of depth of input (WAY too large, but golfy)
t"  % loop over all nodes (golfier than looping over last tree row)
[HlHllO;aOlOHl]! % Matrix to generate three children of current node
@Y* % Multiply with current node to get children
2e  % Reshape to get node pairs
h]] % Append to tree, exit loops
!Xu % Remove duplicates (more efficient to do it before last ] but golfier this way)
GY) % Select n-th odd coprime pair
&*tt % Multiply with it's own transpose to get [m²,m*n;m*n,n²]
[lO;Oa]*ssD % Sum of matrix multiplication = m²-n² to get a
2)ED % Second element doubled for b=2mn
2Xy*ss % Sum of matrix multiplication with identify matrix to get c=m²+n²

3

Haskell, 65 ไบต์

([(a,b,c)|c<-[5..],b<-[1..c],gcd c b<2,a<-[1..b],a^2+b^2==c^2]!!)

การทำดัชนีแบบ 0 สำหรับการให้c, bวิ่งขึ้นไปcและaขึ้นไปbจึงc > b > aมักจะถือ

ลองออนไลน์!


3

Python 67 50 48 46 Bytes

ใช้สูตรที่พบในวิกิพีเดีย

a=m*n, b=(m^2-n^2)/2, c=(m^2+n^2)/2

ที่ไหนm>n>0และmและnเป็น coprimes และคี่ นี่คือรหัส

lambda n:[3+2*n,~-(3+2*n)**2-1/2,-~(3+2*n)**2/2]

-17 ไบต์ขอบคุณ @Martin Ender

ลองออนไลน์

ทำงานโดยมีค่าของnตัวแปรอยู่เสมอในสมการที่ 1 ซึ่งหมายความว่าmเป็นเพียงค่าแปลก ๆ อื่น ๆ ในกรณีนี้3+2*nซึ่งnเป็นจำนวนดั้งเดิมของพีทาโกรัสสาม สิ่งนี้ช่วยให้เราสามารถสมมติค่า 1 สำหรับnค่าทั้งหมด


ยินดีต้อนรับสู่ PPCG! ฟังก์ชั่นที่ไม่มีชื่อนั้นใช้ได้ดีดังนั้นคุณไม่จำเป็นต้องกำหนดแลมบ์ดาให้a(และถ้าคุณทำคุณสามารถกำจัดช่องว่างสองช่องตรงนั้นได้) ฉันก็ไม่แน่ใจเหมือนกันว่าทำไมคุณถึงprintอยู่ที่นั่นคุณสามารถคืนค่าจากแลมบ์ดาเองได้
Martin Ender

"คุณสามารถพิสูจน์ได้ (อย่างไม่เป็นทางการ) ว่าอัลกอริทึมของคุณสามารถสร้าง PPT ที่เป็นเอกลักษณ์ได้ทุกแบบ" แต่วิธีนี้สร้างได้เฉพาะที่ด้านตรงข้ามมุมฉากยาวกว่าขา มันไม่เคยสร้าง 8,15,17 ตัวอย่างเช่น
Rosie F

2

Husk , 18 ไบต์

↑üOf§=F⌋ȯ¬Ḟ-m□ΠR3N

ลองออนไลน์!

-4 ไบต์ขอบคุณ Zgarb ด้วยแรงบันดาลใจจาก Dennis

วิธีเดรัจฉานแรงช้าสุดจะไม่ทำงานบน TIO สำหรับอินพุตที่มีขนาดใหญ่กว่า 1 คุณสามารถลองเวอร์ชันที่จัดการได้ง่ายขึ้น จำกัด ที่ a 200 b ที่นี่

คำอธิบาย

↑üOf§=F⌋ȯ¬Ḟ-m□ΠR3N
              ΠR3N   Get all triples of natural numbers
   f                 Keep only those triples where
      F⌋                their GCD
    §=                  is equal to
        ȯ¬Ḟ-m□          the logical negation of c²-b²-a²
 üO                  Remove duplicates by their sorted version
↑                    Get the first <input> values of this sequence

20 ไบต์โดยรวมแผนที่และตัวกรองเข้าด้วยกันให้ช้าลง
Zgarb

@Zgarb ขอบคุณ! ฉันพยายามเล่นกอล์ฟเป็นไบต์พิเศษ :)
Leo

18 ไบต์พร้อมกับเคล็ดลับการลบจากคำตอบ Jelly ของเดนนิส
Zgarb

@Zgarb ดี! แม้ว่าฉันจะมีข้อสงสัย: อาจมีสาม triples ต่างกันcหรือไม่? ในกรณีนี้การแก้ปัญหานี้จะต้องได้รับการแก้ไข
Leo

cอืมจริงมีจำนวนมากที่มีอเนกประสงค์เดียวกัน โซลูชัน 18 ไบต์ (ซึ่งใช้เคล็ดลับอื่นของเดนนิส) ทำงานโดยไม่คำนึงถึง
Zgarb

1

Mathematica, 89 ไบต์

ใช้แก้คำสั่งโดยค

SortBy[{a,b,c}/.Solve[a^2+b^2==c^2&&GCD[a,b]==1&&0<a<b<c<9#,{a,b,c},Integers],Last][[#]]&

Mathematica, 124 ไบต์

(s={};Table[If[IntegerQ[c=Sqrt[a^2+b^2]]&&GCD[a,b]==1,AppendTo[s,{a,b,c}]],{a,9#},{b,9#}];SortBy[Union[Sort/@s],Last][[#]])&

1

R (ตัวเลข +), 88 ไบต์

n=scan();while(all(nrow(T)<n))T=numbers::pythagorean_triples(5,5+(F<-F+1));T[n,3:5]

สำหรับการใช้บิวอินในการสร้างตัวเลขมันต้องใช้จำนวนไบต์ที่น่าประหลาดใจเพื่อให้ได้สิ่งที่เราต้องการ builtin เวลาสองขัดแย้งc1และและผลตอบแทนแฝดผู้ที่มีc2 c >= c1 & c <= c2สิ่งนี้ทำให้มันน่ารำคาญเล็กน้อยเมื่อไปที่ntriplet ที่สาม นี่จะเพิ่มทีละc21 เรื่อย ๆจนกว่าเอาต์พุตจะมีจำนวนแถวเพียงพอ


1

PHP , 273 ไบต์

function t($n){$x=[];for($c=3;;$c++)for($b=2;$b<$c;$b++)for($a=2;$a<$b;$a++)if(d($a,$b,$c)&&$a**2+$b**2==$c**2){$x[]=[$a,$b,$c];if(--$n==0)return $x;}}function d($a,$b,$c){for($i=2;$i<$a;$i++)if($a%$i==0&&$b%$i==0||$a%$i==0&&$c%$i==0||$b%$i==0&&$c%$i==0)return 0;return 1;}
  • t($n) ส่งคืนอาร์เรย์ของ [a, b, c] ด้วยการสั่งซื้อ a < b < c
  • ส่งคืนดัชนี zero-based

ลองออนไลน์! (รหัสสามารถอ่านได้ที่นั่นด้วย)


1

C, 158 ไบต์

ฉันเชื่อว่านี่คือการส่งครั้งแรกของฉันที่นี่เพื่อให้คุณสามารถทำได้ดีที่สุด

#include<stdio.h>
void f(n){int i=0,j=3,k,l;while(1){for(k=1;k<j;k++){for(l=k;l<j;l++){if(j*j==k*k+l*l)i++;if(i==n){printf("%d %d %d",j,k,l);return;}}}j++;};}

และเวอร์ชันที่ไม่ดีงาม:

#include <stdio.h>

void f(n)
{
  int i=0, j=3, k, l;
  while (1) {
    for (k=1; k<j; k++) {
      for (l=k; l<j; l++) {
        if (j*j==k*k+l*l)
          i++;
        if (i==n) {
          printf("%d %d %d\n", j, k, l);
          return;
        }
      }
    }
    j++;
  };
}

void main()
{
  int i;

  scanf("%d", &i);

  f(i);
  printf("\n");
}

สำหรับ2 + B 2 c = 2 , การสั่งซื้อที่เพิ่มขึ้นแล้วเพิ่มขึ้น

ไม่สามารถมี PPT เดียวกันสองเท่าได้เนื่องจากbอยู่ในระดับaในอัลกอริทึมนี้


ยินดีต้อนรับสู่ PPCG!
JAD

1

เยลลี่ , 27 25 ไบต์

⁽0(ḃs
Ɠḃd2Ḥ’×€Ç
3r5DṭÇæ×/

นี่คือการนำแนวทางต้นไม้มาใช้จากคำตอบของ Haskell ของ @ AndersKaseorgโดยมีคำสั่งสาขาต่างกัน โปรแกรมใช้การจัดทำดัชนีแบบ 0 และรับอินพุตจาก STDIN

ลองออนไลน์!

พื้นหลัง

ดังที่ได้กล่าวไว้ในหน้า Wikipedia ต้นไม้แห่ง Pythagorean triplesทุก ๆ PPT สามารถหาได้โดยการคูณเวกเตอร์แถวซ้ายซ้ำ ๆ(3, 4, 5)โดยเมทริกซ์ที่มีคุณสมบัติบางอย่าง

ในการวนซ้ำแต่ละครั้งผลลัพธ์ก่อนหน้านี้สามารถถูกคูณด้วยA , BหรือCซึ่งสามารถเลือกได้ดังนี้

matrices

เมื่อA , BและCได้รับการแก้ไข PPT แต่ละตัวสามารถรับได้ในรูปแบบที่ไม่ซ้ำกัน

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

3r5DṭÇæ×/  Main link. No arguments.

3          Set the argument and the return value to 3.
 r5        Create a range from 3 to 5, i.e., [3, 4, 5].
   D       Decimal; convert each integer to base 10, yielding [[3], [4], [5]].
     Ç     Call the second helper link with argument 3.
    ṭ      Tack; append [[3], [4], [5]] to the result.
      æ×/  Reduce by matrix multiplication.
Ɠḃd2Ḥ’×€Ç  Second helper link. Argument: 3

Ɠ          Read and evaluate one line of input, yielding an integer n.
 ḃ         Convert n to bijective base 3.
  d2       Divmod 2; map each digit d to [d/2, d%2].
    Ḥ      Unhalve; multiply the results by 2.
     ’     Decrement the doubled results.
           The previous four atoms apply the following mapping to the digits.
               1 -> [0, 1] -> [0, 2] -> [-1,  1]
               2 -> [1, 0] -> [2, 0] -> [ 1, -1]
               3 -> [1, 1] -> [2, 2] -> [ 1,  1]
        Ç  Call the helper link with argument 3, yielding the following 2D array.
               [[ 1,  2,  2],
                [ 2,  1,  2],
                [ 2,  2,  3]]
      ×€   Multiply each [-1,  1], [ 1, -1], and [ 1,  1] by that matrix, using
           vectorizing multiplication (not matrix multiplication), yielding one 
           of the following three 2D arrays.

               [[-1,  2,  2],    [[ 1, -2,  2],    [[ 1,  2,  2],
                [-2,  1,  2],     [ 2, -1,  2],     [ 2,  1,  2],
                [-2,  2,  3]]     [ 2, -2,  3]]     [ 2,  2,  3]]
⁽0(ḃs      First helper link. Argument: 3

⁽0(        Numeric literal; yield 13041.
   ḃ       Convert 13041 to bijective base 3, yielding [1, 2, 2, 2, 1, 2, 2, 2, 3].
    s      Split the result into chunks of length 3, yielding the aforementioned
           2D array.

1

APL (NARS), 90 ตัวอักษร, 180 ไบต์

{a⊃⍨⍵⊃⍋↑¨a←{⍵[⍋⍵]}¨a/⍨{1=∨/⍵}¨a←{(-/k),(×/2,⍵),+/k←⍵*2}¨a/⍨{>/⍵}¨a←,a∘.,a←⍳(⌊2⍟2+⍵)×9+⌊√⍵}

ถ้าอาร์กิวเมนต์ของฟังก์ชั่นด้านบนคือ above ฟังก์ชันด้านบนจะส่งคืนองค์ประกอบของดัชนี based (ตาม 1) ของอาเรย์นั้นมีองค์ประกอบพีทาโกรัสอเนกประสงค์ (a, b, c) โดยที่ <= b <= c และอาเรย์นั้น คือลำดับแรกสำหรับ a, (อีกด้านสั้นกว่า) จากนั้นสำหรับ b (อีกด้านหนึ่งไม่ใช่ด้านตรงข้ามมุมฉาก) จะมีบางอย่างผิดปกติเพราะไม่เห็นว่าฉันสั่ง b ด้วย ... test:

  f←{a⊃⍨⍵⊃⍋↑¨a←{⍵[⍋⍵]}¨a/⍨{1=∨/⍵}¨a←{(-/k),(×/2,⍵),+/k←⍵*2}¨a/⍨{>/⍵}¨a←,a∘.,a←⍳(⌊2⍟2+⍵)×9+⌊√⍵}
  f¨1..10
3 4 5  5 12 13  7 24 25  8 15 17  9 40 41  11 60 61  12 35 37  13 84 85  15 112 113  16 63 65  

มันเกี่ยวข้องกับhttp://oeis.org/A020884และhttp://oeis.org/A020884/b020884.txt

A020884: สั่งขาสั้นของสามเหลี่ยมพีทาโกรัสดั้งเดิม

  ↑¨f¨1..23
3 5 7 8 9 11 12 13 15 16 17 19 20 20 21 23 24 25 27 28 28 29 31 
  f 999
716 128163 128165 
  f 1000
717 28556 28565 

ฉันไม่รู้ว่ามันถูกต้องหรือเปล่าดูเหมือนว่าฟังก์ชั่นให้ผลลัพธ์ที่ถูกต้องของด้านแรกของรูปสามเหลี่ยมจนถึง 1,000 แต่ฉันไม่รู้ว่าส่วนที่เหลืออยู่หรือไม่และอาจเป็นไปได้ว่า


0

JavaScript, 101 ไบต์

ตามสูตรของ Euclid ทุกอเนกประสงค์พีทาโกรัสดั้งเดิมสามารถสร้างขึ้นจากจำนวนเต็มmและnมีm>n>0, m+nคี่gcd(m,n)==1( วิกิพีเดีย )

ฟังก์ชั่นนี้ระบุการm,nเพิ่มขึ้นทุกคู่ของ m ที่เริ่มต้นจากm=2และลดลงn2 โดยเริ่มจากm-1(เพื่อให้m+nเป็นเลขคี่)

c=>eval("g=(a,b)=>b?g(b,a%b):a;for(m=2,n=1;c-=g(m,n)<2;(n-=2)>0||(n=m++));[m*m-n*n,2*m*n,m*m+n*n]")

น้อย golfed

c => {
  g = (a,b) => b ? g(b,a%b) : a;
  for( m = 2, n = 1; 
       g(m,n) < 2 ? --c : c; 
       (n -= 2) > 0 || (n = m++))
    /* empty for body */;
  return [m*m - n*n, 2*m*n, m*m + n*n]
}

ทดสอบ

F=
c=>eval("g=(a,b)=>b?g(b,a%b):a;for(m=2,n=1;c-=g(m,n)<2;(n-=2)>0||(n=m++));[m*m-n*n,2*m*n,m*m+n*n]")

for(i=1;i<=50;i++) console.log(i+' '+F(i))

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