JavaScript (ES6), 172 ไบต์
คำแนะนำรุ่นที่ช้ากว่า แต่สั้นกว่าที่แนะนำโดย @JonathanAllan (เช่นการประหยัด 4 ไบต์ในคำตอบดั้งเดิม):
f=(n,A,S=(n,c)=>n>=0?c(n)||S(n-1,c):0)=>S(A,w=>(F=(l,n)=>n?S(w-n,x=>S(A/w-n,y=>l.some(([X,Y,W])=>X<x+n&X+W>x&Y<y+n&Y+W>y)?0:F([...l,[x,y,n]],n-1))):A%w<1)([],n))?A:f(n,-~A)
ลองออนไลน์!
คำตอบเดิม, 209 183 178 174 ไบต์
ส่งคืนคำที่ยังไม่มีข้อความลำดับของลำดับที่มีดัชนี 1 ชุด
f=(n,A,S=(n,c)=>n>=0?c(n)||S(n-1,c):0)=>S(A,w=>A%w?0:(F=(l,n)=>n?S(w-n,x=>S(A/w-n,y=>l.some(([X,Y,W])=>X<x+n&X+W>x&Y<y+n&Y+W>y)?0:F([...l,[x,y,n]],n-1))):1)([],n))?A:f(n,-~A)
ลองออนไลน์!
แสดงความคิดเห็น
ฟังก์ชั่นตัวช่วย
ก่อนอื่นเรากำหนดฟังก์ชันผู้ช่วยSซึ่งเรียกใช้ฟังก์ชันการเรียกกลับคสำหรับnถึง0 (รวมทั้งคู่) และหยุดทันทีที่การโทรส่งคืนค่าความจริง
S = (n, c) => // n = integer, c = callback function
n >= 0 ? // if n is greater than or equal to 0:
c(n) || // invoke c with n; stop if it's truthy
S(n - 1, c) // or go on with n - 1 if it's falsy
: // else:
0 // stop recursion and return 0
ฟังก์ชั่นหลัก
เราเริ่มต้นด้วย= 1A = 1
สำหรับแต่ละคู่( w , h )เช่นนั้นw × h = Aเราพยายามแทรกสี่เหลี่ยมทั้งหมดที่มีขนาด1 × 1ถึงn × n (อันที่จริงเริ่มต้นด้วยขนาดที่ใหญ่ที่สุด) ในพื้นที่ที่สอดคล้องกันในลักษณะที่พวกเขา อย่าทับซ้อนกัน
เราติดตามรายการของช่องสี่เหลี่ยมที่มีตำแหน่งของพวกเขา( X, วาย)ของพวกเขาและความกว้างWในl [ ] ]
เราทั้งสองกลับถ้าจัดที่ถูกต้องพบหรือลองอีกครั้งกับ+ 1AA + 1
f = ( n, // n = input
A ) => // A = candidate area (initially undefined)
S(A, w => // for w = A to w = 0:
A % w ? // if w is not a divisor of A:
0 // do nothing
: ( // else:
F = (l, n) => // F = recursive function taking a list l[] and a size n
n ? // if n is not equal to 0:
S(w - n, x => // for x = w - n to x = 0
S(A / w - n, y => // for y = A / w - n to y = 0:
l.some( // for each square in l[]
([X, Y, W]) => // located at (X, Y) and of width W:
X < x + n & // test whether this square is overlapping
X + W > x & // with the new square of width n that we're
Y < y + n & // trying to insert at (x, y)
Y + W > y //
) ? // if some existing square does overlap:
0 // abort
: // else:
F([ ...l, // recursive call to F:
[x, y, n] // append the new square to l[]
], //
n - 1 // and decrement n
) // end of recursive call
) // end of iteration over y
) // end of iteration over x
: // else (n = 0):
1 // success: stop recursion and return 1
)([], n) // initial call to F with an empty list of squares
) ? // end of iteration over w; if it was successful:
A // return A
: // else:
f(n, -~A) // try again with A + 1
h
และการเคลื่อนย้ายการทดสอบสำหรับa%w<1
การเรียกซ้ำหางของที่TIO แน่นอนว่ามันช้ากว่ามาก (* อย่างน้อย - ฉันไม่ใช่ผู้เชี่ยวชาญ JavaScript!)