MATL , 22 20 19 ไบต์
Ti:"2Y6Y+FT_Y)]!i_)
อินพุตทั้งสองเป็นแบบอิง 0
ลองออนไลน์!
คำอธิบาย
อนุญาตr
และc
แสดงถึงอินพุตทั้งสองระบุแถวและคอลัมน์ตาม 0
แต่ละแถวใหม่ในรูปสี่เหลี่ยมขนมเปียกปูนของ Pascal สามารถสร้างขึ้นจากเมทริกซ์ที่มีสองแถวก่อนหน้าโดยการประสานกับเคอร์เนล[1 1 1; 0 1 0]
และทำให้สองแถวสุดท้ายของผลการแลกเปลี่ยน นี้จะทำครั้งที่เริ่มต้นจากเมทริกซ์r
1
มันสั้นกว่าที่จะใช้เคอร์เนล[0 1 0; 1 1 1; 0 1 0]
ซึ่งเป็นตัวอักษรที่กำหนดไว้ล่วงหน้า สิ่งนี้จะสร้างแถวพิเศษซึ่งจะถูกยกเลิก
ยกตัวอย่างเช่นr = 3
มี3
การทำซ้ำ
เริ่มจาก
1
ด้วยการ[0 1 0; 1 1 1; 0 1 0]
ให้
0 1 0
1 1 1
0 1 0
การรักษาสองแถวสุดท้าย (เมทริกซ์ทั้งหมดในกรณีนี้) และการแลกเปลี่ยนให้
0 1 0
1 1 1
Convolutions จากข้างบนด้วยการ[0 1 0; 1 1 1; 0 1 0]
ให้
0 0 1 0 0
0 1 1 1 0
1 2 4 2 1
0 1 1 1 0
เมทริกซ์ที่เกิดขึ้นจากการสลับสองแถวสุดท้ายคือ
0 1 1 1 0
1 2 4 2 1
ประกอบด้วยแถวใหม่ที่ด้านล่างและแถวก่อนหน้าขยายด้วยศูนย์
ผลผลิตอีกครั้งที่น่าเชื่อถือ
0 0 1 1 1 0 0
0 1 2 3 2 1 0
1 3 8 9 8 3 1
0 1 2 4 2 1 0
การสลับสองแถวสุดท้ายให้ได้
0 1 2 4 2 1 0
1 3 8 9 8 3 1
หลังจากr
วนซ้ำแล้วเสร็จเอาต์พุตจะอยู่ในแถวสุดท้ายของเมทริกซ์สุดท้าย ตัวอย่างเช่นสำหรับc = 2
(0-based) 8
ผลจะเป็น แทนที่จะจัดทำดัชนีแถวสุดท้ายและคอลัมน์ที่ต้องการคุณสามารถใช้กลอุบายซึ่งหาประโยชน์จากความสมมาตรของแต่ละแถว: เมทริกซ์สุดท้ายถูกย้าย
0 1
1 3
2 8
4 9
2 8
1 3
0 1
และ-c
องค์ประกอบที่จะถูกนำมา นี้ใช้การจัดทำดัชนีเชิงเส้น, ที่อยู่, เมทริกซ์ที่มีการจัดทำดัชนีโดยดัชนีเดียวในคอลัมน์ที่สำคัญเพื่อ เนื่องจากการจัดทำดัชนีเป็นแบบแยกส่วน - ผู้เข้าร่วม0
เป็นมุมล่างขวา (ค่า1
) และ-2
รายการ -th เป็นสองขั้นตอนด้านบน (ค่า8
)
T % Push true
i % Input row number
:" % Do the following that many times
2Y6 % Push predefined literal [0 1 0; 1 1 1; 0 1 0]
Y+ % 2D convolution, increasing size
FT_ % Push [0 -1]
Y) % Matrix with rows 0 (last) and -1 (second-last), in that order
] % End
! % Transpose
i % Input: colun number
_ % Negate
) % Entry with that index. Implicitly display