ผลรวม จำกัด แบบวงกลม


10

ท้าทาย

ลองจินตนาการN-tuple ของจำนวนเต็มระหว่าง 0 และรวมและขอเรียกว่าMF

มีความเป็น(M + 1) ** Nไปได้Fทั้งหมด

จำนวนดังกล่าวFตอบสนองความไม่เท่าเทียมกันต่อไปนี้ทั้งหมด (ดัชนีเป็นฐานเดียว)

  • F[n] + F[n+1] <= M สำหรับ 1 <= n < N
  • F[N] + F[1] <= M

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้เวลาสองจำนวนเต็มบวก NและMและผลคำตอบในรูปแบบที่สะดวกใด ๆ

กรณีทดสอบ

(N,M) => Answer

(1,1) => 1
(2,1) => 3
(3,1) => 4
(4,1) => 7

(1,2) => 2
(2,2) => 6
(3,2) => 11
(4,2) => 26

(10,3) => 39175
(10,4) => 286555
(10,5) => 1508401

(25,3) => 303734663372
(25,4) => 43953707972058
(25,5) => 2794276977562073

(100,3) => 8510938110502117856062697655362747468175263710
(100,4) => 3732347514675901732382391725971022481763004479674972370
(100,5) => 60964611448369808046336702581873778457326750953325742021695001

คำอธิบาย

M (max value of element) = 1

F[1] + F[1] <= 1; F = [0]
(1,1) => 1

F[1] + F[2] <= 1; F = [0,0], [0,1], [1,0]
(2,1) => 3

F = [0,0,0], [0,0,1], [0,1,0], [1,0,0]
(3,1) => 4

F = [0,0,0,0], [0,0,0,1], [0,0,1,0], [0,1,0,0], [0,1,0,1], [1,0,0,0], [1,0,1,0]
(4,1) => 7

---

M = 2

F[1] + F[1] <= 2; F = [0], [1]
(1,2) => 2

F = [0,0], [0,1], [0,2], [1,0], [1,1], [2,0]
(2,2) => 6

F = [0,0,0], [0,0,1], [0,0,2], [0,1,0], [0,1,1], [0,2,0], [1,0,0], [1,0,1],
[1,1,0], [1,1,1], [2,0,0]
(3,2) => 11

(4,2) => 26 (left as exercise for you)

กฎระเบียบ

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

คำตอบ:


7

งูหลามกับnumpy 59 ไบต์

lambda M,N:trace(mat(tri(M+1)[::-1])**N)
from numpy import*

ลองออนไลน์!

ใช้การคูณเมทริกซ์เพื่อนับเส้นทาง หากความแม่นยำของการลอยตัวเป็นปัญหาmatก็สามารถระบุmat(...,int)ได้


การใช้mat(...,int)ดูเหมือนจะไม่สามารถใช้ได้กับทุกn=100กรณี วิธีการที่ถูกต้อง (ใช้ SymPy ที่จะรวมพลังของรากของพหุนามลักษณะไม่ทำงานตัวอย่างเช่น) แต่ numpy ไปที่ไหนสักแห่งที่ไม่ถูกต้องเป็นตัวเลขที่เพิ่มขึ้น (บางทีมันอาจจะเป็น**ผู้ประกอบการพลังงาน?)
โจนาธานอัลลัน

4

Pyth , 27 ไบต์

.N?Ys:RTtYh-QNgQ+NTs:Rdtszh

สาธิต

คาดว่าอินพุตในรูปแบบ:

M
N

นี่คือการเขียนโปรแกรมแบบไดนามิกแบบคลาสสิกทางด้านซ้ายสุดของค่าที่ตั้งไว้จนถึงตอนท้ายด้านขวาและขนาดปัจจุบันของช่องว่าง

มันทำงานอย่างไรใน pseudocode / Python:

.N          | define memoized fill(left, right, gap):
?           | if cap > 0 then
s:RTtY      | sum(fill(i, right, gap - 1)
h-QN        |     for i in range(M - left + 1))
gQ+NT       | else M >= left + right
            | output:
