Hình vuông gần đúng


11

Lý lịch

Tôi có một loạt các hộp hình vuông có kích thước bằng nhau, và vì tôi là một người gọn gàng, tôi muốn sắp xếp tất cả chúng thành một hình vuông. Tuy nhiên, số của chúng không nhất thiết là một hình vuông hoàn hảo, vì vậy tôi có thể phải xấp xỉ hình vuông. Tôi muốn bạn tìm cho tôi sự sắp xếp thẩm mỹ nhất - tất nhiên là lập trình.

Đầu vào

Đầu vào của bạn là một số nguyên dương duy nhất k, đại diện cho số lượng hộp.

Đầu ra

Chương trình của bạn sẽ chọn hai số nguyên dương m, nnhư vậy m*(n-1) < k ≤ m*n. Chúng đại diện cho chiều rộng và chiều cao của hình dạng giống như hình vuông lớn mà chúng ta đang sắp xếp. Vì chúng ta đang tìm kiếm các hình dạng đẹp mắt, nên số lượng sẽ tối thiểu, sao cho hình gần với hình vuông và diện tích của nó gần với . Nếu vẫn còn một vài ứng cử viên cho cặp , hãy chọn một trong đó chiều rộng là tối đa.(m - n)2 + (m*n - k)2k(m, n)m

Bây giờ, đầu ra thực tế của bạn sẽ không phải là số mn. Thay vào đó, bạn sẽ in cách sắp xếp các hộp, sử dụng ký tự #để thể hiện một hộp. Cụ thể hơn, bạn sẽ in n-1các hàng, mỗi hàng bao gồm các mký tự #và sau đó là một hàng k - m*(n-1)ký tự #. Lưu ý rằng đầu ra chứa chính xác các kký tự #.

Quy tắc và chấm điểm

Sẽ không có bất kỳ khoảng trắng đầu hoặc cuối nào trong đầu ra, ngoại trừ hàng cuối cùng có thể được đệm với các khoảng trắng ở cuối có độ dài m, nếu muốn. Có thể có một dòng mới, nhưng không có dòng mới nào trước đó. Bạn có thể sử dụng bất kỳ ký tự ASCII có thể in nào thay thế #, nếu muốn.

Bạn có thể viết một chương trình đầy đủ hoặc trả về một chuỗi từ một hàm. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép.

Các trường hợp thử nghiệm

Dưới đây là các đầu ra chính xác cho một vài giá trị đầu vào.

1
#
2
##
3
##
#
4
##
##
8
###
###
##
13
#####
#####
###
17
######
######
#####
18
#####
#####
#####
###
20
#####
#####
#####
#####
21
######
######
######
###
22
######
######
######
####
23
#####
#####
#####
#####
###

Câu trả lời:


6

Bình thường, 28 byte

jbc*\#Qho.a,,N*NJ_/_QN,JQ_SQ

Hãy thử trực tuyến.

Điểm mấu chốt là tôi sắp xếp tiềm năng m trên thuộc tính sau:

(m - ceil(k/m))^2 + (m*ceil(k/m) - k)^2

Lưu ý sự vắng mặt hoàn toàn của n. Tổng hình dạng được xác định chỉ bởi m. Sau đó, tôi chuyển đổi thuộc tính trên một lần nữa và trọng số sắp xếp cuối cùng của tôi được xác định là khoảng cách Euclide giữa hai điểm sau:

(m, m*ceil(k/m)) and (ceil(k/m), k)

Điều này thay đổi các giá trị trọng lượng, nhưng không phải thứ tự của họ.


3

Python 3, 202 byte

Tôi biết rằng nó dài hơn các giải pháp của CJam hoặc Pyth, tuy nhiên, đây là một cách giải quyết vấn đề này trong Python:

k=int(input())
r,d,s=range(k+1),{},'#'*k
for n in r:
 for m in r:
  if m*n>=k:
   d[m,n]=(m-n)**2+(m*n-k)**2
x,y=max(i for i in d.keys()if d[i]==min(d.values()))
[print(s[i*x:(i*x+x])for i in range(y+1)]

Nguyên tắc cơ bản là chúng ta biết m và n đều nhỏ hơn k. Ngoài ra, m * n> = k. Điều đó có nghĩa là chúng ta có thể chỉ cần tìm mức tối thiểu của biểu thức được đưa ra trong thử thách cho tất cả m, n <k, ngoại trừ các giá trị có sản phẩm lớn hơn k.


Tôi thực sự đếm được 231 byte trong nguồn của bạn, không phải là 234. Nhưng bất kể, bạn có thể giảm nó bằng cách giảm kích thước thụt lề của bạn từ bốn khoảng trắng xuống một khoảng trắng. Nó sẽ làm việc như nhau.
Alex A.

Đây là một công cụ tiện dụng để lấy số byte của bạn. Nhân tiện, trình tốt đẹp và chào mừng đến với trang web!
Alex A.

:thiếu ở dòng 5. Dấu phẩy là những gì xác định một tuple, dấu ngoặc ()có thể được xóa ở dòng 6. Khoảng cách giữa )và ( ifhoặc for) cũng vậy. maxcó thể lấy trình tạo làm tham số, do đó dấu ngoặc []là dự phòng. Bạn lặp lại dcác phím, vì vậy bạn có thể sử dụng một cách an toàn d[i].
Trang Oul

Bạn có thể lưu hai byte thay đổi (i+1)*xthành -~i*xhoặc i*x+x.
Kade

Bạn có một paren bổ sung, không hợp lệ tại (i*x+x...
FlipTack

2

CJam ( 44 42 byte)

qi_,{)_2$d\/m]_2$-_*@@*2$-_*+~}$W=)'#@*/N*

Bản demo trực tuyến

Tôi đã mong đợi có một giải pháp đơn giản hơn liên quan đến căn bậc hai, nhưng nó không đơn giản chút nào. Ví dụ, đối với đầu vào 31chiều rộng hàng là hai lớn hơn trần của căn bậc hai; cho 273(căn bậc hai chỉ hơn 16,5) hình vuông gần đúng nhất là một hình chữ nhật 21x13 hoàn hảo.


1

CJam, 42 byte

li:K_,f-{:XdK\/m]:YX-_*XY*K-_*+}$0='#K*/N*

Dùng thử trực tuyến

Giải trình:

li    Get and interpret input.
:K    Store in variable K for later use.
_     Copy.
,     Build sequence [0 .. K-1].
f-    Subtract from K, to get sequence [K .. 1]. Larger values have to come
      first so that they are ahead in ties when we sort later.
{     Begin block for calculation of target function for sort.
  :X    Store width in variable X.
  d     Convert to double.
  K\/   Calculate K/X.
  m]    Ceiling.
  :Y    Store height in variable Y.
  X-    Calculate Y-X.
  _*    Square it.
  XY*   Calculate X*Y...
  K-    ... and X*Y-K
  _*    Square it.
  +     Add the two squares.
}$    Sort by target function value.
0=    Get first element, this is the best width.
'#K*  Build string of K '# characters.
/     Split using width.
N*    Join with newlines.
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.