Tìm diện tích của hình chữ nhật nhỏ nhất để chứa các hình vuông có kích thước lên đến n


19

Đây là một câu hỏi trình tự thuộc loại thông thường, như được áp dụng cho trình tự OEIS A038666 . Đó là, thực hiện một trong những điều sau đây:

  • Chấp nhận không hoặc bất kỳ đầu vào nào, và đầu ra A038666 cho đến khi cái chết nhiệt của vũ trụ.
  • Chấp nhận một số nguyên dương làm đầu vào và xuất ra số hạng thứ của A038666 hoặc đầu tiên của nó . (Nếu sử dụng - thay vì 1 -indexing, thì tất nhiên bạn cũng phải ra về đầu vào.)nn0110

Các n thứ hạn của A038666 là khu vực ít nhất trong số các hình chữ nhật có chứa hình vuông không chồng chéo của các kích cỡ 1×1,2×2,n×n nếu bạn đang sử dụng 1 -indexing.

Thí dụ:

Hình chữ nhật có diện tích nhỏ nhất có thể chứa các hình vuông không chồng chéo có kích thước 1×1 đến 4×4 có kích thước 7×5 :

4 4 4 4 3 3 3
4 4 4 4 3 3 3
4 4 4 4 3 3 3
4 4 4 4 2 2 1
x x x x 2 2 x

Do đó, a(4)=7×5=35 ( 1 -exexed).

Tương tự, hình chữ nhật có diện tích nhỏ nhất chứa các ô vuông không chồng chéo có kích thước 1×1 đến 17×17 có kích thước 39×46 , do đó a(17)=39×46=1794 ( 1 -exexed).

Câu trả lời:


10

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

2
Lưu 6 * bằng cách không xác định hvà di chuyển thử nghiệm a%w<1sang đ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!)
Jonathan Allan

@Jonathan ALLan Cảm ơn. :) Trên thực tế, tôi tự hỏi nếu a%w<1có thể được thay thế bằng chỉ 1. Tôi sẽ phải kiểm tra lại sau.
Arnauld

0

Python 2 (PyPy) , 250 236 byte

-14 byte nhờ các đề xuất của msh210 .

Xuất ra số hạng thứ 1 được lập chỉ mục của chuỗi.

n=input()
r=range
k=n*-~n*(n-~n)/6
m=k*k
for Q in r(m):
 P={0}
 for X in r(n,0,-1):P|=([x for x in[{(x+a,y+b)for a in r(X)for b in r(X)}for x in r(Q%k-X+1)for y in r(Q/k-X+1)]if not x&P]+[{0}])[0]
 if len(P)>k:m=min(Q%k*(Q/k),m)
print m

Hãy thử trực tuyến! Đối với n> 4, điều này mất rất nhiều thời gian. Tôi đã xác minh kết quả lên tới n = 7 cục bộ.


Bạn có phiền bao gồm một lời giải thích về cách nó hoạt động? Ngoài ra, tôi tưởng tượng bạn có thể cạo byte bằng cách thụt một khoảng trống tại một thời điểm thay vì bảy (đối với lần thụt thứ hai). (Trên thực tế, tôi nghĩ có lẽ hai fordòng có thể nằm trên một dòng và bạn chỉ cần thụt lề một lần.)
msh210

1
@ msh210 "7 khoảng trắng" trên thực tế là một tab, vì trong Python 2, bạn có thể thụt lề trước bằng một khoảng trắng, sau đó bằng một tab. Không may đặt hai vòng lặp trên một dòng sẽ là cú pháp không hợp lệ.
ArBo

1
@ msh210 Tôi tìm thấy một cách khác để kết hợp chúng cho các vòng lặp. 7 không gian nơi chỉ có trên đường, cảm ơn vì đã bắt được. Tôi sẽ cố gắng để viết một lời giải thích vào ngày mai
OVS
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.