s:Rdtsz     | sum(fill(i, i, N - 1)
h           |     for i in range(M + 1))

Qจะใช้สำหรับการM, zใช้สำหรับN, :เป็นfill, Nคือleft, Tคือright, คือYgap


4

MATL , 13 12 ไบต์

Q:&>~PiY^Xds

ลองออนไลน์! นี่เป็นการแปลโดยตรงของคำตอบ Python ของ xnorและคำตอบ MATLแรกของฉันดังนั้นจึงเป็นไปได้ว่ามันจะไม่เหมาะสมที่สุด t&lYRPเช่นมีแนวโน้มเป็นวิธีที่สั้นกว่าที่จะได้รับบนซ้ายเมทริกซ์สามเหลี่ยมของคนมากกว่า แก้ไข: :&>~Pและมันจะเปิดออกมีคือ ขอบคุณ Luis Mendo สำหรับ -1 ไบต์!

               M is the first input and N the second
Q:             increment M and generate range from 1 to M+1
  &>           compare vector element wise with itself with greater-than function
               results in a upper-right triangular matrix
    ~          inverse to get lower-left triangular matrix
     P         flip rows to get upper-left triangular matrix
      i        input N
       Y^      take the matrix to the power of N
         Xds   compute the sum of the main diagonal

@LuisMendo ขอบคุณ! แม้ว่าจะเป็นเพียงหนึ่งไบต์หรือมีอย่างอื่นที่สามารถปล่อยได้?
Laikoni

1
ไม่ฉันไม่สามารถนับได้ :-D
Luis Mendo

2

Stax , 17 ไบต์

°(√&╒íƽ╨⌂'├╖▼1_Z

เรียกใช้และแก้ไขข้อบกพร่อง

คลายกล่อง ungolfed และแสดงความคิดเห็นมันมีลักษณะเช่นนี้

^1](    [1, 0, ... 0] with M zeroes
:)      get all rotations of the array
{       begin block
  {:+rm map each array to reverse(prefixSums(arr))
},v*    execute preceding block N-1 times
F       for each array, execute the rest of the program
  iT    remove the last i elements from the array, where i is the iteration index
  F+    add the remaining elements to the running total
        implicitly print output

เรียกใช้อันนี้


2

R , 72 ไบต์

function(M,N)sum(diag(Reduce(`%*%`,rep(list(outer(0:M,0:M,"+")<=M),N))))

ลองออนไลน์!

พอร์ตของ xnor

ล้มเหลวสำหรับกรณีทดสอบที่มีขนาดใหญ่เนื่องจาก R มีการรองรับจำนวนเต็ม 32 บิตเท่านั้น (พวกมันจะถูกส่งไปdoubleยังค่าสูงสุดเมื่อถึงค่าสูงสุด) ดังนั้นการใช้gmpหรือจำเป็นต้องใช้ไลบรารีทางคณิตศาสตร์ที่มีความแม่นยำตามอำเภอใจอื่น

แปลก R ขาดตัวดำเนินการพลังงานเมทริกซ์เช่นเดียว^กับการใช้องค์ประกอบ


จริงๆแล้วมี%^%โอเปอเรเตอร์ที่ใช้งานอย่างถูกต้องในแพ็คเกจexpmที่อนุญาตให้-5 ไบต์แต่น่าเสียดายที่มันไม่สามารถใช้งานได้ใน TIO (ฉันต้องทดสอบในเครื่อง)
Kirill L.

@KirillL ใช่ฉันได้พิจารณาแล้ว แต่ฉันคิดว่าฉันจะยึดติดกับการตอบสนองฐานของฉัน นอกจากนี้คุณยังสามารถตีกอล์ฟที่ขนาดไม่เกิน 60 ไบต์โดยไม่โหลดในแพ็คเกจทั้งหมด:function(M,N)sum(diag(expm::`%^%`(outer(0:M,0:M,"+")<=M,N)))
Giuseppe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.