JavaScript (ES6), 172 byte
Đề xuất phiên bản chậm hơn nhưng ngắn hơn được đề xuất bởi @JonathanAllan (cũng lưu 4 byte trong câu trả lời ban đầu):
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)
Hãy thử trực tuyến!
Câu trả lời gốc, 209 183 178 174 byte
Trả về số hạng thứ của chuỗi, được lập chỉ mục 1.N
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)
Hãy thử trực tuyến!
Đã bình luận
Chức năng trợ giúp
Trước tiên, chúng tôi xác định hàm trợ giúp gọi hàm gọi lại từ đến (bao gồm cả hai) và dừng ngay khi cuộc gọi trả về giá trị trung thực.Scn0
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
Chức năng chính
Chúng tôi bắt đầu với .A=1
Đối với mỗi cặp sao cho , chúng tôi cố gắng chèn tất cả các hình vuông có kích thước đến (thực sự bắt đầu bằng số lớn nhất) trong khu vực tương ứng, theo cách như vậy rằng họ không chồng chéo với nhau.(w,h)w×h=A1×1n×n
Chúng tôi theo dõi danh sách các hình vuông với vị trí của họ và họ chiều rộng trong .(X,Y)Wl[ ]
Chúng tôi sẽ trả về nếu tìm thấy sắp xếp hợp lệ hoặc thử lại với .AA+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
và di chuyển thử nghiệma%w<1
sang đuôi của TIO đệ quy . Tất nhiên là chậm hơn nhiều. (* ít nhất - Tôi không phải là chuyên gia JavaScript!)